主: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
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;
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。
8,主从切换验证:
- 停止主库,然后mycat登录进去看看是否能够进行读写操作。