目录
docker搭建mysql主从复制
1.创建master数据库
1.1创建MySQL容器并映射端口和改密码
docker run -di --name=mysql_master -p 33306:3306 -e MYSQL_ROOT_PASSWORD=980224 mysql
--name 代表容器名称可以用来启动停止重启容器
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 向外映射端口 通过linux访问
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
1.1.1参考过程:
1.2进入创建好MySQL容器,修改配置文件
1.2.1 安装vim
#同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引 apt-get update #安装vim apt-get install -y vim
1.2.2 修改my.cnf文件
#进入刚才创建的容器 mysql_master 是你之前设置的 --name docker exec -it mysql_master /bin/bash vim /etc/mysql/my.cnf
新增信息
[mysqld] ## 设置server_id,注意要唯一 server-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin ## 永久设置时区时间 default-time_zone = '+8:00'
1.3登陆MySQL配置信息
mysql -u root -p 登录
MySQL8的默认的密码加密策略发生了变化,之前的一些客户端的软件会出现无法登录的 情况。
解决:
使用mysql原生的命令进去,使用之前的密码加密策略重新修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
#本地登录(如果用原生的命令行的话,不用改) ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '980224'; #远程登录 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '980224'; #创建同步用户 CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '980224'; #授权 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'%'; #然后修改root权限 use mysql; #在 mysql 数据库的 user 表中查看当前 root 用户的相关信息 select host, user, authentication_string, plugin from user; #授权 root 用户的所有权限并设置远程访问 GRANT ALL ON *.* TO 'root'@'%'; #刷新权限列表 flush privileges; #查看关键信File和Position字段的值,在后面的操作完成之前, #需要保证master库不能做任何操作,否则将会引起状#态变化, #File和Position字段的值变化。 如下图需要记下来在下面2.4步骤需要 下图中的mysql-slave-bin.000001 156
mysql> show master status\G *************************** 1. row *************************** File: mysql-slave-bin.000001 Position: 156 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
退出容器重启
#退出mysql exit; #退出容器 exit; #再退出到宿主容器查看mysql的映射端口 firewall-cmd --zone=public --list-ports #将mysql端口的防火墙打开 xxxxx 端口 firewall-cmd --zone=public --add-port=3363/tcp --permanent #重新载入 firewall-cmd --reload docker restart mysql_master
至此,master数据库安装配置完成。
2.创建slave数据库
2.1创建MySQL容器并映射端口和改密码
docker run -di --name=mysql_slave -p 33307:3306 -e MYSQL_ROOT_PASSWORD=980224 mysql #将mysql端口的防火墙打开 xxxxx 端口 firewall-cmd --zone=public --add-port=33307/tcp --permanent #重新载入 firewall-cmd --reload
2.2进入容器内部
docker exec -it mysql_slave /bin/bash apt-get update apt-get install vim -y vim /etc/mysql/my.cnf
2.3 进入mysql内部,设置主从信息
mysql -uroot -p980224 #本地要用客户端比如navicat连接,设置root的认证方式 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '980224'; #然后修改root权限 use mysql; #在 mysql 数据库的 user 表中查看当前 root 用户的相关信息 select host, user, authentication_string, plugin from user; #授权 root 用户的所有权限并设置远程访问 GRANT ALL ON *.* TO 'root'@'%'; #刷新权限列表 flush privileges;
2.4设置主从信息
change master to master_host='47.104.192.52', master_user='admin', master_password='980224', master_port=33306, master_log_file='mysql-slave-bin.000001', master_log_pos= 156, master_connect_retry=30,get_master_public_key=1;
参数介绍
master_host:Master的地址,指的是容器的独立IP,可以通过下面命令查询 [[email protected] ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5c2 172.17.0.4 master_port: Master的端口,指的是容器的端口号,不是映射端口 master_user:用于数据同步的用户 master_password:用户同步的用户的密码 master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值 master_log_pos:指从哪个Position开始读,即上文中提到的Position字段的值 master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒 备注:之所以设置get_master_public_key=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password
2.5 查看主从同步状态
show slave status \G;
正常情况下,Slave_IO_Running 和 Slave_SQL_Running 都是No,因为我们还没有开启主从复制的过程
2.6开启主从复制
start slave;
再次查询主从同步状态
show slave status \G;
然后退出重启容器。其他的slave的安装配置方法和slave的方法一样,区别就是cnf文件中的server-id不能相同罢了
3. 出现异常参考
3.1. 使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于拦截状态,这种情况一般是下面集中原因造成的,可以根据Last_IO_Error提示予以排除。
-
网络不通
解决办法:检查IP,端口
-
密码不对
检查是否创建用于同步的用户和用户密码是否正确
-
pos不对
检查master的position
3.2. 如果开启主从复制失败,需要修改和重启,可参考下方提示
停止主从复制
stop slave;
重置之前的配置信息
reset slave;
启动主从复制
start slave;
测试
测试在主数据库创建一个数据库,从数据库有的话代表成功