主从复制 Mycat读写分离
Mycat不承担开展主从复制,主从复制是在MySQL上开展配备的。
以前读写分离是在Web运用,也就是TP5的database.php中配备的。如今大家立即在Mycat中配备。
每日任务标准以下:
mycat所属服务器:204.175.124.51
主连接点IP:125.22.28.4
主连接点的分块连接点:test1/test2/test3
从连接点IP:125.22.28.5 和 125.22.28.6
从连接点同歩主连接点的test1/test2/test3
test1~3的表t1是一个大表,将其数据信息按牙模型优化算法水准分割到test1~3中。
主连接点挂了时,从连接点仍然能够查数据信息。
打开主从复制廷时,当从连接点有廷时,则从主连接点获取数据。
1. 主从复制
125.22.28.4实际操作:
环境变量
server-id=4
log-bin=/var/lib/mysql/binlog
log-bin-index=/var/lib/mysql/binlog.index
binlog_format=mixed
expire_logs_days = 10
max_binlog_size = 100M
lower_case_table_names=1 # 忽视表名英文大小写
建立受权客户
grant replication slave on *.* to "repl"@"125.22.28.%" identified by "xxxxx";
查询master情况
show master status;
--------------- ---------- -------------- ------------------ -------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
--------------- ---------- -------------- ------------------ -------------------
| binlog.000001 | 448 | | | |
--------------- ---------- -------------- ------------------ -------------------
125.22.28.5实际操作:
改动uuid
select uuid();
vi /var/lib/mysql/auto.cnf
将查看到的uuid在auto.cnf中升级。
环境变量
server-id=5
relay-log=/var/lib/mysql/slave-bin
relay-log-index=/var/lib/mysql/slave-bin.index
replicate-do-db=test1
replicate-do-db=test2
replicate-do-db=test3
replicate-do-db=mysql
slave-skip-errors=all
binlog_format=mixed
lower_case_table_names=1 # 忽视表名英文大小写
偏向主连接点:
stop slave;
reset slave;
change master to master_host="125.22.28.4",master_user="repl",master_password="xxxxx",master_log_file="binlog.000001",master_log_pos=448;
start slave;
查询slave情况:
show slave status;
125.22.28.6实际操作跟上面一样
在 125.22.28.4中受权一个mycat客户,用以给mycat联接,2个从连接点也会转化成该客户。
grant all privileges on *.* to "mycat"@"204.175.124.51" identified by "opson12356";
在 125.22.28.4中建立test1~3,在从连接点也会转化成。
2.构建Mycat的读写分离
配备schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1,dn2,dn3">
<table name="t1" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="test1"></dataNode>
<dataNode name="dn2" dataHost="host1" database="test2"></dataNode>
<dataNode name="dn3" dataHost="host1" database="test3"></dataNode>
<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="125.22.28.4:3306" user="mycat" password="opson12356">
<readHost host="hostS1" url="125.22.28.5:3306" user="mycat" password="opson12356"></readHost>
<readHost host="hostS2" url="125.22.28.6:3306" user="mycat" password="opson12356"></readHost>
</writeHost>
</dataHost>
</mycat:schema>
必须留意的点:
<table>一定要特定primaryKey来特定分块的字段名。
rule="mod-long" 分块优化算法为牙模型
dataNode="dn1,dn2,dn3" 三个分块连接点(库),几个库就特定好多个dataNode
<dataHost> balance="1" 应用读写分离的负载均衡,仅有备份数据写连接点和读连接点才会开展读实际操作。写连接点不容易开展读实际操作只开展写实际操作。
switchType="2" slaveThreshold="100" 从连接点同歩廷时超出100就全自动转换
<heartbeat>show slave status</heartbeat> 读写分离的heartbeat要应用show slave status句子,而不是select user()句子。
<readHost>包到了<writeHost>里边,那麼当服务器点<writeHost>奔溃的情况下,从连接点<readHost>就没法开展读实际操作。
碰到的好多个难题:
1.<readHost>只有被包在<writeHost>里边,假如<readHost>和<writeHost>放到平级,运行mycat时便会出错。
2.mysql端还记得设定忽视表名英文大小写,lower_case_table_names=1 ,要不然会碰到许多不便。字段名英文大小写是会全自动忽视的。
3.配备server.xml
提升客户
<user name="u1">
<property name="password">xxx</property>
<property name="schemas">test</property>
</user>
4.运行mycat
mycat start # 后台程序,mycat console 是前台接待运作
mycat status # 查询情况
5.联接检测
mysql -h204.175.124.51 -uu1 -P8066 -pxxxxx
use test
# 插进一条句子
insert into t1 (`id`,`name`,`type_id`) values (320,'mls2ki',1);
# 查看
select * from t1;
试验纪录以下:
试着关掉主连接点服务器的MySQL服务项目再查看。发觉出错说
backend connect: java.lang.Throwable: java.net.ConnectException: Connection refused
表明主连接点挂了,从连接点查看便会不成功,合乎环境变量的设定。
试着关掉全部从连接点的MySQL服务项目再查看。
发觉出错说
backend connect: java.lang.Throwable: java.net.ConnectException: Connection refused
表明从连接点挂了以后,mycat不容易从主连接点开展查看(balance="1"的功效)。
关掉在其中从连接点1,打开从连接点2,发觉仍然能够查看。
关掉在其中从连接点2,打开从连接点1,发觉仍然能够查看。
表明负载均衡完成了(balance="1"的功效)。
如今大家期待主连接点关掉以后,从连接点依然能够开展读实际操作,能够将schema.xml的<dataHost>一部分改动为:
<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="125.22.28.4:3306" user="mycat" password="opson12356"></writeHost>
<writeHost host="hostS1" url="125.22.28.5:3306" user="mycat" password="opson12356"></readHost>
<writeHost host="hostS2" url="125.22.28.6:3306" user="mycat" password="opson12356"></readHost>
</dataHost>
其关键是
将以前的2个<readHost>标识改成<writeHost>标识。那样主连接点hostM1挂了后,从连接点依然能够查看。
将swichType改成-1,那样主连接点挂了以后,从连接点不容易转换为主导连接点来载入数据信息,由于假如从连接点载入数据信息,会导致多节点的数据信息不统一。
这一事例也表明:
从连接点并不是一定要用<readHost>标识。用<writeHost>的连接点还可以是以连接点。为了更好地区别writeHost的连接点是主连接点還是从连接点,可以用hostM1和hostS1来区别,自然这仅仅个姓名,除开区别并沒有具体功效。
试验纪录以下:
试着关掉主连接点服务器的MySQL服务项目再在Mycat查看,仍然能够查看。可是在mycat中没法载入,表明从连接点并沒有转换为主导连接点出任写的每日任务
发觉插进以后,查看到的数据信息沒有新数据,有同歩廷时。这时能够将switchType改成2,balance改成2,当有延迟时间的情况下便会从主连接点载入而不容易从连接点载入。可是假如主连接点挂了,从连接点便会代替主连接点开展写,它是不太好的地区。