本篇打算創(chuàng)建一個 1主2從的 mysql主從筛严,3個docker容器
首先創(chuàng)建文件夾
master, slave1, slave2
然后在各個文件夾里創(chuàng)建mysql 的配置文件
mysql 的配置文件在 /etc/mysql/my.conf
所以我們在 各個文件夾內(nèi)創(chuàng)建配置文件
D:.
├─master
│ └─conf
│ my.cnf
├─slave1
│ └─conf
│ my.cnf
└─slave2
└─conf
my.cnf
- 由于我們使用docker默認的mysql鏡像,是最新版的9.0翅溺,密碼插件使用的是caching_sha2_password脑漫,這個可能會給我我們帶來困擾,所以我們在配置文件里面加入
default_authentication_plugin=mysql_native_password
相對應(yīng)我們的docker 語句就變成了
docker run --name some-mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
連接完配置文件后咙崎,就要掛載對應(yīng)的datadir, 相對應(yīng) 我們的docker語句就變成了
docker run --name master-mysql -v D:\my-project\docker-mysql\master\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
進入 master-mysql 實例
docker exec -it master-mysql bash
進入后 連接進入mysql 創(chuàng)建庫先放入一些數(shù)據(jù)优幸,
~:mysql -uroto -proot
mysql> create database newplan DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
-> ;
Query OK, 1 row affected, 2 warnings (0.03 sec)utf8_general_ci;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| newplan |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
- 假設(shè)我們現(xiàn)在已經(jīng)有了數(shù)據(jù),開始配置主從
- 首先我們是在一個docker 宿主的情況下配置主從褪猛,所以我們要先設(shè)置一個網(wǎng)絡(luò)環(huán)境
docker network create mysql_net
讓我們的mysql 實例都在這一個網(wǎng)絡(luò)環(huán)境下運行
所以我們的 docker 命令就要進行適當(dāng)修改
docker run --name master-mysql -v D:\my-project\docker-mysql\master\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --network mysql_net --network-alias network_master_mysql -d mysql
- 網(wǎng)絡(luò)設(shè)置完畢后 開始著手配置主從首先修改我們主機的my.cnf 加入幾條配置
log-bin=mysql-bin
server-id=1
binlog-do-db=newplan
- 重啟主機容器
docker restart master-mysql
- 進入主機mysql
docker exec -it master-mysql bahs
mysql -uroot -proot
- 設(shè)置一個用戶便于從庫登錄
CREATE USER 'leven'@'localhost' IDENTIFIED BY 'Leven';#創(chuàng)建用戶
GRANT REPLICATION SLAVE ON *.* TO 'leven'@'localhost';#授權(quán)
flush privileges;
- 查看當(dāng)前主機master狀態(tài)(記住 File 和 Position)
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 10622 | newplan | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
到此主庫的配置基本完畢
- 修改從庫my.cnf 加入
server-id=2
- 創(chuàng)建從機容器
docker run --name slave1-mysql -v D:\my-project\docker-mysql\slave1\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\slave1\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --network mysql_net --network-alias network_slave1_mysql -d mysql
注意修改對應(yīng)別名以及端口 - 登錄從機mysql
docker exec -it slave1-mysql bash
mysql -uroot -proot
- 執(zhí)行同步SQL設(shè)置語句
CHANGE MASTER TO MASTER_HOST='network_master_mysql',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=10622;
master_host 是我們network 的別名网杆,master_log和master_log_pos是我們主機狀態(tài)里面的 - 啟動同步進程
start slave;
- 查看同步狀態(tài)
show slave status \G
- 如果碰到錯誤需要跳過
stop slave;
set global sql_slave_skip_counter=1;
start slave;
參考資料:
https://blog.csdn.net/m0_37890289/article/details/80087003
https://store.docker.com/images/mysql
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/