DOCKER部署mycat2+mysql8实现读写分离
DOCKER 部署MYSQL主从复制
mysql主节点部署
docker run -d -p 6606:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql-master mysql
etc/my.cnf 修改
[mysqld]中加入以下内容
log_bin server-id=1
创建同步用户并授予权限
create user 'mysqlSync'@'%' identified by '!@#123' require ssl;
grant replication slave on *.* to 'mysqlSync'@'%' ;
flush privileges;
重启容器
docker restart mysql-master
进入容器root用户登录mysql查看主节点状态(或者直接在myql客户端操作也可以)
docker exec -it mysql-master /bin/bash
mysql -uroot -p
输入密码登录成功后查询主节点状态
show master status ;
记下 file 和 Position 的值 从节点要用到
主从节点ssl通讯
将主节点/var/lib/mysql中的 ca.pem ,client-cert.pem ,client-key.pem 保存出来稍后拷贝到从节点容器中
mysql从节点部署
docker run -d -p 6607:3306 -p 33061:33060 -e MYSQL_ROOT_PASSWORD=root --name mysql-slave mysql
主从节点SSL通讯
将之前从主节点保存出来的 ca.pem ,client-cert.pem ,client-key.pem 拷贝到从节点容器中,路径自定义,这里我选择/home/ca/master_ca/
etc/my.cnf 修改
[mysqld]中加入以下内容
relay_log=relay-bin
relay_log_index=slave-relay-bin
server-id=2 # 注意server-id 要唯一
# Ca
ssl-ca=/home/ca/master_ca/ca.pem
ssl-cert=/home/ca/master_ca/client-cert.pem
ssl-key=/home/ca/master_ca/client-key.pem
重启从节点容器
docker restart mysql-slave
进入容器
docker exec -it mysql-slave /bin/bash
测试主从节点的ssl通讯是否正常
mysql --ssl-ca=/home/ca/master_ca/ca.pem --ssl-cert=/home/ca/master_ca/client-cert.pem --ssl-key=/home/ca/master_ca/client-key.pem -umysqlSync -p -h 主节点ip ;
输入密码后登录成功表示正常
退出同步用户登录后重新使用root用户登录从节点mysql设置主节点信息
退出同步用户登录
重新使用root用户登录从节点mysql
设置主节点信息
-- 设置主节点信息
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主节点ip',SOURCE_USER='mysqlSync',SOURCE_PASSWORD='!@#123',SOURCE_LOG_FILE='之前记在主节点查询到的file值',SOURCE_LOG_POS=之前在主节点查询到的Position的值,SOURCE_SSL=1,SOURCE_SSL_CA='/home/master_ca/ca.pem',SOURCE_SSL_CERT='/home/master_ca/client-cert.pem',SOURCE_SSL_KEY='/home/master_ca/client-key.pem';
-- 开启数据同步
start replica;
查询从节点状态
show slave status \G;
在主节点 新创建数据库或者其他操作验证主从复制成功
在主节点执行
CREATE DATABASE nacos;
查看主节点
查看从节点
至此 docker搭建mysql主从复制成功
DOCKER 部署MYCAT
创建mycat用户
在mysql主节点执行sql
CREATE USER 'mycat'@'%' IDENTIFIED BY '!@#123';
-- 必須要複的權限 mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
-- - 視情況賦值權限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;
创建mycat容器
docker run -d -p 8066:8066 -e ENV DATA_SOURCE_PASSWORD=root -e ENV DATA_SOURCE_URL=jdbc:mysql://宿主机ip:6606/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8 --name mycat2 zhangyx1619/mycat2:mysql-1.2.1
镜像mycat2zhangyx1619/mycat2:mysql-1.2.1 拥有以下环境变量需要根据实际情况进行设置
- ENV DATA_SOURCE_URL 主数据源链接
- ENV DATA_SOURCE_USER 主数据源登录用户
- ENV DATA_SOURCE_PASSWORD 主数据源登录密码
- ENV MYCAT_ROOT_PASSWORD mycat 的root用户密码
使用sqLyog链接 mycat
配置主从集群信息实现读写分离
创建逻辑库
-- 创建逻辑库
CREATE DATABASE nacos;
此时查看 /usr/local/mycat/conf/schemas/ 发现mycat自动创建了配置文件nacos.schema.json
查看nacos.schema.json内容
- customTables放置的是mycat默认的表的配置
- globalTables放置的是全局表的配置
- shardingTables放置分片表的配置
- normalTables放置普通表的配置
修改逻辑库
-- 修改逻辑库 指定nacos逻辑库默认的targetName, mycat会自动加载nacos下已经有的物理表或者视图作为单表.
/*+ mycat:createSchema{
"customTables":{},
"globalTables":{},
"normalTables":{},
"schemaName":"nacos",
"shardingTables":{},
"targetName":"prototype"
} */;
此时再次查看/usr/local/mycat/conf/schemas/nacos.schema.json发现已经自动加载单表boradtable在normalTables中了
此时的运行架构
添加从库数据源
/*+ mycat:createDataSource{
"name":"reader01",
"url":"jdbc:mysql://宿主机ip:6607/?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"password":"root"
} */;
-- 查询数据源
/*+ mycat:showDataSources{} */;
更新集群信息
/*! mycat:createCluster{"name":"prototype","masters":["prototypeDs"],"replicas":["reader01"]} */;
-- 查询集群信息
/*+ mycat:showClusters{} */;
此时的运行架构
验证
创建表
在新建的表中写入数据
insert into nacos.mycat_test values('123',@@hostname);
此时 主数据状态
从节点数据
故意修改从节点数据造成主从数据不一致
-- 在从节点mysql执行此sql
UPDATE nacos.mycat_test SET NAME=@@hostname WHERE id='123'
此时从节点数据
此时主节点数据
在mycat节点连续多次查询数据发现可以查询到不同的结果验证成功
发现可以查询到不同的结果,说明查询sql确实分别分发到了主节点和从节点执行了,至此读写分离实现成功
参考文章
https://blog.csdn.net/w329636271/article/details/119729831