Mysql主從搭建(docker compose)

一年`發表於2024-07-27

先建立三個檔案

docker-compose.yml

services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      - free
    volumes:
      - ./mysql/var_lib_mysql:/var/lib/mysql
    command:
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci
    mem_limit: 1024m

  mysql2:
    container_name: mysql2
    image: mysql:8.0
    ports:
      - "3307:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      - free
    command:
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci
    mem_limit: 1024m

master.cnf

[mysqld]
# 禁用主機名快取
host_cache_size=0
# 跳過主機名解析
skip-name-resolve
# 主資料庫端ID號
server_id = 101
# 開啟GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 開啟二進位制日誌
log-bin = mysql-bin
# 不需要複製的資料庫名(mysql庫一般不同步)
binlog-ignore-db = mysql
# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size = 1M
# 二進位制日誌自動刪除的天數,預設值為0,表示“沒有自動刪除”,啟動時和二進位制日誌迴圈時可能刪除
expire_logs_days = 7
# 主從複製的格式(mixed,statement,row,預設格式是statement)
binlog_format = mixed
# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors = 1062
# log_slave_updates表示slave將複製事件寫進自己的二進位制日誌
log_slave_updates = ON

# 將函式複製到slave
log_bin_trust_function_creators = 1

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

slave.cnf

[mysqld]
# 禁用主機名快取
host_cache_size=0
# 跳過主機名解析
skip-name-resolve
# 從資料庫端ID號
server_id = 102
# 開啟GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 開啟二進位制日誌
log-bin = mysql-bin
# 不需要複製的資料庫名(mysql庫一般不同步)
binlog-ignore-db = mysql
# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size = 1M
# 二進位制日誌自動刪除的天數,預設值為0,表示“沒有自動刪除”,啟動時和二進位制日誌迴圈時可能刪除
expire_logs_days = 7
# 主從複製的格式(mixed,statement,row,預設格式是statement)
binlog_format = mixed
# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors = 1062
# log_slave_updates表示slave將複製事件寫進自己的二進位制日誌
log_slave_updates = ON

# 從伺服器中繼日誌的位置
relay_log = mysql-relay-bin
# 設定為只讀
read_only=1

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

配置主從

啟動預設配置的容器

docker compose up -d mysql mysql2

更新配置檔案

docker cp master.cnf mysql:/etc/my.cnf && docker cp slave.cnf mysql2:/etc/my.cnf

重啟兩個mysql

docker restart mysql mysql2

主伺服器執行

CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
FLUSH PRIVILEGES;

SHOW MASTER STATUS;

從伺服器執行

CHANGE REPLICATION SOURCE TO 
MASTER_HOST='mysql'
,MASTER_USER='slave'
,MASTER_PASSWORD='123456'
,MASTER_PORT=3306
,GET_MASTER_PUBLIC_KEY=1
,MASTER_AUTO_POSITION=1;

START SLAVE;
SHOW SLAVE STATUS;

從服務重新配置需先停止同步

STOP SLAVE;
RESET MASTER;

相關文章