伺服器群集—Haproxy+keepalived群集
一、Haproxy
1.1 常見的Web叢集排程器
● 目前常見的Wb叢集排程器分為軟體和硬體
● 軟體通常使用開源的LVS、Haproxy、Nginx
● 硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚、綠盟等
1.2 Haproxy應用分析
LVS在企業應用中抗負載能力很強,但存在不足
● LVS不支援正則處理,不能實現動靜分離
● 對於大型網站,LVS的實施配置複雜,維護成本相對較高
● LVS工作在TCP七層協議第四層
Haproxy是一款可提供高可用性、負載均衡、及基於TCP和HTTP應用的代理的軟體
● 適用於負載大的Web站點
● 執行在硬體上可支援數以萬計的併發連線的連線請求
1.3 Haproxy排程演算法原理(RR;LC;SH)
Haproxy支援多種排程演算法,最常用的有三種
1.31 ● RR (Round Robin)輪詢
RR演算法是最簡單最常用的一種演算法,即輪詢排程
理解舉例:
◆有三個節點A、B、C
第一個使用者訪問會被指派到節點A
第二個使用者訪問會被指派到節點B
第三個使用者訪問會被指派到節點C
第四個使用者訪問繼續指派到節點A,輪詢分配訪問請求實現負載均衡效果
1.32 ● LC (Least Connections)最小連線數
最小連線數演算法,根據後端的節點連線數大小動態分配前端請求
理解舉例:
有三個節點A、B、C,各節點的連線數分別為A:4、B:5、C:6
第一個使用者連線請求,會被指派到A上,連線數變為A:5、B:5、C:6
第二個使用者請求會繼續分配到A上,連線數變為A:6、B:5、C:6
再有新的請求會分配給B,每次將新的請求指派給連線數最小的客戶端
由於實際情況下A、B、C的連線數會動態釋放,很難會出現一樣連線數的情況
此演算法相比較rr演算法有很大改進,是目前用到比較多的一種演算法
1.33 ● SH (Source Hashing)來源訪問排程
基於來源訪問排程演算法,用於一些有Session會話記錄在伺服器端的場景,可以基於來源的IP、Cookie等做叢集排程
理解舉例:
有三個節點A、B、C,第一個使用者第一次訪問被指派到了A,第二個使用者第一次訪問被指派到了B
當第一個使用者第二次訪問時會被繼續指派到A,第二個使用者第二次訪問時依舊會被指派到B,只要負載均衡排程器不重啟,第一個使用者訪問都會被指派到A,第二個使用者訪問都會被指派到B,實現叢集的排程
此排程演算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用
1.4 Haproxy安裝與啟動
在負載均衡器上安裝Haproxy
安裝步驟:
● 安裝基礎軟體包
● 編譯安裝haproxy
● 要注意作業系統版本,是32位系統還是64位
建立Haproxy的配置檔案
● 建立配置檔案目錄/etc/haproxy
● 將原始碼包提供的配置檔案樣例haproxy.cfg複製到配置檔案目錄中
1.5 Haproxy配置檔案詳解
Haproxy配置檔案通常分為三個部分
● global:全域性配置
● defaults:預設配置
● listen:應用元件配置
1.51 global配置引數
log127.0.0.1 lcal0:配置日誌記錄,local0為日誌裝置,預設存放到系統日誌
log127.0.0.1 loca1 notice: notice為日誌級別,通常有24個級別
maxconn4096:最大連線數
uid 99:使用者 uid
gid 99:使用者 gid
1.52 defaults配置項配置預設引數
一般會被應用元件繼承,如果在應用元件中沒有特別宣告,將安裝預設配置引數設定
log global:定義日誌為global配置中的日誌定義
mode http:模式為http option
httplog:採用http日誌格式記錄日誌
retries 3:檢查節點伺服器失敗連續達到三次則認為節點不可用
maxconn2000:最大連線數
contimeout5000:連線超時時間
clitimeout50000:客戶端超時時間
srvtimeout50000:伺服器超時時間
1.53 listen配置專案一般為配置應用模組引數
listen appli4- backup 0.0.0.0:10004:定義一個appli4- backup的應用
option httpchk /index.html檢查伺服器的index.html檔案
option persist:強制將請求傳送到已經down掉的伺服器(註釋掉,否則起服務會報錯)
balance roundrobin:負載均衡排程演算法使用輪詢演算法
server inst1 192.168.114.56:80 check inter 2000 fall 3:定義線上節點
server inst2 192.168 114.56:81 check inter 2000 fall 3 backup:定義備份節點
1.6 Haproxy引數優化
隨著企業網站負載增加,haproxy引數優化相當重要
● maxconn:最大連線數,根據應用實際情況進行調整,推薦使用10240
● daemon:守護程式模式,Haproxy可以使用非守護程式模式啟動,建議使用守護程式模式啟動
● nbproc:負載均衡的併發程式數,建議與當前伺服器CPU核數相等或為其2倍
- retries:重試次數,主要用於對叢集節點的檢查,如果節點多,且併發量大,設定為2次或3次
● option http-server-close:主動關閉http請求選項,建議在生產環境中使用此選項
● timeout http-keep-alive:長連線超時時間,設定長連線超時時間,可以設定為10s
● timeout http-request: http請求超時時間,建議將此時間設定為5~10s,增加http連線釋放速度
● timeout client:客戶端超時時間,如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右就可以了
二、haproxy+keepalived叢集配置
2.1 haproxy+keepalived優點
1.可靠性和穩定性非常好,可以和硬體級的負載均衡裝置F5相媲美。
2.最高可同時維護40000-50000個併發連線,單位時間內處理的最大請求數為20000個。
3.支援8種負載均衡演算法,支援回話保持;支援虛擬主機功能;支援連線拒絕,全透明代理並且有一個功能強大的伺服器狀態監控介面。
4.擁有功能強大的ACL支援。
5.用haproxy構建群集的時候,比如後方代理兩個http,如果haproxy當機,後方的http正常執行網站也是癱瘓狀態,這就造成了單點故障。
這時keepalived就登場了,keepalived基於vrrp協議,兩臺主機之間生成一個虛擬的ip,我們稱漂移ip,漂移ip由主伺服器承擔,一但主伺服器當機,備份伺服器就會搶佔漂移ip,繼續工作,有效的解決了群集中的單點故障。兩者相結合,可靠穩定。
2.2 專案環境
2.3 主伺服器配置
2.31 haproxy配置
放入haproxy-1.4.24.tar軟體包
[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# setenforce 0
[root@server1 ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@server1 ~]# tar zxvf haproxy-1.4.24.tar.gz
[root@server1 ~]# cd haproxy-1.4.24/
[root@server1 haproxy-1.4.24]# make TARGET=linux26 #核心版本大於2.6的使用,指定核心
[root@server1 haproxy-1.4.24]# make install #安裝
[root@server1 haproxy-1.4.24]# mkdir /etc/haproxy #建立haproxy目錄
[root@server1 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/ #將軟體包中的配置檔案模板複製到haproxy目錄中
[root@server1 haproxy-1.4.24]# cd
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg #修改haproxy.cfg配置引數
修改:
maxconn 10240 #最大連線數
下面兩項前面加上註釋
#chroot /usr/share/haproxy #固有目錄,可註釋掉
#redispatch #當使用了cookie時,haproxy將會將其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION永續性;而此時,如果後端的伺服器宕掉了,但是客戶端的cookie是不會重新整理的,如果設定此引數,將會將客戶的請求強制定向到另外一個後端server上,以保證服務的正常。需要註釋掉
將原來的所有listen配置項刪除,新增新配置:
listen webcluster 0.0.0.0:80 #監聽物件webcluster,監聽地址為所有地址,目標埠80
option httpchk GET /index.html #檢查網頁內容為站點下/index.html主頁
balance roundrobin #排程的演算法,rr輪詢
server nginx1 192.168.100.30:80 check inter 2000 fall 3 #定義的節點nginx1,間隔時間及次數
server nginx2 192.168.100.40:80 check inter 2000 fall 3 #定義的節點nginx1
優化服務啟動:
[root@server1 ~]# cp haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy #啟動指令碼檔案cp到/etc/init.d/目錄下生成haproxy檔案
[root@server1 ~]# vi /etc/init.d/haproxy #配置檔案
修改:
# chkconfig: 35 85 15
[root@server1 ~]# chmod 755 /etc/init.d/haproxy #給予執行許可權
[root@server1 ~]# chkconfig --add /etc/init.d/haproxy
[root@server1 ~]# chkconfig --list #檢查haproxy35是否開啟
[root@server1 ~]# systemctl enable haproxy #設定自啟動
[root@server1 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #把命令連結出來方便使用
[root@server1 ~]# systemctl start haproxy #啟動
2.32 keepalived配置
放入keepalived-2.0.13.tar軟體包
[root@server1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel #安裝依賴包
[root@server1 ~]# tar zxvf keepalived-2.0.13.tar.gz #解壓縮keepalived軟體包
[root@server1 ~]# cd keepalived-2.0.13/
[root@server1 keepalived-2.0.13]# ./configure --prefix=/ #配置
[root@server1 keepalived-2.0.13]# make && make install #編譯與安裝
[root@server1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d #把keepalived加入系統管理服務
[root@server1 keepalived-2.0.13]# cd
[root@server1 ~]# systemctl enable keepalived.service #設定開機自啟
[root@server1 ~]# vim /etc/keepalived/keepalived.conf #刪除所有配置,重新新增
! Configuration File for keepalived
global_defs {
router_id lvs_01 #本伺服器的名稱
}
vrrp_instance vi_1 { #定義VRRP熱備例項
state MASTER #熱備狀態,MASTER(主伺服器)
interface ens33 #承載VIP地址的物理介面
virtual_router_id 51 #虛擬路由器的ID號,每個熱備組保持一致
priority 110 #優先順序,數值越大優先順序越高
advert_int 1 #通告間隔秒數
authentication { #熱備認證資訊,每個熱備組保持一致
auth_type PASS #認證型別
auth_pass 6666 #密碼字串
}
virtual_ipaddress { #指定漂移地址(VIP)
192.168.100.100
}
}
[root@server1 ~]# systemctl start keepalived.service #啟動服務
[root@server1 ~]# ip addr
2.4 備伺服器配置
2.41 haproxy配置(與主伺服器配置相同)
放入haproxy-1.4.24.tar軟體包
[root@server2 ~]# systemctl stop firewalld
[root@server2 ~]# setenforce 0
[root@server2 ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
[root@server2 ~]# tar zxvf haproxy-1.4.24.tar.gz
[root@server2 ~]# cd haproxy-1.4.24/
[root@server2 haproxy-1.4.24]# make TARGET=linux26 #核心版本大於2.6的使用,指定核心
[root@server2 haproxy-1.4.24]# make install #安裝
[root@server2 haproxy-1.4.24]# mkdir /etc/haproxy #建立haproxy目錄
[root@server2 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/ #將軟體包中的配置檔案模板複製到haproxy目錄中
[root@server2 haproxy-1.4.24]# cd
[root@server2 ~]# vim /etc/haproxy/haproxy.cfg #修改haproxy.cfg配置引數
修改:
maxconn 10240 #最大連線數
下面兩項前面加上註釋
#chroot /usr/share/haproxy #固有目錄,可註釋掉
#redispatch #當使用了cookie時,haproxy將會將其請求的後端伺服器的serverID插入到cookie中,以保證會話的SESSION永續性;而此時,如果後端的伺服器宕掉了,但是客戶端的cookie是不會重新整理的,如果設定此引數,將會將客戶的請求強制定向到另外一個後端server上,以保證服務的正常。需要註釋掉
將原來的所有listen配置項刪除,新增新配置:
listen webcluster 0.0.0.0:80 #監聽物件webcluster,監聽地址為所有地址,目標埠80
option httpchk GET /index.html #檢查網頁內容為站點下/index.html主頁
balance roundrobin #排程的演算法,rr輪詢
server nginx1 192.168.100.30:80 check inter 2000 fall 3 #定義的節點nginx1,間隔時間及次數
server nginx2 192.168.100.40:80 check inter 2000 fall 3 #定義的節點nginx1
優化服務啟動:
[root@server2 ~]# cp haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy #啟動指令碼檔案cp到/etc/init.d/目錄下生成haproxy檔案
[root@server2 ~]# vi /etc/init.d/haproxy #配置檔案
修改:
# chkconfig: 35 85 15
[root@server2 ~]# chmod 755 /etc/init.d/haproxy #給予執行許可權
[root@server2 ~]# chkconfig --add /etc/init.d/haproxy
[root@server2 ~]# chkconfig --list #檢查haproxy35是否開啟
[root@server2 ~]# systemctl enable haproxy #設定自啟動
[root@server2 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #把命令連結出來方便使用
[root@server2 ~]# systemctl start haproxy #啟動
2.42 keepalived配置
放入keepalived-2.0.13.tar軟體包
[root@server2 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel #安裝依賴包
[root@server2 ~]# tar zxvf keepalived-2.0.13.tar.gz #解壓縮keepalived軟體包
[root@server2 ~]# cd keepalived-2.0.13/
[root@server2 keepalived-2.0.13]# ./configure --prefix=/ #配置
[root@server2 keepalived-2.0.13]# make && make install #編譯與安裝
[root@server2 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d #把keepalived加入系統管理服務
[root@server2 keepalived-2.0.13]# cd
[root@server2 ~]# systemctl enable keepalived.service #設定開機自啟
[root@server2 ~]# vim /etc/keepalived/keepalived.conf #刪除所有配置,重新新增
! Configuration File for keepalived
global_defs {
router_id lvs_02 #本伺服器的名稱
}
vrrp_instance vi_1 { #定義VRRP熱備例項
state BACKUP #熱備狀態,MASTER(主伺服器)
interface ens33 #承載VIP地址的物理介面
virtual_router_id 51 #虛擬路由器的ID號,每個熱備組保持一致
priority 105 #優先順序,數值越大優先順序越高
advert_int 1 #通告間隔秒數
authentication { #熱備認證資訊,每個熱備組保持一致
auth_type PASS #認證型別
auth_pass 6666 #密碼字串
}
virtual_ipaddress { #指定漂移地址(VIP)
192.168.100.100
}
}
[root@server2 ~]# systemctl start keepalived.service #啟動服務
[root@server2 ~]# ip addr
2.5 nginx1伺服器配置
放入nginx-1.12.2.tar軟體包
[root@server3 ~]# systemctl stop firewalld
[root@server3 ~]# setenforce 0
[root@server3 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@server3 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server3 ~]# useradd -M -s /sbin/nologin nginx #建立不帶宿主,不可登入nginx使用者
[root@server3 ~]# cd nginx-1.12.2
[root@server3 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@server3 nginx-1.12.2]# make && make install #編譯安裝nginx
[root@server3 nginx-1.12.2]# cd
[root@server3 ~]# echo "<h1>Nginx1</h1>" > /usr/local/nginx/html/index.html #建立首頁內容
[root@server3 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin #命令連結,方便使用
[root@server3 ~]# nginx #開啟
[root@server3 ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 57499/nginx: master
2.6 nginx2伺服器配置
放入nginx-1.12.2.tar軟體包
[root@server4 ~]# systemctl stop firewalld
[root@server4 ~]# setenforce 0
[root@server4 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@server4 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@server4 ~]# useradd -M -s /sbin/nologin nginx #建立不帶宿主,不可登入nginx使用者
[root@server4 ~]# cd nginx-1.12.2
[root@server4 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@server4 nginx-1.12.2]# make && make install #編譯安裝nginx
[root@server4 nginx-1.12.2]# cd
[root@server4 ~]# echo "<h1>Nginx2</h1>" > /usr/local/nginx/html/index.html #建立首頁內容
[root@server4 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin #命令連結,方便使用
[root@server4 ~]# nginx #開啟
[root@server4 ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 59567/nginx: master
2.7 訪問測試
瀏覽器輸入:http://192.168.100.100
等待後重新整理
客戶機解析
三、haproxy日誌管理(主備伺服器都配置)
[root@server1 ~]# vi /etc/haproxy/haproxy.cfg
修改:
global
log /dev/log local0 info #啟用本地日誌,級別info
log /dev/log local0 notice
[root@server1 ~]# systemctl restart haproxy #重啟服務,記錄日誌
[root@server1 ~]# vi /etc/rsyslog.d/haproxy.conf
新增:
if ($programname == 'haproxy' and $syslogseverity-text == 'info') #如果程式是haproxy,並且日誌型別是info
then -/var/log/haproxy/haproxy-info.log #則建立一個日誌
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
[root@server1 ~]# systemctl restart rsyslog
[root@server1 ~]# systemctl restart haproxy
[root@server1 ~]# cd /var/log/haproxy/
[root@server1 haproxy]# ll #檢視
總用量 8
-rw-------. 1 root root 329 12月 11 02:52 haproxy-info.log #haproxy排程資訊
-rw-------. 1 root root 132 12月 11 02:52 haproxy-notice.log #haproxy啟動資訊
關閉主伺服器後,漂移ip由備份伺服器承擔 ,繼續工作
[root@server1 ~]# systemctl stop keepalived
在備伺服器上檢視日誌
[root@server2 ~]# cd /var/log/haproxy/
[root@server2 haproxy]# tail -100 /var/log/messages
[root@server2 haproxy]# cat haproxy-info.log
[root@server2 haproxy]# cat haproxy-notice.log
相關文章
- 伺服器群集—LVS負載均衡群集(LVS-NAT部署)伺服器負載
- 伺服器群集—Nginx+Tomcat+keepalived負載均衡、動靜分離群集伺服器NginxTomcat負載
- 伺服器群集LVS負載均衡-NAT伺服器負載
- Sqlserver 2014 alwayson故障轉移群集節點被踢出群集SQLServer
- RabbitMQ 群集安裝MQ
- LVS+Keepalived群集
- 一、群集的簡介
- LVS負載均衡群集負載
- 使用haproxy搭建web群集Web
- LVS+Keepalived高可用群集
- Pfsense HA(高可用性群集)
- LVS負載均衡群集--NAT模式負載模式
- 使用Haproxy與nginx配合搭建web群集NginxWeb
- CentOS 7.4 下搭建 Elasticsearch 6.3 搜尋群集CentOSElasticsearch
- Haproxy搭建 Web 群集實現負載均衡Web負載
- ELK 日誌分析系統 ----------- 部署ElasticSearch群集Elasticsearch
- 綜合專案:lvs+keepalived+glusterfs群集
- MongoDB分片群集的部署(用心描述,詳細易懂)!!MongoDB
- Redis的安裝及建立節點、部署群集Redis
- Nginx—tomcat負載均衡動靜分離群集NginxTomcat負載
- LVS+Keepalived 高可用群集(理論+實戰部署)
- MySQL——MHA高可用群集部署及故障測試MySql
- MySQL高可用群集MHA部署及故障測試分析MySql
- 技術分享| 訊息佇列Kafka群集部署佇列Kafka
- 使用kube_ping進行Keycloak群集設定 - DZone CloudCloud
- 部署docker-consul群集,Harbor構建Docker私有倉庫Docker
- Windows故障轉移群集(WSFC)的備份和恢復Windows
- SQLServer2012對現有AlwaysOn群集新加節點SQLServer
- Redis 架構演變與 Redis-cluster 群集讀寫方案Redis架構
- linux下部署lvs-DR群集構建實施過程Linux
- 擁抱藍綠部署,推動AKS群集版本平滑升級
- 擁抱藍綠部署,推動AKS群集版本平滑升級(下篇)
- Nginx+Tomcat負載均衡,動靜分離群集部署解析NginxTomcat負載
- LVS負載均衡群集概念、NAT模式LVS負載均衡實戰部署負載模式
- 帶你瞭解Nginx+Tomcat負載均衡,動靜分離群集NginxTomcat負載
- 人工智慧 (05) 機器學習 - 無監督式學習群集方法人工智慧機器學習
- 節點 B 上的 Windows 防火牆未正確配置為故障轉移群集Windows防火牆
- windows故障轉移叢集 “群集事件” 經常出現 1135 錯誤的解決Windows事件