主服务器: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中间件实现读写分离
具体的实现过程请参照之前的两篇博文,请移步:
在linux同一台主机下面搭建两个mysql 实例并实现主从复制(一)
在linux同一台主机下面搭建两个mysql 实例并实现主从复制(二)
由于是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)
①把之前的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>
name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的
writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。
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没有。
1.writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后 已切换后的为准,切换记录在配置文件中:dnindex.properties.
2.writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。
3.writeType="2",不执行写操作
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换
3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)
心跳语句为show status like‘wsrep%’
这两个标签都指定后端数据库的相关配置给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 //有这句就成功了!!!!
mycat的连接方式与mysql的连接方式一样,只不过端口不同而已,mycat默认连接端口为8066,我这里使用的是Navicat连接测试,用户名和密码都是前面设置的test
登陆进去开看到TESTDB数据库,其实就是对应的192.168.222.120主数据库中的TEST数据库,可以测试在主数据库建表table1,刷新TESTDB数据库,可以发现已经有了,同理做其它测试。
①修改日志为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
其实还有很多未完善的功能,希望这是一个抛砖引玉吧!!!