java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

一次性付费进群,长期免费索取教程,没有付费教程。

进微信群回复公众号:微信群;QQ群:460500587

 教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍 

73d587f690f5e0abb141b7da5e13f05f.png

微信公众号:计算机与网络安全

ID:Computer-network

在MMM集群架构中,通过提供虚拟的读、写IP地址,将数据库的读写功能分离出来,但是这仅仅设定了读、写的VIP地址,并没有真正实现业务系统中所说的读、写分离功能,因为应用程序不可能在需要读的时候就去找可读的VIP,在写的时候就去找可写的VIP,要解决这个问题,可由两种方法来实现。

第一种实现读、写分离的方式是通过修改程序,将读、写操作提取出来,并分别在程序的连接池中设定可读、可写的VIP地址,这种方法要修改业务系统的程序,实现起来相对比较困难,如果是新开发的程序,可以在开发时就预留这样的接口,而如果程序已经在运行,修改的难度是相当大的,采用这种方法基本行不通。

第二种实现读、写分离的方法是通过一个数据库透明代理,也就是在业务系统和数据库之间提供一个代理接口,由这个接口来完成业务系统读、写请求的分发,将读操作分发到后端只读的数据库服务器上,而将写请求分发到后端可写的数据库服务器上。常见的读、写分离软件有Amoeba和MySQL-Proxy。

MySQL-Proxy是MySQL官方推出的一个处在业务系统和MySQL数据库之间的程序,这个代理可以用来分析、监控和变换通信数据,但是MySQL官方建议不要将MySQL-Proxy用于生产环境。事实上,MySQL-Proxy确实很不稳定,它的读、写分离功能都是通过一个lua脚本来实现的,而这个脚本bug很多,所以不建议通过MySQL-Proxy来实现读、写分离功能,不过可以作为线下测试使用。

Amoeba是一个开源项目,致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由器功能,具有负载均衡、高可用性、SQL过滤、读写分离等功能,通过Amoeba可以实现数据源的高可用、负载均衡、数据切片等功能。本文介绍Amoeba作为MySQL读、写分离代理接口的实现过程。

1、通过Amoeba实现MySQL读写分离

(1)MMM整合Amoeba应用架构

在实际的应用环境中,Amoeba可与简单的MySQL主从复制架构进行整合,实现读与写的分离操作。但是这样存在安全性问题,例如MySQL的Master节点出现故障或者任何一个Slave节点故障,那么Amoeba并不能自动屏蔽这些故障的MySQL节点,可能会导致前端应用程序无法读取数据库的情况。为了解决这个问题,Amoeba经常与MMM集群架构一起使用,这样如果任意MySQL节点故障,MMM集群就能自动屏蔽故障节点,从而保证Amoeba一直能够连接到正常的MySQL节点。这里要介绍的Amoeba应用环境就是在MMM集群的基础上构建的,整个架构如图1所示。

eaff91c0aabddcb93d912cad6f0534a5.png

图1  MMM整合Amoeba应用架构

此架构其实就是在MMM集群架构的基础上增加了Amoeba Server服务器,这样前端所有应用程序的请求都将提交到Amoeba Server上,然后Amoeba Server根据自身的读、写配置参数将读请求分配到可读的每个MySQL节点,而将写请求分配到可写的MySQL节点上。这个架构由于在底层使用了MMM集群,因此,Amoeba Server不用担心会将请求分配到一个故障的MySQL节点,因为MMM集群会自动转移故障节点到健康节点上。

(2)Amoeba的安装

这里下载的是amoeba-mysql-3.0.5-RC-distribution.zip。Amoeba的安装非常简单,直接解压即可使用,这里将Amoeba解压到/usr/local/amoeba目录下,这样就完成安装了。

Amoeba框架是基于Java SE1.5开发的,因此,还需要安装Java环境,建议使用Java SE1.5以上的JDK版本,这里使用的JDK版本为jdk1.6.0_25。将JDK安装到/usr/local/目录下,然后设置Java环境变量,信息如下:

export JAVA_HOME= /usrk/local/jdk1.6.0_25 

export  CLASSPATH=.:$JAVA_HOME/jre/lib//rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

export PATH=$JAVA_HOME/bin:$PATH

将这些内容添加到系统的/etc/profile文件中即可完成Java环境的设置。

(3)配置Amoeba

Amoeba的配置文件在本环境下位于/usr/local/amoeba/conf目录。配置文件比较多,但是仅仅使用读、写分离功能,只需配置二个文件即可,分别是dbServers.xml和amoeba.xml,如果需要配置IP访问控制,还需要修改access_list.conf文件。下面首先介绍dbServers.xml文件的配置,内容如下:

${defaultManager}64128

3306 #设置Amoeba要连接的mysql数据库的端口,默认是3306

testzhu #缺省数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver

test1 #设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接

111111 #连接密码

500 #最大连接数,默认500500 #最大空闲连接数1 #最新空闲连接数600000600000truetruetrue

#设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到

192.168.1.129 #设置后端可写dbserver

#设置后端可读dbserver

192.168.1.118 #后端可读dbserver的IP

……

这样Amoeba就配置完成了。

(4)设置Amoeba登录数据库权限

这里假定Amoeba服务器的IP地址为192.168.88.35,在MMM集群的所有MySQL节点上执行如下操作,为Amoeba访问MMM集群中所有MySQL数据库节点授权:

mysql>GRANT ALL ON repldb.* TO 'ixdba'@'192.168.88.35' IDENTIFIED BY 'xxxxxx';

mysql>flush privileges;

(5)启动Amoeba

在Amoeba服务器上执行如下命令,启动Amoeba:

[root@amoebaserver bin]# /usr/local/amoeba/bin/launcher

2019-10-24 18:46:37 [INFO] Project Name=Amoeba-MySQL, PID=22474, starting...

log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml

2019-10-24 18:50:21,668 INFO context.MysqlRuntimeContext - Amoeba for Mysq  current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA

log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf

2019-10-24 18:50:22,852 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.

[root@cloud0 bin]# netstat -unlpt | grep java
tcp 0 0 :::8066 :::* LISTEN 22474/java

由此可知Amoeba启动正常。

(6)测试Amoeba实现读、写分离和负载均衡

要测试Amoeba实现读、写分离和负载均衡功能,需要在MMM集群的所有MySQL节点开启MySQL的查询日志。查询日志可以记录数据库中建立的客户端连接和执行的语句。开启方法很简单,在MySQL配置文件/etc/my.cnf中添加如下内容:

log=/var/log/mysql_query_log

当然,mysql_query_log文件要事先存在,并且对MySQL用户可写。

为了测试方便,这里在每个MySQL节点的test库中创建一张表,表的名字为mmm_test,例如在Master1节点,创建表的过程如下:

mysql>use test;

mysql>create table mmm_test(id int,email varchar(60));

mysql>insert into mmm_test(id,email) values(100,'this is 192.168.88.20');

上面的操作是在mmm_test表的email字段中插入一条记录“this is 192.168.88.20”,而字符串“this is 192.168.88.20”就是个IP标识,这样做的目的是区分多个MySQL节点不同IP地址的情况。接着在Master2节点同样执行上面的SQL操作,所不同的是mmm_test表email字段的内容修改为“this is 192.168.88.21”。依此类推,分别在Slave1和Slave2节点执行相同的操作。

接着,在远程MySQL客户端通过Amoeba配置文件中指定的用户名、密码、端口以及Amoeba服务器的IP地址连接MySQL数据库,操作过程如图2所示。

5d7e20d84953bdf367253d7f7cdcfb9d.png

图2  测试Amoeba实现读操作的负载均衡功能

从图2可以看出,客户端连接到的Server version为5.1.45-mysql-amoeba-proxy-3.0.4-BETA,可见客户端连接的是Amoeba实例而不是MySQL实例,而从下面的查询test库中mmm_test表的内容来看,Amoeba依次将4次select请求均衡地分配到MMM集群中4个可读MySQL节点上,由此可知,Amoeba实现了读操作的负载均衡。

下面继续进行SQL测试,创建两个表mmm_test1和mmm_test2,操作过程如下:

mysql>create table mmm_test1(id int,email varchar(60));

Query OK,0 rows affected(0.04 sec)

