1. 程式人生 > >Mysql之一主多從復制

Mysql之一主多從復制

一個 oca 正常 art 應用 必須 如果 1.4 emc

MySQL主從復制

簡介

master數據庫中的DDL和DML操作通過二進制日誌(BINLOG)傳輸到slave數據庫上,然後將這些日誌重新執行(重做);從而使得slave數據庫的數據與master數據庫保持一致。

MySQL數據庫自身提供的主從復制功能可以方便的實現數據的多處自動備份,實現數據庫的拓展。多個數據備份不僅可以加強數據的安全性,通過實現讀寫分離還能進一步提升數據庫的負載性能。

目錄

一、主從原理

1.1 主從復制基本原理

1.2 主從復制原理運行流程

二、主從用途

2.1 主從復制的形式選擇

2.2 主從復制的作用

三、主從配置

3.1 主從復制環境準備,安裝數據庫

3.2 一主多從配置文件

3.3 驗證一主多從同步

四、常見問題

4.1 Slave_IO_Running: NO

4.2 Slave_SQL_Running: NO

4.3 mysql主從復制存在的問題


一、主從原理

技術分享圖片

Binary log:主數據庫的二進制日誌

Relay log:從服務器的中繼日誌

1.1 主從復制基本原理:

從庫生成兩個線程,一個I/O線程,一個SQL線程;i/o線程去請求主庫 的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 文件中;主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;SQL 線程,會讀取relay log文件中的日誌,並解析成具體操作,來實現主從的操作一致,而最終數據一致;

1.2 主從復制原理運行流程:

1> master在每個事務更新數據完成之前,將該操作記錄串行地寫入到binlog文件中;

2> slave開啟一個I/O Thread,該線程在master打開一個普通連接,主要工作是binlog dump process。如果讀取的進度已經跟上了master,就進入睡眠狀態並等待master產生新的事件。I/O線程最終的目的是將這些事件寫入到中繼日誌中;

3> SQL Thread會讀取中繼日誌,並順序執行該日誌中的SQL事件,從而與主數據庫中的數據保持一致;


二、主從形式與用途

2.1 主從形式

Mysql主從復制比較靈活,形式多種

v一主一從

v主主復制(互為主從)

v一主多從(常用於擴展系統讀取性能,因為讀是在從庫讀取的)

v多主一從(5.7開始支持)

v聯級復制

聯級復制就是master服務器,只給一臺slave服務器同步數據,然後slave服務器在向後端的所有slave服務器同步數據,降低master服務器的寫壓力,和復制數據的網絡IO。

技術分享圖片

2.2 主從用途

v實時災備,用於故障切換,主數據庫出現問題,可以切換到從數據庫

v讀寫分離,提供查詢服務

v數據備份,避免影響業務

三、主從配置

3.1 環境準備

OS:centos7.2

Mysql:5.6

防火墻、selinux:關閉

Mysql安裝方式:Yum


部署環境 ---> 一主多從

Master:192.168.174.164

Slave1:192.168.174.132

Slave2:192.168.174.133


3.1.1 安裝Mysql

主從安裝方式一致

3.1.2 安裝一些常用linux工具

yum -y install wget vim net-tools

3.1.3 下載Mysql5.6的yum源

wget http://dev.mysql.com/get/mysql-community-release-el7-5noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm


3.1.4 yum安裝Mysql服務並啟動

yum -y install mysql-community-server

service mysqld start

netstat -anptl|grep 3306
tcp6  0  0 :::3306       :::*    LISTEN      1248/mysqld


3.1.5 更改數據庫密碼,驗證是否能正常登陸

mysql -uroot -e "set password for 'root'@'localhost'=password('123456');"

mysql -uroot -p123456


3.2 一主多從復制

3.2.1 數據庫配置文件

Master:

# vim /etc/my.cnf

log-bin=mysql-bin 
binlog-format = mixed
server-id = 1
relay-log =relay-bin
relay-log-index = slave-relay-bin.index

技術分享圖片

Slave1:

# vim /etc/my.cnf
 
log-bin=mysql-bin  
binlog-format = mixed
server-id = 2
relay-log =relay-bin
relay-log-index = slave-relay-bin.index

技術分享圖片

Slave2:

# vim /etc/my.cnf
 
log-bin=mysql-bin
binlog-format = mixed
server-id = 3
relay-log =relay-bin
relay-log-index = slave-relay-bin.index

技術分享圖片

備註:修改完配置文件後重啟服務:systemctl restart mysqld

Mysql配置文件詳情請參考以下地址:

http://blog.51cto.com/13266497/2150082


3.2.2 數據庫一主多從操作

Master:

1> 授權用戶相應權限

mysql> grant replication slave on *.* to 'lxq'@'192.168.174.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)


2> 查看master狀態值,用於slave庫上同步

mysql> show master status\G;
*************************** 1. row ***************************
              File: mysql-bin.000001
       Position: 329
     Binlog_Do_DB:
     Binlog_Ignore_DB:
     Executed_Gtid_Set:
