MySQL集羣搭建(4)-MMM+LVS+Keepalived

上篇文章 MySQL集羣搭建(3)-MMM高可用架構 介紹了 MMM 高可用集羣的搭建方法, 裏面有提到 MMM 能夠配置多個讀 VIP, 今天這篇文章教你們怎麼用 LVS 對這些讀 VIP 作一個負載均衡。html

1 LVS 介紹

1.1 簡介

LVS 是 Linux Virtual Server 的簡寫,意即 Linux 虛擬服務器,是一個虛擬的服務器集羣系統。本項目在 1998 年 5 月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。mysql

LVS 集羣採用 IP 負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。linux

好比說,用 LVS 作 Web 負載均衡,那麼請求 LVS 調度器的時候,請求會根據配置的算法分發給後端某臺 Web 服務器,後端 Web 服務器機器對於請求者來講是透明的。算法

1.1 LVS 工做模式

LVS 包含如下三種經常使用工做模式sql

1). NAT 模式

NAT (Network Address Translation) 即網路地址裝換,NAT 的工做原理是更改報文頭(目標地址、源地址和端口等)後,轉發請求都後端地址。流程以下shell

  1. 客戶端請求 LVS 的 IP
  2. LVS 更改請求的目的 IP,改成後端服務器其中一個 IP,而後轉發請求
  3. 後端服務器處理完,返回數據給 LVS,LVS 更改源 IP 爲 LVS 機器的 IP 而後返回給請求端

NAT 模式的全部數據都會通過 LVS 服務器,簡單來講就是從 LVS 進,從 LVS 出,如圖segmentfault

2). TUN 模式

在 NAT 的集羣系統中,請求和響應的數據報文都須要經過 LVS 服務器,當真實服務器的數目在10臺和20臺之間時,負載調度器將成爲整個集羣系統的新瓶頸。大多數 Internet服務都有這樣的特色:請求報文較短而響應報文每每包含大量的數據。若是能將請求和響應分開處理,即在負載調度器中只負責調度請求而響應直接返回給客戶,將極大地提升整個集羣系統的吞吐量。後端

IP 隧道(IP tunneling)是將一個IP報文封裝在另外一個IP報文的技術,這可使得目標爲一個IP地址的數據報文能被封裝和轉發到另外一個IP地址。IP隧道技 術亦稱爲IP封裝技術(IP encapsulation)。IP隧道主要用於移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態創建的,隧道一端有一個IP地址,另外一端也有惟一的IP地址。服務器

咱們利用IP隧道技術將請求報文封裝轉發給後端服務器,響應報文能從後端服務器直接返回給客戶(要求後端真實服務器與外部網絡鏈接)。網絡

TUN 模式工做流程以下:

  1. 客戶端請求數據,調度器根據各個服務器的負載狀況,動態地選擇一臺服務器, 將請求報文封裝在另外一個IP報文中,再將封裝後的IP報文轉發給選出的服務器
  2. 服務器收到報文後,先將報文解封得到原來目標地址爲VIP的報文,服務器發 現VIP地址被配置在本地的IP隧道設備上,因此就處理這個請求,而後根據路由表將響應報文直接返回給客戶。

3). DR 模式

DR 模式中,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶, DR 模式架構圖

DR 模式的執行流程以下

  1. 客戶端請求數據,調度器根據各個服務器的負載狀況,動態地選擇一臺服務器,不修改也不封裝IP報文,而是將數據幀的MAC 地址改成選出服務器的 MAC 地址,再將修改後 的數據幀在與服務器組的局域網上發送。
  2. 由於數據幀的 MAC 地址是選出的服務器,因此服務器確定能夠收到這個數據幀,從中能夠得到該 IP 報文。當服務器發現 報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,而後根據路由表將響應報文直接返回給客戶。

關於三種模式選擇

NAT模式下,全部流量會通過 LVS 服務器, 很容易有瓶頸;TUN 模式須要內核支持,部署成本比較高;DR模式性能高、容易部署,通常使用這種模式。

本小節內容參考: LVS集羣中的IP負載均衡技術

1.2 LVS 調度算法

這裏簡單介紹 LVS 的 8 種調度算法