mysql>create table mmm_test2(id int,email varchar(60));

Query OK,0 rows affected(0.04 sec)

mysql>insert into mmm_test1(id,email) values(101,'mmm_test1@126.com');

Query OK,1 rows affected(0.02 sec)

mysql>drop table mmm_test2;

Query OK,0 rows affected(0.10 sec)

为了确定创建的两个表是否已经正常同步到MMM集群的其他节点,可分别登录每个MySQL节点进行查询,接着还要确定MySQL的写操作是否分配到可写的节点Master1,可通过查看每个MySQL节点的查询日志。Master1节点的MySQL查询日志信息如图3所示。

49bba603e0abaca937c8c14617669cd0.png

图3  Master1节点MySQL查询日志

Master2节点的MySQL查询日志信息如图4所示。

bf70569f5f1a98b04183b51b86c9f43c.png

图4  Master2节点MySQL查询日志

其他节点的信息基本类似,这里不一一列出。从MySQL的查询日志中可以进一步验证Amoeba实现了读负载均衡,而写操作在Master1节点执行了。虽然Master2节点也有相关写操作的日志,但这是MySQL的复制线程执行的写操作,因为除了Master1,其他MySQL节点都是read_only状态,是无法执行写操作的。

2、通过Keepalived构建高可用的Amoeba服务

在上面介绍的MMM整合Amoeba应用方案中,虽然通过Amoeba实现了MySQL的读、写分离,但是这个架构并不完美,因为还存在Amoeba服务器单点故障,也就是说当Amoeba出现故障后,业务系统将无法访问MySQL服务。要解决这个问题其实非常简单,通过Keepalived给Amoeba做高可用即可,通过Keepalived实现Amoeba高可用并实现MySQL集群读、写分离的架构如图5所示。

e756d61da0bd59b1a0da34db93027c56.png

图5  通过Keepalived实现Amoeba高可用并实现MySQL集群读、写分离架构

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

的硬件报错_工程师经验:78%的硬件失效罪魁祸首 —— 焊接问题

工程师经验你是否长时间纠缠于线路板的失效分析?你是否花费大量精力在样板调试过程中?你是否怀疑过自己的原本正确的设计?也许许多硬件工程师都有过类似的心理对话。有数据显示,78%的硬件失效原因是由于不良的焊接和错误的物料贴片…

柔性体没有应变_灌注式半柔性道面材料抗冲击性能试验研究

文章来源:微信公众号"沥青路面”前言灌注式半柔性道面材料是一种刚度大于沥青混凝土,小于水泥混凝土的复合道面材料,在兼具了两种材料优势的同时避开了它们的缺陷。半柔性道面不存在裂缝,而且受温度影响远远小于沥青道面&…

html网页上传到服务器_JSP+Servlet实现文件上传到服务器功能

本文实例为大家分享了JSPServlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下项目目录结构大致如下:正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC 架构&#xff…

gaf处理一维故障信号_【推荐文章】改进局部均值分解的齿轮箱复合故障特征提取...

《机械传动》2019年 第43卷 第8期文章编号:1004-2539(2019)08-0130-05DOI:10.16578/j.issn.1004.2539.2019.08.024引用格式:柴慧理, 叶美桃. 改进局部均值分解的齿轮箱复合故障特征提取[J]. 机械传动, 2019,43(8):130-134.CHAI…

dll模块化设计与编程_FPGA设计原则经验分享

一、面积和速度如何折中 面积和速度是芯片设计中一对相互制约、影响成本和性能的指标,贯穿FPGA设计的始终。在FPGA设计中,面积是指一个设计消耗的FPGA内部逻辑资源的数量,可以用消耗的触发器和查找表的个数或者是等效逻辑门数来衡量&#x…

div背景透明_为什么css3实现background-image和半透明边框这么麻烦

”background和border属性能有什么难的?"我经常听到新手觉得css的background和border属性简单。那好,我们来看下面这个比较“简单”的需求:父元素有一张背景,子元素有边框,且子元素有一张背景颜色。这时候子元素的…

c mysql 查询超时设置_MySQL查询超时的设置方法

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 这里顺带解释一下什么是non-interactive connection Non-Interactive Commands Just do a quick look up on a table without logging into the client, running the query then logging back out aga欢…

