docker配置mysql主从复制,实现读写分离

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

猜你喜欢

转载自blog.csdn.net/xfcy1990/article/details/88953248