天天看點

建構MHA實作MySQL高可用叢集架構

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實作MySQL高可用叢集架構

在MHA自動故障切換過程中,MHA試圖從當機的主伺服器上儲存二進制日志,最大程度的保證資料的不丢失,但這并不總是可行的。例如,如果主伺服器硬體故障或無法通過ssh通路,MHA沒法儲存二進制日志,隻進行故障轉移而丢失了最新的資料。使用MySQL 5.5的半同步複制,可以大大降低資料丢失的風險。MHA可以與半同步複制結合起來。如果隻有一個slave已經收到了最新的二進制日志,MHA可以将最新的二進制日志應用于其他所有的slave伺服器上,是以可以保證所有節點的資料一緻性

異步複制(Asynchronous replication)

MySQL預設的複制即是異步的,主庫在執行完用戶端送出的事務後會立即将結果返給給用戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經送出的事務可能并沒有傳到從上,如果此時,強行将從提升為主,可能導緻新主上的資料不完整。

全同步複制(Fully synchronousreplication)

指當主庫執行完一個事務,所有的從庫都執行了該事務才傳回給用戶端。因為需要等待所有從庫執行完該事務才能傳回,是以全同步複制的性能必然會收到嚴重的影響。

半同步複制(Semisynchronous replication)

介于異步複制和全同步複制之間,主庫在執行完用戶端送出的事務後不是立刻傳回給用戶端,而是等待至少一個從庫接收到并寫到relay log中才傳回給用戶端。相對于異步複制,半同步複制提高了資料的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。是以,半同步複制最好在低延時的網絡中使用。

下面來看看半同步複制的原理圖:

建構MHA實作MySQL高可用叢集架構

總結:異步與半同步異同

預設情況下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 搭建成功!!!