在正在使用的DN1-1 192.168.2.220节点上创建一个可以远程登陆的用户这里使用root作为测试,在生产环境中对于库是要配置专门管理库的用户以及登陆ip的权限
grant all privileges on *.* to root@'192.168.2.%' identified by 'qwe123';
flush privileges;
配置配置文件
cd /tools/mycat/conf/
mv schema.xml schema.xml.ba
添加新的配置文件实现读写分离高可用
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>
<dataNode name="dn1" dataHost="localhost1" database= "hellodb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="192.168.2.220:3306" user="root" password="qwe123">
<readHost host="db2" url="192.168.2.221:3306" user="root" password="qwe123" />
</writeHost>
<writeHost host="db3" url="192.168.2.222:3306" user="root" password="qwe123">
<readHost host="db4" url="192.168.2.223:3306" user="root" password="qwe123" />
</writeHost>
</dataHost>
</mycat:schema>
EOF
balance="2"修改此参数让所有的节点都变为可读并且是随机分配
database= "hellodb"被管理的库是hellodb
重启mycat
[root@mycat conf]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
登陆mycat进行读写分离和高可用测试
mysql -uroot -p123456 -h 127.0.0.1 -P8066
读写分离
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 11 |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 10 |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 13 |
+---------------+-------+
1 row in set (0.01 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 12 |
+---------------+-------+
1 row in set (0.00 sec)
通过serverid可以看到所有的节点都是读节点
而写节点只有一台
MySQL [(none)]> begin;show variables like 'server_id';commit;
Query OK, 0 rows affected (0.00 sec)
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 10 |
+---------------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
生产中如故写业务比较多可以配置writeType=“1”,但是要配置主和备主之间,定义字段增长的id字段的数值范围为奇偶
在使用的主
auto-increment-offset = 1 开始点是1
auto-increment-increment = 2 每次数据库写入插入id增长加2,开始为1,然后3,5,7,
备用的主
auto-increment-offset = 2 开始点是2
auto-increment-increment = 2 每次数据库写入插入id增长加2,开始为2,然后4.6.8
高可用测试
停止掉正在使用的主库
[root@dn1-1-master ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
在mycat进程读写操作测试
读操作
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 12 |
+---------------+-------+
1 row in set (0.01 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 13 |
+---------------+-------+
1 row in set (0.00 sec)
可以看到只有第二组分片的在使用,默认当第一组分片主节点挂了,从是不被容许使用的
可以使用此参数tempReadHostAvailable="1"让挂了的主的从库临时使用
tempReadHostAvailable="1"表示主库挂了,跟着挂了的主库的从库还是可以使用,默认主库挂了,跟着的从库就不可以使用,添加此参数就可以临时使用,但不推荐使用
会跟原主库的从库会跟备用主库的从库的数据库不一致,会出现查询问题
写操作
MySQL [(none)]> begin;show variables like 'server_id';commit;
Query OK, 0 rows affected (0.00 sec)
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 12 |
+---------------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
从原来分片dn1-1的serverid为11的节点变为了分片dn2-1的serverid为12的备用主库上面了
恢复原来的主库进行测试
[root@dn1-1-master ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
读操作
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 13 |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 11 |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 10 |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 12 |
+---------------+-------+
1 row in set (0.00 sec)
所有的分片节点都可以进行读操作了
写操作
MySQL [(none)]> begin;show variables like 'server_id';commit;
Query OK, 0 rows affected (0.00 sec)
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 12 |
+---------------+-------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
当原来进行写操作的主挂掉后,备的变为写的主库,当原写操作主库恢复,原来的备主就变为写操作的主,原来的写操作的主变为备主