為確保生產環境中的數據安全與可靠性,數據庫普遍采用主從集群架構(一主一從)進行部署。本文將系統闡述如何利用Docker鏡像實現數據庫集群的容器化部署,并完整記錄各配置環節的具體實現步驟。
一、主服務實例創建(可以先創建docker網絡)
- 首先通過下面的命令將主服務器實例創建完成
docker run -d -p 3306:3306 --privileged=true \
-v /appData/mysql/master/log:/var/log/mysql \
-v /appData/mysql/master/data:/var/lib/mysql \
-v /appData/mysql/master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-master mysql:5.7
主服務器運行成功。下面來修改一下對應的my.cnf配置。
- 添加主服務器對應配置文件,進入到 /appData/mysql/master/conf 目錄下,此目錄已掛載到容器內部,新建 my.cnf 文件,并添加如下內容:
## 設置編碼字符集
[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8## 設置server_id,同一局域網中需要唯一
server_id=101## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql## 開啟二進制日志功能
log-bin=master-mysql-bin## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed## 二進制日志過期清理時間。默認值為0;表示不自動清理.
expire_logs_days=7## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
進入到容器,檢查一下配置文件是否掛載成功。
- 配置文件添加完畢后,重啟主服務器
docker restart mysql-master
查看編碼字符集是否修改成功:
docker exec -it mysql-master /bin/bashmysql -u root -pshow variables like '%character%';
已經修改生效,說明剛剛修改的配置文件沒問題,進行下一步。
- 進入到主服務器的容器中,創建slave用戶并授權,用來同步數據使用
# 交互式模式進入容器內部
docker exec -it mysql-master /bin/bash# 使用root 用戶登錄mysql服務器
mysql -uroot -p# 創建slave用戶并授權
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
二、從服務器實例創建
- 和主服務器創建的命令一樣,個別掛載地址需要調整一下,如果是在不同的服務器上,可直接執行;
docker run -d -p 3307:3306 --privileged=true \
-v /appData/mysql/slave/log:/var/log/mysql \
-v /appData/mysql/slave/data:/var/lib/mysql \
-v /appData/mysql/slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave mysql:5.7
- 添加從服務器對應配置文件,進入到 /appData/mysql/slave/conf 目錄下,此目錄已掛載到容器內部,新建 my.cnf 文件,并添加如下內容:
## 設置編碼字符集
[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
## 設置server_id,同一局域網中需要唯一
server_id=102## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql## 開啟二進制日志功能,以備slave作為其他數據庫實例的master時使用
log-bin=slave-mysql-bin## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed## 二進制日志過期清理時間。默認值為0;表示不自動清理.
expire_logs_days=7## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062## relay_log 配置中繼日志
relay_log=slave-mysql-relay-bin## log_slave_updates 表示slave將復制事件寫進自己的二進制日志
log_slave_updates=1## slave 設置為制度(具有super權限的用戶除外)
read_only=1
- 重啟從服務器實例
docker restart mysql-slave
- 和主服務器一樣,登入mysql,使用命令行查看配置文件是否生效。
三、主從搭建
- 在主服務器中,查看當前主服務器情況,如下:
show master status;
這里的信息很重要,主要作用是告訴從機同步的位置。
- 在從數據庫中配置主從復制,在從機的mysql命令行中,執行以下命令:
change master to master_host='192.168.152.128', master_user='slave', master_password='123456',master_port=3306,master_log_file='master-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;
參數說明:
master_host:主數據庫的|P地址;
master_port:主數據庫的運行端口:
master_user:在主數據庫創建的用于同步數據的用戶賬號;
master_password:在主數據庫創建的用于同步數據的用戶密碼;
master_log_file:指定從數據庫要復制數據的日志文件,通過査看主數據的狀態,獲取File參數;
master_log_pos:指定從數據庫從哪個位置開始復制數據,通過査看主數據的狀態,獲Position參數;
master_connect_retry:連接失敗重試的時間間隔,單位為秒。
執行完畢以后,查看一下從機的主從同步狀態:
show slave status \G;
這里命令的結尾使用了 “\G” 的形式,則是以下面這種類似于json的格式展示出來的,因為內容較多,如果以表格的形式展現,不易于閱讀。
從圖中可以看到,兩個狀態值:
Slave_IO_Running: No
Slave_SQL_Running: No
這兩個值均為No,說明主從復制還未開始。
下面,繼續進行后續操作。
- 在從數據庫中開啟主從同步,執行下面的命令:
start slave;
- 從數據庫開啟主從配置后,查看一下狀態,看看是否啟用主從同步功能;
這里遇到了一個小坑,具體解決方案可參考:https://www.cnblogs.com/momo6656/p/14922886.html,我這里主要是因為防火墻的問題導致。如果經過多次調整,仍不生效,記得使用《重啟大法》,通常情況下,可以給你意外驚喜。
最終效果如下如:
四、主從復制測試
- 在主數據庫中,新建數據庫、表以及插入信息;
- 從庫中查看是否同步;
發現,數據已經完美同步。
- 使用客戶端再次進行測試;
查詢從庫:
至此,安裝完畢!