正所謂理論造航母,現實小帆船。單有理論,不動手實踐,學到的知識猶如空中樓閣。接下來,咱們一塊兒來看下如何一步步進行 MySQL Replication 的配置。html
爲 MySQL 服務器配置複製很是簡單。但因爲場景不一樣,基本的步驟仍是有所差別。最基本的場景是新安裝主庫和備庫,總得來講分爲如下幾步:mysql
此外,因爲主備部署須要多臺服務器,可是這種要求對大多數人來講並不怎麼友好,畢竟沒有必要爲了學習部署主備結構,多買個雲服務器。所以,爲了測試方便,咱們經過 docker 容器技術在同臺機器上部署多個容器,從而實如今一臺機器上部署主備結構。面試
這裏咱們先假定大部分配置採用默認值,在主庫和備庫都是全新安裝而且擁有一樣的數據。接下來,咱們將展現如何經過 docker 技術一步步進行復制配置。sql
此外,咱們將推薦一些「安全配置」,以便在不清楚如何配置時,確保數據的安全。docker
1) 部署 dockerubuntu
什麼?docker 還沒部署?趕忙參考這裏配一個,docker 都沒玩,怎麼和麪試官吹水呀!vim
2) 拉取 MySQL 鏡像安全
docker pull mysql:5.7
3) 使用 mysql 鏡像啓動容器bash
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 啓動 master 容器 docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 啓動 slave 容器
master 對外的端口是 3339,slave 對外的端口是 3340,咱們在使用客戶端鏈接要使用對應的端口鏈接對應 mysql。服務器
4) 使用命令查看正在運行的容器
docker ps
5) 使用客戶端鏈接工具測試麗鏈接 mysql
1) 配置 master
經過如下命令進入容器內部
docker exec -it mysql-master /bin/bash
a) 更新 apt-get 源
apt-get update
b) 安裝 vim
apt-get install vim
c) 配置 my.cnf
vim /etc/mysql/my.cnf // 在my.cnf 中添加以下配置 [mysqld] server-id=110 # 服務器 id,同一局域網內惟一 log-bin=/var/lib/mysql/mysql-bin # 二進制日誌路徑
d) 重啓 mysql 服務使配置生效
service mysql restart
e) 啓動容器
重啓 mysql 服務時會使得 docker 容器中止,須要重啓容器。
docker start mysql-master
f) 建立數據同步用戶並受權
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
2) 配置 slave
經過如下命令進入容器內部
docker exec -it mysql-slave /bin/bash
a) 配置 my.cnf
vim /etc/mysql/my.cnf // 在my.cnf 中添加以下配置 [mysqld] server-id=120 # 服務器 id,同一局域網內惟一 log-bin=/var/lib/mysql/mysql-bin # 二進制日誌路徑 relay_log=/path/to/logs/relay-bin # 中繼日誌路徑
3) 關聯 master 和 slave
配置完 master 和 slave,接下來就要讓 master 和 slave 相關聯。
回到咱們的服務器,先找出 master 和 slave 容器的 IP,執行:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
所以,咱們知道了 mysql-master 容器的 IP 是:172.17.0.3。一樣的方法,mysq-slave 容器的 IP 是:172.17.0.4。記住這兩個值,後面的配置須要用到。
咱們首先配置 master。在 master 容器內經過 mysql -u root -p 進入 MySQL 命令行,執行 show master status;
上圖中,File 和 Position 字段對應的值要記錄下來,後續在 slave 配置時須要用到這兩個值。要注意的是,記錄完這兩個值後,就不能在 master 庫上作任何操做,不然會出現數據不一樣步的狀況。
接下來配置 slave,一樣的,在 slave 上進入 MySQL 命令行。而後執行下面語句:
change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=42852, master_connect_retry=30;
change master to 是 slave 配置 master 的命令,相關參數含義以下:
配置完 slave 後,能夠經過 show slave statusG; 查看 slave 的狀態。
![slave 狀態]](/img/bVbqPxZ)
正常狀況下,剛配置完 slave 的 Slave_IO_Running 和 Slave_SQL_Runing 都是 NO,由於咱們還沒開啓主從複製。使用 start slave 開啓主從複製,而後再查下 slave 狀態。
slave 的 Slave_IO_Running 和 Slave_SQL_Runing 都是 YES,說明主從複製已成功啓動。此時,能夠經過客戶端可否成功複製數據。
咱們在 master 新建 replication 庫,而後觀察 slave 庫是否建立了 replication 庫,以下圖,表示複製成功。
另外,開啓主從複製後,若是出現如下狀況:
Slave_IO_Running: CONNECTING Slave_SQL_RUNNING: Yes
表示開啓主從複製後, slave 的 IO 進程鏈接 master 出現問題,一直在重試鏈接。咱們能夠根據 Last_IO_Error 的提示進行解決:
前面的設置都是假定主備庫均爲剛剛安裝好且都是默認的數據,也就是說兩臺服務器上數據相同,而且知道當前主庫的二進制日誌。但在實際環境中,大多數狀況下是有一個一級運行了一段時間的主庫,而後用一臺新安裝的備庫與之同步,此時這臺備庫尚未數據。
有幾種方法來初始化備庫或者從其餘服務器克隆數據到備庫。包括從主庫複製數據、從另一臺備庫克隆數據,以及使用最近的一次備份來啓動備庫等。而這些方法都須要有三個條件來讓主庫與備庫保持同步:
下面是一些從別的服務器克隆備庫的方法:
咱們知道,MySQL 的複製有許多參數能夠控制,其中一些會對數據安全和性能產生影響。這裏,咱們介紹一種「安全配置」,能夠最小化問題發生的機率。
在主庫上二進制日誌最重要的選項是 sync_binlog:
sync_binlog=1
若是開啓該選項,MySQL 每次在提交事務前會將二進制日誌同步到磁盤上,保證在服務器崩潰時不會丟失時間。若是禁止該選項,服務器會少作一些工做,但二進制日誌文件可能在服務器崩潰時損壞或丟失信息。在一個不須要做爲主庫的備庫上 ,該選項會帶來沒必要要的開銷。要注意的是,它只適用於二進制日誌,而非中繼日誌。
若是沒法接受服務器崩潰致使表損壞,推薦使用 InnoDB。MyISAM 表在備庫服務器崩潰重啓後,可能已經處於不一致狀態。
若是使用 InnoDB,推薦設置以下選項:
innodb_flush_logs_at_trx_commit=1 # 每次事務提交時,將 log buffer 寫入到日誌文件並刷新到磁盤。默認值爲 1 innodb_safe_binlog
明確指定二進制日誌文件的名稱。當服務器間轉移文件、克隆新的備庫、轉儲備份或者其餘場景下,若是以服務器名來命名二進制日誌可能會致使不少問題。所以,咱們須要給 log_bin 選項指定一個參數。
log_bin=/var/lib/mysql/mysql-bin
在備庫上,一樣開啓以下培訓,爲中繼日誌指定絕對路徑:
relay_log=/path/to/logs/relay-bin skip_slave_start read_only
經過設置 relay_log 能夠避免中繼日誌文件基於機器名來命名,防止以前提到的可能在主庫上發生的問題。而 skip_slave_start 選項可以阻止備庫在崩潰後自動啓動複製,以留出時間修復可能發生的問題。read_only 選項能夠阻止大部分用戶更改非臨時表。