docker实现mysql主从配置

环境准备

mysql镜像获取和主从容器生成

docker pull mysql:5.7

docker run -d -p 3306:3306 --name mysqlMaster -v /mysqlConfig/master/cnf:/etc/mysql/conf.d -v /mysqlConfig/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker run -d -p 3307:3306 --name mysqlSlave -v /mysqlConfig/slave/cnf:/etc/mysql/conf.d -v /mysqlConfig/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --link mysqlMaster:master mysql:5.7

命令解读

  1. -v /mysqlConfig/slave/cnf:/etc/mysql/conf.d 表示将mysql容器内部路径/etc/mysql/conf.d目录挂载到主机路径/mysqlConfig/slave/cnf目录下。目的是为了将配置文件保留在主机,防止配置文件随容器删除而丢失。

  2. -v /mysqlConfig/master/data:/var/lib/mysql 表示将容器内/var/lib/mysql路径下所有文件挂载到主机目录下,该路径是mysql数据库的数据文件。

  3. 生成slave容器命令中,--link mysqlMaster:master 表示slave容器网络连接到master网络中,其中:master表示别名,在配置连接master时会用到。

配置文件

  1. 在主机路径 /mysqlConfig/master/cnf 下创建文件mysql.cnf,以下是配置内容
[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket    = /var/run/mysqld/mysqld.sock
datadir    = /var/lib/mysql

symbolic-links=0

character-set-server = utf8   
#skip-networking  
innodb_print_all_deadlocks = 1
max_connections = 2000  
max_connect_errors = 6000  
open_files_limit = 65535  
table_open_cache = 128   
max_allowed_packet = 4M  
binlog_cache_size = 1M  
max_heap_table_size = 8M  
tmp_table_size = 16M  
  
read_buffer_size = 2M  
read_rnd_buffer_size = 8M  
sort_buffer_size = 8M  
join_buffer_size = 28M  
key_buffer_size = 4M  
  
thread_cache_size = 8  
  
query_cache_type = 1  
query_cache_size = 8M  
query_cache_limit = 2M  
  
ft_min_word_len = 4  
  
log-bin = mysql-bin
server-id = 1
binlog_format = mixed  
 
performance_schema = 0  
explicit_defaults_for_timestamp  
  
#lower_case_table_names = 1  
  
interactive_timeout = 28800  
wait_timeout = 28800  

# Recommended in standard MySQL setup  
  
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES   
  
[mysqldump]  
quick  
max_allowed_packet = 16M  
  
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
  1. 在主机路径 /mysqlConfig/slave/cnf 下创建文件mysql.cnf,以下是配置内容
[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket    = /var/run/mysqld/mysqld.sock
datadir    = /var/lib/mysql

symbolic-links=0

character-set-server = utf8   
#skip-networking  
innodb_print_all_deadlocks = 1
max_connections = 2000  
max_connect_errors = 6000  
open_files_limit = 65535  
table_open_cache = 128   
max_allowed_packet = 4M  
binlog_cache_size = 1M  
max_heap_table_size = 8M  
tmp_table_size = 16M  
  
read_buffer_size = 2M  
read_rnd_buffer_size = 8M  
sort_buffer_size = 8M  
join_buffer_size = 28M  
key_buffer_size = 4M  
  
thread_cache_size = 8  
  
query_cache_type = 1  
query_cache_size = 8M  
query_cache_limit = 2M  
  
ft_min_word_len = 4  
  
log-bin = mysql-bin
server-id = 2
binlog_format = mixed  
 
performance_schema = 0  
explicit_defaults_for_timestamp  
  
#lower_case_table_names = 1  
  
interactive_timeout = 28800  
wait_timeout = 28800  

# Recommended in standard MySQL setup  
  
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES   
  
[mysqldump]  
quick  
max_allowed_packet = 16M  
  
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

配置主从数据库

master数据库配置

# 进入master容器
docker exec -it mysqlMaster /bin/bash
# 进入数据库
mysql -uroot -p123456;
# 配置连接master数据库账号
grant replication slave on *.* to 'slave'@'%' identified by '123456';
# 刷新
flush privileges;
# 查看binlog状态,记录File和Position值
show master status;

slave数据库配置

# 进入master容器
docker exec -it mysqlMaster /bin/bash
# 进入数据库
mysql -uroot -p123456;
# master_host对应的是link的容器映射名master
# master_log_file和master_log_pos分别对应master数据库中File和Position值
change master to master_host='master',master_user='slave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=889;
# 启动slave模式
start slave;
# 查看状态,若Slave_IO_Running: Yes和Slave_SQL_Running: Yes则成功
show slave status\G;

测试

进入master容器

# 创建数据库
create database master;
# 进入数据库
use master;
# 创建表
create table user(id bigint, name varchar(255));
# 插入数据
insert into user(id, name) value (1, 'master');

进入slave容器

# 进入数据库
use master;
# 查看数据
select * from user
posted @ 2021-11-19 10:26  dxyoung  阅读(142)  评论(0)    收藏  举报