MySQL高可用在網易的最佳應用與實踐
摘要: 講師介紹 潘威 網易資深係統運維工程師 現任職於網易,負責網易對象存儲服務NOS的運維相關工作; 曾負責過易信、網易視頻雲、網易博客、LOFTER等產品數據庫,擁有豐富的大型數據庫架構設計與運維實踐經驗。

潘威
網易資深係統運維工程師
-
現任職於網易,負責網易對象存儲服務NOS的運維相關工作;
-
曾負責過易信、網易視頻雲、網易博客、LOFTER等產品數據庫,擁有豐富的大型數據庫架構設計與運維實踐經驗。
主題簡介:
1、常見的MySQL高可用架構
2、分布式數據庫高可用實踐
3、基於keepalive的MySQL高可用改造
大家好,我是來自杭州研究院的潘威,今天主要給大家分享下MySQL高可用方麵的一些具體的經典解決方案,以及我們網易杭州研究院、網易雲 在MySQL高可用方麵的一些架構和運維上的探索與實踐。希望今天的分享能給大家帶來收獲。
今天分享主要包括三方麵內容:一是常見的MySQL高可用架構;二是分布式數據庫高可用實踐;三是基於keepalive的MySQL高可用改造。第一部分會介紹業界一些經典的MySQL高可用解決方案,第二部分和第三部分分別介紹網易在分布式數據庫和單節點MySQL上的高可用運維實踐。
一、常見的MySQL高可用架構
MySQL高可用主要涉及兩個方麵,一是客戶端如何切換,如何自動failover,二是多個MySQL節點之間如何做數據同步。業界MySQL高可用的解決方案有很多,總結起來有幾類:從客戶端自動切換的角度來看主要有兩類:一類是基於HA同步軟件的MySQL高可用,用戶通過VIP訪問數據庫,然後第三方組件監控MySQL的狀態,控製VIP的漂移。還有一類是基於API調用的MySQL高可用,把MySQL主從狀態維護在客戶端,應用程序可以通過API調用控製主從切換,進行數據同步。
MySQL多節點的數據同步方案也有多種,最常用的是基於binlog的數據同步,其次還有基於共享存儲的數據同步,以及第三方自己實現的數據同步協議(如Galera)。
1、基於HA同步軟件實現的高可用方案
如圖所示,基於HA同步軟件的MySQL高可用主要是通過VIP作為對外的訪問入口,正常情況下VIP綁定在Master上,當Master出現故障後,可以將VIP切換漂移到Slave上。從而實現了一個故障failover的過程。這種基於VIP的高可用方案,最常用的數據同步方式是使用MySQL原生的binlog複製方式,當然,在成本允許的情況下,也可以選擇利用SAN之類的共享存儲解決方案。我們這邊重點介紹的還是binlog複製或者其他軟件層次的數據同步方式。
基於HA同步軟件的高可用方式的主要特點包括:
-
結構簡單、容易管理;
-
不支持多寫、standby屬於備機;
-
不保證數據一致性;
-
入侵性小,對用戶透明。
2、MHA(Master High Availabitliy)
下麵,我們來介紹幾種典型的MySQL HA同步軟件。在業界應用最為廣泛,技術最為成熟的HA同步軟件之一是MHA。MHA全稱是Master High Availability,是一種一主多從的數據庫高可用解決方案。他的特點是在保障高可用自切換的前提下,最大限度的保障主從數據的一致性。
我們先來看下MHA的架構圖:
一次完整MHA故障切換流程如下:
-
保存故障的master節點的binlog日誌;
-
Manager查找最新更新的slave節點;
-
應用差異的relay log日誌到其他的slave;
-
在slave節點上應用從master保存的binlog日誌;
-
提升一個slave為新的master;
-
使其他的slave連接新的master進行複製。
3、MMM(Master-Master Replication Manager for MySQL)
除了MHA以外,還有一個老牌的MySQL自動切換套件MMM。
與MHA相比,MMM是基於主主複製的故障切換。也就是不支持從多個slave中選擇最新的一個,而是隻能切換到特定的主主複製從節點。
4、基於API調用的MySQL高可用
剛才介紹的兩種MySQL高可用解決方案,主要都是基於VIP切換的,優點是對應用程序沒有入侵,但是缺點是不夠靈活,而且係統的可靠性取決於HA軟件本身的可靠性。如VIP通知產生問題,或者keepalive進程自己掛了,都可能導致切換出現問題。除了這種解決方案,還有一種是在客戶端實現的MySQL高可用 - 基於API調用的MySQL高可用。也就是JDBC或者其他數據庫驅動可以自主選擇MySQL節點。這種實現方案可能使用的不是特別廣泛,但是也有它自身的應用場景,它有如下特點:
-
架構較重,運維相對複雜
-
使用靈活,有一定開發成本
-
支持數據分片、分庫分表、讀寫分離等高級特性
HA-JDBC 就是一種典型的基於API調用的MySQL高可用方案,它可以在應用程序中配置多個MySQL地址,由HA-JDBC實現選主/屏蔽故障節點以及多個應用程序之間的連接狀態通知。HA-JDBC可以實現如下功能:
-
基本的failover
-
讀寫分離
-
節點狀態通知
-
負載均衡
數據同步(先寫主,然後同時寫多個從節點,如果主寫失敗,則重新選主,如果從寫失敗,屏蔽從) 弱一致性。
剛才介紹的多是在客戶端角度看到的MySQL高可用切換技術,下麵再介紹幾種MySQL數據同步的高可用解決方案,MySQL最經典的數據同步方案就是利用binlog進行數據同步,這種數據同步的優勢是架構簡單、易於管理,對主服務的性能影響相對較小。缺點是不能保障主從完全一致,而且隻支持單寫。下麵介紹幾種能保證主從完全一致,並且支持多節點寫的方案。
5、Galera MySQL的高可用及特點
Galera架構如圖所示:
客戶端通過Galera Load Balancer訪問數據庫,提交的每個事務都會通過wsrep API 在所有服務器中執行,要不所有服務器都執行成功,要不就所有都回滾,保證所有服務的數據一致性,而且所有服務器同步實時更新。
wsrep API是一係列應用回調和複製調用庫,來實現事務數據庫同步寫集(writeset)複製以及應用。其主要思想是在不出現衝突的背景下事務正常執行並持續到commit為止;當客戶端發起commit命令時(此時仍然沒有發生真正的commit),所有本事務內對數據庫的改動與改動數據行的主鍵都會被放入一個寫入集(writeset)中,該寫入集隨後會被複製到其他節點執行,在每個節點上使用主鍵進行衝突檢測判斷該寫入集是否可以被應用,如果出現主鍵衝突,則其中一個事務會被回滾。
缺點及限製:由於同一個事務需要在集群的多台機器上執行,因此網絡傳輸及並發執行會導致性能上有一定的消耗。所有機器上都存儲著相同的數據,全冗餘。若一台機器既作為主服務器,又作為備份服務器,出現樂觀鎖導致rollback的概率會增大,編寫程序時要小心。不支持的SQL:LOCK / UNLOCK TABLES / GET_LOCK(), RELEASE_LOCK()…不支持XA Transaction。目前基於Galera Cluster的實現方案有三種:Galera Cluster for MySQL、Percona XtraDB Cluster、MariaDB Galera Cluster。
6、MySQL Group Replication
MySQL Group Replication是16年 MySQL 5.7官方推出的多節點數據同步解決方案,它也支持多節點寫和強一致性。在架構上它與Galera相似,但是多節點事務一致性提交是基於paxos來實現的,性能更高。可以預見MySQL Group Replication,這類基於強一致性協議的MySQL數據同步方案,是MySQL高可用的下一個研究熱點,目前騰訊、阿裏均有類似的方案推出。
MySQL Group Replication中的Replication-group就是一組節點,每個節點都可以獨立執行事務,讀寫事務會在group內的其它節點進行協調之後再commit。因此,當一個事務準備提交時,會自動在group內進行原子性的廣播,告知其他節點變更了什麼內容/執行了什麼事務。基於Paxos協議使得事務在每一個節點上都保持著同樣順序執行,這意味著每一個節點都以同樣的順序,接收到了同樣的事務日誌,所以每一個節點以同樣的順序重演了這些事務日誌,最終整個group保持了完全一致的狀態。
MySQL Group Replication僅支持InnoDB表,並且每張表一定要有一個主鍵,用於做衝突檢測;必須打開GTID特性,二進製日誌格式必須設置為ROW。這是使用MGR的一些限製。
二、MySQL高可用在網易的實踐
1、分布式數據庫高可用實踐
首先是分布式數據庫方麵的。由於OLTP的業務特性和業務量大的特點,分布式數據庫在網易有廣泛的應用,下麵我們簡單介紹下網易的分布式數據庫架構以及重點介紹下其高可用解決方案。
DDB的組織架構如上圖所示,DBN(MySQL)負責實際的數據存儲與讀寫提供。管理服務器負責數據庫表、用戶權限、數據分布路由的維護以及DBN狀態的監控與管理。除此之外DDB最核心的模塊是被稱之為DBI的數據庫驅動,它是一個類jdbc驅動,一方麵可以與管理服務器交互,獲取分布式數據庫的表結構與分布路由;另一方麵可以解析用戶發過來的SQL語句,轉換成適用於分布式場景的sql直接發送給DBN節點,並且將DBN返回的結果進行聚合或者排序並最終返回給應用程序。正是由於DBN這一係列的改寫與聚合動作,才能使得應用程序可以像訪問一個簡單的關係型數據庫那樣去訪問DDB這樣一個分布式數據庫。
管理服務器的高可用主要是基於分離持久化信息到sysdb中實現的,也就是管理服務器本身是一個無狀態的服務,可以部署多個,短暫的故障也不會影響DBI到DBN節點的正常數據讀取。而sysdb本身是個MySQL節點,它的高可用可以用經典的MySQL高可用方案解決。
DBN的高可用也可以使用MySQL原生的高可用方式,比如基於VIP的高可用。但是使用分布式數據庫做高可用的優勢就是有一個管理服務器的角色維護數據路由,因此隻要可以根據當前的節點的狀態更新數據路由就可以做到一個自動的failover的過程。具體到DDB這個場景,我們引入了一個DDBSwitch高可用切換工具,這個工具可以監控DBN狀態,維護DBN主從關係。當主DBN存在異常時,DDBSwitch工具會檢測到節點異常,並且觸發管理服務器更新DBN列表,管理服務器會通知所有客戶端的DBI更新本地的DBN列表,切換緩存中的路由,從而完成了一次完整的切換。除了最基本的故障切換,DDBSwitch還可以通過逐步放開DBN連接池的方式控製新切入節點的流量,防止新上線的節點由於之前堆積的請求而瞬間被壓垮。
目前網易杭州這邊的項目,絕大多數的分布式數據庫都是使用的DDB,因此有比較多的線上實踐,事實也證明DDB這套高可用架構是穩定可靠的。目前像網易雲的項目,比如視頻雲、雲信後端依賴的數據庫都是DDB,可以做到數據庫相關模塊故障異常在30s內自動恢複。在減少人工運維成本的前提下,提高係統整體可靠性。
除了分布式數據庫,網易也有少量的單節點MySQL。出於成本和易用性的考慮,我們沒有選擇MHA方案,而是配合keepalive使用自定義的腳步進行故障自切換與盡可能的保障可靠性。首先keepalive本身是一個多進程的程序,可靠性和成熟度很高,不止可以做無狀態的nginx的高可用代理,還能通過配合第三方的腳本來做類似MySQL這種有狀態服務的高可用。
2、基於keepalive的MySQL高可用改造
網易的這套keepalive的MySQL高可用方案采用的也是經典的MySQL主主複製的架構,然後配合自研的切換腳本進行自定義故障判定以及升主的一致性檢查功能。一次完整的故障切換包含如下幾個步驟:首先利用Master上的keepalive定時調用故障檢查check腳本,發現異常後進行3次重試,重試後MySQL依然無法正常服務則觸發切換。切換不是采用keepalive傳統的降低權值的方式進行的,而是直接stop keepalive來觸發slave搶占VIP,升級為主。升級為主後slave keepalive會調用升主檢查腳本,判定relay log應用完成後才放開寫,關閉read only正式提供服務。
這套keepalive高可用解決方案有如下幾個特點:
-
具備一致性檢驗功能(檢查relay log是否應用完),配合杭研改進的semisync 功能,可以保障數據的強一致;
-
具備防網絡抖動功能,不會再網絡不穩定的情況下頻繁切換;
-
原主恢複後不自動升級為master功能(MySQL複製延遲);
-
自定義故障判定規則,貼近業務的高可用;
-
簡單易用,方便管理,可以人工介入。
-
Keepalived 使用注意事項
現象:
keepalived主從切換後,網關/交換機上的arp表沒有立刻更新VIP對應備用 LVS 的mac,或者arp包被交換機drop掉,導致備機無法被訪問。
解決:
arping -I eth1 -c 5 -s VIP GATEWAY
garp_master_refresh 選項 (Release 1.2.10)
-
Keepalived 不搶占的實現
Keepalived自帶nopreempt參數實現不搶占功能,但當新主服務再掛掉後由於原主帶nopreempt參數,即使原主優先級高仍無法完成切換。故現在通過自定義腳本實現類似功能(sudo /etc/init.d/keepalived stop),備機節點腳本隻有當自身 MySQL可用且主機MySQL不可用時才觸發切換。
Keepalive這套方案在網易內部主要用在一些負載比較小,但是對穩定性和可靠性要求比較高的數據庫,比如openresty等雲計算服務的元數據庫,易信朋友圈數據庫,也已經在線上穩定運行了3,4年的時間,可以做到秒級別的切換。
今天我們主要介紹了MySQL高可用幾種常見的解決方案,以及網易在這方麵的一些應用實踐,由於時間關係,可能有些技術細節隻是粗略的帶過,感興趣的同學歡迎留言交流。
原文發布時間為:2017-05-08
本文來自雲棲社區合作夥伴DBAplus
最後更新:2017-05-17 14:02:10