RabbitMQ负载均衡(4)——LVS
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-4-lvs/
負載均衡的方案有很多,適合RabbitMQ使用的處理HAProxy之外還有LVS。LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.6.32內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.6.32內核以后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
LVS是4層負載均衡,也就是說建立在OSI模型的傳輸層之上。LVS支持TCP/UDP的負載均衡,相對于其它高層負載均衡的解決方案,比如DNS域名輪流解析、應用層負載的調度、客戶端的調度等,它是非常高效的。LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。
LVS主要由3個部分組成:
- 負載調度器(Load Balancer/ Director):它是整個集群對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認為服務是來自一個IP地址(VIP)上的。
- 服務器池(Server Pool/ RealServer):是一組真正執行客戶端請求的服務器,如RabbitMQ服務器。
- 共享存儲(Shared Storage):它為服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
目前LVS的負載均衡方式也分為三種:
- VS/NAT:即Virtual Server via Network Address Translation的簡稱。VS/NAT是一種最簡單的方式,所有的RealServer只需要將自己的網關指向Director即可。客戶端可以是任意的操作系統,但此方式下,一個Director能夠帶動的RealServer比較有限。
- VS/TUN:即Virtual Server via IP Tunneling的簡稱。IP隧道(IP Tunneling)是將一個IP報文封裝再另一個IP報文的技術,這可以使得目標為一個IP地址的數據報文能夠被封裝和轉發到另一個IP地址。IP隧道技術亦可以稱之為IP封裝技術(IP encapsulation)。
- VS/DR:即Virtual Server via Direct Routing的簡稱。VS/DR方式是通過改寫報文中的MAC地址部分來實現的。Director和RealServer必須在物理上有一個網卡通過不間斷的局域網相連。RealServer上綁定的VIP配置在各自Non-ARP的網絡設備上(如lo或tunl),Director的VIP地址對外可見,而RealServer的VIP對外是不可見的。RealServer的地址即可以是內部地址,也可以是真實地址。
對于LVS而言配合Keepalived一起使用同樣可以實現高可靠的負載均衡,對于圖7-11來說,LVS可以完全的替代HAProxy而其他內容可以保持不變。LVS不需要額外的配置文件,直接集成在Keepalived的配置文件之中。修改/etc/keepalived/keepalived.conf文件內容如下:
#Keepalived配置文件(Master) global_defs {router_id NodeA #路由ID, 主備的ID不能相同 } vrrp_instance VI_1 {state MASTER #Keepalived的角色。Master表示主服務器,從服務器設置為BACKUPinterface eth0 #指定監測網卡virtual_router_id 1priority 100 #優先級,BACKUP機器上的優先級要小于這個值advert_int 1 #設置主備之間的檢查時間,單位為sauthentication { #定義驗證類型和密碼auth_type PASSauth_pass root123}track_script {chk_haproxy}virtual_ipaddress { #VIP地址,可以設置多個:192.168.0.10} }virtual_server 192.168.0.10 5672 { #設置虛擬服務器delay_loop 6 #設置運行情況檢查時間,單位是秒#設置負載調度算法,共有rr,wrr,lc,wlc,lblc,lblcr,dh,sh這8種。lb_algo wrr #這里是加權輪詢lb_kind DR #設置LVS實現的負載均衡機制方式VS/DR#指定在一定的時間內來自同一IP的連接將會被轉發到同一RealServer中。persistence_timeout 50 protocal TCP #指定轉發協議類型,有TCP和UDP兩種#這個real_server即指LVS的三大部分之一的RealServer,這里特指RabbitMQ的服務real_server 192.168.0.2 5672 { #配置服務節點weight 1 #配置權重TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 5672}}real_server 192.168.0.3 5672 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 5672}}real_server 192.168.0.4 5672 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 5672}} } #為RabbitMQ的rabbitmq_management插件設置負載均衡 virtual_server 192.168.0.10 15672 {delay_loop 6lb_algo wrrlb_kind DRpersistence_timeout 50protocal TCPreal_server 192.168.0.2 15672 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 15672}}real_server 192.168.0.3 15672 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 15672}}real_server 192.168.0.4 15672 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 15672}} }對于Backup的配置可以參考前一小節中的相應配置。在LVS和Keepalived環境里面,LVS主要的工作是提供調度算法,把客戶端請求按照需求調度在RealServer,Keepalived主要的工作是提供LVS控制器的一個冗余,并且對RealServer做健康檢查,發現不健康的RealServer就把它從LVS集群中剔除,RealServer只負責提供服務。
通常在LVS的VS/DR模式下需要在RealServer上配置VIP。原因在于當LVS把客戶端的包轉發給RealServer時,因為包的目的IP地址是VIP,那么如果RealServer收到這個包后發現包的目的地址不是自己系統的IP,那么就會認為這個包不是發給自己的,就會丟棄這個包,所以需要將這個IP地址綁定到網卡下。當發送應答包給客戶端時,RealServer就會把包的源和目的地址調換,直接回復給客戶端。下面為所有的RealServer的的lo:0網卡創建啟動腳本(vim /opt/realserver.sh)綁定VIP地址,詳細內容如下:
#!/bin/bash VIP=192.168.0.10 /etc/rc.d/init.d/functionscase "$1" in start)/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP/sbin/route add -host $VIP dev lo:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start Ok" ;; stop)/sbin/ifconfig lo:0 down/sbin/route del -host $VIP dev lo:0echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; status)islothere=`/sbin/ifconfig lo:0 | grep $VIP | wc -l`isrothere=`netstat -rn | grep "lo:0"|grep $VIP | wc -l`if [ $islothere -eq 0 ]thenif [ $isrothere -eq 0 ]thenecho "LVS of RealServer Stopped."elseecho "LVS of RealServer Running."fielseecho "LVS of RealServer Running."fi ;; *)echo "Usage:$0{start|stop}"exit 1 ;; esac注意上面綁定VIP的掩碼是255.255.255.255,說明廣播地址使其自身,那么它就不會將ARP發送到實際的自己該屬于的廣播域了,這樣防止與LVS上的VIP沖突進而導致IP地址沖突。為/opt/realserver.sh文件添加可執行權限后,運行/opt/realserver.sh start命令之后可以通過ip add show命令查看lo:0網卡的狀態,注意與Keepalived節點的網卡狀態進行區分。
[root@node1 keepalived]# ip add show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet 192.168.0.10/32 brd xx.xx.197.74 scope global lo:0inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP qlen 1000link/ether fa:16:3e:5e:7a:f7 brd ff:ff:ff:ff:ff:ffinet 192.168.0.2/18 brd xx.xx.255.255 scope global eth0inet6 fe80::f816:3eff:fe5e:7af7/64 scope link valid_lft forever preferred_lft forever歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-4-lvs/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的RabbitMQ负载均衡(4)——LVS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ负载均衡(3)——Kee
- 下一篇: RabbitMQ之监控(2)