用 Docker 構建 MySQL 主從環境

曾是然發表於2020-07-22

前言

本篇文章記錄我使用 docker-compose 以及 dockerfile 來構建基於 binlog 的 MySQL 主從環境。如果你嚴格按照文中的步驟進行配置,相信很快就可以搭建好一個基礎的 MySQL 主從環境。

介紹


MySQL 主從同步分為 5 個步驟:

  1. master 節點將資料的更新記錄寫到 binary log 中。
  2. slave 節點開啟 IO 執行緒連線 master 節點,請求獲取指定 binary log 檔案的指定位置之後的日誌。
  3. master 節點的 binary log dump 執行緒將指定的 binary log 資訊推送給 slave 節點。
  4. slave 節點的 IO 執行緒接收到訊息後,將日誌內容寫入 relay log 檔案。
  5. 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

執行上述命令進行容器建立,如果構建時間過長,可以考慮更換映象源,例如下面幾個國內優質映象源:

  1. 網易:http://hub-mirror.c.163.com
  2. 阿里雲:http://<你的ID>.mirror.aliyuncs.com
  3. 中國科學技術大學: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 主從架構所記錄的步驟,如果有卡在哪一步,可以留言與我交流。???

相關文章