1 row in set (0.00 sec)


Slave1:

1> 使用change master語句,確定master庫的ip、用戶、密碼等信息

mysql> change master to
    -> master_host='192.168.174.164',
    -> master_user='lxq',
    -> master_password='123456',
    -> master_log_file='mysql-bin.000001', 
    -> master_log_pos=329;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

以下兩項是從master status中獲取的File和Position與下列相對應

master_log_file='mysql-bin.000001'

master_log_pos=329

2> 開啟同步

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)


3> 驗證Slave_IO_Running、Slave_SQL_Running是否是YES,兩個都是YES表示mysql主從復制配置成功了。

mysql> show slave status\G;
*************************** 1. row ***************************
      Slave_IO_State: Waiting for master to send event
        Master_Host: 192.168.174.164
        Master_User: lxq
        Master_Port: 3306
       Connect_Retry: 60
      Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 329
       Relay_Log_File: relay-bin.000002
       Relay_Log_Pos: 283
   Relay_Master_Log_File: mysql-bin.000001
      Slave_IO_Running: Yes
     Slave_SQL_Running: Yes

Slave_IO_Running: Yes(負責從庫去主庫讀取二進制日誌,並寫入到從庫的中繼日誌)

Slave_SQL_Running: Yes(負責將中繼日誌準換成SQL語句後執行)

備註:Slave2庫重復一下Slave1的操作即可完成一主多從

3.3 驗證能否成功同步

測試主從是否同步(master數據庫上執行Sql、Slave上面去驗證)

Master:

mysql> create database lxqdb;

mysql> create table lxqdb.lxq(id int,name varchar(50),sex varchar(10));

mysql> insert into lxqdb.lxq(id,name,sex) values (1,'lxq','male');


Slave:

mysql> show databases;
+--------------------+
| Database     |
+--------------------+
| information_schema|
| lxqdb       |
| mysql       |
| performance_schema|
+--------------------+
4 rows in set (0.01 sec)


mysql> select * from lxqdb.lxq;
+------+------+------+
| id | name| sex |
+------+------+------+
| 1  | lxq | male|
+------+------+------+
1 row in set (0.00 sec)


一、常見問題

4.1 Slave_IO_Running: NO

一般的原因是:

1> master服務器的網絡不通,或者master服務器的防火墻拒絕了外部連接3306端口,selinux模式選擇都可能會影響結果。

2> 在配置slave服務器時,使用chage master語句時輸錯了ip地址和密碼等信息。

3> master主服務器授權了錯誤的IP地址,權限。

解決方法:

關閉防火墻或開通3306的訪問權限,selinux設置為disabled;

slave的服務器上使用master授權用戶登陸一下master數據庫確保授權和slave地址能夠訪問,最後slave庫檢查一下change master語句是否有誤;

4.2 Slave_SQL_Running: No

mysql同步故障原因:

1> 程序可能在slave上進行了寫操作

2> 也可能是slave機器重起後,事務回滾造成的.

一般是事務回滾造成

解決方法1:

mysql> stop slave;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> start start;

備註:不一定會生效,操作兩次不生效後,選擇第二種方法


解決方法2:

mysql> stop slave;  

mysql> show master status;

master服務器上查看主機狀態,記錄File和Position對應的值,然後到slave服務器上執行手動同步(change master語句),參考同步時使用的語句。

備註:強制從某一個點同步,這種方法會停掉master寫操作,會丟失部分沒有同步的數據,不影響使用。

4.3 mysql主從復制存在的問題

1> 主庫宕機後,數據可能丟失

2> 從庫只有一個sql Thread,主庫寫壓力大,復制很可能延時

解決方法:

半同步復制---解決數據丟失的問題

異行復制----解決從庫復制延遲的問題

v全同步復制

全同步復制,當主庫提交事務之後,所有的從庫節點必須收到、APPLY並且提交這些事務,然後主庫線程才能繼續做後續操作。但缺點是,主庫完成一個事務的時間會被拉長,性能降低。

v異步復制

異步復制,主庫將事務 Binlog 事件寫入到 Binlog 文件中,此時主庫只會通知一下 Dump 線程發送這些新的 Binlog,然後主庫就會繼續處理提交操作,而此時不會保證這些 Binlog 傳到任何一個從庫節點上。

v半步復制

半同步復制的原理是,一個事務在主服務器上執行完成後,必須至少確保至少在一臺從服務器上執行完成後,事務才算提交成功。

主庫寫入一個事務commit提交並執行完之後,並不直接將請求反饋給前端應用用戶,而是等待從庫也接收到binlog日誌並成功寫入中繼日誌後,主庫才返回commit操作成功給客戶端。半同步復制保障了事物執行後,至少有兩份日誌記錄,一份在主庫的binlog上 ,另一份至少在從庫的中繼日誌Relay log上,這樣就極大的保證了數據的一致性。



Mysql之一主多從復制