大家好,一起來搞一下mysql的負(fù)載均衡這個(gè)技術(shù)點(diǎn)杏节。
mysql負(fù)載均衡集群
1. haproxy介紹與配置
2. keeplived介紹與配置
3. mysql高可用搭建
1. haproxy介紹與配置
HAProxy 是一個(gè)使用C語言編寫的自由及開放源代碼軟件谤民,其提供高可用性慎框、負(fù)載均衡辆影,以及基于 TCP 和HTTP 的應(yīng)用程序代理。
- HAProxy 特別適用于那些負(fù)載特大的 web 站點(diǎn)黍特,這些站點(diǎn)通常又需要會話保持或七層處理蛙讥。
- HAProxy 運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接灭衷。并且它的運(yùn)行模式使得它可以很 簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中次慢, 同時(shí)可以保護(hù)你的 web 服務(wù)器不被暴露到網(wǎng)絡(luò)上。
- HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動翔曲,單一進(jìn)程模型迫像,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模 型受內(nèi)存限制 瞳遍、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制闻妓,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動模型因 為在有更好的資源和時(shí)間管理的用戶空間 (User-Space) 實(shí)現(xiàn)所有這些任務(wù)掠械,所以沒有這些問題由缆。此模 型的弊端是,在多核系統(tǒng)上猾蒂,這些程序通常擴(kuò)展性較差均唉。這就是為什么他們必須進(jìn)行優(yōu)化以使每個(gè) CPU 時(shí)間片 Cycle 做更多的工作。
- 相較與 Nginx肚菠,HAProxy 更專注與反向代理舔箭,因此它可以支持更多的選項(xiàng)膳犹,更精細(xì)的控制晤碘,更多的健 康狀態(tài)檢測機(jī)制和負(fù)載均衡算法。
- 包括 GitHub都办、Bitbucket时捌、Stack Overflow怒医、Reddit、Tumblr奢讨、Twitter 和 Tuenti 在內(nèi)的知名網(wǎng)站稚叹,及亞 馬遜網(wǎng)絡(luò)服務(wù)系統(tǒng)都使用了 HAProxy焰薄。
Haproxy的特性:
1. 可靠性與穩(wěn)定性都非常出色,可與硬件級設(shè)備媲美扒袖。
2. 支持連接拒絕塞茅,可以用于防止 DDoS 攻擊
3. 支持長連接、短連接和日志功能季率,可根據(jù)需要靈活配置
4. 路由 HTTP 請求到后端服務(wù)器,基于 cookie 作會話綁定;同時(shí)支持通過獲取指定的 url 來檢測后 端服務(wù)器的狀態(tài)
5. HAProxy 還擁有功能強(qiáng)大的 ACL 支持野瘦,可靈活配置路由功能,實(shí)現(xiàn)動靜分離飒泻,在架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)上 帶來很大方便
6. 可支持四層和七層負(fù)載均衡鞭光,幾乎能為所有服務(wù)常見的提供負(fù)載均衡功能
7. 擁有功能強(qiáng)大的后端服務(wù)器的狀態(tài)監(jiān)控 web 頁面,可以實(shí)時(shí)了解設(shè)備的運(yùn)行狀態(tài) 泞遗,還可實(shí)現(xiàn)設(shè)備上 下線等簡單操作惰许。
8. 支持多種負(fù)載均衡調(diào)度算法,并且也支持 session 保持史辙。
9. Haproxy 七層負(fù)載均衡模式下汹买,負(fù)載均衡與客戶端及后端的服務(wù)器會分別建立一次 TCP連接,而在 四層負(fù)載均衡模式下(DR)聊倔,僅建立一次 TCP 連接;七層負(fù)載均衡對負(fù)載均衡設(shè)備的要求更高晦毙,處理能力 也低于四層負(fù)載均衡。
haproxy 的配置文件由兩部分組成:
- 全局設(shè)定(globalsettings)
- 對代理的設(shè)定(proxies)
全局設(shè)定
global settings:主要用于定義 haproxy 進(jìn)程管理安全及性能相關(guān)的參數(shù)耙蔑。
代理設(shè)定
proxies 共分為4段:defaults见妒,frontend,backend甸陌,listen
- proxies:代理相關(guān)的配置可以有如下幾個(gè)配置端組成
- defaults:為除了 global 以外的其它配置段提供默認(rèn)參數(shù)徐鹤,默認(rèn)配置參數(shù)可由下一個(gè) “defaults” 重新設(shè)定。
- frontend:定義一系列監(jiān)聽的套接字邀层,這些套接字可接受客戶端請求并與之建立連接返敬。
- backend:定義 “后端” 服務(wù)器,前端代理服務(wù)器將會把客戶端的請求調(diào)度至這些服務(wù)器寥院。
- listen:定義監(jiān)聽的套接字和后端的服務(wù)器劲赠。類似于將 frontend 和 backend 段放在一起 所有代理的名稱只能使用大寫字母、小寫字母秸谢、數(shù)字凛澎、-(中線)、_(下劃線)估蹄、.(點(diǎn)號)和:(冒號)塑煎。此 外,ACL 名稱會區(qū)分字母大小寫臭蚁。
1.2 配置文件詳細(xì)介紹
注意:此處只做配置文件介紹最铁,不做為后期負(fù)載均衡配置
global
log 127.0.0.1 local0 # 定義全局的 syslog 服務(wù)器讯赏,最多可定義2個(gè),格式:log <address> <facility> [max level [min level]]
chroot /var/lib/haproxy # 修改 haproxy 的工作目錄至指定的目錄并在放棄權(quán)限之前執(zhí)行,保證haproxy的安全,使用配置文件默認(rèn)值即可
pidfile /var/run/haproxy.pid
maxconn 10000 # 設(shè)定每個(gè)haproxy進(jìn)程所接受的最大并發(fā)連接數(shù)冷尉,其等同于命令行選項(xiàng)“-n”漱挎;“ulimit -n”自動計(jì)算的結(jié)果正是參照此參數(shù)設(shè)定的;
user haproxy # 以指定的 user 運(yùn)行haproxy雀哨,建議使用專用于運(yùn)行 haproxy 的 user, 以免因權(quán)限問題帶來風(fēng)險(xiǎn)磕谅;
group haproxy # 以指定的 group 運(yùn)行haproxy,建議使用專用于運(yùn)行 haproxy 的 group雾棺, 以免因權(quán)限問題帶來風(fēng)險(xiǎn)膊夹;
daemon # 讓 haproxy 以守護(hù)進(jìn)程的方式工作于后臺,其等同于 “-D” 選項(xiàng)的功能捌浩, 當(dāng)然割疾,也可以在命令行中以 “-db” 選項(xiàng)將其禁用;
ulimit-n 100000 # 設(shè)定每進(jìn)程所能夠打開的最大文件描述符數(shù)目嘉栓,默認(rèn)情況下其會自動進(jìn)行計(jì)算,因此不推薦修改此選項(xiàng)拓诸;Linux默認(rèn)單進(jìn)程打開文件數(shù)為1024個(gè)
stats socket /var/lib/haproxy/stats level admin process 1 # 開啟一個(gè) socket 管理接口
nbproc 12 # 指定啟動的 haproxy 進(jìn)程個(gè)數(shù)侵佃,只能用于守護(hù)進(jìn)程模式的 haproxy;默認(rèn)只啟動一個(gè)進(jìn)程奠支,
cpu-map 1 0 # 綁定 cpu,和 nbproc 數(shù)量相對馋辈。進(jìn)程號從1開始,cpu 核數(shù)從0開始倍谜;
defaults
log global
option tcplog # 啟用日志記錄迈螟;tcplog 請求;
option dontlognull # 日志中將不會記錄空連接尔崔;
retries 3 # 定義連接后端服務(wù)器的失敗重連次數(shù)
timeout connect 2s # 定義 haproxy 將客戶端請求轉(zhuǎn)發(fā)至后端服務(wù)器所等待的超時(shí)時(shí)長
timeout client 3600s # 客戶端非活動狀態(tài)的超時(shí)時(shí)長
timeout server 3600s # 客戶端與服務(wù)器端建立連接后答毫,等待服務(wù)器端的超時(shí)時(shí)長
maxconn 10000 # 默認(rèn)和前段的最大連接數(shù),但不能超過 global 中的 maxconn 限制數(shù)
listen admin_stats # 開啟一個(gè)統(tǒng)計(jì)報(bào)告服務(wù)
bind *:1080 # 監(jiān)聽1080端口
mode http # 基于http協(xié)議
maxconn 10
stats refresh 10s # 統(tǒng)計(jì)頁面自動刷新時(shí)間間隔
stats uri /haproxy # url 地址
stats realm Haproxy # 統(tǒng)計(jì)頁面密碼框上提示文本
stats auth admin:admin # 賬號:密碼
stats hide-version # 隱藏統(tǒng)計(jì)報(bào)告版本信息
stats admin if TRUE # 在制定條件下開啟admin 功能
frontend haproxy # 前端應(yīng)用
bind *:40000 # 端口
mode tcp # tcp 模式
default_backend tidb # 此前端對應(yīng)的后端應(yīng)用
backend tidb # 后端應(yīng)用
balance leastconn # balance 基于最少連接數(shù)
mode tcp # tcp 模式
# acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1 定義一條ACL季春,ACL是根據(jù)數(shù)據(jù)包的指定屬性以指定表達(dá)式計(jì)算出的true/false值洗搂。
# tcp-request content reject if ! internal_networks
# option mysql-check user haproxy post-41
server tidb1 10.0.1.4:4000 check # 后端應(yīng)用地址,代理將會將對應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器载弄。
server tidb2 10.0.1.10:4000 check
1.3 haproxy安裝與環(huán)境配置
在192.168.199.175與192.168.199.172(負(fù)載均衡服務(wù)器)中安裝與配置如下
- 安裝haproxy負(fù)載均衡器
yum install haproxy -y
- 配置haproxy配置文件耘拇,目錄:/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend mysql
bind 0.0.0.0:3307
mode tcp
log global
default_backend mysql_server
backend mysql_server
balance roundrobin
server mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3
server mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
- 3.啟動haproxy負(fù)載均衡
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
2. keeplived介紹與配置
2.1 Keepalived介紹
Keepalived的作用是檢測服務(wù)器的狀態(tài),如果有一臺服務(wù)器宕機(jī)宇攻,或工作出現(xiàn)故障惫叛,Keepalived將檢測到,并將有故障的服務(wù)器從系統(tǒng)中剔除逞刷,同時(shí)使用其它服務(wù)器代替該服務(wù)器的工作嘉涌,當(dāng)服務(wù)器工作 正常后Keepalived自動將服務(wù)器加入到服務(wù)器群中妻熊,這些工作全部自動完成,不需要人工干涉洛心,需要人工做的只是修復(fù)故障的服務(wù)器固耘。
2.2 Keepalived安裝
安裝Keepalived需要的擴(kuò)展
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
解壓Keepalived并安裝
[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz
[root@localhost home]# cd keepalived-1.2.18
[root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.2.18]# make && make install
將 keepalived 安裝成 Linux 系統(tǒng)服務(wù)
因?yàn)闆]有使用 keepalived 的默認(rèn)路徑安裝(默認(rèn)是/usr/local) ,安裝完成之后,需要做一些工作 復(fù)制默認(rèn)配置文件到默認(rèn)路徑
[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
復(fù)制 keepalived 服務(wù)腳本到默認(rèn)的地址
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
設(shè)置 keepalived 服務(wù)開機(jī)啟動
[root@localhost keepalived-1.2.18]# chkconfig keepalived on
3. mysql高可用搭建
- 3.1 Keepalived配置
keepalived主機(jī)配置
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態(tài)的腳本路徑
interval 2 ## 檢測時(shí)間間隔
weight 2 ## 如果條件成立词身,權(quán)重+2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 79
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.29.101
}
track_script {
chk_haproxy
}
}
# 寫VIP virtual_server厅目,只配置本地機(jī)器
virtual_server 192.168.29.101 3307 {# 定義虛擬服務(wù)器,地址與上面的virtual_ipaddress相同
delay_loop 3 # 健康檢查時(shí)間間隔法严,3秒
lb_algo rr # 負(fù)載均衡調(diào)度算法:rr|wrr|lc|wlc|sh|dh|lblc
lb_kind DR # 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則:NAT|DR|TUN
# persistence_timeout 5 # 會話保持時(shí)間5秒损敷,動態(tài)服務(wù)建議開啟
protocol TCP # 轉(zhuǎn)發(fā)協(xié)議protocol,一般有tcp和udp兩種
real_server 192.168.29.106 3307 {
weight 1 # 權(quán)重越大負(fù)載分越大深啤,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Keepalived從機(jī)配置
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態(tài)的腳本路徑
interval 2 ## 檢測時(shí)間間隔
weight 2 ## 如果條件成立拗馒,權(quán)重+2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 79
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.29.101
}
track_script {
chk_haproxy
}
}
# 寫VIP virtual_server,只配置本地機(jī)器
virtual_server 192.168.29.101 3307 {# 定義虛擬服務(wù)器溯街,地址與上面的virtual_ipaddress相同
delay_loop 3 # 健康檢查時(shí)間間隔诱桂,3秒
lb_algo rr # 負(fù)載均衡調(diào)度算法:rr|wrr|lc|wlc|sh|dh|lblc
lb_kind DR # 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則:NAT|DR|TUN
# persistence_timeout 5 # 會話保持時(shí)間5秒,動態(tài)服務(wù)建議開啟
protocol TCP # 轉(zhuǎn)發(fā)協(xié)議protocol呈昔,一般有tcp和udp兩種
real_server 192.168.29.107 3307 {
weight 1 # 權(quán)重越大負(fù)載分越大挥等,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
haproxy狀態(tài)檢測腳本
#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy啟動命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件
HAPS=`ps -C haproxy --no-header |wc -l` # 檢測haproxy的狀態(tài),0代表未啟動,1已經(jīng)啟動
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日志文件當(dāng)中記錄檢測時(shí)間
echo "check haproxy status" >> $LOG_FILE # 記錄haproxy的狀態(tài)
if [ $HAPS -eq 0 ];then #執(zhí)行haproxy判斷
echo $START_HAPROXY >> $LOG_FILE #記錄啟動命令
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #啟動haproxy
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
service keepalived stop
fi
fi
haproxy狀態(tài)檢測腳本不執(zhí)行問題堤尾,如果是使用的service keeplived start 或者是 systemctl 方式啟動肝劲,腳本可能會不執(zhí)行,可以使用 Keepalived -f /etc/keepalived/keepalived.conf方式啟動Keepalived
keepalived配置注意點(diǎn) - 配置完成但是ip不生效郭宝;
- 1.查看虛擬機(jī)/機(jī)器系統(tǒng)時(shí)間是否一致
- 2.virtual_router_id路由id不對辞槐,不能沖突≌呈遥可以通過/var/log/messages查看此錯(cuò)誤
3.2 測試
在本地通過(IP根據(jù)自己的來)192.168.199.101去連接mysql榄檬,查詢sever_id,端口使用haproxy定義的3307