簡介
因爲個人資源有限,手裏沒有太多的服務器,只能通過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_Running
和 Slave_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;