環(huán)境說明
- Docker
- Ubuntu/CentOS
- MySQL v8.0.11
1. 配置my.cnf
??my.cnf
(部分老版本可能是my.ini
)是MySQL核心配置文件陈莽。首先,在任意掛載目錄下新建*.cnf
文件(這里的*代表可以是任意的文件名稱)。如果你的mysql是下載安裝的营罢,請找到my.cnf
并參考如下配置:
[mysqld]
log-bin=mysql-bin //啟用二進(jìn)制日志
server_id=xxx //xxx代表唯一ID笤受,默認(rèn)是1。特別注意,當(dāng)前版本這里是server_id而不是server-id胰丁,有些版本可能會不一樣
-
實戰(zhàn)示例
- 在
/root/mysql/conf/master/
新建master.cnf
凄鼻,配置如下:
[mysqld] log-bin=mysql-bin server_id=100
- 在
/root/mysql/conf/slave/
新建slave.cnf
腊瑟,添加如下:
[mysqld] log-bin=mysql-bin server_id=200
- 在
2. 運行MySQL
2.1 master(主庫)
docker run --name mysql-master -v /root/mysql/conf/master:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 10000:3306 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
2.2 slave(從庫)
docker run --name mysql-slave -v /root/mysql/conf/slave:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 10001:3306 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
??注意,當(dāng)前mysql版本是8.0.11块蚌,不同的版本之間可能存在差別闰非,docker可以拉取指定版本的mysql Image,命令:docker pull mysql:8.0.11
3. 新建賬號
3.1 在 master 上創(chuàng)建復(fù)制賬號
// 1.進(jìn)入主庫容器
docker exec -it mysql-master bash
// 2.登錄mysql
mysql -uroot -proot
// 3.rep表示復(fù)制賬號峭范;<salve_ip>可修改為%财松,代表任意的主機;`IDENTIFIED BY`后面代表rep用戶的認(rèn)證密碼
CREATE USER 'rep'@'<salve_ip>' IDENTIFIED WITH mysql_native_password BY 'reppassword';
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'<salve_ip>';
3.2 獲取并記錄File
和Position
信息
??執(zhí)行show master status;
即可
4. 配置連接
- 配置 slave 連接 master
// 1.進(jìn)入從庫容器
docker exec -it mysql-slave bash
// 2.登錄mysql
mysql -uroot -proot
// 3.配置主庫認(rèn)證信息纱控,<File>和<Position>同上
CHANGE MASTER TO MASTER_HOST='<master_ip>',MASTER_PORT=10000,MASTER_USER='rep',MASTER_PASSWORD='reppassword',MASTER_LOG_FILE='<File>',MASTER_LOG_POS=<Position>;
5. 開啟同步
- 開啟同步
??在 slave 上啟動線程:start slave;
- 查看狀態(tài)
??在 slave 上執(zhí)行命令:show slave status\G;
6. 相關(guān)命令
設(shè)置從庫只讀:
set global read_only=1;
辆毡。1表示只讀,0是讀寫甜害,但對擁有super權(quán)限的賬號是不生效的舶掖,所以在授權(quán)賬號的時候應(yīng)盡量避免添加super權(quán)限查看讀寫情況:
show global variables like "%read_only%";
查看server_id:
show variables like '%server_id%';
7. 踩坑記錄
??執(zhí)行show slave status\G;
,發(fā)現(xiàn)從庫并沒有連接上主庫尔店,留意到錯誤信息大致為:“主從庫server_id不能一致”眨攘,隨即查看新增的master.cnf
和slave.cnf
,但并沒有發(fā)現(xiàn)問題嚣州,隨即用docker logs mysql-master
查看啟動日志鲫售,有一行警告大概是這樣的:mysql: [Warning] World-writable config file '/etc/mysql/conf.d/master.cnf' is ignored.
,這說明配置文件并沒有掛載成功该肴,搜索后得知當(dāng)文件權(quán)限全局可寫時情竹,mysql會擔(dān)心這種文件被其他用戶惡意修改,所以會忽略掉這個配置文件沙庐,修改文件權(quán)限chmod 644 *.cnf
后鲤妥,再將以上流程重新跑了一遍,問題沒有復(fù)現(xiàn)拱雏。