1. 程式人生 > 其它 >Docker MariaDB配置主從複製

Docker MariaDB配置主從複製

編寫主節點配置檔案master.cnf:

[client]
# 預設字符集
default-character-set=utf8mb4

[mysqld]
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 允許最大連結數
max_connections=4096

# 伺服器引擎
default-storage-engine=InnoDB

# 表名小寫
# lower_case_table_names=1

# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size=1M

# binlog 格式 row statement mixed
binlog_format=mixed

# 忽略的資料庫binlog
binlog-ignore-db=mysql,information_schema

# 到期自動刪除
expire_logs_day=7

# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors=1062

# 設定server_id,一般設定為IP,注意要唯一
server-id=1

# bin-log
log_bin=mariadb-bin

從節點配置檔案slave.cnf:

[client]
# 預設字符集
default-character-set=utf8mb4

[mysqld]
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# 伺服器引擎
default-storage-engine=InnoDB

# 表名小寫
# lower_case_table_names=1

# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size=1M

# binlog 格式 row statement mixed
binlog_format=mixed

# 忽略的資料庫binlog
binlog-ignore-db=mysql,information_schema

# 到期自動刪除
expire_logs_day=7

# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors=1062

# 設定server_id,一般設定為IP,注意要唯一
server-id=10

# bin-log
log_bin=slave-mariadb-bin

# 表示slave將複製事件寫進自己的二進位制日誌
log_slave_updates=1

# 記錄同步資訊
relay-log=slave-relay-bin

# 防止改變資料(除了特殊的執行緒)
read_only=1

# 同步重新整理binlog,當事務提交之後,MySQL不做fsync之類的磁碟同步指令重新整理binlog_cache中的資訊到磁碟,
# 而讓Filesystem自行決定什麼時候來做同步,或者cache滿了之後才同步到磁碟。
# sync_binlog=n,當每進行n次事務提交之後,MySQL將進行一次fsync之類的磁碟同步指令來將binlog_cache中的資料強制寫入磁碟
# 1 最安全,但是最慢。 0 最快,但是風險最大
sync_binlog=0

docker-compose檔案docker-compose.yml:

version: "3"
services: 
  mariadb-master:
    image: mariadb:10.7.1
    container_name: mariadb-master
    restart: always
    ports:
      - "3307:3306"
    environment:
      - MARIADB_ROOT_PASSWORD=123
    volumes:
      - ./master/data:/var/lib/mysql:cached
      - ./master.cnf:/etc/mysql/my.cnf:cached
    security_opt:
      - seccomp:unconfined
    logging: 
      driver: "json-file"
      options: 
        max-size: "500m"
    networks:
      - dev_network

  mariadb-slave:
    image: mariadb:10.7.1
    container_name: mariadb-slave
    restart: always
    ports:
      - "3308:3306"
    environment:
      - MARIADB_ROOT_PASSWORD=123
    volumes:
      - ./slave/data:/var/lib/mysql:cached
      - ./slave.cnf:/etc/mysql/my.cnf:cached
    security_opt:
      - seccomp:unconfined
    logging: 
      driver: "json-file"
      options: 
        max-size: "500m"
    networks:
      - dev_network

networks:
  dev_network:
    external:
      name: dev_network

啟動:

$ sudo docker-compose up -d
Creating mariadb-master ... done
Creating mariadb-slave  ... done

檢視列表資訊:

$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS         PORTS                                       NAMES
452272cd0ee8   mariadb:10.7.1   "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds   0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mariadb-slave
750c98f28b24   mariadb:10.7.1   "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds   0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mariadb-master

檢視主節點IP:

$ sudo docker inspect 750 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.2",

同理可得從節點IP為172.18.0.2

連線主節點:

$ mysql -u root -h 172.18.0.2 -p
Enter password: 

執行:

mysql> create user 'slave'@'%' identified by '123';
Query OK, 0 rows affected (0.04 sec)

mysql> grant replication slave on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+--------------------+----------+--------------+--------------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB         |
+--------------------+----------+--------------+--------------------------+
| mariadb-bin.000003 |      771 |              | mysql,information_schema |
+--------------------+----------+--------------+--------------------------+

連線從節點執行:

mysql> change master to master_host='mariadb-master',master_port=3306,master_user='slave',master_password='123',master_log_file='mariadb-bin.000003',master_log_pos=771;
Query OK, 0 rows affected (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: mariadb-master
                   Master_User: slave
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000003
           Read_Master_Log_Pos: 771
                Relay_Log_File: slave-relay-bin.000002
                 Relay_Log_Pos: 557
         Relay_Master_Log_File: mariadb-bin.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes

完成