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