使用Docker容器搭建MySql主从复制


1.docker上面寻找mysq,命令如下所示:docker search mysql

使用Docker容器搭建MySql主从复制_docker


2.pull mysql到本地,命令如下:docker pull mysql:5.6


使用Docker容器搭建MySql主从复制_docker_02

(成功之后,使用docker images查看是否已经下载成功)


3.在主机下面新建conf文件夹,新增master.cnf和slave.cnf配置文件


(创建文件命令如下:mkdir conf、vim master.cnf 记住配置文件必须是以cnf结尾。)

使用Docker容器搭建MySql主从复制_docker_03


master.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





slave.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





 (我加粗的那些是开启主从数据库的关键,重要参数解释如下:


lower_case_table_names:忽略表名、列名等数据结构的大小写(注意:不是每行记录内容的大小写!)。


 server-id=1: 表示此MySQL服务器是主服务器 。


log-bin:开启二进制记录。这是为了主从复制而做的设置。本文使用RBR(Row-Based Replication)模式。


slow_query_log=1:开启慢查询日志。如果某一条SQL执行的时间超过long_query_time设置的秒数,那么就记录下来。记录文件路径可以使用show variables;命令,在变量名是slow_query_log_file下查找到具体的日志文件路径。


long_query_time=1:单位是秒。指如果某一条SQL语句执行时间超过1秒,就记录下来。必须开启慢查询日志了以后,此变量才能使用。


log_error:开启错误日志。show variables like 'log_error'; 就可以查询到日志文件的路径。mysql的docker官方镜像如果设置别的取值会导致容器无法正常启动。


 )


4.运行容器


启动master容器:


docker run -p 3306:3306 --name master -v /conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=220316 -d mysql:5.6





启动slave容器:


docker run -p 3307:3306 --name slave -v /conf/slave.cnf:/etc/mysql/conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=220316 -d mysql:5.6


 (参数解释如下:


 -p 3306:3306:将容器的3306端口映射到主机的3306端口。


 -v /conf/master.cnf:/etc/mysql/

conf.d/master.cnf:将主机当前目录下的conf/master.cnf挂载到容器的/etc/mysql/

conf.d/master.cnf。

记住只能是在conf.d的文件下面才可以。


 -e MYSQL_ROOT_PASSWORD=220316:初始化root用户的密码。)

使用Docker容器搭建MySql主从复制_docker_04


5.进入容器中,命令如下:


进入到slave容器中:docker exec -i -t 1f105944a7c4 /bin/bash


进入到master容器中:docker exec -i -t 7e4c483127c7 /bin/bash

使用Docker容器搭建MySql主从复制_docker_05


6.进入master容器中,进入mysql中,命令如下:

mysql -hlocalhost -uroot -p

使用Docker容器搭建MySql主从复制_docker_06


7.查看master数据库状态,命令如下:show master status;

使用Docker容器搭建MySql主从复制_数据库_07


 (如果出现这个表格就说明启动成功了,这边我们需要记录file字段的值,因为在slave中需要用这个值进行主从关联)


8.在master数据库中创建用户,命令如下:create user linzhiqiang;


9.在master数据库中给刚才创建的用户赋予一定权限,命令如下:


GRANT ALL PRIVILEGES ON *.* TO linzhiqiang@'%' IDENTIFIED BY '220316'; FLUSH PRIVILEGES;FLUSH PRIVILEGES;


 (参数介绍:


 1.FLUSH PRIVILEGES;这个命令必须填写,否则上面设置的用户权限失效。


 2.ip地址是可以设置范围的。例如:GRANT REPLICATION SLAVE ON *.* TO'linzhiqiang'@'192.168.0.%' IDENTIFIED BY'220316';


 3.操作的数据库也是可以指定的。


 4.用户的权限也是可以设置的。具体的命令大家可以自己去学习,我这里就不多说了。


 如果不设置用户权限的话,本地可以连接的上mysql服务器,局域网或者外网是连接不上,会显示连接被拒绝或者用户没有这个权限。除此之外权限还可以精确到某个数据库,连接者的IP地址区间,设置是某个数据的操作问题等等都可以进行设置。我这边设置的是linzhiqiang这个用户具备所有用户数据库的权限,所有的ip地址都可以通过Master这个用户来连接主数据库。)


10.在slave数据库中配置主从关系关联:


 change master to


 master_host='

192.168.88.22',

 //Master 服务器Ip地址,也就是上面写的192.168.88.22


 master_port=3306,

//Master 端口号


 master_user='linzhiqiang',

//Master 用户名


 master_password='220316',

//用户密码


 master_log_file='mysql-bin.000004',

//Master服务器产生的日志要和Master服务器所配置的相互对应如下如所示的file对应


 master_log_pos=0;

//要和Master服务器所配置的相互对应如下如所示的Position对应(经过测试发现如果是一样的只能同步一次,所以这里修正成0,0是可以每次都同步成功的)


(我这边用//是为了解释方便,数据库中操作的时候一定不要加上!!!)


12.在salve数据库中启动服务,命令如下:

start slave;


13.在salve数据库中查看启动状态,命令如下:show slave status\G

使用Docker容器搭建MySql主从复制_docker_08


14.利用Navicat进行测试,是否同步成功。

使用Docker容器搭建MySql主从复制_数据库_09


结果显示同步成功!!!