MySQL在互聯網應用中已經遍地開花,但是在銀行系統中,還在生根發芽的階段。本文記錄的是根據某生產系統實際需求,對數據庫高可用方案從需求、各高可用技術特點對比、實施、測試等過程進行整理,完善Mysql高可用方案,同時為后續開展分布式數據庫相關測試做相應準備。
存儲復制技術:傳統IOE架構下,常用高可用方案,靠存儲底層復制技術實現數據的一致性,優點數據安全性有保障,限制在于是依賴存儲硬件,實施成本較高。
keepalived+雙主復制:兩臺MySQL互為主從關系,即雙主模式,通過Keepalived配置虛擬IP,實現當其中的一臺數據庫故障時,自動切換VIP到另外一臺MySQL數據庫,備機快速接管業務來保證數據庫的高可用。
MHA: MHA部署在每臺mysql服務器上,定時探測集群中的master節點,當master出現故障時,它可以自動將最新的slave提升為新的master,然后將所有其他的slave重新指向新的master,優點在最大程度保證數據的一致性的前提下實現快速切換,最少需要3臺服務器,存在數據丟失的可能性。
PXC: Percona eXtra Cluster是Percona基于galera cluster封裝的集群方案。不同于普通多主復制,PXC保障強一致性和實時同步,故障切換更快。但是也需要3個節點,配置相對復雜,對性能也稍有影響。
除了上述方案外,還有MMM、Heartbeat+DRBD等高可用方案,此處不做詳細介紹。
綜合評估下,本次實施采用了 keepalived+mysql雙主實現數據庫同城雙機房的高可用。MySQL版本為: 5.7.21。操作系統:Red Hat Enterprise Linux Server 7.3。
配置過程如下:
Mysql-master1: IP地址1???? --以下簡稱master1
Mysql-master2: IP地址2???? --以下簡稱master2
Mysql-vip :???? VIP地址???? --應用連接使用
Mysql復制相關概念描述:
1、 Mysql主從復制圖示:
2、 Mysql主從復制過程描述:
(1)master記錄二進制日志:在每個事務更新數據完成之前,master在二進制日志記錄這些改變。MySQL將事務寫入二進制日志。在事務寫入二進制日志完成后,master通知存儲引擎提交事務。
(2)slave將master的binarylog拷貝到自己的中繼日志:首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事務,如果已經同步了master,它會睡眠并等待master產生新的事件。I/O線程將這些事務寫入中繼日志。
(3)SQL slave thread處理該過程的最后一步:SQL線程從中繼日志讀取事務,并重放其中的事務而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。
主主同步就是兩臺機器互為主的關系,在任何一臺機器上寫入都會同步至備端。
為了便于后續數據庫服務器的擴展,且在整個復制環境中能夠自動地切換,降低運維成本,引入了當前主流的基于Mysql GTID的復制特性,工作原理及優缺點簡介如下。
3、 GTID工作原理簡介:
(1)??? master更新數據時,會在事務前產生GTID,一同記錄到Binlog日志中。
(2)??? slave的I/O線程將變更的binlog寫入到本地的relay log中。
(3)??? slave的sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有記錄。
(4)??? 如果有記錄說明該GTID的事務已經執行,slave會忽略。
(5)??? 如果沒有記錄,slave就會從relay log中執行該GTID的事務,并記錄到binlog。
(6)??? 在解析的過程中會判斷是否有主鍵,如果有就用索引,如果沒有就用全部掃描。
4、 ?GTID優點:
(1)? 一個事務對應一個唯一的ID,一個GTID在一個服務器上? ? ? ? ? 只會執行一次。(2)? GTID是用來替代傳統復制的方法,GTID復制與普通復制模式的最大不同就是不需要指定二進制文件名和位置。
(3)??? 減少手工干預和降低服務故障時間,當主機宕機之后會通過軟件從眾多的備機中提升一臺備機為新的master。
5、 ?GTID也存在一些限制:
(1)??? 不支持非事務引擎。
(2)??? 不支持create table … select 語句復制(主庫直接報錯)。
(3)??? 不允許一個sql同時更新一個事務引擎表和非事務引擎表。
(4)??? 在一個復制組中,必須要求統一開啟GTID或者是統一關閉GTID。
(5)??? 開啟GTID需要重啟(5.7版本除外)。
(6)??? 開啟GTID后,就不再使用原理的傳統復制方式。
(7)??? 不支持create temporary table 和 drop temporary table語句。
(8)??? 不支持sql_slave_skip_counter。
一、配置兩臺mysql主主同步模式:
前置條件:
主備兩個節點使用行內統一的安裝部署腳本安裝mysql5.7.21介質(略)
Master1端創建應用的數據庫(略)
1、 修改MySQL配置文件
參考相關配置規范,分別設置master1、master2的my.cnf文件,
其中server-id參數設置為不同值;
由于后續keepalived會掛起VIP,應用通過VIP連接數據庫,為了避免應用程序無法通過VIP訪問,需將兩個節點的bind-address參數注釋掉;
2、 設置master1端自動半同步模式
Mysql的同步模式主要有如下3種:
a.???? 主從同步復制:數據完整性好,但是性能消耗略高;
b.??? 主從異步復制:性能消耗低,但容易出現不一致;
c.???? 主從半自動復制:介于上述兩種之間,既保持了數據的完整性,又提高了性能;
基于上述特性,建議采用半自動同步模式,由于后續要配置為雙主模式,因此任一節點其角色既為master又為slave,因此相關的master/slave插件要同時配置,過程如下。
(1) 首先查看庫是否支持動態加載(默認都支持)
(2) 主從庫上分別安裝插件
作為主庫,安裝插件semisync_master.so
作為從庫,安裝插件semisync_slave.so
(3) 安裝完成后,從plugin表中能夠看到剛剛安裝的插件
(4) 分別打開主從庫半同步復制
同時添加到各自的my.cnf中,在后續數據庫實例重啟時自動加載該配置。
此時查看狀態還沒有啟動
(5) 兩個節點分別啟動IO進程
(6) 查看半同步狀態
3、 將master1設為master2的主服務器
(1)在master1主機上創建授權賬戶,允許在master2主機上連接
(2)將主庫master1數據導出
(3)將master.sql傳輸到master2上并導入
(4)在master2端將master1設置為自己的主庫,并開啟slave功能
在master2上查看slave狀態
至此master1到master2的主從復制關系已經建立完成。
4、 將master2設為master1的主服務器
在master1上執行
在master1上查看slave狀態
二、配置keepalived+Mysql雙主的高可用:
1、keepalived相關概念說明:
keepalived是集群管理中保證集群高可用的一個軟件解決方案,其功能類似于heartbeat,用來防止單點故障
keepalived是以VRRP協議為實現基礎的,VRRP全稱VirtualRouter Redundancy Protocol,即虛擬路由冗余協議。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip,master會發組播(組播地址為224.0.0.18),當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core 、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。同時為了避免出現腦裂,應關閉防火墻或者開啟防火墻但允許接收VRRP協議。
2、keepalived的安裝配置
(1)配置本地yum源,在master1和master2兩臺服務器上安裝keepalived的相關依賴包Kernel-devel/openssl-devel/popt-devl等
配置指向rhel-7.5.iso的yum本地源,步驟略
注意:如不知道keepalived需要哪些依賴包,可到下載后的源碼解壓目錄下查看INSTALL 文件內容,安裝需要的依賴包,源碼安裝任何一個軟件都要養成查看源碼包文檔的習慣,比如INSTALL,README,doc等文檔,可以獲得很多有用的信息。
(2)在兩臺mysql上解壓縮并編譯安裝keepalived
(3)master1、master2上分別配置keepalived.conf
注意上圖紅色字體中兩個節點配置相同處及差異。
說明:keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區域:
·???????? global_defs:主要是配置故障發生時的通知對象以及機器標識。
·???????? vrrp_instance:用來定義對外提供服務的VIP區域及其相關屬性。
·???????? virtual_server:虛擬服務器定義
(4)同時兩個節點上都需要添加檢測腳本
作用:是當mysql停止工作時自動關閉本機的keeplived服務,從而實現將故障主機踢出熱備組,因每臺機器上keepalived只添加了本機為realserver,所以當mysqld正常啟動后,我們還需要手動啟動keepalived服務。
(5)分別啟動兩個節點的keepalived服務
檢查兩個節點keepalived啟動進程
檢查兩個節點的vip掛載情況,略
(6)主備機故障切換測試
停止master2的mysql服務,看keepalived健康檢查程序是否會觸發腳本,自動進行故障切換,步驟略
查看master1節點的VIP掛載情況,驗證是否實現了自動切換,步驟略
說明在master2服務器的mysql服務發生故障時,觸發了腳本,自動完成了切換。
(7)現在我們把master2的mysql服務開起來,并且keepalived的服務也需要啟動。
即便master2的mysql服務和keepalived服務都重新開啟了,master1仍然是主master了,master2未對主master的權利進行搶奪,說明設置的nopreempt參數生效了,為了保證群集的穩定性,生產環境不允許搶占配置,只有當master1的mysql服務壞掉的時候,master2才會再次成為主master,否則它永遠只能當master1的備份。(注:nopreempt一般是在優先級高的mysql上設置)
三、基于sysbench工具測試
主主同步效率測試:
Sysbench是一個模塊化的、跨平臺、多線程基準測試工具,可用于評估數據庫負載情況,通過sysbench命令配置IP地址、端口號、用戶名、密碼連接到指定的數據庫db1中,創建多個表,并快速插入指定條數的記錄,觀察主備庫同步效率
(1)? 下載開源工具sysbench-0.4.12.14.tar.gz,放置在相應目錄下并解壓
(2)? 使用iso配置本地yum源并安裝Sysbench如下的依賴包(步驟略):autoconf/automake/cdbs/debhelper(>=9)/docbook-xml/docbook-xsl/libmysqlclient15-dev/libtool/xsltproc
(3)? 編譯sysbench
編輯配置文件/etc/ld.so.conf中添加mysql lib目錄/mysql/app/5.7.21/lib,并執行命令ldconfig生效
(4)? 執行sysbench壓測
使用sysbench工具向主節點的db1數據庫中創建5張表,并且每張表分別插入10萬條記錄
同時觀察備機同步效率
幾個重要的參數說明:
B、半自動同步模式、異步模式切換測試
(1)? 檢查主備同步狀態,及同步參數設置
rpl_semi_sync_master_enabled參數表示啟用半同步模式;
rpl_semi_sync_master_timeout參數單位為毫秒,表示主庫事務等待從庫返回commit成功信息超過10秒就降為異步模式,不再等待從庫,等探測到從庫io線程恢復后,再返回為半自動同步;
rpl_semi_sync_master_wait_no_slave參數表示事務提交后需要等待從庫返回確認信息;
(2)? 將slave的io線程停止
(3)? 使用sysbench向master寫入少量的數據,本例創建一張表,并插入10條記錄,命令包裝在1.sh測試腳本中
通過記錄的時間戳發現,master在等待了slave10秒無響應,自動切換為異步模式,將數據寫入本地。
(4)? Slave啟動io線程,數據自動追平
?至此MySQL主主復制配置完成,運行在半自動同步模式,通過keepalived實現Mysql的HA高可用。
四、監控、備份配置
上線后應符合統一的標準監控策略,添加備份協議對數據進行周期備份并保存到帶庫中,以及定期的數據恢復測試。
由于是靠keepalived實現的高可用,還應將如下資源添加到監控管理平臺:
1、 對每臺數據庫主機的3個keepalived進程進行監控;
2、 對主備節點的io線程、sql線程工作狀態進行監控;
本文僅描述對特定需求的方案選擇、實施過程進行整理,其要點如下:同城跨機房基于GTID的雙主復制、半自動同步模式保護數據、keepalived實施快速切換,上線后還應加強對運行狀態的監控、數據備份、以及完善運維手冊,本文僅起到一個拋磚引玉的作用,不同的系統架構可結合特定的需求,制定適用的分布式及高可用方案。開源軟件和分布式數據庫等技術在同業處于起步階段,隨著業務轉型,高并發、大數據量、以及聯機事務處理的交易型應用需要,對傳統業務架構提出了諸多要求,也對底層數據存取、處理提出了更高的要求,而基于mysql分庫分表的分布式數據庫解決方案也被廣泛使用,我們也會逐步加大對相關技術的探索,希望各位同學多提寶貴意見。
