Linux+Mysql多实例主从复制+Mycat读写分离(实战总结)
文章有点长,请耐心细心的阅读!!!!!!!
先说说环境吧:
主服务器:192.168.222.120 3306
从服务器:192.168.222.120 3307
mysql版本软件:yum安装mysql 5.1版本
java版本软件:jdk-8u161-linux-i586.rpm 相应的软件下载请点击
mycat版本软件:Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz 软件下载请点击,其他版本软件自行搜索
再说说想实现的功能吧:
主从服务器的数据库复制备份,通过mycat中间件实现读写分离
1.在linux同一台主机下面搭建两个mysql 实例并实现主从复制
具体的实现过程请参照之前的两篇博文,请移步:
在linux同一台主机下面搭建两个mysql 实例并实现主从复制(一)
在linux同一台主机下面搭建两个mysql 实例并实现主从复制(二)
2.java环境搭建
由于是java开发的mycat,因此先得搭建java环境,
用之前准备好的jdk-8u161-linux-i586.rpm安装包进行安装,安装好后进行检查。命令如下:
rpm -ivh jdk-8u161-linux-i586.rpm #用rpm方式安装
java -version #检查java安装情况
如果显示如下类似信息即可:
[root@localhost ~]# java -version java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) Client VM (build 25.161-b12, mixed mode, sharing)
3.mycat的配置与启动
①把之前的Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz进行解包解压得到mycat目录
[root@localhost ~]# tar -xzvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
②进入Mycat目录里的conf目录
[root@localhost ~]#cd mycat/conf
③先编辑server.xml
[root@localhost conf]# vi server.xml
34 <user name="test"> 35 <property name="password">test</property> 36 <property name="schemas">TESTDB</property> 37 </user> 38 39 <user name="user"> 40 <property name="password">user</property> 41 <property name="schemas">TESTDB</property> 42 <property name="readOnly">true</property> 43 </user> <!--以上配置的是连接mycat的用户名和密码-->
大概文档的34~43行,这儿做一个解释:
//34行配置中name是应用连接中间件逻辑库的用户名,35行配置中password是应用连接中间件逻辑库的密码。
//36行中的TESTDB是定义的MyCat的逻辑库,必须与schema.xml中的一致,逻辑库的概念与MySQL中的 database 概念相同,schemas中可以配置一个或多个。
//42行中的readOnly是应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。
④再编辑schema.xml
[root@localhost conf]# vi schema.xml
由于我们仅仅是做的读写分离,所以这个文件当中仅精简成如下的文字
仅仅主从读写分离的配置如下:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <!-- 定义MyCat的逻辑库TESTDB,逻辑库的概念与MySQL中的 database 概念相同 --> <dataNode name="dn1" dataHost="localhost1" database="test" /> <!--上面的database属性设置的就是你要连接的数据库test,其他可以不用变--> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <!--设置执行写操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记!--> <writeHost host="hostM1" url="192.168.222.120:3306" user="root" password="123456"> <!-- 以下是设置多个执行读操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记! --> <readHost host="hostS1" url="192.168.222.120:3307" user="root" password="123456"/> </writeHost> </dataHost> </mycat:schema>
主挂掉之后自动切换到从的配置如下
(主从切换后,从写了数据,如原来的主库恢复后,在mycat上做写操作,后台mysql写库还是原来的从库,这个时候就会报错,主从连接失败,原因是从库会再重新从主库同步所有的数据,但是从库已经有了,所以就会报错,可以采取下面办法在原从库上一个个忽略过后,就正常了,没有报错:
stop slave; set global sql_slave_skip_counter=1; start slave; show slave status\G;
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <!-- 定义MyCat的逻辑库TESTDB,逻辑库的概念与MySQL中的 database 概念相同 --> <dataNode name="dn1" dataHost="localhost1" database="test" /> <!--上面的database属性设置的就是你要连接的数据库test,其他可以不用变--> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <!-- 使用Mycat托管MySQL主从服务器 --> <!-- can have multi write hosts --> <!--设置执行写操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记!--> <writeHost host="hostM1" url="192.168.222.120:3306" user="root" password="123456"> <!-- 以下是设置多个执行读操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记! --> <readHost host="hostS1" url="192.168.222.120:3307" user="root" password="123456"/> </writeHost> <writeHost host="hostM2" url="192.168.222.120:3307" user="root" password="123456"/> <!-- 以上的设置是多设置一个可以写的主机 --> </dataHost> </mycat:schema>
PS:上面定义了hostM1、hostM2,放在上面的是默认起的那套系统。一定要多个writeHost,这样上面的readHost还可以用。
配置说明:
name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的
writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance属性负载均衡类型,目前的取值有4种:
1.balance="0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2.balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1- >S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3.balance="2",所有读操作都随机的在writeHost、readhost上分发。
4.balance="3",所有读请求随机的分发到wiriterHost对应的readhost去,writerHost不负担读压力,注意balance=3 只在1.4及其以后版本有,1.3没有。
writeType属性负载均衡类型,目前的取值有3种:
1.writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后 已切换后的为准,切换记录在配置文件中:dnindex.properties.
2.writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。
3.writeType="2",不执行写操作
switchType属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换
3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)
心跳语句为show status like‘wsrep%’
writeHost标签、readHost标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”
⑤wrapper.xml编辑
[root@localhost conf]# vi wrapper.xml
修改当中的大概36/37号内容如下:
36 wrapper.java.additional.10=-Xmx512M
37 wrapper.java.additional.11=-Xms64M
主要是虚拟机安装的需要把容量调低点!
⑥启动mycat服务
切换到mycat目录下的bin目录,执行./mycat start,然后用ps -ef | grep mycat检查是否启动
[root@localhost conf]# cd ../bin [root@localhost bin]#./mycat start Starting Mycat-server... [root@localhost bin]# cat ../logs/wrapper.log
执行cat ../logs/wrapper.log 如果是下面的结果就表示成功启动。如果启动的时候就失败了,查看日志文件去解决!
MyCAT Server startup successfully. see logs in logs/mycat.lo //有这句就成功了!!!!
4.测试
mycat的连接方式与mysql的连接方式一样,只不过端口不同而已,mycat默认连接端口为8066,我这里使用的是Navicat连接测试,用户名和密码都是前面设置的test
登陆进去开看到TESTDB数据库,其实就是对应的192.168.222.120主数据库中的TEST数据库,可以测试在主数据库建表table1,刷新TESTDB数据库,可以发现已经有了,同理做其它测试。
5.读写分离测试
①修改日志为debug
[root@localhost bin]# vi ../conf/log4j.xml
修改里面内容为value=debug
<root> <level value="debug" /> <appender-ref ref="FILE" /> <!--<appender-ref ref="FILE" />--> </root>
②查看日志进行测试
[root@localhost bin]# tail ../logs/mycat.log
6.总结
其实还有很多未完善的功能,希望这是一个抛砖引玉吧!!!
综上,Linux+Mysql多实例主从复制+Mycat读写分离集群配置成功。
您阅读这篇文章共花了: