mysql主從的機(jī)制主要是通過(guò)從服務(wù)器訂閱主服務(wù)器的binlog日志實(shí)現(xiàn)。
這里以一主雙從的形式演示。

image.png
解釋
這三個(gè)mysql創(chuàng)建一個(gè)docker的局域網(wǎng)用于通信使用,因?yàn)楦鱾€(gè)容器之間是互不影響的,所以他們的啟動(dòng)端口都可以是3306,對(duì)于宿主機(jī)映射的端口分別是6606,6607,6608
部署方案
1. 編寫docker-compose
version: '3.7'
services:
mysql-master:
image: mysql/mysql-server:5.7
container_name: mysql_master
ports:
- 6606:3306
volumes:
- /volume/mysql-master:/var/lib/mysql
- /volume/conf/mysql-ms/mysqld-master.cnf:/etc/my.cnf
command:
- "--user=root"
environment:
MYSQL_ROOT_PASSWORD: Yu20200416_
MYSQL_DATABASE: spark
MYSQL_USER: admin
MYSQL_PASSWORD: Yu20200416_
restart: unless-stopped
networks:
mysql-ms-network:
ipv4_address: 172.25.0.101
mysql-slave1:
image: mysql/mysql-server:5.7
container_name: mysql_slave1
ports:
- 6607:3306
command:
- "--user=root"
volumes:
- /volume/mysql-slave1:/var/lib/mysql
- /volume/conf/mysql-ms/mysqld-slave1.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: Yu20200416_
MYSQL_DATABASE: spark
MYSQL_USER: admin
restart: unless-stopped
networks:
mysql-ms-network:
ipv4_address: 172.25.0.102
mysql-slave2:
image: mysql/mysql-server:5.7
container_name: mysql_slave2
ports:
- 6608:3306
command:
- "--user=root"
volumes:
- /volume/mysql-slave2:/var/lib/mysql
- /volume/conf/mysql-ms/mysqld-slave2.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: Yu20200416_
MYSQL_DATABASE: spark
MYSQL_USER: admin
restart: unless-stopped
networks:
mysql-ms-network:
ipv4_address: 172.25.0.103
networks:
mysql-ms-network:
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24
2.準(zhǔn)備my.cnf文件
修改mysql-master.cnf
[mysqld]
#主數(shù)據(jù)庫(kù)端ID號(hào)
server_id = 1
#開啟二進(jìn)制日志
log-bin = mysql-bin
#需要復(fù)制的數(shù)據(jù)庫(kù)名,如果復(fù)制多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可
binlog-do-db = spark
#將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中
log-slave-updates
#控制binlog的寫入頻率。每執(zhí)行多少次事務(wù)寫入一次(這個(gè)參數(shù)性能消耗很大,但可減小MySQL崩潰造成的損失)
sync_binlog = 1
#這個(gè)參數(shù)一般用在主主同步中,用來(lái)錯(cuò)開自增值, 防止鍵值沖突
auto_increment_offset = 1
#這個(gè)參數(shù)一般用在主主同步中,用來(lái)錯(cuò)開自增值, 防止鍵值沖突
auto_increment_increment = 1
#二進(jìn)制日志自動(dòng)刪除的天數(shù),默認(rèn)值為0,表示“沒(méi)有自動(dòng)刪除”,啟動(dòng)時(shí)和二進(jìn)制日志循環(huán)時(shí)可能刪除
expire_logs_days = 7
#將函數(shù)復(fù)制到slave
log_bin_trust_function_creators = 1
mysqld-slave1.cnf
[mysqld]
# 從數(shù)據(jù)庫(kù)端ID號(hào)
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
#log buffer將每秒一次地寫入log file中,并且log file的flush(刷到磁盤)操作同時(shí)進(jìn)行。該模式下在事務(wù)提交的時(shí)候,不會(huì)主動(dòng)觸發(fā)寫入磁盤的操作
innodb_flush_log_at_trx_commit = 0
#指定slave要復(fù)制哪個(gè)庫(kù)
replicate-do-db = spark
#MySQL主從復(fù)制的時(shí)候,當(dāng)Master和Slave之間的網(wǎng)絡(luò)中斷,但是Master和Slave無(wú)法察覺的情況下(比如防火墻或者路由問(wèn)題)。Slave會(huì)等待slave_net_timeout設(shè)置的秒數(shù)后,才能認(rèn)為網(wǎng)絡(luò)出現(xiàn)故障,然后才會(huì)重連并且追趕這段時(shí)間主庫(kù)的數(shù)據(jù)
slave-net-timeout = 60
log_bin_trust_function_creators = 1
3.啟動(dòng)mysql
將配置文件放置在指定目錄
因?yàn)槲覀兿雽ysql的my.cnf文件映射到宿主機(jī)上(否則docker會(huì)將映射的文件作為路徑處理導(dǎo)致報(bào)錯(cuò)),所以需要提前將準(zhǔn)備好的配置文件放置在我們約定的指定位置中(這里我約定的路徑為/volume/conf/mysql-ms/)
執(zhí)行docker-compose
第一次需要拉取mysql鏡像,執(zhí)行時(shí)間相對(duì)長(zhǎng)一點(diǎn)。
docker-compose up -d