前提
已有mysql主从环境,dble环境,并且已经启动mysql和dble。可以参考我前面写的两篇文章。
修改dble配置文件
db.xml
<?xml version="1.0"?>
<!DOCTYPE dble:db SYSTEM "db.dtd">
<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
<dbGroup name="host_1" rwSplitMode="0" delayThreshold="100">
<heartbeat >select 1</heartbeat>
<dbInstance name="hostM1" url="10.11.33.211:3306" user="root" password="1017~Fulin" maxCon="1000" minCon="1000" primary="true" />
<dbInstance name="hostM2" url="10.11.33.212:3306" user="root" password="1017~Fulin" maxCon="1000" minCon="1000" primary="false" />
</dbGroup>
</dble:db>
user.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dble:user SYSTEM "user.dtd">
<dble:user xmlns:dble="http://dble.cloud/" version="4.0">
<managerUser name="admin" password="admin"/>
<shardingUser name="test" password="123456" schemas="testdb" readOnly="false" maxCon="20"/>
</dble:user>
sharding.xml
注意使用singleTable,而不是shardingTable
<?xml version="1.0"?>
<!DOCTYPE dble:sharding SYSTEM "sharding.dtd">
<dble:sharding xmlns:dble="http://dble.cloud/" version="4.0">
<schema name="testdb" >
<singleTable name="single" shardingNode="dn1"/>
</schema>
<shardingNode name="dn1" dbGroup="host_1" database="tb_single"/>
</dble:sharding>
因为没有使用分库分表,因此不用设置id自增,在建表语句中设置自增即可。
登录dble管理账号,检查配置文件并重新加载配置
## 登录dble管理账号,账号用户名和密码对应user.xml中的<managerUser name="admin" password="admin"/>
docker exec -it mysql mysql -uadmin -padmin -P9066 -h 10.11.33.211
## 检查配置文件是否有误
mysql> dryrun;
## 列名含义:
## TYPE: 错误类型, ⽐如XML表⽰xml配置错误, BACKEND表⽰后端连接错误
## LEVAL:错误级别: 分为WARNNING 和ERROR表,⼀般来说WARNNING错误不影响启动和使⽤, 但需要注意。
## DETAIL :错误详情
## 配置文件没有问题,则重新加载配置生效
mysql> reload @@config;
Query OK, 1 row affected (0.12 sec)
Reload config success
## 创建shardingNode
create database @@shardingNode ='dn1';
## 可以看到主从节点数据库上都已经创建tb_single库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tb_single |
+--------------------+
5 rows in set (0.00 sec)
登录使用账号,建表
#登录使用用户
docker exec -it mysql mysql -utest -p123456 -P8066 -h 10.11.33.211
## 可以先查看当前已经存在的databases;
mysql> show databases;
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
1 row in set (0.01 sec)
#使用schemas的表
use testdb;
# 创建表
CREATE TABLE `single` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
验证主从同步及复制
## 插入数据
INSERT INTO `single`(`name`) VALUES ("zhangsan");
INSERT INTO `single`(`name`) VALUES ("lisi");
## 可以登录主从节点查看这两条数据都存在
mysql> use tb_single;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------+
| Tables_in_tb_single |
+---------------------+
| single |
+---------------------+
1 row in set (0.00 sec)
mysql> select single;
ERROR 1054 (42S22): Unknown column 'single' in 'field list'
mysql> select * from single;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
## 此时,先关闭主节点,关于如何确定是否为主节点,可以通过以下命令,查看从节点ip地址来确定主节点。
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.11.33.211
Master_User: slave
Master_Port: 3306
[root@mysql1 ~]# docker stop mysql
mysql
## 关闭主节点后,再插入数据
INSERT INTO `single`(`name`) VALUES ("wangwu");
## 这时只有一个mysql节点在运行,可以看到多了一条wangwu的记录。
mysql> select * from single;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)
## 启动刚才停用的mysql节点
[root@mysql1 ~]# docker start mysql
mysql
## 登录mysql,查看single表中也存在wangwu这条数据。说明主从同步和复制是没有问题的。
docker exec -it mysql mysql -uroot -p1017~Fulin
use tb_single;
mysql> select * from single;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)