1,下载mysql镜像
mysql版本:mysql5.7
docker pull mysql:5.7
注意:如果使用docker pull mysql,则默认拉取的是最新版本的mysql(文章发布时是 mysql 8.0.15版本),则下述的配置方法无效。
2,创建主服务器所需目录
在本机上先创建好mysql主服务器所需目录,以便与mysql主服务器所需目录进行映射,便于管理。
mkdir /usr/local/mysqlData/master/cnf -p
mkdir /usr/local/mysqlData/master/data -p
3,定义主服务器配置文件
vim /usr/local/mysqlData/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
4,创建并启动mysql主服务
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 98455b9624a9 5 days ago 372 MB
[root@localhost ~]# docker run -itd -p 3306:3306 --name master -v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=masterpwd 98455b9624a9 //注意修改镜像ID。
6405439bdd40d10507400dd0d750836de36a1f50e081a56ea4880dfc187dbb34
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6405439bdd40 98455b9624a9 "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp master
5,进入主服务器控制台,添加复制master数据的用户reader,供从服务器使用
[root@localhost ~]# docker exec -it 6405439bdd40 /bin/bash //注意修改容器ID
root@6405439bdd40:/# mysql -u root -pmasterpwd
mysql> GRANT REPLICATION SLAVE ON *.* to 'reader'@'%' identified by 'readerpwd';
Query OK, 0 rows affected, 1 warning (1.60 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.03 sec)
6,创建从服务器所需目录,编辑配置文件
[root@localhost ~]# mkdir /usr/local/mysqlData/slave/cnf -p
[root@localhost ~]# mkdir /usr/local/mysqlData/slave/cnf -p
[root@localhost ~]# vim /usr/local/mysqlData/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
7,创建并运行mysql从服务器
[root@localhost ~]# docker run -itd -p 3307:3306 --name slaver -v /usr/local/mysqlData/slave/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=slavepwd 98455b9624a9
8,在从服务器上配置连接主服务器的信息
首先主服务器上查看master_log_file,master_log_pos两个参数,然后切换到从服务器上进行主服务器的连接信息的设置
/*主服务上执行*/
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 765 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
/*从服务器上执行*/
[root@localhost ~]# docker exec -it fbc7e934f424 /bin/bash
root@fbc7e934f424:/# mysql -u root -pslavepwd
mysql> change master to master_host='172.17.0.2',master_user='reader',master_password='readerpwd',master_log_file='mysql-bin.000003',master_log_pos=765;
主服务器ip(master_host)可以在主服务器上通过命令:cat /etc/hosts查看,用户名以及密码就是在步骤5中创建的用户以及设定的密码。
9,从服务器启动I/O 线程和SQL线程
不带任何参数,表示同时启动I/O 线程和SQL线程。
I/O线程从主库读取bin log,并存储到relay log中继日志文件中。
SQL线程读取中继日志,解析后,在从库重放。
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.2
Master_User: reader
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 765
Relay_Log_File: b3a8ba2fdc0c-relay-bin.000002
Relay_Log_Pos: 494
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes,Slave_SQL_Running: Yes即表示启动成功。
10,测试
主服务器上创建测试数据库:slavetest
mysql> create database slavetest;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slavetest |
| sys |
+--------------------+
5 rows in set (0.00 sec
在从服务器上查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slavetest |
| sys |
+--------------------+
5 rows in set (0.00 sec)
可以看到,slavetest已成功复制到mysql从服务器。
注意:本文介绍的是单向复制,即只能从master复制到slaver,而不能逆向进行。
延伸:实现读写分离
主从复制是在主服务器上添加或更新数据,从服务器进行复制操作。因此,如果要实现读写,可以调整应用程序,对主数据库进行写的操作,而查询,读取的操作可以放到从服务器上执行。这样,便可以通过在应用程序上的控制,实现对数据库的读写分离。
延伸:其他复制方式
MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的复制。在复制过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(Slave),接收来自主服务器binlog文件的日志内容,解析出SQL重新更新到从服务器,使得主从服务器数据达到一致。
如果设置了链式级联复制,那么,从(slave)服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器。链式级复制类似A→B→C的复制形式。MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的复制
http://baijiahao.baidu.com/s?id=1598186201849829616&wfr=spider&for=pc