靜態調度

  1. 輪詢調度(rr): 輪詢調就是依次將請求調度不一樣的服務器,即每次調度執行i = (i + 1) mod n,並選出第i臺服務器。算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。
  2. 加權輪詢(wrr): 加權輪詢算法能夠解決服務器間性能不一的狀況,它用相應的權值表示服務器的處理性能,服務器的缺省權值爲1。假設服務器A的權值爲1,B的 權值爲2,則表示服務器B的處理性能是A的兩倍。加權輪詢調度算法是按權值的高低和輪叫方式分配請求到各服務器。
  3. 源地址散列(sh): 該算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
  4. 目標地址散列(dh): 該算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,經過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。

動態調度

  1. 最少鏈接(lc): 最少鏈接是把新的鏈接請求分配到當前鏈接數最小的服務器。
  2. 加權最少鏈接(wlc): 加權最少鏈接算法是最小鏈接調度的超集,各個服務器用相應的權值表示其處理性能。
  3. 基於局部性的最少鏈接(lblc): 該算法是針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,由於在Cache集羣中 客戶請求報文的目標IP地址是變化的。
  4. 帶複製的基於局部性最少鏈接(lblcr): 該算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要 維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。

本小節內容參考: LVS集羣的負載調度

2 Keepalived 簡介

Keepalived 起初是爲 LVS 件設計, 用來管理和監控 LVS 各個服務器節點狀態的工具

Keepalived 採用 Master/Slave 模式, 在 Master 上設置配置文件的 VIP,當 Master 宕機後,VIP 自動漂移到另外一臺 Keepalived 服務器上

Keepalived 能夠用來作各類軟件的高可用集羣,它會一直檢測服務器的狀態,若是有一臺服務器宕機,或工做出現故障,Keepalived 將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後 Keepalived 自動將服務器加入到服務器羣中。

簡單來講,Keepalived 就是用來實現機器的高可用的,在使用 Keepalived 的狀況下,只有一臺服務器可以提供服務(經過 VIP 來實現),當 Master 主機宕機後,VIP 會自動飄移到另外一臺服務器

3 環境準備

3.1 服務器與 MySQL 環境

MySQL 環境採用上篇文章部署的那一套,而後新增一臺服務器做爲 LVS 的備用節點

節點信息

IP 系統 端口 MySQL版本 節點 讀寫 說明
10.0.0.247 Centos6.5 3306 5.7.9 Master 讀寫 主節點
10.0.0.248 Centos6.5 3306 5.7.9 Standby 只讀,可切換爲讀寫 備主節點
10.0.0.249 Centos6.5 3306 5.7.9 Slave 只讀 從節點
10.0.1.24 Centos6.5 - - MMM Monitor/LVS - MMM Monitor/LVS Keepalive Master
10.0.1.85 Centos6.5 - - LVS - LVS Keepalive Slave

VIP 信息

簡稱 VIP 類型
RW-VIP 10.0.0.237 讀寫VIP
RO-VIP1 10.0.0.238 讀VIP
RO-VIP2 10.0.0.239 讀VIP
LVS-RO 10.0.0.236 LVS Keepalived VIP

3.2 Keepalved 安裝配置

咱們在10.0.1.2410.0.1.85上部署 Keepalived

1). yum 安裝

若是有對應的 yum 源,直接安裝就能夠了

yum install -y keepalived

2). 源碼安裝

下載安裝包, 下載地址 keepalived, 使用 1.2.24 版本舉例

# 安裝依賴
yum install -y gcc popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel libnfnetlink-devel

# 下載包
wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz

# 解壓安裝
tar -xvz -f  keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure --prefix=/usr/local/keepalived
make && make install

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

3). 配置 Keepalived

打開 /etc/keepalived/keepalived.conf 文件, 加上上面的配置

global_defs {
   notification_email {
   }
   router_id MYSQL_MMM
}

vrrp_instance MMM_TEST {
    state BACKUP
    interface eth0
    virtual_router_id 24
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.236
    }
}
  • router_id: 標識用的
  • state: MASTERBACKUP, 當其餘節點起來的時候會從新選舉,因此這裏設爲 BACKUP 就能夠了
  • virtual_router_id: 用來區分 VRRP 組播的標記,取值 0-255
  • priority: 優先級
  • advert_int: 監控檢測間隔
  • authentication: 認證相關
  • virtual_ipaddress: 要設置的 VIP

注意: 在同一個廣播域內 virtual_router_id 不能重複

4). 啓動

因爲在priority都相同,因此先啓動爲 Master, 咱們在10.0.1.2410.0.1.85上輪流啓動Keepalived

/etc/init.d/keepalived start

