使用Docker搭建MySQL主從複製(一主一從)

簡介

因爲個人資源有限,手裏沒有太多的服務器,只能通過docker來進行mysql的主從搭建。原理基本上都是一致的,在實際生產中,也可以按照該方式進行搭建。
如果對Docker還不是很瞭解,請移步Docker官網進行學習!

使用Docker搭建主從

使用Docker拉取MySQL鏡像,使用5.7版本

我們可以先使用search命令查詢一下mysql鏡像,選擇官方版本

docker search mysql

在這裏插入圖片描述
下載5.7版本:

docker pull mysql:5.7

下載完成後,可以使用如下命令查看mysql鏡像:

docker images

在這裏插入圖片描述

使用下載好的鏡像搭建MySQL主從

Master:

docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave:

docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Master對外映射的端口號是3301,Slave對外映射的端口號是3302,大家可以自己隨意設置。因爲docker容器是相互隔離的,每個容器有其獨立的IP地址,所以不同容器使用相同的端口並不會衝突。如果是在生產環境,肯定是在不同的機器上安裝MySQL,相對來說會簡單一些。
在這裏插入圖片描述
容器啓動完成後,可以通過MySQL連接工具進行連接測試,看是否能成功
在這裏插入圖片描述

配置Master

使用如下命令進入到Master容器內部,使用容器ID或者名稱均可:

docker exec -it 8b71301f25ed /bin/bash		 //8b71301f25ed爲容器ID
docker exec -it mysql-master /bin/bash		 //mysql-master爲容器名稱

切換到 /etc/mysql 目錄下
在這裏插入圖片描述
使用vim命令編輯my.cnf文件,會出現bash: vim: command not found,因此我們需要在docker內部安裝vim工具
在這裏插入圖片描述

docker內部安裝vim

很簡單,依次輸入如下命令即可安裝,時間和網速有關,耐心等待。

apt-get update

apt-get install vim

安裝成功後,編輯my.cnf文件

[mysqld]
## 同一局域網內注意要唯一
server-id=100  
## 開啓二進制日誌功能,可以隨便取(關鍵)
log-bin=master-bin
binlog-format=ROW     // 二級制日誌格式,有三種 row,statement,mixed
binlog-do-db=數據庫名  //同步的數據庫名稱,如果不配置,表示同步所有的庫

配置完成後,需要重啓mysql服務使其修改的配置文件生效,使用如下命令使mysql進行重啓

service mysql restart

重啓會導致docker容器停止,使用如下命令重新啓動容器:

docker start mysql-master

創建數據庫同步賬戶

使用docker命令重新進入到Master容器內部:

docker exec -it mysql-master /bin/bash

在Master數據庫創建數據同步用戶,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用於在主從庫之間同步數據。登錄到mysql客戶端:

mysql -uroot -p123456

創建用戶並授權:

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)

至此,Master配置完成。

配置Slave

類似於Master,使用docker命令docker exec -it mysql-slave /bin/bash 進入到slave容器中,進入到etc/mysql路徑,使用vim命令編輯my.cnf文件:

[mysqld]
## 設置server_id,注意要唯一
server-id=101  
## 開啓二進制日誌功能,以備Slave作爲其它Slave的Master時使用
log-bin=mysql-slave-bin   
## relay_log配置中繼日誌
relay_log=mysql-relay-bin  
read_only=1  ## 設置爲只讀,該項如果不設置,表示slave可讀可寫

配置完成後也需要重啓mysql服務和docker容器,操作可以參考Master。

開啓Master-Slave主從複製

進入Master庫mysql客戶端:輸入show master status查看Master狀態:
在這裏插入圖片描述
記住File和Position,後面需要用到。此時一定不要操作Master庫,否則將會引起Master狀態的變化,File和Position字段也將會進行變化。
進入到Slave庫myslq客戶端,執行如下命令:

change master to master_host='172.18.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=617, master_connect_retry=30;

命令說明:

master_host :Master庫的地址,指的是容器的獨立ip,可以通過
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱 | 容器id查詢容器的IP進行查詢:
如下所示:
在這裏插入圖片描述
master_port:Master的端口號,指的是容器的端口號
master_user:用於數據同步的用戶
master_password:用於同步的用戶的密碼
master_log_file:指定 Slave 從哪個日誌文件開始複製數據,即上文中提到的 File 字段的值
master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認是60秒

在Slave 中的mysql終端執行show slave status \G;用於查看主從同步狀態。
在這裏插入圖片描述
Slave_IO_Running 和 Slave_SQL_Running是查看主從是否運行的關鍵字段,默認爲NO,表示沒有進行主從複製。
使用start slave;開啓主從複製過程,然後再次查詢主從同步狀態show slave status \G;。
在這裏插入圖片描述
使用start slave開啓主從複製過程後,如果SlaveIORunning一直是Connecting,則說明主從複製一直處於連接狀態,這種情況一般是下面幾種原因造成的,我們可以根據 Last_IO_Error提示予以排除。
在這裏插入圖片描述
1、網絡不通:檢查ip,端口
2、密碼不對:檢查是否創建用於同步的用戶和用戶密碼是否正確
3、pos不對:檢查Master的 Position

正常啓動後如下:
在這裏插入圖片描述
Slave_IO_RunningSlave_SQL_Running 都是Yes,說明主從複製已經開啓。此時可以測試數據同步是否成功。

主從複製測試

進行mysql的主從複製有很多方式,此處我們進行一個簡單的測試。
1、在Master中創建一個新庫

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

此時Slave中會有該test庫:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

在Master中創建表並插入數據:

mysql> create table mytbl (id varchar(16),name varchar(32));
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytbl          |
+----------------+
mysql> insert into mytbl values (1,'zhangsan');
Query OK, 1 row affected (0.01 sec)

mysql> select * from mytbl;
+------+----------+
| id   | name     |
+------+----------+
| 1    | zhangsan |
+------+----------+
1 row in set (0.00 sec)

在Slave中查看是否有數據進行同步:

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytbl          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from mytbl;
+------+----------+
| id   | name     |
+------+----------+
| 1    | zhangsan |
+------+----------+
1 row in set (0.00 sec)

到此,整個Mysql的一主一從的主從複製結構就已經完成了。

補充:

show slave status\G 的完成配置信息

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.0.3
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 617
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 617
              Relay_Log_Space: 528
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 100
                  Master_UUID: 3cc36a8d-9aa0-11ea-883f-0242ac120003
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

如何停止從服務複製功能

使用stop slave;命令

如何重新配置主從

使用這兩個命令 stop slave; reset master;

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