摘要:上篇文章集群搭建高可用架構介紹了高可用集群的搭建方法里面有提到可以配置多個讀,今天這篇文章教大家怎么用對這些讀做一個負載均衡。集群采用負載均衡技術和基于內(nèi)容請求分發(fā)技術。
上篇文章 MySQL集群搭建(3)-MMM高可用架構 介紹了 MMM 高可用集群的搭建方法, 里面有提到 MMM 可以配置多個讀 VIP, 今天這篇文章教大家怎么用 LVS 對這些讀 VIP 做一個負載均衡。
1 LVS 介紹 1.1 簡介LVS 是 Linux Virtual Server 的簡寫,意即 Linux 虛擬服務器,是一個虛擬的服務器集群系統(tǒng)。本項目在 1998 年 5 月由章文嵩博士成立,是中國國內(nèi)最早出現(xiàn)的自由軟件項目之一。
LVS 集群采用 IP 負載均衡技術和基于內(nèi)容請求分發(fā)技術。調(diào)度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執(zhí)行,且調(diào)度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。
比如說,用 LVS 做 Web 負載均衡,那么請求 LVS 調(diào)度器的時候,請求會根據(jù)配置的算法分發(fā)給后端某臺 Web 服務器,后端 Web 服務器機器對于請求者來說是透明的。
1.1 LVS 工作模式LVS 包含以下三種常用工作模式
1). NAT 模式NAT (Network Address Translation) 即網(wǎng)路地址裝換,NAT 的工作原理是更改報文頭(目標地址、源地址和端口等)后,轉發(fā)請求都后端地址。流程如下
客戶端請求 LVS 的 IP
LVS 更改請求的目的 IP,改為后端服務器其中一個 IP,然后轉發(fā)請求
后端服務器處理完,返回數(shù)據(jù)給 LVS,LVS 更改源 IP 為 LVS 機器的 IP 然后返回給請求端
NAT 模式的所有數(shù)據(jù)都會經(jīng)過 LVS 服務器,簡單來說就是從 LVS 進,從 LVS 出,如圖
2). TUN 模式在 NAT 的集群系統(tǒng)中,請求和響應的數(shù)據(jù)報文都需要通過 LVS 服務器,當真實服務器的數(shù)目在10臺和20臺之間時,負載調(diào)度器將成為整個集群系統(tǒng)的新瓶頸。大多數(shù) Internet服務都有這樣的特點:請求報文較短而響應報文往往包含大量的數(shù)據(jù)。如果能將請求和響應分開處理,即在負載調(diào)度器中只負責調(diào)度請求而響應直接返回給客戶,將極大地提高整個集群系統(tǒng)的吞吐量。
IP 隧道(IP tunneling)是將一個IP報文封裝在另一個IP報文的技術,這可以使得目標為一個IP地址的數(shù)據(jù)報文能被封裝和轉發(fā)到另一個IP地址。IP隧道技 術亦稱為IP封裝技術(IP encapsulation)。IP隧道主要用于移動主機和虛擬私有網(wǎng)絡(Virtual Private Network),在其中隧道都是靜態(tài)建立的,隧道一端有一個IP地址,另一端也有唯一的IP地址。
我們利用IP隧道技術將請求報文封裝轉發(fā)給后端服務器,響應報文能從后端服務器直接返回給客戶(要求后端真實服務器與外部網(wǎng)絡連接)。
TUN 模式工作流程如下:
客戶端請求數(shù)據(jù),調(diào)度器根據(jù)各個服務器的負載情況,動態(tài)地選擇一臺服務器, 將請求報文封裝在另一個IP報文中,再將封裝后的IP報文轉發(fā)給選出的服務器
服務器收到報文后,先將報文解封獲得原來目標地址為VIP的報文,服務器發(fā) 現(xiàn)VIP地址被配置在本地的IP隧道設備上,所以就處理這個請求,然后根據(jù)路由表將響應報文直接返回給客戶。
3). DR 模式DR 模式中,負載調(diào)度器中只負責調(diào)度請求,而服務器直接將響應返回給客戶, DR 模式架構圖
DR 模式的執(zhí)行流程如下
客戶端請求數(shù)據(jù),調(diào)度器根據(jù)各個服務器的負載情況,動態(tài)地選擇一臺服務器,不修改也不封裝IP報文,而是將數(shù)據(jù)幀的MAC 地址改為選出服務器的 MAC 地址,再將修改后 的數(shù)據(jù)幀在與服務器組的局域網(wǎng)上發(fā)送。
因為數(shù)據(jù)幀的 MAC 地址是選出的服務器,所以服務器肯定可以收到這個數(shù)據(jù)幀,從中可以獲得該 IP 報文。當服務器發(fā)現(xiàn) 報文的目標地址VIP是在本地的網(wǎng)絡設備上,服務器處理這個報文,然后根據(jù)路由表將響應報文直接返回給客戶。
關于三種模式選擇
NAT模式下,所有流量會經(jīng)過 LVS 服務器, 很容易有瓶頸;TUN 模式需要內(nèi)核支持,部署成本比較高;DR模式性能高、容易部署,一般使用這種模式。
本小節(jié)內(nèi)容參考: LVS集群中的IP負載均衡技術
1.2 LVS 調(diào)度算法這里簡單介紹 LVS 的 8 種調(diào)度算法
靜態(tài)調(diào)度
輪詢調(diào)度(rr): 輪詢調(diào)就是依次將請求調(diào)度不同的服務器,即每次調(diào)度執(zhí)行i = (i + 1) mod n,并選出第i臺服務器。算法的優(yōu)點是其簡潔性,它無需記錄當前所有連接的狀態(tài),所以它是一種無狀態(tài)調(diào)度。
加權輪詢(wrr): 加權輪詢算法可以解決服務器間性能不一的情況,它用相應的權值表示服務器的處理性能,服務器的缺省權值為1。假設服務器A的權值為1,B的 權值為2,則表示服務器B的處理性能是A的兩倍。加權輪詢調(diào)度算法是按權值的高低和輪叫方式分配請求到各服務器。
源地址散列(sh): 該算法正好與目標地址散列調(diào)度算法相反,它根據(jù)請求的源IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發(fā)送到該服務器,否則返回空。
目標地址散列(dh): 該算法也是針對目標IP地址的負載均衡,但它是一種靜態(tài)映射算法,通過一個散列(Hash)函數(shù)將一個目標IP地址映射到一臺服務器。
動態(tài)調(diào)度
最少連接(lc): 最少連接是把新的連接請求分配到當前連接數(shù)最小的服務器。
加權最少連接(wlc): 加權最少連接算法是最小連接調(diào)度的超集,各個服務器用相應的權值表示其處理性能。
基于局部性的最少連接(lblc): 該算法是針對請求報文的目標IP地址的負載均衡調(diào)度,目前主要用于Cache集群系統(tǒng),因為在Cache集群中 客戶請求報文的目標IP地址是變化的。
帶復制的基于局部性最少連接(lblcr): 該算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統(tǒng)。它與LBLC算法的不同之處是它要 維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。
本小節(jié)內(nèi)容參考: LVS集群的負載調(diào)度
2 Keepalived 簡介Keepalived 起初是為 LVS 件設計, 用來管理和監(jiān)控 LVS 各個服務器節(jié)點狀態(tài)的工具
Keepalived 采用 Master/Slave 模式, 在 Master 上設置配置文件的 VIP,當 Master 宕機后,VIP 自動漂移到另一臺 Keepalived 服務器上
Keepalived 可以用來做各種軟件的高可用集群,它會一直檢測服務器的狀態(tài),如果有一臺服務器宕機,或工作出現(xiàn)故障,Keepalived 將檢測到,并將有故障的服務器從系統(tǒng)中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后 Keepalived 自動將服務器加入到服務器群中。
簡單來說,Keepalived 就是用來實現(xiàn)機器的高可用的,在使用 Keepalived 的情況下,只有一臺服務器能夠提供服務(通過 VIP 來實現(xiàn)),當 Master 主機宕機后,VIP 會自動飄移到另一臺服務器
3 環(huán)境準備 3.1 服務器與 MySQL 環(huán)境MySQL 環(huán)境采用上篇文章部署的那一套,然后新增一臺服務器作為 LVS 的備用節(jié)點
節(jié)點信息IP | 系統(tǒng) | 端口 | MySQL版本 | 節(jié)點 | 讀寫 | 說明 |
---|---|---|---|---|---|---|
10.0.0.247 | Centos6.5 | 3306 | 5.7.9 | Master | 讀寫 | 主節(jié)點 |
10.0.0.248 | Centos6.5 | 3306 | 5.7.9 | Standby | 只讀,可切換為讀寫 | 備主節(jié)點 |
10.0.0.249 | Centos6.5 | 3306 | 5.7.9 | Slave | 只讀 | 從節(jié)點 |
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 | 類型 |
---|---|---|
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 |
我們在10.0.1.24和10.0.1.85上部署 Keepalived
1). yum 安裝如果有對應的 yum 源,直接安裝就可以了
yum install -y keepalived2). 源碼安裝
下載安裝包, 下載地址 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: MASTER或BACKUP, 當其他節(jié)點起來的時候會重新選舉,所以這里設為 BACKUP 就可以了
virtual_router_id: 用來區(qū)分 VRRP 組播的標記,取值 0-255
priority: 優(yōu)先級
advert_int: 監(jiān)控檢測間隔
authentication: 認證相關
virtual_ipaddress: 要設置的 VIP
注意: 在同一個廣播域內(nèi) virtual_router_id 不能重復
4). 啟動
由于在priority都相同,所以先啟動為 Master, 我們在10.0.1.24和10.0.1.85上輪流啟動Keepalived
/etc/init.d/keepalived start
啟動后觀察10.0.1.24 IP 狀態(tài)
[root@chengqm ~]# ip addr 1: lo:3.3 LVS 安裝配置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: 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
本次測試,負載調(diào)度的算法采用 加權最少連接(wlc),工作模式采用 DR 模式
1). 安裝LVS 采用 yum 安裝就可以了
yum install -y ipvsadm2). 增加配置文件
繼續(xù)打開 /etc/keepalived/keepalived.conf 文件, 在后面加上 LVS 配置, 轉發(fā)VIP為10.0.0.236的3306端口到MMM的虛IP
virtual_server 10.0.0.236 3306 { delay_loop 6 # 健康檢查時間,單位是秒 lb_algo wlc # 負載調(diào)度的算法 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 # 節(jié)點權重, 數(shù)字越大, 權重越大 TCP_CHECK { # 檢測參數(shù) 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廣播,這樣路由器接收到請求就會發(fā)給 LVS,LVS 修改請求的 MAC 地址。這樣路由器和后端服務器通過 MAC 地址進行通信,達到負載均衡的目的。
在 10.0.0.247, 10.0.0.248, 10.0.0.249 服務器上執(zhí)行以下命令
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_announce4). 檢查 LVS 狀態(tài)
[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 負載均衡已經(jīng)生效
4 測試 4.1 負載均衡測試LVS 配置好了,讓我們測試一下效果, 目前 Keepalived Master在 10.0.1.24, 并且已經(jīng)預先創(chuàng)建了一個測試賬號,那么我們在其他機器發(fā)起請求看看
[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 負載均衡已經(jīng)生效
4.2 高可用測試10.0.1.24 和 10.0.1.85部署了 Keepalived服務,我們停掉Master的Keepalived, VIP 會自動飄移到另一臺機器
現(xiàn)在停掉10.0.1.24的Keepalived
[root@chengqm ~]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ]
查看10.0.1.85的IP
[root@yexm ~]# ip addr 1: lo: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: 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: 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: 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 已經(jīng)飄移到另一臺 LVS 服務器
5 結語LVS + MMM下既可以實現(xiàn)多臺 MySQL 節(jié)點的負載均衡,也避免了因為同步延遲、同步失敗等問題造成的數(shù)據(jù)不一致問題,是一個非常不錯的架構方式。
參考: http://www.linuxvirtualserver.org/zh/lvs1.html
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17845.html
閱讀 3528·2021-09-22 15:50
閱讀 3233·2019-08-30 15:54
閱讀 2748·2019-08-30 14:12
閱讀 3058·2019-08-30 11:22
閱讀 2079·2019-08-29 11:16
閱讀 3574·2019-08-26 13:43
閱讀 1192·2019-08-23 18:33
閱讀 919·2019-08-23 18:32