此文仅做记录,欢迎大佬指正错误,如果能帮到你那就更好啦
还未创建主从复制,看这篇文章 。需要使用之前创建的三个数据库
https://blog.csdn.net/yj1414158414/article/details/129274386
吐槽一下学习中的坑, 一模一样的写法,昨天可以,今天就不行。网上有的方案还解决不了,只有重装系统。神奇的是重装系统之后可以使用了,真想打人
真实项目不适用docker创建多个数据库,这里只是模拟一下多服务器的操作
一、服务器版本
- CentOS7.6
- mysql 8.0.21
二、创建mysql容器
docker run --restart=always --name mysqltest4 -v /data/mysqltest4/conf:/etc/mysql -v /data/mysqltest4/data:/var/lib/mysql -v /data/mysqltest4/log:/var/log -v /data/mysqltest4/mysql-files:/var/lib/mysql-files -p 3311:3306 -e MYSQL_ROOT_PASSWORD='123456' -d mysql:8.0.21
执行docker ps
出现下图说明启动成功。
三、配置mysqltest4
//进入容器
docker exec -it mysqltest4 /bin/bash
//编辑配置
vim /etc/my.cnf
输入以下配置,按esc键,输入
:wq
保存
server-id 服务器唯一id,auto_increment_increment 代表有两台主数据库
auto_increment_offset 代表这是第二台服务器, log-slave-updates 共联同步
log-bin 开启二进制日志文件
[mysqld]
server-id=3311
auto_increment_increment=2
auto_increment_offset=2
log-slave-updates=1
log-bin = mysql-bin-3311
添加具有复制权限的用户,一步一步执行。这里创建的用户是给mysqltest1使用的,用于同步数据
需要先登录mysqlmysql -uroot -p123456
//slaveuser1:用户名,slaveuser1@qq.com:密码
create user slaveuser2@'%' identified by 'slaveuser2@qq.com';
//REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'%'WITH GRANT OPTION;
//刷新权限
flush privileges;
//查看Master的状态
show master status;
配置同步mysqltest1
//执行前先停下slave
stop slave;
//这是从库和主库连接的关键一步,master_host是主库的ip,master_user是前面创建的slaveuser1用户,master_password是密码,master_log_file和master_log_pos是主库show master status的信息,master_port 主数据库的端口
change master to
master_host='162.14.115.68',master_user='slaveuser1',master_password='slaveuser1@qq.com',
master_port=3308,master_log_file='mysql-bin-3308.000001',master_log_pos=886;
//执行后启动slave。
start slave;
配置完成之后退出mysqltest4容器
三、配置mysqltest1
//进入mysqltest1容器
docker exec -it mysqltest1 /bin/bash
//编辑配置文件
vim /etc/my.cnf
在my.cnf里面新增配置如下
auto_increment_increment=2
auto_increment_offset=1
log-slave-updates=1
重启mysqltest1,然后登录数据库后一步一步执行
//停止同步
stop slave;
//修改同步的信息
change master to
master_host='162.14.115.68',master_user='slaveuser2',master_password='slaveuser2@qq.com',
master_port=3311,master_log_file='mysql-bin-3311.000004',master_log_pos=901;
//执行后启动slave。
start slave;
四、总结
主主复制和主从复制其实就一点区别,新加了个服务器mysqltest4,并配置mysqltest1同步mysqltest4数据,之前只是mysqltest4去同步mysqltest1。
可以自由的增加节点,写的多就增加主服务器,读的多就增加从服务器
五、注意
在所有的配置完成之后,进入每一个mysql容器,然后登录mysql,执行一下
show slave status\G;
,看看是不是两个yes。如果不是,请看下面的内容。
5.1、去对应的主服务器查询,show master status;
。然后去修改对应的数据就行了。
例子如下:比如说mysqltest1的Slave_IO_Running:No/Connecting就应该去查询mysqltest4的状态
//进入mysqltest4容器
docker exec -it mysqltest4 /bin/bash
//登录mysql
mysql -uroot -p123456
//查看状态
show master status;
//然后将对应的两个值复制出来,进入mysqltest1容器,登录数据库
//先停止mysqltest1的同步
stop slave;
//修改同步的信息
change master to
master_host='162.14.115.68',master_user='slaveuser2',master_password='slaveuser2@qq.com',
master_port=3311,master_log_file='mysql-bin-3311.000005',master_log_pos=950;
//重新启动
start slave;
//到这里就能解决问题了,如果还是有问题,就重启容器,或者看5.2
//然后重新执行一下步骤五的流程。
5.2、请求服务器公钥
重启mysqltest1之后出现的问题error connecting to master 'slaveuser1@162.14.115.68:3308' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
//两种办法随便一个
//1、进入mysqltest4容器后执行。root 123456是mysqltest4的连接信息, 3308是mysqltest1的端口
mysql -uroot -p123456 -h 162.14.115.68 -P3308 --get-server-public-key
//2、在对应数据库执行
ALTER USER 'slaveuser2'@'%' IDENTIFIED WITH mysql_native_password BY 'slaveuser2@qq.com';