前言
本篇文章記錄我使用 docker-compose 以及 dockerfile 來構建基於 binlog 的 MySQL 主從環境。如果你嚴格按照文中的步驟進行配置,相信很快就可以搭建好一個基礎的 MySQL 主從環境。
介紹
MySQL 主從同步分為 5 個步驟:
- master 節點將資料的更新記錄寫到 binary log 中。
- slave 節點開啟 IO 執行緒連線 master 節點,請求獲取指定 binary log 檔案的指定位置之後的日誌。
- master 節點的 binary log dump 執行緒將指定的 binary log 資訊推送給 slave 節點。
- slave 節點的 IO 執行緒接收到訊息後,將日誌內容寫入 relay log 檔案。
- slave 節點的 SQL 執行緒檢測到 relay log 新增了內容,馬上解析 relay log 檔案生成相應的 SQL 語句,並將這些 SQL 語句重放到資料庫,保證主從資料一致性。
配置
建立目錄結構
首先先搞定目錄結構,我的目錄結構如下,如果想按照自己的想法來組建目錄,在下文中的 docker-compose.yaml 檔案與 Dockerfile 檔案要注意修改檔案路徑。
配置 docker-compose 模版檔案
version: "3"
services:
mysql-master:
build:
context: ./
dockerfile: mysql/master/Dockerfile
container_name: mysql-master
volumes:
- ./mysql/master/data:/var/lib/mysql
restart: always
ports:
- 3305:3306
links:
- mysql-slave
mysql-slave:
build:
context: ./
dockerfile: mysql/slave/Dockerfile
container_name: mysql-slave
volumes:
- ./mysql/slave/data:/var/lib/mysql
restart: always
ports:
- 3306:3306
配置 master 節點的 cluster.cnf 檔案以及 Dockerfile 檔案
[mysqld]
server_id=100
binlog-ignore-db=mysql
log-bin=replicas-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
# 我的 MySQL 為 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
FROM mysql:latest
ADD ./mysql/master/cluster.cnf /etc/mysql/conf.d/cluster.cnf
ENV MYSQL_ROOT_PASSWORD=password
配置 slave 節點的 cluster.cnf 檔案以及 Dockerfile 檔案
[mysqld]
server_id=101
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
relay_log=replicas-mysql-relay-bin
log_slave_updates=1
read_only=1
# 我的 MySQL 為 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
FROM mysql:latest
ADD ./mysql/slave/cluster.cnf /etc/mysql/conf.d/cluster.cnf
ENV MYSQL_ROOT_PASSWORD=password
建立容器
docker-compose up -d mysql-master mysql-slave
執行上述命令進行容器建立,如果構建時間過長,可以考慮更換映象源,例如下面幾個國內優質映象源:
- 網易:http://hub-mirror.c.163.com
- 阿里雲:http://<你的ID>.mirror.aliyuncs.com
- 中國科學技術大學:http://docker.mirrors.ustc.ed...
構建完成之後,使用 docker ps
命令檢視一下容器是否正常執行,出現如下情形則可以認為已經構建成功。
配置 slave 節點
首先使用 docker 命令進入到 mysql-master 容器中,再登入到 mysql 輸入 show master status
命令獲取主庫狀態,這裡我們要關心兩個引數 File
以及 Position
,之後配置從庫會用到這兩個引數。
接下來使用 docker 命令進入 mysql-slave 容器,再登入到 mysql 輸入以下語句進行與 mysql-master 連線。
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='root',
MASTER_PASSWORD=你設定的密碼,
MASTER_LOG_FILE=上一步得到的 File 引數,
MASTER_LOG_POS=上一步得到的 Position 引數;
輸入完成後再鍵入 start slave
命令啟動 slave 服務。啟動之後輸入 show slave status \G
命令檢視 slave 節點狀態,出現如下情形可認為配置成功。
測試主從節點同步狀態
登入到 mysql-master 節點,建立一個全新的庫,建立成功之後,切換到 mysql-slave 節點,輸入 show databases;
命令,檢視是否成功同步,出現如下情形則配置成功。其他操作可以自己嘗試,這裡不再做演示。
總結
這是我自己嘗試搭建 MySQL 主從架構所記錄的步驟,如果有卡在哪一步,可以留言與我交流。???