1. 在/user/local/share/下創建mysql文件夾,在mysql文件夾目錄下創建4個文件夾分別是:
master1, master2, slave1, slave2分別在每個目錄下建立data, conf, logs用於數據持久化
創建后如下
2.創建容器:
1)創建一個名為master1的mysql容器(主 mysql)
docker run -p 4306:3306 --name master1 \ -v /usr/local/share/mysql/master1/conf:/etc/mysql/conf.d \ -v /usr/local/share/mysql/master1/logs:/var/log/mysql \ -v /usr/local/share/mysql/master1/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
2)創建一個名為master2的mysql容器(主 mysql)
docker run -p 4307:3306 --name master2 \ -v /usr/local/share/mysql/master2/conf:/etc/mysql/conf.d \ -v /usr/local/share/mysql/master2/logs:/var/log/mysql \ -v /usr/local/share/mysql/master2/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
3)創建一個名為salve1 的mysql容器(從 mysql)
docker run -p 5306:3306 --name salve1 \ -v /usr/local/share/mysql/salve1/conf:/etc/mysql/conf.d \ -v /usr/local/share/mysql/salve1/logs:/var/log/mysql \ -v /usr/local/share/mysql/salve1/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
4)創建一個名為salve2的mysql容器(從 mysql)
docker run -p 5307:3306 --name salve2 \ -v /usr/local/share/mysql/salve2/conf:/etc/mysql/conf.d \ -v /usr/local/share/mysql/salve2/logs:/var/log/mysql \ -v /usr/local/share/mysql/salve2/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD= 123456 -itd mysql:8.0.22
命令參數注解:
--name : 容器名稱
-p : 映射容器端口號和宿主機端口號
-v : 掛載宿主機目錄和docker容器中的目錄,前面是宿主機目錄,后面是容器內部目錄
-d : 后台運行容器
-e :環境參數,MYSQL_ROOT_PASSWORD設置root用戶的密碼
-itd : 指定數據庫版本
3.查看是否將mysql容器創建成功
命令:docker ps
4.配置(雙主雙從)
1) 配置master1
命令:vim /usr/local/share/mysql/master1/conf/my.cnf 添加如下內容:
[mysqld] # master01主服務器01唯一ID server-id=4306 # 啟用二進制日志 log-bin=mysql-bin #從庫的中繼日志,主庫日志寫到中繼日志,中繼日志再重做到從庫 # relay-log=myslql-relay-bin # binlog保留時間7天 expire_logs_days=7 # binlog 文件的大小 max_binlog_size=1G #設置logbin格式。取值:STATEMENT (默認),ROW,MIXED binlog_format=ROW # 設置不要賦值的數據 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys # 設置需要復制的數據(可選) # 如果配置了此項,就是只復制那個數據庫, 如果不指定就是所有 # binlog-do-db=需要復制的主數據庫1 # 設置login格式 binlog_format=STATEMENT # 在作為從數據庫的時候,有寫入操作也要更新二進制日志文件 log-slave-updates # 該從庫是否寫入二進制日志。如果需要成為多主則可啟用。只讀可以不需要 log-slave-updates=1 #表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1,取值范圍是1 .. 65535 auto-increment-increment=2 # 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 .. 65535 auto-increment-offset=1
2)配置master2
命令:vim /usr/local/share/mysql/master2/conf/my.cnf 添加如下內容:
[mysqld] # master01主服務器01唯一ID server-id=4307 # 啟用二進制日志 log-bin=mysql-bin #從庫的中繼日志,主庫日志寫到中繼日志,中繼日志再重做到從庫 # relay-log=myslql-relay-bin # binlog保留時間7天 expire_logs_days=7 # binlog 文件的大小 max_binlog_size=1G #設置logbin格式。取值:STATEMENT (默認),ROW,MIXED binlog_format=ROW # 設置不要賦值的數據 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys # 設置需要復制的數據(可選) # 如果配置了此項,就是只復制那個數據庫, 如果不指定就是所有 # binlog-do-db=需要復制的主數據庫1 # 設置login格式 binlog_format=STATEMENT # 在作為從數據庫的時候,有寫入操作也要更新二進制日志文件 log-slave-updates # 該從庫是否寫入二進制日志。如果需要成為多主則可啟用。只讀可以不需要 log-slave-updates=1 #表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1,取值范圍是1 .. 65535 auto-increment-increment=2 # 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 .. 65535 auto-increment-offset=1
3)配置slave1
命令:vim /usr/local/share/mysql/slave1/conf/my.cnf 添加如下內容:
[mysqld] # 從服務唯一ID server-id=5306 # 啟用中繼日志 relay-log=mysql-relay
4)配置slave2
命令:vim /usr/local/share/mysql/slave2/conf/my.cnf 添加如下內容:
[mysqld] # 從服務唯一ID server-id=5307 # 啟用中繼日志 relay-log=mysql-relay
注:查看server_id 的語句 show variables like 'server_id';
5.配置完成后重啟容器,即可生效
docker restart $(docker ps -q)
6.創建數據庫相關賬戶並授權
1)進入容器 master1是容器名稱
docker exec -it master1 bash
2)進入mysql窗口
mysql -uroot -p123456 //-u表示賬號 -p密碼(為上述創建容器時設置)
3)創建一個用戶來做同步的用戶,並授權,所有集群內的服務器都需要做
create user 'master1'@'%' identified with mysql_native_password by 'a123456';
grant replication slave,replication client on *.* TO 'master1'@'%'; //一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.245.139,加強安全。
4)刷新生效
flush privileges;
6)使用exit命令退出mysql命令、退出master1容器
7)進入master2容器創建賬號:
docker exec -it master2 bash //進入容器master2
mysql -uroot -p123456 //進去mysql窗口
mysql> create user 'master2'@'%' identified with mysql_native_password by 'a123456'; //創建賬號 master2
mysql>grant replication slave,replication client on *.* TO 'master2'@'%'; //授權
mysql> flush privileges;//刷新生效
7.從機復制主機
slave1復制master1 slave2復制master2
#復制主機的命令 CHANGE MASTER TO MASTER_HOST='主機的IP地址',//查看容器ip的命令 docker inspect master1 |grep IPAddress #master1 容器名稱 MASTER_USER='username',//主機的數據庫賬號 MASTER_PASSWORD='passworld',//主機的數據庫密碼 MASTER_LOG_FILE='mysql-bin.具體數字', MASTER_LOG_POS=具體值;
配置slave1:
如下圖即為主機master1的參數:
master_log_file的值對應為File的值
master_log_pos的值為Position對應的值
配置步驟:
同上述主機配置 先進入容器salve1->再進入mysql窗口運行如下命令即可,具體參數配置根據自己安裝的查詢填寫
change master to master_host='172.17.0.2', master_user='master1', master_password='a123456', master_log_file='mysql-bin.000004', master_log_pos=156;
啟用同步進程
start slave;
查看同步從庫狀態
show slave status\G;
如上圖沒有相關報錯信息就是配置成功了
本人安裝時遇到的問題:
執行start slave時報:
Slave failed to initialize relay log info structure from the repository
原因:由於之前配置過主從備份已經執行過一次change master to命令,這次再次執行change master to,2次的pos值不一樣。
解決:
#停止同步
stop slave
# 重置slave reset slave; # 執行同步
change master to master_host='172.17.0.2',
master_user='master1',
master_password='a123456',
master_log_file='mysql-bin.000004',
master_log_pos=156;
# 啟動slave start slave; # 查看slave狀態 show slave status\G;
配置完成后報錯:
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manu
原因:server_id重復,是由於配置文件放錯位置,導致未生效
解決:my.cnf放到容器創建時指定的位置,重啟容器即可
同理配置slave2,不再重復贅述
change master to master_host='172.17.0.3', master_user='master2', master_password='a123456', master_log_file='mysql-bin.000003', master_log_pos=880;
8.兩主機互相復制
master1復制master2, master2復制master1
配置master1:
change master to master_host='172.17.0.3', master_user='master2', master_password='a123456', master_log_file='mysql-bin.000003', master_log_pos=880;
啟用同步進行:
start master
查看狀態:
show slave status\G;
如上報錯:
解決:使用flush privileges 刷新一下即可,如果還是不行,使用show master status\G;查看對應的主機信息是否已經變更新了,重新設置slave即可
正常的顯示如下:
同理配置master2復制master1
change master to master_host='172.17.0.2', master_user='master1', master_password='a123456', master_log_file='mysql-bin.000004', master_log_pos=156;
到此就完成了安裝和配置
測試以上集群是否成功:
1.在master1上創建一個庫
CREATE DATABASE test_db;
2.創建一個表
CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `age` INT(3) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.插入數據
INSERT INTO user (name, age) VALUES ("zhaoming", 18); INSERT INTO user (name, age) VALUES ("張三", 20);
出現如下說明主從同步成功,至此集群可以快樂玩耍了: