Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)

Docker搭建Mysql8.x主从集群

首先先去pull一个mysql镜像,不写版本自动就是8.0+,结尾链接搭建完直接去实战

第一步

首先准备两个配置文件,my.cnf,你可以去网上copy一份,也可以按照这种方法,先启动一个mysql容器,就配置个密码能进去就可以,主要为了看一下配置文件的位置

docker run -d--name mysqltest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

进去之后查找一下,发现位置在/etc/mysql/my.cnf
Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)_第1张图片
然后把它拷贝到宿主机来,拷贝两份一样的,一份master,一份slave一会会改配置

docker cp mysqltest:/etc/mysql/my.cnf  /home/mysql/master
docker cp mysqltest:/etc/mysql/my.cnf  /home/mysql/slave

然后分别修改一下配置文件,这里就不截全了,只看mysqld下面内容,首先是master的配置文件

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
skip-name-resolve
wait_timeout=31536000  
interactive_timeout=31536000
secure-file-priv= NULL
server-id=2 #服务器唯一ID这个必须要
log-bin=master-bin #开启binlog
log_bin_index =master-bin.index
#binlog_do_db= #同步所有库
binlog_ignore_db=mysql
user=mysql
character_set_server=utf8
init_connect='SET NAMES utf8'
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

然后是slave的配置文件

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
server-id=3
user=mysql
read_only = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay-log = slave-relay-bin
character_set_server=utf8
init_connect='SET NAMES utf8'
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

然后配置一个mysql网络,用来实现通信(为了学习方便,单机这样,如果是生产环境多机情况,则推荐使用host模式

docker network create --subnet 172.6.0.0/16 mysqlnet

然后先启动master配置一个新的账号,slave使用这个账号连接master

docker run -d --network mysqlnet --ip 172.6.0.2 -v /home/mysql/master/my.cnf:/etc/mysql/my.cnf --name mysqlmaster -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

启动好了之后,我们创建master账号,这里有一个8.0的坑,直接创建会出一个错误Authentication plugin ‘caching_sha2_password’ reported error,需要修改一下加密规则,权限设置,刷新
Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)_第2张图片
如果你要通过root用户并且使用Navicat工具连接,也会报错也要修改加密方式

ALTER USER 'master'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'master'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
grant all privileges on *.* to 'root'@'%';
FLUSH PRIVILEGES;

这一些操作完成之后,提前查一下binlog的file和pos,一会slave设置master时候会用到

show master status;

在这里插入图片描述
复制好了之后,准备启用slave

run -dit --network mysqlnet --ip 172.6.0.3 -v /home/mysql/slave/my.cnf:/etc/mysql/my.cnf --name mysqlslave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

启动slave之后我们指定master,这里host就是主机ip,masterUser使用刚刚创建的账号,logfile就是上面图中的file名字,pos就是现在的版本号

change master to master_host='172.6.0.2',master_port=3306,master_user='master',master_password='123456',master_log_file='master-bin.000003',master_log_pos=1660;  

这里还有一个坑就是,需要先关闭stop slave;然后设置

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

再开启,start slave;
最后查看一下效果

show slave status\G;

Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)_第3张图片
这样就成功了,然后在master和slave创建一个test库,在master里创建表,slave自动也会创建
Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)_第4张图片
然后添加一条数据,发现也同步过去了
Mysql8主从复制通过Docker搭建(搭配读写分离实战更香)_第5张图片

点我跳转基于SpringBoot读写分离实战

你可能感兴趣的:(Mysql,mysql)