購(gòu)物網(wǎng)站設(shè)計(jì)目的小吳seo博客
基于Docker去創(chuàng)建MySQL的主從架構(gòu)
用于開發(fā)與測(cè)試環(huán)境讀寫分離
主從的架構(gòu)搭建步驟
基于Docker去創(chuàng)建MySQL的主從架構(gòu)
# 創(chuàng)建主從數(shù)據(jù)庫(kù)文件夾
mkdir -p /usr/local/mysql/master1/conf
mkdir -p /usr/local/mysql/master1/data
mkdir -p /usr/local/mysql/slave1/conf
mkdir -p /usr/local/mysql/slave1/data# 初始化主數(shù)據(jù)庫(kù)配置文件
cd /usr/local/mysql/master1/conf
vi my.cnf# 粘貼以下內(nèi)容
[mysqld]
datadir = /usr/local/mysql/master1/data
character-set-server = utf8
lower-case-table-names = 1# 主從復(fù)制-主機(jī)配置# 主服務(wù)器唯一ID
server-id = 1
# 啟用二進(jìn)制日志
log-bin=mysql-bin
# 設(shè)置logbin格式
binlog_format = STATEMENT# 初始化從數(shù)據(jù)庫(kù)配置文件
cd /usr/local/mysql/slave1/conf
vi my.cnf# 粘貼以下內(nèi)容
[mysqld]
datadir = /usr/local/mysql/slave1/data
character-set-server = utf8
lower-case-table-names = 1# 主從復(fù)制-從機(jī)配置# 從服務(wù)器唯一ID
server-id = 2
# 啟用中繼日志
relay-log = mysql-relay# 文件夾授權(quán)
chmod -R 777 /usr/local/mysql
Docker部署Mysql8.0
# 拉取鏡像
docker pull mysql:8.0# 查看鏡像
docker images# 構(gòu)建主數(shù)據(jù)庫(kù)容器
docker run --name=mysql-master-1 \
--privileged=true \
-p 8808:3306 \
-v /usr/local/mysql/master1/data/:/var/lib/mysql \
-v /usr/local/mysql/master1/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/mysql/master1/mysql-files/:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0 --lower_case_table_names=1docker ps# 驗(yàn)證是否可以登錄
# 交互式進(jìn)入容器
docker exec -it mysql-master-1 /bin/bash# 登錄(使用構(gòu)建時(shí)指定的密碼:root)
mysql -uroot -p# 退出
quit
exit# 構(gòu)建從數(shù)據(jù)庫(kù)容器
docker run --name=mysql-slave-1 \
--privileged=true \
-p 8809:3306 \
-v /usr/local/mysql/slave1/data/:/var/lib/mysql \
-v /usr/local/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/mysql/slave1/mysql-files/:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0 --lower_case_table_names=1
編寫主數(shù)據(jù)庫(kù)的復(fù)制配置文件
# 交互式進(jìn)入容器
docker exec -it mysql-master-1 /bin/bash# 登錄(使用構(gòu)建時(shí)指定的密碼:root)
mysql -uroot -p- 主數(shù)據(jù)庫(kù)創(chuàng)建用戶slave并授權(quán)
# 創(chuàng)建用戶,設(shè)置主從同步的賬戶名
create user 'fdy-slave'@'%' identified with mysql_native_password by '123456';# 授權(quán)
grant replication slave on *.* to 'fdy-slave'@'%'; # 刷新權(quán)限
flush privileges;# 查詢server_id值
show variables like 'server_id';# 也可臨時(shí)(重啟后失效)指定server_id的值(主從數(shù)據(jù)庫(kù)的server_id不能相同)
set global server_id = 1;# 重置下master的binlog位點(diǎn)
reset master;# 查詢Master狀態(tài),并記錄File和Position的值,這兩個(gè)值用于和下邊的從數(shù)據(jù)庫(kù)中的change那條sql中的master_log_file,master_log_pos參數(shù)對(duì)齊使用
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 157 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
編寫從數(shù)據(jù)庫(kù)的復(fù)制配置文件
# 進(jìn)入從數(shù)據(jù)庫(kù)
# 注意:執(zhí)行完此步驟后退出主數(shù)據(jù)庫(kù),防止再次操作導(dǎo)致File和Position的值發(fā)生變化
# 驗(yàn)證slave用戶是否可用 fdy-slave/123456# 交互式進(jìn)入容器
docker exec -it mysql-slave-1 /bin/bash# 登錄(使用構(gòu)建時(shí)指定的密碼:root)
mysql -uroot -p# 查詢server_id值
show variables like 'server_id';# 也可臨時(shí)(重啟后失效)指定server_id的值(主從數(shù)據(jù)庫(kù)的server_id不能相同)
set global server_id = 2;# 若之前設(shè)置過同步,請(qǐng)先重置
stop slave;
reset slave;# 設(shè)置主數(shù)據(jù)庫(kù)
# 主機(jī)IP端口:192.168.9.149:8808
# 主機(jī)帳號(hào)密碼:fdy-slave/123456
change master to master_host='192.168.9.149',master_port=8808,master_user='fdy-slave', master_password='123456',master_log_file='binlog.000001',master_log_pos=157; # 開始同步
start slave;# 查詢Slave狀態(tài)
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.9.149Master_User: fdy-slaveMaster_Port: 8808Connect_Retry: 60Master_Log_File: binlog.000001Read_Master_Log_Pos: 157Relay_Log_File: 16f1708b43a0-relay-bin.000002Relay_Log_Pos: 323Relay_Master_Log_File: binlog.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 157Relay_Log_Space: 540Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: dce2949e-f403-11ef-851f-0242ac110002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.00 sec)# 最后需要查看是否配置成功# 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。# 查看現(xiàn)有數(shù)據(jù)庫(kù)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)# (主庫(kù))創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE fdy_user CHARACTER SET utf8mb3 COLLATE = utf8_bin;# (主從)查看是否創(chuàng)建成功
show databases;
注意點(diǎn)
- MySQL出現(xiàn)同步問題,根據(jù)Last_SQL_Error提示,查具體的表:select * from performance_schema.replication_applier_status_by_worker\G; 就能看到具體錯(cuò)誤信息。
- 如若服務(wù)器重啟,在啟動(dòng)docker里面主從鏡像,需要留意 server_id 是否有變化,如果發(fā)現(xiàn)my.cnf沒有生效,就可能需要在容器手動(dòng)找到文件進(jìn)行添加 server_id, 我是把映射的文件覆蓋容器里面這個(gè)路徑的文件 【記得備份容器里面的my.cnf】 /etc/my.cnf
出現(xiàn)同步問題解決辦法
# (主)重置下master的binlog位點(diǎn)
reset master;# (從)重置下slave
stop slave;
reset slave;# (從)設(shè)置主數(shù)據(jù)庫(kù)
change master to master_host='192.168.9.149',master_port=8808,master_user='fdy-slave', master_password='123456',master_log_file='binlog.000001',master_log_pos=157; # (從)開始同步
start slave;# 查詢Slave狀態(tài):Slave_IO_Running 和 Slave_SQL_Running是否都為 yes
show slave status;