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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章