docker安装MySQL主从及新增节点

585 阅读3分钟

1.下载镜像,这里使用MySQL8.0.18

docker pull mysql:8.0.18

2.主库

创建my.cnf

user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
#expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

创建容器

sudo docker run -d --privileged=true \
-v /community/mysql/master/conf:/etc/mysql \
-v /community/mysql/master/logs:/var/log/mysql \
-v /community/mysql/master/data:/var/lib/mysql \
-v /community/mysql/master/my.cnf:/etc/mysql/my.cnf \
-p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18

参数说明

参数说明
-d后台运行
-v挂载文件或文件夹
-p端口映射
-e环境变量设置
--privileged=true拥有root权限
--name容器名称

创建数据同步用户

  • 进入容器中的MySQL
# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p

  • 创建账号
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';

3.从库

创建从库容器

sudo docker run -d --privileged=true \
-v /community/mysql/slave1/conf:/etc/mysql \
-v /community/mysql/slave1/logs:/var/log/mysql \
-v /community/mysql/slave1/data:/var/lib/mysql \
-v /community/mysql/slave1/my.cnf:/etc/mysql/my.cnf \
-p 3305:3306 --name=mysqlslave -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18

4. 主从同步

查看主库状态

  • 进入主库容器中的MySQL
# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p
  • 查看主数据库状态
mysql> show master status;
+-----------------------+------------+--------------+------------------+-------------------+
| File                  | Position   | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+------------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 | 1044876395 |              | mysql            |                   |
+-----------------------+------------+--------------+------------------+-------------------+

配置从库

  • 进入从库中的MySQL
# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p

  • 在从数据库中配置主从复制
change master to master_host='10.0.0.165',\
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000003', \
master_log_pos=1044876395, master_connect_retry=30;  
  • 参数说明
参数说明
master_host主库IP
master_user同步的用户
master_password同步的密码
master_port同步的端口
master_log_fileshow master status;查出来的File
master_log_posshow master status;查出来的Position
master_connect_retry连接失败重试的时间间隔,单位为秒。
  • 查看主从同步状态
show slave status \G;
  • 开启主从同步
start slave;
  • Slave_IO_RunningSlave_SQL_Running都为YES时就是成功

5.测试

  • 在主库中创建数据库
  • 在从库中查看

6.增加新节点

停止一个从库的主从复制

# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p

# 停止主从同步
stop slave;

# 查看从库状态
show slave status \G;

备份当前从库的所有数据

mysqldump -uroot -p --all-databases > sqlfile.sql
  • ps: 之前创建容器的时候,映射有文件夹,这条命令可以在有映射文件夹的地方执行,这样能直接在外面拿到sqlfile.sql ,也可以使用docker cp命令将sqlfile.sql文件拷贝出来

将导出的数据,导入新库里面

source /var/log/mysql/sqlfile.sql;

设置主库同步

change master to master_host='10.0.0.165', \
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000004', \
master_log_pos=37642095, master_connect_retry=30;  
  • 参数说明
参数说明
master_log_file对应从库状态查询出来的Relay_Master_Log_file
master_log_pos对应从库状态查询出来的Exec_Master_Log_Pos

开启同步

start slave;
  • 查看状态
  • show slave status \G;

开启第一步关闭的从库的主从复制