docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群
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 ..65535auto-increment-increment=2# 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 ..65535auto-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 ..65535auto-increment-increment=2# 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 ..65535auto-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 MASTERTO 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`INTUNSIGNED 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);
出現如下說明主從同步成功,至此集群可以快樂玩耍了:
總結
以上是生活随笔為你收集整理的docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: win10企业版更新和安全中没有 “恢复
- 下一篇: thinkphp+mysql+join+
