docker-compose MySQL 8.0 GTID主從複製方式

準備環境

# 使用docker pull mysql:latest 拉取下來的mysql版本是:8。0。27-1debian10# 準備2臺機器192。168。0。121 (安裝master)192。168。0。122 (安裝slave)注意:mysql 是無法使用nfs共享區的。所以如果是使用docker,映射出來的卷最好在宿主機上,別在共享區。

操作目錄都是在

/usr/local/docker/mysql

先分別在兩臺機器的這個目錄下分別建立2個資料夾。

mkdir data logs

192。168。0。121 master 機器

增加my。cnf ,這裡我命名為master。cnf

master。cnf

[mysqld]max_connections = 2000default-time_zone=‘+8:00’sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION#gtid:server_id = 1 #伺服器idgtid_mode = on #開啟gtid模式enforce_gtid_consistency = on #強制gtid一致性,開啟後對於特定create table不被支援#binloglog_bin = mysql-binloglog_slave_updates = onbinlog_format = row #強烈建議,其他格式可能造成資料不一致# 指定同步哪個資料庫binlog-do-db=d_sun# 忽略以下資料庫的同步binlog-ignore-db=mysqlbinlog-ignore-db=sysbinlog-ignore-db=information_schemabinlog-ignore-db=performance_schema#relay logskip_slave_start = 1default_authentication_plugin = ‘mysql_native_password’ #更改加密方式

增加 docker-compose。yaml

version: “3。9”services: mysql: restart: always image: mysql:latest container_name: mysql ports: - 3306:3306 command: ——default-authentication-plugin=mysql_native_password ——character-set-server=utf8mb4 ——collation-server=utf8mb4_general_ci ——explicit_defaults_for_timestamp=true ——lower_case_table_names=1 environment: MYSQL_ROOT_PASSWORD: root volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/master。cnf:/etc/my。cnf

master機器下建立完成後,如下所示:

docker-compose MySQL 8.0 GTID主從複製方式

192。168。0。122 slave 機器

增加my。cnf ,這裡我命名為slave。cnf

slave。cnf

[mysqld]max_connections = 2000default-time_zone = ‘+8:00’sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION#GTID:server_id = 2 #伺服器id(注意這裡的servier_id不能master一樣,另外每啟動一臺slave,都需要改動)gtid_mode = on #開啟gtid模式enforce_gtid_consistency = on #強制gtid一致性,開啟後對於特定create table不被支援#binloglog_bin =mysql-binloglog_slave_updates = onbinlog_format = row #強烈建議,其他格式可能造成資料不一致# 以下為多餘配置,slave機器不需要配置,否則會導致mysql服務無法啟動# 指定同步哪個資料庫# binlog-do-db=d_sun# 忽略以下資料庫的同步# binlog-ignore-db=mysql# binlog-ignore-db=sys# binlog-ignore-db=information_schema# binlog-ignore-db=performance_schema#relay logskip_slave_start = 1default_authentication_plugin = ‘mysql_native_password’ #更改加密方式read_only = on #設定只讀super_read_only = on # 設定超級管理員也只允許讀,不允許寫# mysql8。0以上版本,binlog儲存時間 以秒為單位;預設2592000 30天# mysql8。0以下版本,使用expire_logs_days,以天為單位binlog_expire_logs_seconds=604800

增加 docker-compose。yaml

version: “3。9”services: mysql: restart: always image: mysql:latest container_name: mysql ports: - 3306:3306 command: ——default-authentication-plugin=mysql_native_password ——character-set-server=utf8mb4 ——collation-server=utf8mb4_general_ci ——explicit_defaults_for_timestamp=true ——lower_case_table_names=1 environment: MYSQL_ROOT_PASSWORD: root volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/slave。cnf:/etc/my。cnf

slave 機器下建立完成後,如下所示:

docker-compose MySQL 8.0 GTID主從複製方式

啟動

分別使用以下指令啟動兩臺mysql服務

# 進入這個資料夾cd /usr/local/docker/mysql# 啟動mysql服務docker-compose up -d

docker-compose MySQL 8.0 GTID主從複製方式

初始化配置,從master上建立專用於同步的賬戶

# 登入192。168。0。121這臺master服務# 進入docker 容器docker exec -it mysql bash# 登入mysqlmysql -u root -proot# 檢視server_id是否生效show variables like ‘%server_id%’;# 如果列印以下內容表示生效+————————+————-+| Variable_name | Value |+————————+————-+| server_id | 1 || server_id_bits | 32 |+————————+————-+2 rows in set (0。00 sec)

docker-compose MySQL 8.0 GTID主從複製方式

可以使用

show master status;

檢視master狀態

docker-compose MySQL 8.0 GTID主從複製方式

# 建立一個專用的賬戶使用者bin log的同步# 賬號為:slave 密碼為:000000CREATE USER ‘slave’@‘%’ IDENTIFIED BY ‘000000’; GRANT REPLICATION SLAVE ON *。* TO ‘slave’@‘%’;flush privileges;

docker-compose MySQL 8.0 GTID主從複製方式

初始化配置, slave 服務(配置master指向)

# 啟動mysql服務docker-compose up -d# 進入docker 容器docker exec -it mysql bash# 登入mysqlmysql -u root -proot# 檢視server_id是否生效show variables like ‘%server_id%’;# 如果列印以下內容表示生效+————————+————-+| Variable_name | Value |+————————+————-+| server_id | 2 || server_id_bits | 32 |+————————+————-+2 rows in set (0。00 sec)

docker-compose MySQL 8.0 GTID主從複製方式

# 檢視MASTER狀態show slave status\G;# 輸出Empty set, 1 warning (0。01 sec)

從節點使用備份賬戶連線主節點,開啟備份

# 執行指令,連線主節點,開啟備份change master to master_host=‘192。168。0。121’, master_port=3306, master_user=‘slave’, master_password=‘000000’, master_auto_position=1; # 啟動同步start slave;# 如果出現異常:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository# 則可以執行重置,然後再 start slave;reset slave;

docker-compose MySQL 8.0 GTID主從複製方式

可以使用

show slave status\G;

檢視狀態。

如果下邊的標紅加粗部分(

Slave_IO_Running

Slave_SQL_Running

)都顯示為Yes,表示主從複製一切正常。

mysql> show slave status\G;*************************** 1。 row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 192。168。0。121 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-binlog。000003 Read_Master_Log_Pos: 868 Relay_Log_File: 6f4258c72724-relay-bin。000004 Relay_Log_Pos: 1089 Relay_Master_Log_File: mysql-binlog。000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 868 Relay_Log_Space: 3118370 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 6a4b9321-3c9d-11ec-a45e-0242c0a84002 Master_Info_File: mysql。slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8 Executed_Gtid_Set: 452bf0c3-3c9e-11ec-9fb3-0242c0a85002:1-5,6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace:1 row in set, 1 warning (0。01 sec)ERROR:No query specified

測試

# 登入192。168。0。121 master 機器# 檢視目前所有的資料庫show databases;# 建立一個新的資料庫CREATE DATABASE `d_sun` CHARACTER SET ‘utf8mb4’;# 登入192。168。0。122 slave機器# 檢視目前所有的資料庫,可以看到d_sun這個資料庫已經同步過來了。show databases;# 剩下的表資料同步這裡就不進行測試了。

只讀機器使用超級管理員賬戶是可以進行修改的,不要進行改動,以免影響主從複製。