mycat之读写分离

语言: CN / TW / HK

主:10.10.10.100
从:10.10.10.200

1,先做好主从同步

2,mycat安装配置:

[root@master ~]# tar xvf Mycat-server-1.6-release-linux.tar
[root@master ~]# mv mycat /usr/local/mycat
[root@master ~]# tar xvf jdk-7u79-linux-x64.tar.gz
[root@master ~]# mv jdk1.7.0_79 /usr/local/
[root@master conf]# cd /usr/local/mycat/conf
[root@master conf]# vi wrapper.conf               #修改java路径
       wrapper.java.command=/usr/local/jdk1.7.0_79/bin/java
[root@master logs]# cat ~/.bash_profile  |grep mycat
PATH=$PATH:$HOME/bin:/usr/local/mycat/bin

3,修改配置文件如下:

[root@master conf]# cat schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="guo" />                                        //dn1和dn2这个名字可以随意,不用修改。这个表示,数据库TESTDB中只有一个实例guo,TESETDB2中有一个实例jia
<dataNode name="dn2" dataHost="localhost1" database="jia" />                                        //这种是适用于一个mysql中有多个物理数据库都要进行读写分离的情况。
<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 -->
<writeHost host="master" url="10.10.10.100:3306" user="root" password="123456">                        
   <!-- can have multi read hosts -->
   <readHost host="slave" url="10.10.10.200:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>

guo:这个是在真实数据库中的数据库实例,如果有多个库要实现读写分离,多配置几行。dn1和dn2两个名称随意配置

balance=0 不开启读写分离机制,所有读操作都发送到当前可用的writehost
balance=1 全部的读节点与备用的写节点参与select语句的负载均衡
balance=2 所有读操作都随机的在readhost和writehost上分发

writeType,负载均衡类型,目前的取值有3种:
writeType="0", 所有写操作发送到配置的第一个writeHost。
writeType="1",所有写操作都随机的发送到配置的writeHost,该参数1.5版本以后废弃不用了。
writeType="2",不执行写操作。

switchType=-1 表示主从不自动切换
switchType=1  默认值,自动切换
switchType=2  基于MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status
MyCAT心跳检查询句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running","Slave_SQL_Running" 三个字段来确定当前主从同步的状态及Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久以前的旧数据,当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主仅同步,可安全切换,否则不会切换。

writeHost host="hostM1":host和主机名一致


修改server.xml配置文件:
[root@master conf]# tail -12 server.xml
       </system>
       <user name="test">
               <property name="password">test</property>
               <property name="schemas">TESTDB,TESTDB2</property>
       </user>
       <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property>
               <property name="weight">1</property> </node> </cluster> -->
       <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property>
               </host> </quarantine> -->

mycat登录的用户名密码和mycat连接进去显示的逻辑数据库名
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066

4,启动mycat后验证读写分离:

[root@master bin]# ./mycat start
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066

image
RS_CODE 值为1表示正常情况

5,测试:

打开mycat的log4j.xml文件,修改日志级别info为debug,重启mycat
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P8066
mysql> create table user(id int primary key, name varchar(20));
mysql> insert into user values(100000,test);                                
mysql>select * from user;

image

6,mycat管理:

目前mycat有两个端口,8066数据端口,9066管理端口。
[root@master bin]#  mysql -utest -ptest -h10.10.10.100 -P9066
msyql> show @@help;
msyql> show @@heartbeat;                //RS_CODE为1表示心跳正常
msyql> show @@cache;                //MAX为缓存的最大值(记录个数),CUR为当前已经在缓存中的数量,ACESS为缓存读次数,HIT为缓存命中次数,PUT                                         
                                               为写缓存次数,LAST_XX为最后操作时间戳,比较重要的几个参数:CUR:若CUR接近MAX,而PUT大于MAX很多,则表明MAX需要增大,HIT/ACCESS为缓存命中率,这个值越高越好。
msyql> show @@datasource;
mysql> show @@datanode;                 //包括每个数据节点当前活动连接数(active),空闲连接数(idle)以及最大连接数(maxCon) size,EXECUTE参数表示从该节点获取连接的次数,次数越多,说明访问该节点越多。
mysql> show @@version;
mysql> show @@connection;
mysql> show @@backend;                //显示mycat后端连接状态
mysql> show @@threadpool;                //当前线程池的执行情况,是否有积压(active_count)以及task_queue_size,后者为积压的待处理的SQL,若积压数目一直保值,则说明后端物理连接可能不够或者SQL执行比较缓慢。
mysql> Kill @@connection                //杀掉客户端的连接,参数为连接的ID值,通过show @@connection,可以展示当前连接到MyCAT的所有客户端进程,若某个进程异常,则可以通过该命令杀掉连接,如KILL @@CONNECTION 1;
mysql> show @@processor;                      //显示当前processors的处理情况,包括每个processor的IO吞吐量(NET_IN/NET_OUT)、IO队列的积压情况(R_QUEY/W_QUEUE),Socket Buffer Pool的使用情况 BU_PERCENT为已使用的百分比、BU_WARNS为Socket Buffer Pool不够时,临时创建的新的BUFFER的次数,若百分比经常超过90%并且BU_WARNS>0,则表明BUFFER不够,需要增大,参见性能调优手册。

7,主从切换:

  • 如果只有一个writeHost,主挂了,整个mysql就无法使用了,读也不能用,mycat能够进行自动主从切换的前提是必须要有2个writeHost。
    image

8,主从切换验证:

  • 停止主库,然后mycat登录进去看看是否能够进行读写操作。
分享到: