1. 程式人生 > >運維筆記36 mysql的一主多從模型(原始主從複製,基於GTID主從複製)

運維筆記36 mysql的一主多從模型(原始主從複製,基於GTID主從複製)

概述:

mysql的主從複製是十分經典的一個應用,但是主從之間總會有資料一致性(data consistency )的問題,一般情況從庫會落後主庫幾個小時,而且在傳統一主多從(mysql5.6之前)的模型中當master down掉後,我們不只是需要將一個slave提成master就可以,還要將其他slave的同步目的地從以前的master改成現在master,而且bin-log的序號和偏移量也要去檢視,這是十分不方便和耗時的,但mysql5.6引入gtid之後解決了這個問題,本次文章我們會講解傳統的資料庫主從切換,mysql5.6之後的主從切換。
系統版本:Red Hat Enterprise Linux Server release 7.1 (Maipo)
mysql版本:
mysql叢集框圖:
這裡寫圖片描述

1.傳統主從切換

沒有基於GTID的mysql主從複製在我之前的部落格中有記錄 運維筆記32 (mysql的主從複製)
或者參考官方文件(強力推薦,仔細讀過後會發現寫的是真心好)配置基於日誌位置的主從複製

master伺服器配置:

[mysqld]
binlog-do-db=test   
log-bin=mysql-bin
server-id=1

建立複製使用者並授權:

mysql> create user repl;
mysql> grant replication slave on *.* to 'repl' @'172.25.3.%' identified by
'redhat';

從伺服器1配置

server-id=2

將主伺服器設定為master.mo.com

CHANGE MASTER TO MASTER_HOST='172.25.3.102',MASTER_USER='repl',MASTER_PASSWORD='redhat';

從伺服器2配置

server-id=3

將主伺服器設定為master.mo.com

CHANGE MASTER TO MASTER_HOST='172.25.3.102',MASTER_USER='repl',MASTER_PASSWORD='redhat';

現在開啟salve1,slave2的複製。

start slave;

以上只是一個非常簡易的主從配置,我們在接下來會一點點豐富,現在建立一個test庫,並寫入加入一些資料。

    create database test;
    create table test(id not int auto_increment,
    name varcahr(30),
    school varchar(30)
);
start transaction;
insert into user values(NULL,'mo','test');
insert into user values(NULL,'li','test');
commit;

master與slave1,slave2同步成功。
這裡寫圖片描述
通過該圖可以看出同步成功。
現在開始模擬主從切換
首先將master的mysql關閉

[root@master ~]# /etc/init.d/mysqld stop
Shutting down MySQL.... SUCCESS!

現在檢視slave上的狀態

        Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes

IO執行緒一直在嘗試連線主機,我們把master都關掉了,任他怎麼連都是連不上的,所以開始將原來的slave1提升成master。
其實將slave1提升成主,並不需要在slave1上做什麼,而是要在其他slave上做設定,而且要根據slave1上的日誌號和日誌偏移來確定新的主從複製。
現在檢視下slave1上的日誌

mysql> show binlog events\G
Empty set (0.00 sec)

。。。不存在日誌,我們看下data目錄

slave2-relay-bin.000001
ca.pem           localhost.localdomain.err  private_key.pem     slave2-relay-bin.000002
client-cert.pem  localhost.localdomain.pid  public_key.pem      slave2-relay-bin.index

發現這裡只有relay-log,我們查閱官網的文件

Normally, a slave does not write any updates that are received from a master server to its own binary log. This option causes the slave to write the updates performed by its SQL thread to its own binary log. For this option to have any effect, the slave must also be started with the --log-bin option to enable binary logging.

簡單翻譯:

一般情況,一個從伺服器不會向他的二進位制日誌更新任何從主伺服器接收到的資料,log-slave-updates選項讓從伺服器也更新他本機的二進位制日誌。為了讓這個選項生效,我們還必須指定log-bin引數。

看到這裡,我們在看下自己的配置檔案,終於發現了問題,我們的從伺服器根本什麼都沒有配置,data目錄下的realy-bin並不沒有master上資料更新的,而且他也不會把自己更新的資料寫入二進位制檔案(This option causes the slave to write the updates performed by its SQL thread to its own binary log.),所以要讓slave成為master必須新增log-bin,和log-slave-updates。
修改後的slave1,slave2上的配置檔案
slave1:

log-bin=mysql-bin
log-slave-updates=ON
server-id=2 

slave2:

log-bin=mysql-bin
log-slave-updates=ON
server-id=3 

檢視slave1上的日誌

mysql> show binlog events\G
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 2
End_log_pos: 123
       Info: Server ver: 5.7.11-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 2
End_log_pos: 154
       Info: 
2 rows in set (0.00 sec)

確定當前的複製檔案為mysql-bin.000001,當前的檔案偏移為154。這兩個都要幾下,因為要讓其他slave以slave1為master去同步,依靠的就是這個日誌。
slave2上配置

mysql> CHANGE MASTER TO MASTER_HOST='172.25.3.103', MASTER_USER='repl', MASTER_PASSWORD='redhat'  ,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

開啟slave,檢視slave2狀態

       Master_Host: 172.25.3.103
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
...omit
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在slave1上寫入資料,觀察slave2的同步
這裡寫圖片描述
從上圖可以看出,我們在筆記本[1](slave1)上插入資料後,在筆記本[2](slave2)上可以檢視到,說明切換成功。雖然切換成功,但是因為需要去查詢新提升的資料庫的日誌號和偏移id,整個過程非常麻煩,而且容易出錯,在mysql5.6版本更新了GTID之後一切都改變了,讓我們下面來介紹一下。

2.基於GTID的主從複製

官方文件關於gtid的定義:

A global transaction identifier (GTID) is a unique identifier created and associated with each transaction committed on the server of origin (master). This identifier is unique not only to the server on which it originated, but is unique across all servers in a given replication setup. There is a 1-to-1 mapping between all transactions and all GTIDs.

簡要翻譯:通用事務識別符號是一個與每個在伺服器上提交事務相關的識別符號,這個表示符不僅在創造它的伺服器上是獨一無二的,而且他在所有的從伺服器上也是獨一無二的,這是一個識別符號與事務一對一的符號。
(翻譯水平有限。。。英文好的同學自動無視)
GTID的格式就像下面這樣:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

用冒號分割開,左半部分是mysql的uuid,右半部份是事務的id。
我們通過下面方式檢視我們的master與slave的uuid

[root@master data]# cat auto.cnf 
[auto]
server-uuid=b7f3c1bc-12b5-11e7-a4ba-5254000d5ada

[root@slave1 data]# cat auto.cnf 
[auto]
server-uuid=6447f007-12c2-11e7-91f7-525400d18cb9

現在我們要恢復環境,重新讓域名為master的伺服器變成mysql主資料庫,但是大家要知道,在設定主從複製之前,我們的主資料庫與從資料庫一定要先是一致的,否則會出現一種情況,我有兩臺伺服器,mster和slave,但現在他們並沒有做主從,我準備為master上的test庫做一次主從複製,但是,slave上沒有這個test庫,現在做主從就會出問題,因為,slave去讀取master的日誌的時候發現要向一個test的庫插入資料,可是我都沒有這個庫,這時主從同步就會卡在這裡。
這裡寫圖片描述
如上圖,由於我們剛才將master在主從中剔除了,導致後續更新的資料,master中並沒有,為了穩妥起見,我們使用1中的根據偏移量來進行主從的同步。
這裡寫圖片描述
從上圖可以看出,開始修改時候的二進位制日誌是’mysql-bin.000001’,偏移是4。所以我們從這裡開始同步。
在master上輸入如下

mysql> CHANGE MASTER TO MASTER_HOST='172.25.3.103',MASTER_USER='repl',MASTER_PASSWORD='redhat',MAASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=4;

這裡寫圖片描述
現在兩邊資料同步了。
我們開始帶有gtid的主從複製!

master配置:
my.cnf:

[mysqld]
binlog-do-db=test
log-bin=mysql-bin
server-id=1
gtid-mode=ON
enforce-gtid-consistency

slave1配置

[mysqld]
read-only
socket=/usr/local/lnmp/mysql/data/mysql.sock
gtid-mode=ON
enforce-gtid-consistency
log-bin=mysql-bin
log-slave-updates=ON
server-id=2

slave2只是將slave1的配置修改中的server-id修改一下。
現在關閉master,slave2的slave。並重啟所有節點。

現在我們將slave1,slave2都將master指向master.mo.com,並且加上
MASTER_AUTO_POSITION = 1。讓slave根據gtid自動同步。’

CHANGE MASTER TO MASTER_HOST='172.25.3.102',MASTER_USER='repl',MASTER_PASSWORD='redhat',MASTER_AUTO_POSITION=1;

現在開啟slave。
觀察一下是否同步成功。

這裡寫圖片描述
根據圖片可以看到,slave開啟成功。而且是基於GTID的!
現在在主庫上插入一些資料,觀察從資料庫的日誌資訊。
要查詢slave的二進位制日誌,首先要看下data目錄,二進位制日誌檔案都有什麼

[[email protected] data]# ls
auto.cnf         ibtmp1                     mysqld_safe.pid     slave1.mo.com.err
ca-key.pem       localhost.localdomain.err  mysql.sock          slave1.mo.com.pid
ca.pem           localhost.localdomain.pid  mysql.sock.lock     slave1-relay-bin.000001
client-cert.pem  master.info                performance_schema  slave1-relay-bin.000002
client-key.pem   mysql                      private_key.pem     slave1-relay-bin.index
ib_buffer_pool   mysql-bin.000001           public_key.pem      sys
ibdata1          mysql-bin.000002           relay-log.info      test
ib_logfile0      mysql-bin.000003           server-cert.pem
ib_logfile1      mysql-bin.index            server-key.pem

發現最新的二進位制是mysql-bin.000003,我們在進到資料庫,檢視下這個日誌。

mysql> show binlog events in 'mysql-bin.000003'\G

OMIT...
*************************** 3. row ***************************
   Log_name: mysql-bin.000003
        Pos: 154
 Event_type: Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'b7f3c1bc-12b5-11e7-a4ba-5254000d5ada:1'
*************************** 4. row ***************************

看到日誌中有一行是設定下次的GTID,現在我們再插入一條並觀察日誌。

*************************** 8. row ***************************
   Log_name: mysql-bin.000003
        Pos: 416
 Event_type: Gtid
  Server_id: 1
End_log_pos: 481
       Info: SET @@SESSION.GTID_NEXT= 'b7f3c1bc-12b5-11e7-a4ba-5254000d5ada:2'

發現了沒有,GTID中冒號後面變成2了。

基於GTID的主從複製已經搭建完成,現在將master down掉。
讓slave1提成master,這一過程只需要修改slave2,而且完全不用去看slave1的任何狀態。

CHANGE MASETR TO MASTER_HOST='172.25.3.103',MASTER_USER='repl',MASTER_PASSWORD='redhat',MASTER_AUTO_POSITION=1

start slave,
在slave1上插入資料。
這裡寫圖片描述
由圖可見,同步成功。十分方便,那麼現在再考慮一個問題,如果master恢復了,讓master從新成為主如何做呢?
當然還是先資料同步,之後再將MASTER切換成主,但因為有了MASTER_AUTO_POSITION=1,我們同步資料的時候都不需要去檢視偏移了(具體原理還沒有找到)。

相關推薦

筆記36 mysql模型原始主從複製基於GTID主從複製

概述: mysql的主從複製是十分經典的一個應用,但是主從之間總會有資料一致性(data consistency )的問題,一般情況從庫會落後主庫幾個小時,而且在傳統一主多從(mysql5.6之前)的模型中當master down掉後,我們不只是需要將一個sl

Mysql復制數據

sock 是否 art str cor term 數據庫 啟動 ado 應用場景:外部僅僅訪問主數據庫(Mysql_Master),多個從數據庫(Mysql_Slave)做數據庫熱備份。一旦主數據庫宕機,從服務器負責處理數據實驗拓補圖: 實驗環

搭建MySQL————VMware Workstation 虛擬機nat網絡配置

VMware Workstation 虛擬機 虛擬網絡 nat連接 運行 VMware Workstation Pro 在桌面找到該圖標,雙擊運行即可,如果沒有安裝請下載安裝。流程編輯 ==》虛擬網絡編輯器 ==》 VMnet0 如果沒有 添加網絡 最後設置完後,點擊確定即可。 配置虛

MySQL

MySQL主192.168.65.128上配置/etc/my.cnf[root@localhost ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL.. SUCCESS!備份數據從1、192.168.65.

CentOS6.5配置MYSQL詳解

ali ati In restart 配置文件 left 主庫 vim 數據庫 一、環境 1 操作系統 :CentOS 6.5 2 數據庫版本:MySQL 5.6.27 3 主機A:192.168.1.1 (Master) 4 從機B:192.168.1.2 (

mysql 配置說明

背景 mysql 一主多從的場景是經常見的,具體的業務場景裡我們一般讀的壓力遠遠是大於寫的壓力,master我們可以用來做寫操作,slave用來做讀操作、備份,可以做到資料庫的負載均衡。 同步複製過程說明  (1) master將改變記錄到二進位制日誌(binary log)中(這些記

Redis學習筆記(7)-redis搭建高可用環境之簡單版

在redis的主目錄下面建立三個資料夾 [[email protected] redis-4.0.11]# pwd /root/redis/redis-4.0.11 [[email protected] redis-4.0.11]# mkdi

Mysql和讀寫分離配置簡記

近期開發的系統中使用MySql作為資料庫,由於資料涉及到Money,所以不得不慎重。同時,使用者對最大訪問量也提出了要求。為了避免Mysql成為效能瓶頸並具備很好的容錯能力,特此實現主從熱備和讀寫分離。在此簡做紀要,以備日後所用! 一、配置主從 條件:兩臺PC,IP分別為1

資料庫MYSQL與讀寫分離

近期開發的系統中使用MySql作為資料庫,由於資料涉及到Money,所以不得不慎重。同時,使用者對最大訪問量也提出了要求。為了避免Mysql成為效能瓶頸並具備很好的容錯能力,特此實現主從熱備和讀寫分離。在此簡做紀要,以備日後所用! 一、配置主從 條件:兩臺P

mysql主從複製基於GTID主從複製並行複製半同步複製

複製方式: 主–從複製(A-B一主一從或者A-BC一主多從) 基於GTID複製 非同步複製 半同步複製 複製原理: Mysql中有一種日誌叫做bin日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的SQL語句 主從複製的原理其實就是把主伺服器上的bin日

Mysql DBA 高級學習筆記-宕機庫切換繼續和庫同步過程

復制 導入數據 之間 pro vim 庫服務器 chan mas 優點 1.主庫master 宕機 登錄從庫show processlist\G 看兩個線程的更新狀態 mysql> show processlist\G ************************

MySQL主從MySQL proxy Lua讀寫分離設置同步配置分庫分表方案

否則 count user username 2個 ons 基礎 zxvf 路徑 Mysql Proxy Lua讀寫分離設置一.讀寫分離說明讀寫分離(Read/Write Splitting),基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DE

MySQL進階-MySQL(master-master)+半同步(Semisync Repl

MySQL運維進階-MySQL雙主(maMySQL --> MariaDB --> Percona-Server MySQL: oracle ,commutity : 社區版 5.5 5.6 5.7 8.0MariaDB:5.5 10.xPercona:Percona-Ser

Centos7配置mysql主從

表結構 .cn single 讀取 entos body 分享 posit bin-log mysql主從復制原理1.首先master將數據更新記錄到二進制binlog文件2.slave通過I/O線程向master請求binlog日誌文件指定位置之後的內容3.master接

MySql例項配置及環境搭建

主從複製原理 當 master 主伺服器上的資料發生改變時,則將其改變寫入二進位制日誌檔案中 salve 從伺服器會在一定時間間隔內對 master 主伺服器上的二進位制日誌進行探測,探測其是 否發生過改變 如果探測到 master 主伺服器的二進位制日誌發生了改變,則開始一個

Mysql叢集和之後如何分庫分表的方案實現

4-3、使用MyCat配置橫向拆分 之前文章中我們介紹瞭如何使用MyCat進行讀寫分離,類似的關係型資料庫的讀寫分離儲存方案可以在保持上層業務系統透明度的基礎上滿足70%業務系統的資料承載規模要求和效能要求。比起單純使用LVS + Replicaion的讀寫分離方案而言最大的優勢在於更能增加對上層業務系

Mysql叢集和的方案實現

4、改進方式三:MyCat資料庫中介軟體 在上文中我們介紹了MySQL讀寫分離叢集的持續優化方式。按照這樣的方式,叢集中負責讀寫分離的MySQL節點基本上能夠分別實現真對上層業務系統訪問的透明化。這樣的MySQL叢集方式已經可以承載讀者遇到的大部分業務系統的結構化資料規模,但整個叢集方案還有一些明顯的問

使用spring實現讀寫分離mysql主從複製五:的實現

很多實際使用場景下都是採用“一主多從”的架構的,使用輪詢演算法實現,目前只需要修改DynamicDataSource即可。   1.1. 實現 import java.lang.reflect.Field; import java.util.ArrayList; impo

Spring AOP實現Mysql資料庫主從切換

設定資料庫主從切換的原因:資料庫中經常發生的是“讀多寫少”,這樣讀操作對資料庫壓力比較大,通過採用資料庫叢集方案,  一個數據庫是主庫,負責寫;其他為從庫,負責讀,從而實現讀寫分離增大資料庫的容錯率。  那麼,對資料庫的要求是:  1. 讀庫和寫庫的資料一致;  2. 寫資料

MySQL 5.6 的 半同步複製搭建已糾正

# The following options will be passed to all MySQL clients [client] #password       = your_password port            = 3306 socket          = /tmp/my