MySQL主主複製+LVS+Keepalived實現MySQL高可用性

來源:互聯網
上載者:User

標籤:/etc   crypto   work   ifconf   chmod   pvs   oop   儲存   參考   

MySQL複製能夠保證資料的冗餘的同時可以做讀寫分離來分擔系統壓力,如果是主主複製還可以很好的避免主節點的單點故障。但是MySQL主主複製存在一些問題無法滿足我們的實際需要:未提供統一訪問入口來實現負載平衡,如果其中master宕掉的話需要手動切換到另外一個master,而不能自動進行切換。

這篇文章下面要介紹如何通過LVS+Keepalived的方式來是實現MySQL的高可用性,同時解決以上問題。

Keepalived和LVS介紹

Keepalived 是一個基於 VRRP (虛擬路由冗餘協議)可用來實現服務高可用性的軟體方案,避免出現單點故障。Keepalived一般用來實現輕量級高可用性,且不需要共用儲存,一般用於兩個節點之間,常見有LVS+Keepalived、Nginx+Keepalived組合。

LVS (Linux Virtual Server)是一個高可用性虛擬伺服器叢集系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體項目之一。

LVS主要用於多伺服器的負載平衡,作用於網路層。LVS構建的伺服器叢集系統中,前端的負載平衡層被稱為Director Server;後端提供服務的伺服器組層被稱為Real Server。通過可以大致瞭解LVS的基礎架構。

LVS有三種工作模式,分別是DR(Direct Routing 直接路由)、TUN(Tunneling IP隧道)、NAT(Network Address Translation 網路位址轉譯)。其中TUN模式能夠支援更多的Real Server,但需要所有伺服器支援IP隧道協議;DR也可以支援相當的Real Server,但需要保證Director Server虛擬網卡與物理網卡在同一網段;NAT擴充性有限,無法支援更多的Real Server,因為所有的請求包和應答包都需要Director Server進行解析再生,影響效率。 同時,LVS負載平衡有10中調度演算法,分別是rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq

詳細的LVS說明請參見傳送門

本文中將利用LVS實現MySQL的讀寫負載平衡,Keepalived避免節點出現單點故障。

LVS+Keepalived配置環境準備

LVS1:192.168.1.2

LVS2:192.168.1.11

MySQL Server1:192.168.1.5

MySQL Server2:192.168.1.6

VIP:192.168.1.100

OS: CentOS 6.4

Keepalive安裝

keepalived

需要安裝以下軟體包

# yum install -y kernel-devel openssl openssl-devel

解壓keepalived到/usr/local/並進入目錄執行配置編譯

# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64/Keepalived configuration------------------------Keepalived version       : 1.2.13Compiler                 : gccCompiler flags           : -g -O2Extra Lib                : -lssl -lcrypto -lcrypt Use IPVS Framework       : YesIPVS sync daemon support : YesIPVS use libnl           : Nofwmark socket support    : YesUse VRRP Framework       : YesUse VRRP VMAC            : YesSNMP support             : NoSHA1 support             : NoUse Debug flags          : No# make && make install

預設情況下keepalived啟動時會去/etc/keepalived目錄下找設定檔,將需要的設定檔拷貝到指定位置

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/# chkconfig mysqld on# chkconfig keepalived on
LVS安裝

ipvsadm

需要安裝以下軟體包

# yum install -y libnl* popt*

查看是否載入lvs模組

# modprobe -l |grep ipvs

解壓安裝

# ln -s /usr/src/kernels/2.6.32-431.5.1.el6.x86_64/ /usr/src/linux# tar -zxvf ipvsadm-1.26.tar.gz# make && make install

LVS安裝完成,查看當前LVS叢集

# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
LVS+Keepalived配置搭建MySQL主主複製

這裡不再贅述,請參考MySQL複製

配置Keepalived

下面是LVS1節點(Keepalived主節點)上的Keepalived配置,LVS2類似

# vim /etc/keepalived/keepalived.conf    ! Configuration File for keepalivedglobal_defs {   router_id LVS1}vrrp_instance VI_1 {    state MASTER #指定instance初始狀態,實際根據優先順序決定.backup節點不一樣    interface eth0 #虛擬IP所在網    virtual_router_id 51 #VRID,相同VRID為一個組,決定多播MAC地址    priority 100 #優先順序,另一台改為90.backup節點不一樣    advert_int 1  #檢查間隔    authentication {        auth_type PASS  #認證方式,可以是pass或ha        auth_pass 1111  #認證密碼    }    virtual_ipaddress {        192.168.1.100  #VIP    }}virtual_server 192.168.1.100 3306 {    delay_loop 6  #服務輪詢的時間間隔    lb_algo wrr  #加權輪詢調度,LVS調度演算法 rr|wrr|lc|wlc|lblc|sh|sh    lb_kind DR   #LVS叢集模式 NAT|DR|TUN,其中DR模式要求負載平衡器網卡必須有一塊與物理網卡在同一個網段    #nat_mask 255.255.255.0    persistence_timeout 50  #會話保持時間    protocol TCP  #健全狀態檢查協議     ## Real Server設定,3306就是MySQL串連連接埠    real_server 192.168.1.5 3306 {        weight 3  ##權重        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3            connect_port 3306        }    }    real_server 192.168.1.6 3306 {        weight 3        TCP_CHECK {            connect_timeout 3            nb_get_retry 3            delay_before_retry 3            connect_port 3306        }    }}
配置LVS

編寫LVS啟動指令碼/etc/init.d/realserver

#!/bin/shVIP=192.168.1.100. /etc/rc.d/init.d/functionscase "$1" in# 禁用本地的ARP請求、綁定本地迴環地址start)    /sbin/ifconfig lo down    /sbin/ifconfig lo up    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    /sbin/sysctl -p >/dev/null 2>&1    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在迴環地址上綁定VIP,設定掩碼,與Direct Server(自身)上的IP保持通訊    /sbin/route add -host $VIP dev lo:0    echo "LVS-DR real server starts successfully.\n"    ;;stop)    /sbin/ifconfig lo:0 down    /sbin/route del $VIP >/dev/null 2>&1    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_announceecho "LVS-DR real server stopped.\n"    ;;status)    isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`    isRoOn=`/bin/netstat -rn | grep "$VIP"`    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then        echo "LVS-DR real server has run yet."    else        echo "LVS-DR real server is running."    fi    exit 3    ;;*)    echo "Usage: $0 {start|stop|status}"    exit 1esacexit 0

將lvs指令碼加入開機自啟動

# chmod +x /etc/init.d/realserver# echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local

分別啟動LVS和keepalived

# service realserver start# service keepalived start

注意此時網卡的變化,可以看到虛擬網卡已經分配到了realserver上。

此時查看LVS叢集狀態,可以看到叢集下有兩個Real Server,調度演算法,權重等資訊。ActiveConn代表當前Real Server的活躍串連數

# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.1.100:3306 wrr persistent 50  -> 192.168.1.5:3306             Route   3      4          1           -> 192.168.1.6:3306             Route   3      0          2

此時LVS+Keepalived+MySQL主主複製已經搭建完成。

測實驗證功能性驗證

關閉MySQL Server2

# service mysqld stop

在LVS1查看/var/log/messages中關於keepalived日誌,LVS1檢測到了MySQL Server2宕機,同時LVS叢集自動剔除了故障節點

Sep  9 13:50:53 192.168.1.2 Keepalived_healthcheckers[18797]: TCP connection to [192.168.1.6]:3306 failed !!!Sep  9 13:50:53 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.6]:3306 from VS [192.168.1.100]:3306

從新啟動MySQL Server2後自動將故障節點自動加入LVS叢集

Sep  9 13:51:41 192.168.1.2 Keepalived_healthcheckers[18797]: TCP connection to [192.168.1.6]:3306 success.Sep  9 13:51:41 192.168.1.2 Keepalived_healthcheckers[18797]: Adding service [192.168.1.6]:3306 to VS [192.168.1.100]:3306

關閉LVS1上的Keepalived(類比宕機操作),查看LVS1上的日誌,可以看到Keepalived移出了LVS1上的VIP

Sep  9 14:01:27 192.168.1.2 Keepalived[18796]: Stopping Keepalived v1.2.13 (09/09,2014)Sep  9 14:01:27 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.5]:3306 from VS [192.168.1.100]:3306Sep  9 14:01:27 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.6]:3306 from VS [192.168.1.100]:3306Sep  9 14:01:27 192.168.1.2 Keepalived_vrrp[18799]: VRRP_Instance(VI_1) sending 0 prioritySep  9 14:01:27 192.168.1.2 Keepalived_vrrp[18799]: VRRP_Instance(VI_1) removing protocol VIPs.

同時查看LVS2上日誌,可以看到LVS2成為了Master,並接管了VIP

Sep  9 14:11:24 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Transition to MASTER STATESep  9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Entering MASTER STATESep  9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) setting protocol VIPs.Sep  9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.100Sep  9 14:11:25 192.168.1.11 Keepalived_healthcheckers[7456]: Netlink reflector reports IP 192.168.1.100 addedSep  9 14:11:25 192.168.1.11 avahi-daemon[1407]: Registering new address record for 192.168.1.100 on eth0.IPv4.Sep  9 14:11:30 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.100

在LVS2上查看LVS叢集狀態,一切正常。

# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.1.100:3306 wrr persistent 50  -> 192.168.1.5:3306             Route   3      2          0           -> 192.168.1.6:3306             Route   3      1          0
總結
  • MySQL主主複製是叢集的基礎,組成Server Array,其中每個節點作為Real Server。
  • LVS伺服器提供了負載平衡的作用,將使用者請求分發到Real Server,一台Real Server故障並不會影響整個叢集的。
  • Keepalived搭建主備LVS伺服器,避免了LVS伺服器的單點故障,出現故障時可以自動切換到正常的節點。

MySQL主主複製+LVS+Keepalived實現MySQL高可用性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.