mysql主從的機(jī)制主要是通過從服務(wù)器訂閱主服務(wù)器的binlog日志實(shí)現(xiàn)澜掩。
這里以一主雙從的形式演示。
image.png
解釋
這三個mysql創(chuàng)建一個docker的局域網(wǎng)用于通信使用市咽,因?yàn)楦鱾€容器之間是互不影響的疟丙,所以他們的啟動端口都可以是3306奠滑,對于宿主機(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ù)庫端ID號
server_id = 1
#開啟二進(jìn)制日志
log-bin = mysql-bin
#需要復(fù)制的數(shù)據(jù)庫名搪哪,如果復(fù)制多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項(xiàng)即可
binlog-do-db = spark
#將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中
log-slave-updates
#控制binlog的寫入頻率坪圾。每執(zhí)行多少次事務(wù)寫入一次(這個參數(shù)性能消耗很大晓折,但可減小MySQL崩潰造成的損失)
sync_binlog = 1
#這個參數(shù)一般用在主主同步中,用來錯開自增值, 防止鍵值沖突
auto_increment_offset = 1
#這個參數(shù)一般用在主主同步中兽泄,用來錯開自增值, 防止鍵值沖突
auto_increment_increment = 1
#二進(jìn)制日志自動刪除的天數(shù)漓概,默認(rèn)值為0,表示“沒有自動刪除”,啟動時和二進(jìn)制日志循環(huán)時可能刪除
expire_logs_days = 7
#將函數(shù)復(fù)制到slave
log_bin_trust_function_creators = 1
mysqld-slave1.cnf
[mysqld]
# 從數(shù)據(jù)庫端ID號
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
#log buffer將每秒一次地寫入log file中病梢,并且log file的flush(刷到磁盤)操作同時進(jìn)行胃珍。該模式下在事務(wù)提交的時候,不會主動觸發(fā)寫入磁盤的操作
innodb_flush_log_at_trx_commit = 0
#指定slave要復(fù)制哪個庫
replicate-do-db = spark
#MySQL主從復(fù)制的時候蜓陌,當(dāng)Master和Slave之間的網(wǎng)絡(luò)中斷觅彰,但是Master和Slave無法察覺的情況下(比如防火墻或者路由問題)。Slave會等待slave_net_timeout設(shè)置的秒數(shù)后钮热,才能認(rèn)為網(wǎng)絡(luò)出現(xiàn)故障填抬,然后才會重連并且追趕這段時間主庫的數(shù)據(jù)
slave-net-timeout = 60
log_bin_trust_function_creators = 1
3.啟動mysql
將配置文件放置在指定目錄
因?yàn)槲覀兿雽ysql的my.cnf文件映射到宿主機(jī)上(否則docker會將映射的文件作為路徑處理導(dǎo)致報錯),所以需要提前將準(zhǔn)備好的配置文件放置在我們約定的指定位置中(這里我約定的路徑為/volume/conf/mysql-ms/)
執(zhí)行docker-compose
第一次需要拉取mysql鏡像隧期,執(zhí)行時間相對長一點(diǎn)飒责。
docker-compose up -d