docker 搭建Mysql 集羣: 主從配置

docker 搭建Mysql 集羣: 主從配置

前言

前面已經將瞭如何利用composer 快速搭建mysql服務。本篇文章將在原來的基礎配置出,2臺Mysql 服務器。一臺做爲Master 服務器,一臺做爲Slave 服務器。html

docker-composer.yml

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

配置Master節點

修改後的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

  • log-bin : 用於開啓binlog 日誌功能,默認不開啓,值爲binlog日誌文件名稱可隨本身喜歡定義。填寫後就開啓了binlog功能。
  • binlog_format:文件格式。
  • statement: sql語句形式,例如在Master 執行 delete from student where id = 1。那麼binlog日誌中也會如實記錄這條信息。優勢:佔用空間少,缺點:誤刪則沒法恢復數據,在某些狀況下,可能形成主備不一致。
  • row: 會記錄數據信息,例如上面例子中會把id爲1的學生信息也記錄下來。優勢:能夠找回誤刪的信息,能夠避免主備不一致的狀況,缺點:佔用空間大。
  • mixed:混合statement,row。 Mysql 會判斷哪些語句執行可能引發主備不一致,這些語句採用row 格式記錄,其餘的使用statement格式記錄。固然這種形式的日誌也沒有辦法恢復誤刪的數據。
  • 在服務器配置較好的狀況下,建議使用row。阿里雲上RDS服務,默認也是使用row格式。
  • expire_logs_days: 設置binlog保存時間,默認爲0,也就是隨着服務器運行,binlog會愈來愈大。看業務需求來配置binlog保存時間吧。結合每日的數據庫備份功能,經過binlog,能夠支持將數據庫回溯到N天的任意時間點。
  • sync_binlog:默認,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系統本身控制它的緩存的刷新。這時候的性能是最好的,可是風險也是最大的。一旦系統崩潰, binlog_cache中的全部binlog信息都會被丟失。設置爲1表示每次事務提交都須要寫入磁盤。也能夠設置爲2,3..N標識 N次事務提交寫入磁盤。Master 節點通常設置爲1,保證binlog日誌不丟失。

修改完成後,啓動Master節點服務

docker-compose up -d --build mysql-master
複製代碼

--build參數可讓鏡像強制從新生成。
查看Master服務binlog狀況docker

show VARIABLES like 'log_%';
複製代碼

展現內容以下:
數據庫

image.png

看到 log_bin爲ON。

建立用於主從同步的帳號:

grant file,select,replication slave on *.* to 'slave'@'%' identified by '123456';
複製代碼

這裏'slave'@'%' 讓slave 能夠在任何機器均可以登陸,固然若是知道Slave節點IP ,建議使用IP,增長帳號安全性。
緩存

查看Master狀態

show master status;
複製代碼
image.png
image.png

有用的字段是File,和Position記錄下來。

配置Slave節點

複製mysql 目錄 生成一個mysql_slave目錄,改後目錄結構爲
安全

image.png
image.png

修改mysql_slave下的my.cnf

# 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 服務崩潰或者斷點丟失數據,也能夠從新啓動後從主庫恢復。
  • read_only :設置爲只讀,防止沒必要要的修改。 主備同步線程具備管理員權限,不受read_only控制,因此可以正常寫入。

啓動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;
複製代碼
  • master_host : 爲主節點IP, 因爲咱們mysql-master 和msql-slave都在同一個backend網路中,因此能夠經過mysql-master名稱訪問到。docker 幫咱們作了host解析。
  • master_user : 剛剛建立的用於同步的帳號
  • master_password: 登陸密碼
  • master_log_file: 就是Master 要同步的binlog文件。
  • master_log_pos:從binlong哪一個文件位置開始同步。

簡單來講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服務

相關文章
相關標籤/搜索