MHA(Master HighAvailability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職于Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟體。在MySQL故障切換過程中,MHA能做到在0~30秒之内自動完成資料庫的故障切換操作,并且在進行故障切換的過程中,MHA能在最大程度上保證資料的一緻性,以達到真正意義上的高可用。
MHA裡有兩個角色一個是MHA Node(資料節點)另一個是MHA Manager(管理節點)。
MHA Manager可以單獨部署在一台獨立的機器上管理多個master-slave叢集,也可以部署在一台slave節點上。MHA Node運作在每台MySQL伺服器上,MHA Manager會定時探測叢集中的master節點,當master出現故障時,它可以自動将最新資料的slave提升為新的master,然後将所有其他的slave重新指向新的master。整個故障轉移過程對應用程式完全透明

在MHA自動故障切換過程中,MHA試圖從當機的主伺服器上儲存二進制日志,最大程度的保證資料的不丢失,但這并不總是可行的。例如,如果主伺服器硬體故障或無法通過ssh通路,MHA沒法儲存二進制日志,隻進行故障轉移而丢失了最新的資料。使用MySQL 5.5的半同步複制,可以大大降低資料丢失的風險。MHA可以與半同步複制結合起來。如果隻有一個slave已經收到了最新的二進制日志,MHA可以将最新的二進制日志應用于其他所有的slave伺服器上,是以可以保證所有節點的資料一緻性
異步複制(Asynchronous replication)
MySQL預設的複制即是異步的,主庫在執行完用戶端送出的事務後會立即将結果返給給用戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經送出的事務可能并沒有傳到從上,如果此時,強行将從提升為主,可能導緻新主上的資料不完整。
全同步複制(Fully synchronousreplication)
指當主庫執行完一個事務,所有的從庫都執行了該事務才傳回給用戶端。因為需要等待所有從庫執行完該事務才能傳回,是以全同步複制的性能必然會收到嚴重的影響。
半同步複制(Semisynchronous replication)
介于異步複制和全同步複制之間,主庫在執行完用戶端送出的事務後不是立刻傳回給用戶端,而是等待至少一個從庫接收到并寫到relay log中才傳回給用戶端。相對于異步複制,半同步複制提高了資料的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。是以,半同步複制最好在低延時的網絡中使用。
下面來看看半同步複制的原理圖:
總結:異步與半同步異同
預設情況下MySQL的複制是異步的,Master上所有的更新操作寫入Binlog之後并不確定所有的更新都被複制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現問題的時候,存在很高資料不同步的風險,甚至可能丢失資料。
MySQL5.5引入半同步複制功能的目的是為了保證在master出問題的時候,至少有一台Slave的資料是完整的。在逾時的情況下也可以臨時轉入異步複制,保障業務的正常使用,直到一台salve追趕上之後,繼續切換到半同步模式。
工作原理
相較于其它HA軟體,MHA的目的在于維持MySQL Replication中Master庫的高可用性,其最大特點是可以修複多個Slave之間的差異日志,最終使所有Slave保持資料一緻,然後從中選擇一個充當新的Master,并将其它Slave指向它。
目前MHA主要支援一主多從的架構,要搭建MHA,要求一個複制叢集中必須最少有三台資料庫伺服器,一主二從,即一台充當master,一台充當備用master,另外一台充當從庫,因為至少需要三台伺服器。
相關軟體包
MHA監控伺服器安裝:mha4mysql-manager-0.55-1.el5.noarch,mha4mysql-node-0.54-1.el5.noarch
其他主從叢集伺服器安裝:mha4mysql-node-0.54-1.el5.noarch
MHA軟體包官網位址: https://code.google.com/archive/p/mysql-master-ha/
使用到如下包:
實作環境:
角色
IP位址
主機名
Server Id
類型
OS
Manager
192.168.64.37
manager
管理節點
Centos7.2x86_64
master
192.168.64.7
master1
1
主mysql
Candidate master
192.168.64.17
master2
2
從mysql
slave
192.168.64.27
3
其中master對外提供寫服務,備選master(實際的slave,主機名master2)提供讀服務,slave也提供相關的讀服務,一旦master當機,将會把備選master提升為新的master,slave指向新的master,manager作為管理伺服器。
1、 在配置好所有主機IP位址後檢查selinux,firewalld設定,關閉所有主機selinux ,firewalld 服務以友善後期主從同步不出錯
2.同步伺服器時間
3、
在四台主機上都配置epel源
官網下載下傳位址:點選打開連結 wget https://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
4.在四台主機上建立ssh無互動登入環境
1、在主從節點安裝node節點包(master1 master2,slave)
2、修改my.cnf檔案,配置主從同步
注意:若主MYSQL伺服器已經存在,隻是後期才搭建從MYSQL伺服器,在置配資料同步前應先将主MYSQL伺服器的要同步的資料庫拷貝到從MYSQL伺服器上(如先在主MYSQL上備份資料庫,再用備份在從MYSQL伺服器上恢複)
(1.)master1的主機配置:
(2.)master2的主機配置:
(3)slave的主機配置:
注意:重新開機所有主機的mariadb服務!!!
(3.)建立用于主從複制的賬号“mharep”,在(master1、master2)主機上建立即可,建立MHA管理賬号“manager”在所有mysql伺服器上都要建立。
master1、master2主機上的配置:
slave主機上的配置:
開始建立主從複制:
檢視master1的節點:
master2主機上的配置:
建立主從複制,并開啟slave功能
檢視master2主機從的狀态,以下兩個值必須為yes,代表從伺服器能正常連接配接主伺服器
建立主從複制,并開啟salve功能
檢視slave主機從的狀态,以下兩個值必須為yes,代表從伺服器能正常連接配接主伺服器
注意:
第一條grant指令是建立一個用于主從複制的帳号repluser,在master1和master2的主機上建立即可。
第二條grant指令是建立MHA管理賬号manager,所有mysql伺服器上都需要建立。MHA會在配置檔案裡要求能遠端登入到資料庫,是以要進行必要的賦權。
mha包括manager節點和data節點,data節點包括原有的MySQL複制結構中的主機,至少3台,即1主2從,當masterfailover後,還能保證主從結構;主從複制叢集隻需安裝node包。
manager server:運作監控腳本,負責monitoring和 auto-failover;mha manager節點需要安裝node包和manager包。
1、在manager主機上需要安裝( mha4mysql-manager-0.55-0.el6.noarch.rpm和 mha4mysql-node-0.54-0.el6.noarch.rpm)兩個操作管理節點, 在3台資料庫主機上隻需要安裝MHA的node節點即可。
其他三台資料庫節點需要安裝MHA的node節點(過程略)!!!
配置MHA
與絕大多數Linux應用程式類似,MHA的正确使用依賴于合理的配置檔案。MHA的配置檔案與mysql的my.cnf檔案配置相似,采取的是param=value的方式來配置,配置檔案位于管理節點,通常包括每一個mysql server的主機名,mysql使用者名,密碼,工作目錄等等。
(1.)編輯/etc/masterha/app1.conf,内容如下:
配置項的解釋:
SSH 有效性驗證:
叢集複制的有效性驗證:
注意:mysql資料庫必須都啟動
注意:驗證成功的話會自動識别出所有伺服器和主從狀況!!!
在驗證時,若遇到這個錯誤:Can't exec "mysqlbinlog" ......
解決方法是在所有伺服器上執行:
啟動 manager:
注意:在應用Unix/Linux時,我們一般想讓某個程式在背景運作,于是我們将常會用&在程式結尾來讓程式自動運作。比如我們要運作mysql在背景: /usr/local/mysql/bin/mysqld_safe –user=mysql&。可是有很多程式并不想mysqld一樣,這樣我們就需要nohup指令,
1、停掉master1 的mariadb服務
(2.)檢視 MHA 日志
上面的配置檔案中指定了日志位置為/data /masterha/app1/manager.log
從日志資訊中可以看到master failover 已經成功了,并可以看出故障轉移的大體流程
(3)檢查 slave 的複制
登入 slave(192.168.64.27)的Mysql,檢視 slave 狀态
可以看到master 的 IP 現在為 192.168.64.17,已經切換到和192.168.64.27同步了,本來是和192.168.64.7同步的,說明 MHA 已經把Candicatemaster(master2)提升為了新的master,IO線程和SQL線程也正确運作,MHA 搭建成功!!!