前面已经写了mycat的目录基本介绍,还有需要准备的用户,这次就简单说一下mycat的读写分离的实现。

使用mycat之前先讲一下读写分离的两个重要文件,一下内容基本上属于官方的原话

server.xml 包含了mycat的系统配置信息,分别两个标签user,system,是mycat的调优关键
schema.xml 涵盖了Mycat的逻辑库,表,分片规则,分片节点及数据源


首先配置mycat读写分离时你需要清楚添加mycat结构后是一个什么样的结构,也就是本来没使用Mycat之前你的结构是nginx或者Apache直接访问,之前是做mysql的用户验证,但是现在不同的是你现在需要找Mycat这哥们去做认证了,也就是你刚才创建的mysql_r还有w都是在给mycat打工,那么这个时候我们需要在mycat上配置一个用户供nginx等程序连接


配置认证用户server.xml


[root@Mycat01 conf]# vim /usr/local/mycat/conf/server.xml +80
	      ##这里我定义一个用户www,这个用户主要执行增删改查操作
		www     ##他的密码我定义为和他名字相同
		pcard,job,shop  ##和schema.xml里的schema对应,多个用schma用“,”隔开
	

	            ##这里我定义一个用户rrr,对于连接到这个用户的人,只能执行查询操作
		rrr         ##定义密码
		pcard,job,shop    ##和schema.xml里的schema对应
		true        ##只读
	


配置数据源schma.xml

认证用户配置完成后,配置schma.xml


这个配置文件里面对与读写分离来说需要配置的点有schema,dataNode,dataHost。





        
        
        
        
        
        


        
        
        
        

基本的逻辑是这样的:


当用户认证mycat访问后,首先读取定义的schemas表里的pcard,而pcard只是mycat里的逻辑数据库名字,也就是你连上mycat后所看到的数据库名字,他不一定是真实数据库名字,因为pcard来自schema.xml上的schema进行的定义,pcard应着DataNode里的dn1,dn1是上定义了后端数据库真实的数据库名和datahost。



到以上几部基本上请求通过mycat已经知道了他的真实数据库名字,但是似乎还不知道这些库在哪些主机上。是的你可能看到了DataNode上有datahost,我第一次配置的时候就以为这个东西是需要我写详细的主机IP,但是这里也是一个逻辑的地址,这里赐予他法号:locahost1,这里的localhost1代表一个数据库架构,他可能是一主多从,多主多从等等具体他是什么架构继续往下配置datahost标签:



        
                select user()

name:这里的name对应DataNode1的datahost,唯一标示datahost,供上层标签使用


maxCon:指定每个读写实例连接池的最大连接数。内嵌writeHost、readHost,都会使用这个属性的值来实例化连接池的做大连接数


minCon:初始化最初连接池的大小


balance:负载均衡类型,目前有四种值

  • balance="0":  不开启读写分离机制,所有操作都发送到当前可用的writeHost上

  • balance="1":  全部的readHost与双主模式下备用writeHost都参与select语句的负载均衡,简而言之在双主双主双从模式下(M1->S1 M2->S2 M1和M2互为主备)时,M2、S1、S2都会参与select语句的负载均衡

  • balance="2"  所有的读操作都随机在writeHost和readHost上分发

  • balance="3"  所有的读请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance=3只在Mycat 1.4版本及以后中有

   

 writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后,不会再切回来,切换记录在配置文件中:dnindex.properties .


switchType    故障自动切换下台可用writeHost属性

  • switchType="-1"  表示不自动切换

  • switchType="1"   默认值,表示自动切换 

  • switchType="2"   表示基于MySQL主从同步状态决定切换,心跳语句:show slave status

  • switchType="3"   表示基于MySQL Galary Cluster的切换机制,1.4.1以上支持  心跳语句:show status like 'wsrep%' 


配置完上面负载均衡等策略之后开始正式配置具体数据库真实IP位置,以及一主多从或其他架构

                

                        
                        
           
                


到这一部基本上读写分离的配置就已经说完了,刚开始我理解的时候,也是很绕,但是当你理解了之后你可能就明白了,其实很简单。


现在待着需求去完整的看一下配置文件的内容吧(读写分离无关的无分片需求可以全部删掉,我的已经删掉)


总览配置文件理清思路

需求:

    一主两从架构,基于主从复制。通过mycat去配置成通过mycat的用户www和rrr连接管理三个数据库“pcard,job,shop”,读请求全部交给两台从机来处理,写请求交给Master来处理。






        
        
        
        
        
        


        
        
        





        
                select user()


                

                        
                        
                
                
                

                          
                
         


