上篇文章 MySQL集羣搭建(3)-MMM高可用架構 介紹了 MMM
高可用集羣的搭建方法, 裏面有提到 MMM
能夠配置多個讀 VIP
, 今天這篇文章教你們怎麼用 LVS
對這些讀 VIP
作一個負載均衡。html
LVS 是 Linux Virtual Server 的簡寫,意即 Linux 虛擬服務器,是一個虛擬的服務器集羣系統。本項目在 1998 年 5 月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。mysql
LVS 集羣採用 IP 負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。linux
好比說,用 LVS 作 Web 負載均衡,那麼請求 LVS 調度器的時候,請求會根據配置的算法分發給後端某臺 Web 服務器,後端 Web 服務器機器對於請求者來講是透明的。算法
LVS 包含如下三種經常使用工做模式sql
NAT (Network Address Translation) 即網路地址裝換,NAT 的工做原理是更改報文頭(目標地址、源地址和端口等)後,轉發請求都後端地址。流程以下shell
NAT 模式的全部數據都會通過 LVS 服務器,簡單來講就是從 LVS 進,從 LVS 出,如圖segmentfault
在 NAT 的集羣系統中,請求和響應的數據報文都須要經過 LVS 服務器,當真實服務器的數目在10臺和20臺之間時,負載調度器將成爲整個集羣系統的新瓶頸。大多數 Internet服務都有這樣的特色:請求報文較短而響應報文每每包含大量的數據。若是能將請求和響應分開處理,即在負載調度器中只負責調度請求而響應直接返回給客戶,將極大地提升整個集羣系統的吞吐量。後端
IP 隧道(IP tunneling)是將一個IP報文封裝在另外一個IP報文的技術,這可使得目標爲一個IP地址的數據報文能被封裝和轉發到另外一個IP地址。IP隧道技 術亦稱爲IP封裝技術(IP encapsulation)。IP隧道主要用於移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態創建的,隧道一端有一個IP地址,另外一端也有惟一的IP地址。服務器
咱們利用IP隧道技術將請求報文封裝轉發給後端服務器,響應報文能從後端服務器直接返回給客戶(要求後端真實服務器與外部網絡鏈接)。網絡
TUN 模式工做流程以下:
DR 模式中,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶, DR 模式架構圖
DR 模式的執行流程以下
關於三種模式選擇
NAT
模式下,全部流量會通過 LVS
服務器, 很容易有瓶頸;TUN
模式須要內核支持,部署成本比較高;DR
模式性能高、容易部署,通常使用這種模式。
本小節內容參考: LVS集羣中的IP負載均衡技術
這裏簡單介紹 LVS 的 8 種調度算法
靜態調度
動態調度
本小節內容參考: LVS集羣的負載調度
Keepalived 起初是爲 LVS 件設計, 用來管理和監控 LVS 各個服務器節點狀態的工具
Keepalived 採用 Master/Slave 模式, 在 Master 上設置配置文件的 VIP,當 Master 宕機後,VIP 自動漂移到另外一臺 Keepalived 服務器上
Keepalived 能夠用來作各類軟件的高可用集羣,它會一直檢測服務器的狀態,若是有一臺服務器宕機,或工做出現故障,Keepalived 將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後 Keepalived 自動將服務器加入到服務器羣中。
簡單來講,Keepalived 就是用來實現機器的高可用的,在使用 Keepalived 的狀況下,只有一臺服務器可以提供服務(經過 VIP 來實現),當 Master 主機宕機後,VIP 會自動飄移到另外一臺服務器
MySQL 環境採用上篇文章部署的那一套,而後新增一臺服務器做爲 LVS 的備用節點
IP | 系統 | 端口 | MySQL版本 | 節點 | 讀寫 | 說明 |
---|---|---|---|---|---|---|
10.0.0.247 | Centos6.5 | 3306 | 5.7.9 | Master | 讀寫 | 主節點 |
10.0.0.248 | Centos6.5 | 3306 | 5.7.9 | Standby | 只讀,可切換爲讀寫 | 備主節點 |
10.0.0.249 | Centos6.5 | 3306 | 5.7.9 | Slave | 只讀 | 從節點 |
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
若是有對應的 yum
源,直接安裝就能夠了
yum install -y keepalived
下載安裝包, 下載地址 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/
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
, 當其餘節點起來的時候會從新選舉,因此這裏設爲 BACKUP
就能夠了virtual_router_id
: 用來區分 VRRP
組播的標記,取值 0-255priority
: 優先級advert_int
: 監控檢測間隔authentication
: 認證相關virtual_ipaddress
: 要設置的 VIP
注意: 在同一個廣播域內 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
狀態
[root@chengqm ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
本次測試,負載調度的算法採用 加權最少鏈接(wlc)
,工做模式採用 DR
模式
LVS
採用 yum
安裝就能夠了
yum install -y ipvsadm
繼續打開 /etc/keepalived/keepalived.conf
文件, 在後面加上 LVS
配置, 轉發VIP
爲10.0.0.236
的3306
端口到MMM
的虛IP
virtual_server 10.0.0.236 3306 { delay_loop 6 # 健康檢查時間,單位是秒 lb_algo wlc # 負載調度的算法 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 # 節點權重, 數字越大, 權重越大 TCP_CHECK { # 檢測參數 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
因爲 DR 模式的原理是 LVS
與後端真實服務器配置同一個 VIP
,後端服務器 不容許arp
廣播,這樣路由器接收到請求就會發給 LVS
,LVS
修改請求的 MAC
地址。這樣路由器和後端服務器經過 MAC
地址進行通訊,達到負載均衡的目的。
在 10.0.0.247
, 10.0.0.248
, 10.0.0.249
服務器上執行如下命令
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_announce
[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
負載均衡已經生效
LVS 配置好了,讓咱們測試一下效果, 目前 Keepalived
Master
在 10.0.1.24
, 而且已經預先建立了一個測試帳號,那麼咱們在其餘機器發起請求看看
[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 負載均衡已經生效
10.0.1.24
和 10.0.1.85
部署了 Keepalived
服務,咱們停掉Master
的Keepalived
, VIP 會自動飄移到另外一臺機器
如今停掉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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
已經飄移到另外一臺 LVS
服務器
LVS
+ MMM
下既能夠實現多臺 MySQL
節點的負載均衡,也避免了由於同步延遲、同步失敗等問題形成的數據不一致問題,是一個很是不錯的架構方式。
參考: http://www.linuxvirtualserver.org/zh/lvs1.html