LVS+Keepalived實現mysql的負載均衡


1 初識LVS:Linux Virtual Server

1.1 LVS是什么

      LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標准內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。

1.2 LVS有什么作用

      LVS主要用於服務器集群的負載均衡。它工作在網絡層,可以實現高性能,高可用的服務器集群技術。它廉價,可把許多低性能的服務器組合在一起形成一個超級服務器。它易用,配置非常簡單,且有多種負載均衡的方法。它穩定可靠,即使在集群的服務器中某台服務器無法正常工作,也不影響整體效果。另外可擴展性也非常好。

LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。

1.3 LVS的體系結構

使用LVS架設的服務器集群系統有三個部分組成:

(1)最前端的負載均衡層,用Load Balancer表示;

(2)中間的服務器集群層,用Server Array表示;

(3)最底端的數據共享存儲層,用Shared Storage表示;

在用戶看來,所有的內部應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。

1.4 LVS負載均衡機制

(1)LVS是四層負載均衡,也就是說建立在OSI模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支持TCP/UDP的負載均衡。因為LVS是四層負載均衡,因此它相對於其它高層負載均衡的解決辦法,比如DNS域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。

(2)LVS的轉發主要通過修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR模式)來實現。

①NAT模式:網絡地址轉換

NAT

NAT(Network Address Translation)是一種外網和內網地址映射的技術。NAT模式下,網絡數據報的進出都要經過LVS的處理。LVS需要作為RS(真實服務器)的網關。當包到達LVS時,LVS做目標地址轉換(DNAT),將目標IP改為RS的IP。RS接收到包以后,仿佛是客戶端直接發給它的一樣。RS處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP。這時RS的包通過網關(LVS)中轉,LVS會做源地址轉換(SNAT),將包的源地址改為VIP,這樣,這個包對客戶端看起來就仿佛是LVS直接返回給它的。客戶端無法感知到后端RS的存在。

②DR模式:直接路由

DR

DR模式下需要LVS和RS集群綁定同一個VIP(RS通過將VIP綁定在loopback實現),但與NAT的不同點在於:請求由LVS接受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不經過LVS。詳細來看,一個請求過來時,LVS只需要將網絡幀的MAC地址修改為某一台RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目標IP都沒變,LVS只是做了一下移花接木。RS收到LVS轉發來的包時,鏈路層發現MAC是自己的,到上面的網絡層,發現IP也是自己的,於是這個包被合法地接受,RS感知不到前面有LVS的存在。而當RS返回響應時,只要直接向源IP(即用戶的IP)返回即可,不再經過LVS。

(3)DR負載均衡模式數據分發過程中不修改IP地址,只修改mac地址,由於實際處理請求的真實物理IP地址和數據請求目的IP地址一致,所以不需要通過負載均衡服務器進行地址轉換,可將響應數據包直接返回給用戶瀏覽器,避免負載均衡服務器網卡帶寬成為瓶頸。因此,DR模式具有較好的性能,也是目前大型網站使用最廣泛的一種負載均衡手段。

2 構建實戰:LVS+Keepalived實現mysql負載均衡

2.1 實驗結構總覽

image

(1)本次基於VMware Workstation搭建一個四台Linux(CentOS 6.4)系統所構成的一個服務器集群,其中兩台負載均衡服務器(一台為主機,另一台為備機),另外兩台作為真實的Web服務器(向外部提供http服務,這里僅僅使用了CentOS默認自帶的http服務,沒有安裝其他的類似Tomcat、Jexus服務)。

(2)本次實驗基於DR負載均衡模式

設置了一個VIP(Virtual IP)為192.168.5.200,用戶只需要訪問這個IP地址即可獲得網頁服務。

負載均衡主機為192.168.5.120

備機為192.168.5.121

mysql服務器A為192.168.5.122

mysql服務器B為192.168.5.123

2.2 基礎准備工作

以下工作針對所有服務器,也就是說要在四台服務器中都要進行配置:

(1)網絡配置

  參考 centos網絡配置,將4台虛擬機配置成靜態ip

(2)設定主機名

①修改當前會話中的主機名,執行命令hostname xxxx (這里xxxx為你想要改為的名字)

②修改配置文件中的主機名,執行命令vi /etc/sysconfig/network (√一般需要進行此步湊才能永久更改主機名)

驗證:重啟系統reboot

(3)IP地址與主機名的綁定

執行命令vi /etc/hosts,增加一行內容,如下(下面的從節點以你自己的為主,本實驗搭建了兩個從節點):

192.168.5.120 lvs-master

192.168.5.121 lvs-slave

#下面是本次試驗的兩個真實服務器節點

192.168.5.122 lvs-mysql1

192.168.5.123 lvs-mysql2

保存后退出

驗證:ping lvs-master

(4)關閉防火牆

①執行關閉防火牆命令:service iptables stop

      驗證:service iptables stauts

②執行關閉防火牆自動運行命令:chkconfig iptables off

驗證:chkconfig --list | grep iptables

2.3 配置兩台mysql服務器

以下操作需要在角色為數據庫服務器的兩台中進行,不需要在負載均衡服務器中進行操作:

(1)安裝和運行mysql

參考我之前寫的一篇文章:MySQL知識總結(一)安裝與配置(Linux CentOS)

創建數據庫bruce

創建表test並插入數據:

create table test(
  id int,
  name varchar(10)
);
-- A中插入
insert into test values(1,'A');
-- B中插入
insert into test values(2,'B');

(2)編輯realserver腳本文件

①進入指定文件夾:cd /etc/init.d/

②創建腳本文件:vi realserver

SNS_VIP=192.168.5.200
/etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_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
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_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
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

這里我們設置虛擬IP為:192.168.5.200

③保存腳本文件后更改該文件權限:chmod 755 realserver

④開啟realserver服務:service realserver start

2.4 配置主負載服務器

關於keepalived相關知識,請參考:http://bbs.nanjimao.com/thread-855-1-1.html

(1)安裝Keepalived相關包

wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

tar -zxvf keepalived-1.2.13.tar.gz

cd keepalived-1.2.13

./configure --disable-fwmark --prefix=/usr/local/keepalived

make && make install

(2)編輯keepalived.conf配置文件

①進入keepalived.conf所在目錄:cd /etc/keepalived

②首先清除掉keepalived原有配置:> keepalived.conf

③重新編輯keepalived配置文件:vi keepalived.conf

global_defs {  
    router_id LVS_DEVEL  # 設置lvs的id,在一個網絡內應該是唯一的
}  
vrrp_instance VI_1 {  
    state MASTER   #指定Keepalived的角色,MASTER為主,BACKUP為備          
    interface eth1  #指定Keepalived的角色,MASTER為主,BACKUP為備
    virtual_router_id 51  #虛擬路由編號,主備要一致
    priority 100  #定義優先級,數字越大,優先級越高,主DR必須大於備用DR    
    advert_int 1  #檢查間隔,默認為1s
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.5.200  #定義虛擬IP(VIP)為192.168.2.33,可多設,每行一個
    }  
}  
# 定義對外提供服務的LVS的VIP以及port
virtual_server 192.168.5.200 3306 {  
    delay_loop 6 # 設置健康檢查時間,單位是秒                    
    lb_algo wlc # 設置負載調度的算法為wlc 基於權重的調度算法                  
    lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式   
    nat_mask 255.255.255.0                
   #persistence_timeout 0 會話保持時間    
    protocol TCP                  
    real_server 192.168.5.122 3306 {  # 指定real server1的IP地址
        weight 3   # 配置節點權值,數字越大權重越高              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 3306  
        }  
    }  
    real_server 192.168.5.123 3306{  # 指定real server2的IP地址
        weight 3  # 配置節點權值,數字越大權重越高  
        TCP_CHECK {  
        connect_timeout 10  
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 3306  
        }  
     }  
}

注意:會話保持時間要注釋掉,這樣可以看出負載均衡的調度

(3)開啟keepalived服務

service keepalived start
停止命令
service keepalived stop
查看狀態
service keepalived status

檢測:運行命令ipvsadm

image

2.5 配置從負載服務器

從負載服務器與主負載服務器大致相同,只是在keepalived的配置文件中需要改以下兩處:

(1)將state由MASTER改為BACKUP

(2)將priority由100改為99

復制代碼

vrrp_instance VI_1 {  
    state BACKUP # 這里改為BACKUP
    interface eth1  
    virtual_router_id 51  
    priority 99 # 這里改為99,master優先級是100
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.5.200  
    }  
}  

復制代碼

2.6 驗證性測試

在客戶端上登錄mysql,客戶端機器是120,121,122,123之外的機器

mysql -h192.168.5.200 -uroot –pbruce -P3306 –Dbruce

因為mysql是長連接,所以測試時需要開啟多個命令窗口進行連接

發現請求被平均分配到A和B服務器

 

參考文章:

http://www.cnblogs.com/edisonchou/p/4281978.html

keepalived:

Keepalived雙機熱備(HA)精講

Keepalived原理與實戰精講


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM