標籤:

Mysql高可用之Keepalived+mysql雙主

生產環境中一台mysql主機存在單點故障,所以我們要確保mysql的高可用性,即兩台MySQL伺服器如果其中有一台MySQL伺服器掛掉後,另外一台能立馬接替其進行工作。

MySQL的高可用方案一般有如下幾種:

keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD等,比較常用的是keepalived+雙主,MHA和PXC。

本節主要介紹了利用 keepalived 實現 MySQL資料庫的高可用。

Keepalived+mysql雙主來實現MySQL-HA,我們必須保證兩台MySQL資料庫的數據完全一樣,基本思路是兩台MySQL互為主從關係,通過Keepalived配置虛擬IP,實現當其中的一台MySQL資料庫宕機後,應用能夠自動切換到另外一台MySQL資料庫,保證系統的高可用。

拓撲環境:

OS:centos6.5 x86_64

Mysql版本:mysql 5.5.38

Keepalived: keepalived-1.2.20

Mysql-vip:192.168.1.100

Mysql-master1:192.168.1.101

Mysql-master2:192.168.1.102

一、 配置兩台mysql主主同步

該過程的第一部分就是master記錄二進位日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務寫入二進位日誌。在事件寫入二進位日誌完成後,master通知存儲引擎提交事務。

下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進位日誌中讀取事件,如果已經同步了master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。

SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。

主主同步就是兩台機器互為主的關係,在任何一台機器上寫入都會同步。

若mysql主機開啟了防火牆,需要關閉防火牆或創建規則。

1、修改MySQL配置文件

兩台MySQL均要開啟binlog日誌功能,開啟方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項,兩台MySQL的server-ID不能一樣,默認情況下兩台MySQL的serverID都是1,需將其中一台修改為2即可。

master1中有關複製的配置如下:

log-bin = mysql-bin

binlog_format = mixed

server-id = 1

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

auto-increment-increment = 2

auto-increment-offset = 1

重啟mysqld服務

#service mysqld restart

master2中有關複製的配置如下:

log-bin = mysql-bin

binlog_format = mixed

server-id = 2

relay-log = relay-bin

relay-log-index = slave-relay-bin.index

auto-increment-increment = 2

auto-increment-offset = 2

重啟mysqld服務

#service mysqld restart

註:master1和master2隻有server-id不同和 auto-increment-offset不同。

mysql中有自增長欄位,在做資料庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offset和auto_increment_increment。

auto-increment-increment表示自增長欄位每次遞增的量,其默認值是1。它的值應設為整個結構中伺服器的總數,本案例用到兩台伺服器,所以值設為2。

auto-increment-offset是用來設定資料庫中自動增長的起點(即初始值),因為這兩能伺服器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避免兩台伺服器數據同步時出現主鍵衝突,

註:可以在my.cnf文件中添加「binlog_do_db=資料庫名」配置項(可以添加多個)來指定要同步的資料庫

2、將master1設為master2的主伺服器

在master1主機上創建授權賬戶,允許在master2(192.168.1.102)主機上連接

查看master1的當前binlog狀態信息

在master2上將master1設為自已的主伺服器並開啟slave功能。

查看從的狀態,以下兩個值必須為yes,代表從伺服器能正常連接主伺服器

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

3、將master2設為master1的主伺服器

在master2主機上創建授權賬戶,允許在master1(192.168.1.101)主機上連接

查看master2的當前binlog狀態信息

在master1上將master2設為自已的主伺服器並開啟slave功能。

查看從的狀態,以下兩個值必須為yes,代表從伺服器能正常連接主伺服器

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

4、測試主主同步

在master1上創建要同步的資料庫如test_db,並在test_db中創建一張測試表如tab1

查看master2主機是否同步了master1上的數據變化

從上圖可以看出master2同步了master的數據變化

在master2主機上向tab1表中插入數據

查看master1主機是否同步了master2上的數據變化

現在任何一台MySQL上更新數據都會同步到另一台MySQL,MySQL同步完成。

註:若主MYSQL伺服器已經存在,只是後期才搭建從MYSQL伺服器,在置配數據同步前應先將主MYSQL伺服器的要同步的資料庫拷貝到從MYSQL伺服器上(如先在主MYSQL上備份資料庫,再用備份在從MYSQL伺服器上恢復)

下面我們就完成keepalived的高可用性。

keepalived是集群管理中保證集群高可用的一個軟體解決方案,其功能類似於heartbeat,用來防止單點故障

keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router 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協議的。

二、keepalived的安裝配置

1、在master1和master2上安裝軟體包keepalived

安裝keepalived軟體包與服務控制

在編譯安裝Keepalived之前,必須先安裝內核開發包kernel-devel以及openssl-devel、popt-devel等支持庫。

若沒有安裝則通過rpm或yum工具進行安裝

編譯安裝Keepalived

使用指定的linux內核位置對keepalived進行配置,並將安裝路徑指定為根目錄,這樣就無需額外創建鏈接文件了,配置完成後,依次執行make、make install進行安裝。

注意:如不知道keepalived需要哪些依賴包,可到下載後的源碼解壓目錄下查看INSTALL 文件內容,安裝需要的依賴包,源碼安裝任何一個軟體都要養成查看源碼包文檔的習慣,比如INSTALL,README,doc等文檔,可以獲得很多有用的信息

使用keepalived服務

執行make install操作之後,會自動生成/etc/init.d/keepalived腳本文件,但還需要手動添加為系統服務,這樣就可以使用service、chkconfig工具來對keepalived服務程序進行管理了。

Master2主機也完成keepalived安裝,與master1一樣,安裝過程略

註:若開啟了防火牆,需要關閉防火牆或創建規則。

2、修改Keepalived的配置文件

keepalived只有一個配置文件keepalived.conf,裡面主要包括以下幾個配置區域,分別是global_defs、vrrp_instance和virtual_server。

global_defs:主要是配置故障發生時的通知對象以及機器標識。

vrrp_instance:用來定義對外提供服務的VIP區域及其相關屬性。

virtual_server:虛擬伺服器定義

master1主機上的keepalived.conf文件的修改:

vi /etc/keepalived/keepalived.conf:

! Configuration File for keepalived //!表示注釋

global_defs {

router_id MYSQL-1 //表示運行keepalived伺服器的一個標識

}

vrrp_instance VI_1 {

state BACKUP //指定keepalived的角色, 兩台配置此處均是BACKUP,設為BACKUP將根據優先順序決定主或從

interface eth0 //指定HA監測網路的介面

virtual_router_id 51 //虛擬路由標識,這個標識是一個數字(取值在0-255之間,用來區分多個instance的VRRP組播),同一個vrrp實例使用唯一的標識,確保和master2相同,同網內不同集群此項必須不同,否則發生衝突。

priority 100 //用來選舉master的,要成為master,該項取值範圍是1-255(在此範圍之外會被識別成默認值100),此處master2上設置為50

advert_int 1 //發VRRP包的時間間隔,即多久進行一次master選舉(可以認為是健康查檢時間間隔)

nopreempt //不搶佔,即允許一個priority比較低的節點作為master,即使有priority更高的節點啟動

authentication { //認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)

auth_type PASS

auth_pass 1111

}

virtual_ipaddress { //VIP區域,指定vip地址

192.168.1.100

}

}

virtual_server 192.168.1.100 3306 { //設置虛擬伺服器,需要指定虛擬IP地址和服務埠,IP與埠之間用空格隔開

delay_loop 2 //設置運行情況檢查時間,單位是秒

lb_algo rr //設置後端調度演算法,這裡設置為rr,即輪詢演算法

lb_kind DR //設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選

persistence_timeout 60 //會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,為集群系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。

protocol TCP //指定轉發協議類型,有TCP和UDP兩種

real_server 192.168.1.101 3306 { //配置服務節點1,需要指定real server的真實IP地址和埠,IP與埠之間用空格隔開

註:master 2上此處改為192.168.1.102(即master2本機ip)

weight 3 //配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小為了區分不同性能的伺服器

notify_down /etc/keepalived/bin/mysql.sh //檢測到realserver的mysql服務down後執行的腳本

TCP_CHECK {

connect_timeout 3 //連接超時時間

nb_get_retry 3 //重連次數

delay_before_retry 3 //重連間隔時間

connect_port 3306 //健康檢查埠

}

}

}

master1主機上有關keepalived.conf文件的具體配置如下:

啟動keepalived 服務

#/etc/init.d/keepalived start

Master2主機上的keepalived.conf文件的修改:

Master2主機的keepalived.conf文件配置與master1基本相同,只是router_id ,priority,real_server三處不同,其他配置都相同

可以使用scp命令把server1主機上配置好的keepalived.conf文件拷貝到server2主機,只要做簡單修改即可,如下圖所示:

啟動keepalived 服務

#/etc/init.d/keepalived start

3、master1和master2上都添加此檢測腳本,作用是當mysql停止工作時自動關閉本機的keepalived,從而實現將故障機器踢出(因每台機器上keepalived只添加了本機為realserver).

當mysqld正常啟動起來後,要手動啟動keepalived服務。

#mkdir /etc/keepalived/bin

vi /etc/keepalived /bin/mysql.sh,內容如下:

Master2主機完成相同的操作

4、測試

在master1和master2分別執行ip addr show dev eth0命令查看master1和master2對VIP(群集虛擬IP)的控制權。

Master1主的查看結果:

Master2主的查看結果:

這說明在主服務上停止MySQL服務,觸發了我們編寫的腳本,進行自動故障切換。

MySQL遠程登錄測試

我們找一台安裝有MySQL客戶端,然後登錄VIP,看是否能登錄,在登錄之兩台MySQL伺服器都要授權允許從遠程登錄。例如:

在客戶端上測試登錄:

上圖顯示說明在客戶端訪問VIP地址,由master1主機提供響應的,因為master1當前是主伺服器,將master1的mysql服務停止,在客戶端執行show variables like 『server_id』;

上圖顯示說明在客戶端的查詢請求是由master2主機響應的。故障切換成功。

總結:Keepalived+mysql雙主一般來說,中小型規模的時候,採用這種架構是最省事的。

在master節點發生故障後,利用keepalived的高可用機制實現快速切換到備用節點。

在這個方案里,有幾個需要注意的地方:

1.採用keepalived作為高可用方案時,兩個節點最好都設置成BACKUP模式,避免因為意外情況下(比如腦裂)相互搶佔導致往兩個節點寫入相同數據而引發衝突;

2.把兩個節點的auto_increment_increment(自增步長)和auto_increment_offset(自增起始值)設成不同值。其目的是為了避免master節點意外宕機時,可能會有部分binlog未能及時複製到slave上被應用,從而會導致slave新寫入數據的自增值和原先master上衝突了,因此一開始就使其錯開;當然了,如果有合適的容錯機制能解決主從自增ID衝突的話,也可以不這麼做;

3.slave節點伺服器配置不要太差,否則更容易導致複製延遲。作為熱備節點的slave伺服器,硬體配置不能低於master節點;

4.如果對延遲問題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程複製的方式可以很大程度降低複製延遲;


推薦閱讀:

mysql是如何工作的?
android如何訪問MySQL,通過網路伺服器中轉的話應該如何實現,有實例最好,謝謝了 就是想客戶端向服務端發送請求,服務端對資料庫中數據處理後反饋給客戶端這樣該如何實現
mysql已經有cache了,為啥還要在它前面加一層memcached?
memcached plugin(handlersocket),Memcached的一點看法
如何使用 MySQL 5.7 內置的 InnoDB 集群

TAG:MySQL | 云计算 |