Docker-Compose實(shí)現(xiàn)Mysql主從的示例代碼
1. 簡(jiǎn)介
通過(guò)使用docker-compose
搭建一個(gè)主從數(shù)據(jù)庫(kù),本示例為了解耦 將兩個(gè)server拆分到了兩個(gè)compose文件中,當(dāng)然也可以放到一個(gè)compose文件中
演示mysql版本:5.7.16
2. 部署流程
master節(jié)點(diǎn):
- 安裝mysql-server
- 修改配置
- 創(chuàng)建用于同步的賬號(hào)并授權(quán)
- 檢查相關(guān)配置
slave節(jié)點(diǎn):
- 安裝mysql-server
- 修改配置
- 選擇主節(jié)點(diǎn)
- 檢查相關(guān)配置并驗(yàn)證同步功能
3. master節(jié)點(diǎn)
3.1 安裝mysql
創(chuàng)建mysql文件夾并進(jìn)入文件夾(文件夾名稱mysql)
創(chuàng)建docker-compose文件內(nèi)容如下
# docker-compose.yml version: '3' services: mysql: restart: "no" image: mysql:5.7.16 container_name: mysql-master volumes: - ./datadir:/var/lib/mysql - ./conf/mysql:/etc/mysql environment: - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" ports: - 3306:3306 networks: - mysql-net networks: mysql-net: driver: bridge
注意:因?yàn)橐雅渲梦募煸诘椒?wù)中去,所以要先把容器中的配置文件copy到宿主機(jī)上
1.先啟動(dòng)一個(gè)用于copy文件的容器
$ docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d mysql:5.7.16
2.將mysql-temp
容器中的配置文件copy出來(lái),現(xiàn)在conf文件夾中就是mysql自帶的所有配置文件
$ docker cp mysql-temp:/etc/mysql conf
因?yàn)楫?dāng)前conf目錄中的my.cnf
還是個(gè)link,所以直接使用當(dāng)前目錄中的備份文件作為主要的配置文件
$ mv my.cnf.fallback my.cnf
3.修改配置文件my.cnf
在文件的最下方加入配置信息
[mysqld] log-bin=mysql-bin # 開(kāi)啟 binlog server-id=1 # 當(dāng)前server在cluster中的id,必須保證在cluster中唯一 #只保留7天的二進(jìn)制日志,以防磁盤(pán)被日志占滿(可選) expire-logs-days = 7 #不備份的數(shù)據(jù)庫(kù) (可選) binlog-ignore-db=information_schema binlog-ignore-db=performation_schema binlog-ignore-db=sys
4.啟動(dòng)mysql服務(wù),通過(guò)輸出內(nèi)容得知真實(shí)的網(wǎng)絡(luò)名稱為mysql_mysql-net
,也就是當(dāng)前所在文件夾的名稱拼接了文件中指定的網(wǎng)絡(luò)名稱
5.服務(wù)啟動(dòng)完畢后,創(chuàng)建用于同步的用戶并授權(quán)
創(chuàng)建的用戶名稱為slave
密碼為123456
CREATE USER 'slave' @'%' IDENTIFIED BY '123456'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%'; #刷新權(quán)限 FLUSH PRIVILEGES;
6.查看master狀態(tài)信息
SHOW MASTER STATUS; #查看Mater數(shù)據(jù)有哪些slave select * from information_schema.processlist as p where p.command = 'Binlog Dump';
4. slave節(jié)點(diǎn)
安裝步驟同master相同,只把需要修改的展示一下,當(dāng)前的目錄結(jié)構(gòu)如下
docker-compose.yaml
主要修改了網(wǎng)絡(luò)相關(guān)的信息和container_name(網(wǎng)絡(luò)名稱上面有解釋)
version: '3' services: mysql: restart: "no" image: mysql:5.7.16 container_name: mysql-slave volumes: - ./datadir:/var/lib/mysql - ./conf:/etc/mysql environment: - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" ports: - 3307:3306 networks: - mysql_mysql-net networks: mysql_mysql-net: external: true # 來(lái)自外部
my.cnf
添加的內(nèi)容如下:
[mysqld] server-id=2 relay_log=relay-log #開(kāi)啟只讀 意味著當(dāng)前的數(shù)據(jù)庫(kù)用作讀,當(dāng)然這也只會(huì)影響到非root的用戶,如果使用root用戶操作本庫(kù)是不會(huì)有影響的 read_only=ON
設(shè)置完成后啟動(dòng)salve server,連接slave并關(guān)聯(lián)master節(jié)點(diǎn)
MASTER_HOST
:直接使用container_nameMASTER_LOG_FILE/MASTER_LOG_POS
:直接使用安裝master步驟中的最后一步的值,其實(shí)就是指定同步的bin-log文件名稱和Offset
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
管理完成后 啟動(dòng)salve
START SLAVE;
最后查看slave status
SHOW SLAVE STATUS;
5. 驗(yàn)證
在master上創(chuàng)建test數(shù)據(jù)庫(kù)并創(chuàng)建user表,刷新查看salve庫(kù),出現(xiàn)了對(duì)應(yīng)的庫(kù)表
經(jīng)驗(yàn)證數(shù)據(jù)同步也沒(méi)有問(wèn)題。
6. 可能遇到的問(wèn)題
SHOW SLAVE STATUS
時(shí)發(fā)現(xiàn) slave_io_running=No salve_sql_running=No
,可能的原因有很多,可以查看如下的字段中輸出的內(nèi)容
可能的原因:
- 主從網(wǎng)絡(luò)不通
- 兩臺(tái)節(jié)點(diǎn)的
server-id
重復(fù),直接修改對(duì)應(yīng)的id即可 - 數(shù)據(jù)庫(kù)的uuid相同(可能是因?yàn)閿?shù)據(jù)庫(kù)文件是直接copy過(guò)來(lái)的導(dǎo)致的),在對(duì)應(yīng)的庫(kù)下生成不同于master的uuid到
auto.cnf
中即可 - sql執(zhí)行失敗,可能是slave剛添加進(jìn)來(lái),也沒(méi)有master庫(kù)的數(shù)據(jù)庫(kù)instance,導(dǎo)致操作對(duì)應(yīng)的庫(kù)時(shí)slave這邊根本沒(méi)有對(duì)應(yīng)的instance或者table又或是記錄,引發(fā)的報(bào)錯(cuò)。這個(gè)只能具體問(wèn)題具體解決了
- master和slave的
MASTER_LOG_FILE/MASTER_LOG_POS
值設(shè)置的有問(wèn)題,在slave節(jié)點(diǎn)上STOP SLAVE;
然后重新連接下master即可
7. 同步部分?jǐn)?shù)據(jù)庫(kù)實(shí)例或表
在master節(jié)點(diǎn)上添加配置【可選】(如果只希望從庫(kù)讀取到部分實(shí)例)
在my.cnf文件中加入如下配置
#需要同步的數(shù)據(jù)庫(kù)名 有多個(gè)庫(kù)添加多行即可 binlog-do-db=test binlog-do-db=test1 #排除的數(shù)據(jù)庫(kù) binlog-ignore-db=sys
salve端:在my.cnf文件中加入如下配置,這樣的話salve只會(huì)讀取配置的db或table,master對(duì)其他db的操作也不會(huì)影響slave
#如果salve庫(kù)名稱與master庫(kù)名相同,使用本配置 replicate-do-db=test #如果master庫(kù)名[test]與salve庫(kù)名[test001]不同,使用以下配置[需要做映射] #replicate-rewrite-db = test -> test001 #如果不是要全部同步[默認(rèn)全部同步],則指定需要同步的表 #replicate-wild-do-table=test.user #replicate-wild-do-table=test.role
到此這篇關(guān)于Docker-Compose實(shí)現(xiàn)Mysql主從的示例代碼的文章就介紹到這了,更多相關(guān)Docker-Compose Mysql主從內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
編寫(xiě)Dockerfile和構(gòu)建自定義鏡像的步驟與技巧
Docker已經(jīng)成為現(xiàn)代應(yīng)用程序開(kāi)發(fā)和部署的重要工具之一,在Docker中,Dockerfile是定義和構(gòu)建自定義鏡像的鍵文件,本文將深入解讀Dockerfile的編寫(xiě)和自定義鏡像的構(gòu)建過(guò)程,并分享一些實(shí)用的技巧和最佳實(shí)踐,需要的朋友可以參考下2023-07-07Docker images導(dǎo)出和導(dǎo)入操作
這篇文章主要介紹了Docker images導(dǎo)出和導(dǎo)入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03docker安裝redis掛載容器卷同時(shí)開(kāi)啟持久化
本文主要介紹了docker安裝redis掛載容器卷同時(shí)開(kāi)啟持久化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06docker搭建dnsmasq服務(wù)的實(shí)現(xiàn)
本文將指導(dǎo)讀者如何使用Docker搭建DNSmasq服務(wù),通過(guò)簡(jiǎn)單的步驟和詳細(xì)的說(shuō)明,幫助讀者快速在Docker環(huán)境中部署DNSmasq,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案
這篇文章主要介紹了docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03