一、环境
centos7、docker、mysql5.7、mycat-1.6.7.6
二、docker环境下的主从配置
1、编辑主库的my.cnf文件
1.1 使用docker命令导出主库容器中的my.cnf到当前目录下
docker cp lucid_davinci:/etc/mysql/my.cnf . //lucid_davinci为容器名 .代表当前目录下
1.2 修改my.cnf文件如下:
[mysqld]
skip-grant-tables
user=mysql
character-set-server=utf8
#binlog格式
binlog-format=ROW
#slave更新时是否记录到日志中
log-slave-updates=true
#启用二进制日志
log-bin=mysql-bin-master
#本机数据库 ID 标示,主从配置中ID要唯一
server-id=1
#可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-do-db=test
#不可以被从服务器复制的库
binlog-ignore-db=mysql
1.3 将my.cnf导入容器并重启
docker cp my.cnf suspicious_bose:/etc/mysql/my.cnf
docker restart suspicious_bose
2、在主库中添加slave用户和密码
docker exec -it suspicious_bose /bin/bash //进入容器
mysql -uroot -p //登陆mysql
CREATE USER 'resp'@'%' IDENTIFIED BY '*****'; //创建用户
GRANT REPLICATION SLAVE ON *.* TO 'resp'@'%'; //给用户赋权
注:配置主从前,需保证同步的数据库完全一致
3、编辑主库的my.cnf文件
3.1 步骤与主库相同,修改内容为:
[mysqld]
skip-grant-tables
user=mysql
character-set-server=utf8
#本机数据库 ID 标示,主从配置中ID要唯一
server-id=2
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
bind-address = 0.0.0.0
3.2 进入从库容器并登陆MySQL
docker exec -it lucid_davinci /bin/bash // 进入容器
mysql -uroot -p // 登陆mysql
change master to master_host='***.**.**.***',master_user='slave',master_password='***'; // 设置主库的host和账号密码
start slave; // 开启主从模式
show slave status\G; // 查看状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.61
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000003
Read_Master_Log_Pos: 450
Relay_Log_File: node1-relay-bin.000004
Relay_Log_Pos: 677
Relay_Master_Log_File: mysql-bin-master.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
当Slave_IO_Running: Yes 、 Slave_SQL_Running: Yes时,代表主从配置完成
参数 | 作用 |
---|---|
Slave_IO_Running | 负责与 Master 主机的 IO 通信 |
Slave_SQL_Running | 负责自己的 slave mysql 进程 |
4、查看主库主从同步状态
[root@master ~]# mysql -u root -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show processlist\G
*************************** 1. row ***************************
Id: 8
User: slave
Host: node1:56922
db: NULL
Command: Binlog Dump
Time: 143
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
5、测试主从同步
5.1 在主服务器模拟程序插入数据
[root@master ~]# mysql -u root -p
mysql> use test;
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> insert into test1 values(1,'man')
-> ;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+------+------+
| id | name |
+------+------+
| 1 | man |
+------+------+
1 row in set (0.00 sec)
5.2 切换到从库进行查看
[root@slave~]# mysql -u root -p
mysql> select * from test.test1;
+------+------+
| id | name |
+------+------+
| 1 | man |
+------+------+
1 row in set (0.00 sec)
至此,主从配置完成
三、mycat实现读写分离
1、mycat下载安装
1.1 mycat是用java写的,所以需要下载安装openjdk
# yum源安装
yum search jdk
yum -y install java-1.8.0-openjdk.x86_64
# 查看jsk版本
java -version
1.2 安装mycat
$ cd /usr/local/src/
$ wget http://dl.mycat.org.cn/1.6.7.6/20211016233725/Mycat-server-1.6.7.6-release-20211016233725-linux.tar.gz
#mysql8的驱动
$ wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar
# 解压
# 解压
$ tar -zxvf Mycat-server-1.6.7.6-release-20211016233725-linux.tar.gz
# 改名(可忽略)
$ mv mycat/ mycat-1.6.7.6
# 移动到/usr/local目录
$ mv mycat-1.6.7.6/ /usr/local/
#替换mysql-connector-java-8.0.18.jar
$ cd /usr/local/mycat-1.6.7.6/lib
$ mv mysql-connector-java-8* /tmp
$ mv /usr/local/src/mysql-connector-java-8.0.18.jar .
2、配置mycat
# 进入配置文件目录,并查看文件
$ cd /usr/local/mycat-1.6.7.6/conf
# 修改server.xml
$ vi server.xml
# 修改底部管理员用户和只读用户信息及密码,配置schemas
123456
TESTDB
TESTDB
user
TESTDB
true
TESTDB
# 修改schema.xml
vi schema.xml
# 替换为以下内容
#此处的test为需要同步的库
select user()
#localhost替换为主从服务器公网地址,账号密码为ssh登陆方式
dataHost节点中的balance(负载均衡类型)属性值共四种情况:
3、启动并测试(一主一从)
# 启动
cd /usr/local/mycat-1.6.7.4/bin/
./mycat start
# 查看启动状态
./mycat status
# 使用工具连接
# IP:
# 端口:8066
# 用户名:root
# 密码:123456
# 创建测试表
create table t_data(`id`int not null primary key auto_increment, `value` varchar(255));
# 插入一条记录
insert into t_data(`value`) values('C3Stones');
# 查询
select * from t_data;
二主二从下,两主互为备份。