python聚类分析案例_深度解读|如何构建用户分级体系实现精细化运营?附案例实操...

本文内容较长,代码全部已展示在文中用户精细化分类也可以称做用户画像,是目前很常见的一种运营手段,目的是为了更好的服务不同性质的客户,提高每个环节的转化率,最大程度挖掘客户价值,创造利润。那么如何构…

单片机集成wifi等_从零制作单片机需要哪些知识?

请点击上面 免费关注...说一下从芯片制作开始到最后编写驱动程序整个过程中每一步所需要的知识。作者:彭谟威链接:https://www.zhihu.com/question/28580074/answer/93515413来来来,让我们一起,左手右手一个慢动作。每一个方向都值…

matlab案例_基于matlab和frost平台的cassie案例足式机器人运动学和动力学计算实现过程...

1、软件平台Maltab2019aMathematica 12.1.0Frost2、实现步骤(1)、安装matlab2019a(2)、安装Mathematica 12.1.0(3)、下载frost-dev-master软件说明:https://ayonga.github.io/frost-dev/pages/i…

计算机毕业设计----SSM实现的一个在线文具学习用品购买商城

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录,管理员信息管理,查看用户信息,新闻公告信息管理,文具类型信息管理,城市信息管理,配货点信息管理,文具信息管理,订单信息…

python2和3语法区别_python2和3语法区别

以下是Python2和Python3中的一些语法差异,有需要的小伙伴可以学习下。 print语句 在Python 2里,print是一个语句。无论你想输出什么,只要将它们放在print关键字后边就可以。在Python 3里,print()是一个函数。就像其他的函数一样&a…

python如何循环使用input_python基础知识input到while循环

j周笔记 输入与输出 1.输入 input (请输入内容) 字符串 2.输出 print(输出到控制台) 变量vairable 变量就是相当于我们人的名字 1.名字 2.存储位置 3.该存储位置的内容解释 ​ name(名字) 张三(值(存储位置)) 变量名 值 注意: 给变量取名字时,一定要遵循python语法规范 1.变量…

echarts tooltip被遮挡_echarts 的tooltip定位到当前图,避免溢出和遮挡

问题:tooltip初始是跟着鼠标移动,当内容过多(宽度高度过大),会被其他遮挡或者会溢出屏幕外解决:思路:根据官方文档,鼠标在左侧时,tip在右侧,鼠标在右侧时&…

idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

碰见了一个问题,一直无法解决,希望大家帮帮忙。这是连接mysql的JdbcUtils代码:public class JdbcUtils {// 配置文件private static Properties props null;// 静态块保证只加载一次static {InputStream in JdbcUtils.class.getClassLoader…

python中seed的用法_Python中的seed()方法怎么用

Python中的seed()方法怎么用?下面是seed()方法的相关介绍: 描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。 语法 以下是 seed() 方法的语法:import random random.seed ( [x] ) 注意:seed(…

bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

在电脑当中弹出错误提示框可谓是多种多样,详细有很多电脑都有碰到过,最近有位win7系统用户在使用电脑的过程中,系统总是提示“explorer.exe应用程序错误”,用户不知道怎么解决这个问题,为此非常苦恼,那么wi…

json阅读器_Flutter小说阅读器系列一:使用Bloc模式获取起点小说关键字提示

Bloc模式下的小说关键字提示效果图最近难得有些闲暇时间,所以我又打算做一个小说阅读器,以前倒是用RNGolang写了一个,不过当时太过放飞自我导致自己看起来都很费力,这次我准备换成Flutter试一下。先简单将小说阅读器分为以下几个部…

python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助。 1、如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了。或者用 指向服务器路由get querystring。前端方面不需要python啊。…

python 初始化一个4维向量_看图学NumPy:掌握n维数组基础知识点,看这一篇就够了...

摘要:NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。国外有位程序员讲NumPy的基本运算以图解的方式写下来,让学习过程变得轻松有趣。 NumPy是Python的最重要的扩展程序库之一,也是入门机器学习编程的必备工具。然而对初学者来说,NumPy的大量运算…