啓動後觀察10.0.1.24 IP 狀態

[root@chengqm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:ee:ae:a1 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.24/16 brd 10.0.255.255 scope global eth0
    inet 10.0.0.236/32 scope global eth0
    inet6 fe80::f816:3eff:feee:aea1/64 scope link 
       valid_lft forever preferred_lft forever

3.3 LVS 安裝配置

本次測試,負載調度的算法採用 加權最少鏈接(wlc),工做模式採用 DR 模式

1). 安裝

LVS 採用 yum 安裝就能夠了

yum install -y ipvsadm

2). 增長配置文件

繼續打開 /etc/keepalived/keepalived.conf 文件, 在後面加上 LVS 配置, 轉發VIP10.0.0.2363306端口到MMM的虛IP

virtual_server 10.0.0.236 3306 {  
    delay_loop 6    # 健康檢查時間,單位是秒                    
    lb_algo wlc     # 負載調度的算法                 
    lb_kind DR      # LVS 工做模式
    nat_mask 255.255.255.255     # 掩碼            
    persistence_timeout 0  
    protocol TCP                  
    real_server 10.0.0.237 3306 {     # 指定後端真實服務器的IP地址, 這裏直接指到 MMM 虛 IP 上
        weight 1                      # 節點權重, 數字越大, 權重越大
        TCP_CHECK {                   # 檢測參數
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
    real_server 10.0.0.238 3306 {
        weight 3
        TCP_CHECK {  
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
    real_server 10.0.0.239 3306 {
        weight 3
        TCP_CHECK {  
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
}

更改完畢重啓 keepalived

3). 後端真實服務器抑制 ARP 廣播

因爲 DR 模式的原理是 LVS 與後端真實服務器配置同一個 VIP,後端服務器 不容許arp廣播,這樣路由器接收到請求就會發給 LVSLVS 修改請求的 MAC 地址。這樣路由器和後端服務器經過 MAC 地址進行通訊,達到負載均衡的目的。

10.0.0.247, 10.0.0.248, 10.0.0.249 服務器上執行如下命令

VIP=10.0.0.236
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1

注意: 後端真實服務器的 VIP 綁在 lo 上

若是想取消,能夠反着操做

ifconfig lo:0 down
route del VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

4). 檢查 LVS 狀態

[root@chengqm ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.236:mysql wlc
  -> 10.0.0.237:mysql             Route   1      0          0         
  -> 10.0.0.238:mysql             Route   3      0          0         
  -> 10.0.0.239:mysql             Route   3      0          0

LVS 負載均衡已經生效

4 測試

4.1 負載均衡測試

LVS 配置好了,讓咱們測試一下效果, 目前 Keepalived Master10.0.1.24, 而且已經預先建立了一個測試帳號,那麼咱們在其餘機器發起請求看看

[root@mysql-test-83 ~]# mysql -umytest -p -h10.0.0.236 -P3306 -e "show variables like 'hostname'"
Enter password: 
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| hostname      | cluster01 |
+---------------+-----------+
[root@mysql-test-83 ~]# mysql -umytest -p -h10.0.0.236 -P3306 -e "show variables like 'hostname'"
Enter password: 
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| hostname      | cluster02 |
+---------------+-----------+

能夠看到,LVS 負載均衡已經生效

4.2 高可用測試

10.0.1.2410.0.1.85部署了 Keepalived服務,咱們停掉MasterKeepalived, VIP 會自動飄移到另外一臺機器

如今停掉10.0.1.24Keepalived

[root@chengqm ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]

查看10.0.1.85的IP

[root@yexm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:3c:81:1b brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.85/16 brd 10.0.255.255 scope global eth0
    inet6 fe80::f816:3eff:fe3c:811b/64 scope link 
       valid_lft forever preferred_lft forever
[root@yexm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:3c:81:1b brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.85/16 brd 10.0.255.255 scope global eth0
    inet 10.0.0.236/32 scope global eth0
    inet6 fe80::f816:3eff:fe3c:811b/64 scope link 
       valid_lft forever preferred_lft forever

能夠看到 VIP 已經飄移到另外一臺 LVS 服務器

5 結語

LVS + MMM下既能夠實現多臺 MySQL 節點的負載均衡,也避免了由於同步延遲、同步失敗等問題形成的數據不一致問題,是一個很是不錯的架構方式。

參考: http://www.linuxvirtualserver.org/zh/lvs1.html
相關文章
相關標籤/搜索