当前配置缺陷

目前这个配置,如果Master如果发生宕机,那么整个MySQL将不能读和写,你可能很疑惑,我写主机宕机,但是我从机是正常的啊。这个是mycat的一个定义,如果当前wirteHost内hostM1发生故障整个writeHost将全部失效,读和写都不能使用,为了防止这种现象,我们可以在当前内再添加一个writeHost,作为故障转移节点,当正在使用的出现故障后,立即切换到这个备用节点上,为了防止他读取都不行,我们设置从机备用节点的主,为了保证数据一致性,给予读取权限即可


配置完毕后启动mycat

[root@Mycat01 bin]# ./mycat start
[root@Mycat01 bin]# netstat -tunlp|grep 8066                ##数据端口,增删改查连接此端口
tcp        0      0 :::8066                     :::*                        LISTEN      5308/java           
[root@Mycat01 bin]# netstat -tunlp|grep 9066                ##管理mycat连接该端口
tcp        0      0 :::9066                     :::*                        LISTEN      5308/java

若启动不成功则查看错误日志,或者使用./mycat console查看报错

[root@Mycat01 bin]# tail -f /usr/local/mycat/logs/wrapper.log     ##方法一,看错误日志

[root@Mycat01 bin]# ./mycat console         #方法二,看错误被抛出


判断读写分离是否成功

可以分析mycat执行日志,首先将mycat的日志级别改为“debug”分析执行过程

[root@Mycat01 ~]# cd /usr/local/mycat/conf
[root@Mycat01 conf]# vim log4j2.xml +25
...
        
...
[root@Mycat01 conf]# tail -f ../logs/mycat.log


mycat连接密码加密

生成密码

[root@mycat01 util]# cp /usr/local/mycat/lib/Mycat-server-1.6-RELEASE.jar /tmp/
[root@mycat01 util]# cd /tmp/
[root@mycat01 tmp]# find /tmp/ -name DecryptUtil.class
/tmp/io/mycat/util/DecryptUtil.class
[root@mycat01 tmp]#

io.mycat.util.DecryptUtil”这个参数不同版本位置好像是不一样的

[root@mycat01 ~]# cd /usr/local/mycat/lib
[root@mycat01 lib]# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 0:www:mycat
adlOhoF7ckeMAqFhsDZCTqF3nQ21mz5V4Zh6P40sWjC83bJ//oThaVmyMmA2NsT27b1SkPqJfV/Jz1f0K8gVUQ==
[root@mycat01 lib]# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 0:rrr:mycat
iyPrHL3FHTqgZ41keJs0vjHKg4h6gshP2wgm8zvThEM4nF7YvlS0RXJrgiFrUM1re5Xu21e+pYA7rigtZcMxPg==

启用server.xml的参数

1        ## 0为不启用  1为开启加密   默认没有该段,需要自行添加

[root@mycat01 conf]# vim server.xml 
...
        
                adlOhoF7ckeMAqFhsDZCTqF3nQ21mz5V4Zh6P40sWjC83bJ//oThaVmyMmA2NsT27b1SkPqJfV/Jz1f0K8gVUQ==

                aaa,bbb,ccc
                1
        

        
                iyPrHL3FHTqgZ41keJs0vjHKg4h6gshP2wgm8zvThEM4nF7YvlS0RXJrgiFrUM1re5Xu21e+pYA7rigtZcMxPg==

                aaa,bbb,ccc
                true
                1

        
...

配置schema.xml连接密码加密

生成密码:

[root@PEMYCAT01 lib]# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:hostM1:mycat_w:mycat_w
bx6dlhLF/HO91kBhtBmUWJcChH11IDlzOJgCXbPuqMQdDQVSapUnUnSQ+bM2yEGViE7baZh57PpKIuaLZOR0Mg==
[root@PEMYCAT01 lib]# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:hostS2:mycat_r:mycat_r
T1P7V3C0bc9lYsMX7MNso6N+pRkmdFLrllZPNj9vb51NePlmzsA7gzQp4qz8utAgRHimsJ0yn+P4ixLhSTtg6w==
[root@PEMYCAT01 lib]# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:hostS3:mycat_r:mycat_r
Fdb6g0O94p0LOw7WLzDnY8yzaCD1NtJhG5EJI11z0JHK99SLEYryCGOyOTg3Bmnog7tC4R0zjWsuEPISbvPF8Q==
[root@PEMYCAT01 lib]#

配置密码加密:

                

                        
                        
                

                

                        
                


        

注:记得在标签内添加:usingDecrypt="1"


重启Mycat,若无报错即可

[root@mycat01 bin]# ./mycat start