前面已經將瞭如何利用composer 快速搭建mysql服務。本篇文章將在原來的基礎配置出,2臺Mysql 服務器。一臺做爲Master 服務器,一臺做爲Slave 服務器。html
version: '3'
networks: #定義網路
backend:
driver: ${NETWORKS_DRIVER}
services:
### MySQL ################################################
mysql-master:
build:
context: ./mysql #自定義鏡像
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE} #默認建立數據庫
- MYSQL_USER=${MYSQL_USER} #建立用戶
- MYSQL_PASSWORD=${MYSQL_PASSWORD} #用戶密碼
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用戶祕密
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_PATH_HOST}/mysql:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT}:3306"
networks:
- backend
mysql-slave:
build:
context: ./mysql_slave #自定義鏡像
args:
- MYSQL_VERSION=${MYSQL_VERSION}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE} #默認建立數據庫
- MYSQL_USER=${MYSQL_USER} #建立用戶
- MYSQL_PASSWORD=${MYSQL_PASSWORD} #用戶密碼
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} #root 用戶祕密
- TZ=${WORKSPACE_TIMEZONE}
volumes:
- ${DATA_PATH_HOST}/mysql_slave:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${MYSQL_PORT_SLAVE}:3306"
networks:
- backend
複製代碼
先給出完整版的docker-compose.yml。不過先把關注點放在mysql-master
這個服務上,mysql-slave
先放一邊,不去管他。
比對上一篇中的內容,mysql-master
的配置沒有變化,咱們須要將mysql-master
做爲Master節點。主要的工做在於mysql目錄下的my.cnf文件。
mysql
修改後的my.cnfweb
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
## 主庫配置
## 設置server_id,通常設置爲IP,保證惟一就好
server_id=100
# 開啓binlog,名字能夠隨意取
log-bin=mysql-bin
## binlog日誌格式,(mixed,statement,row,默認格式是statement)
binlog_format=row
## 日誌自動刪除日期,默認值爲0,表示不自動刪除。
expire_logs_days=7
## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致
slave_skip_errors=1062
## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步)
binlog-ignore-db=mysql
#控制binlog的寫入頻率。每執行多少次事務寫入一次(這個參數性能消耗很大,但可減少MySQL崩潰形成的損失)
sync_binlog = 1
#這個參數通常用在主主同步中,用來錯開自增值, 防止鍵值衝突
auto_increment_offset = 1
#這個參數通常用在主主同步中,用來錯開自增值, 防止鍵值衝突
auto_increment_increment = 1
複製代碼
參數的意義備註都有說明了,着重講解下如下幾個sql
delete from student where id = 1。
那麼binlog日誌中也會如實記錄這條信息。優勢:佔用空間少,缺點:誤刪則沒法恢復數據,在某些狀況下,可能形成主備不一致。docker-compose up -d --build mysql-master
複製代碼
--build
參數可讓鏡像強制從新生成。
查看Master服務binlog狀況docker
show VARIABLES like 'log_%';
複製代碼
展現內容以下:
數據庫
log_bin
爲ON。
grant file,select,replication slave on *.* to 'slave'@'%' identified by '123456';
複製代碼
這裏'slave'@'%' 讓slave 能夠在任何機器均可以登陸,固然若是知道Slave節點IP ,建議使用IP,增長帳號安全性。
緩存
show master status;
複製代碼
複製mysql 目錄 生成一個mysql_slave目錄,改後目錄結構爲
安全
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
## 從庫配置
## 設置server_id,通常設置爲IP,保證惟一就好
server_id=101
# 開啓binlog,名字能夠隨意取
log-bin=mysql-slave-bin
## binlog日誌格式,(mixed,statement,row,默認格式是statement)
binlog_format=row
## 日誌自動刪除日期,默認值爲0,表示不自動刪除。
expire_logs_days=7
## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致
slave_skip_errors=1062
## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步)
binlog-ignore-db=mysql
#犧牲必定可靠性,增強併發能力
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0
## 只讀
read_only=1
複製代碼
和Master 項目比:bash
sync_binlog 和 ``innodb_flush_log_at_trx_commit 設置爲0,
加快事務處理速度,犧牲了必定的可靠性。因爲Slave 是Master 的備份,因此即便Slave 服務崩潰或者斷點丟失數據,也能夠從新啓動後從主庫恢復。docker-compose up -d --build mysql-slave
複製代碼
mysql-slave節點在.env中,我配置成了3309端口。
服務啓動後,鏈接上Slave節點,設置Master 信息:服務器
change master to master_host='mysql-master',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1311;
複製代碼
簡單來講Slave 服務器,經過master_log_file和master_log_pos 兩個參數知道本身經過Master中的哪一個binlog信息開始同步。
stop slave;
start slave;
複製代碼
開啓同步,查看同步信息
mysql>SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1311
Relay_Log_File: aee031481732-relay-bin.000002
Relay_Log_Pos: 232
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1311
Relay_Log_Space: 1401
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
複製代碼
Slave_IO_Running 和 Slave_SQL_Running
兩列的值都爲"Yes",這代表 Slave 的 I/O 和 SQL 線程都在正常運行。Seconds_Behind_Master
表示延遲多少,通常狀況爲0
經過今天的配置,咱們搭建了2臺Mysql 服務器,一臺Master ,一臺Slave。瞭解binlog日誌的不一樣格式,以主從服務器爲了效率不一樣的配置信息。下一篇將講解怎麼作雙主
。
docker 搭建Mysql 集羣:使用composer 啓動Mysql服務