針對上一篇博客的karaf集羣,在項目中的計劃是需要部署一個對外提供http接口的插件(兩臺karaf中各部署一個http).
那麼就有一個問題,對於兩臺服務器上的集羣,怎麼通過一個地址實現對集羣中接口的輪詢訪問? --負載均衡
1.haproxy
選擇nginx和haproxy都可以.
簡介:
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代 理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
安裝:
下載 haproxy-2.1.4.tar.gz
yum install gcc --虛擬機是最小安裝,所以需要手動安裝c環境
tar -zxvf haproxy-2.1.4.tar.gz --解壓縮
cd haproxy-2.1.4 --進入haproxy目錄
make TARGET=linux310 編譯, 注意一定要在haproxy-2.1.4文件夾內, 裏面有markfile文件,否則會報錯make: *** 沒有指明目標並且找不到 makefile。 停止。
make install PREFIX=/usr/local/haproxy --安裝
mkdir /usr/local/haproxy/conf
cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg --拷貝源碼中的配置文件,用來配置haproxy
配置haproxy.cfg:
#進程,安全配置,性能調整,Debug參數
global
log 127.0.0.1 local0 debug #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出 info日誌級別
maxconn 4096 #每個HAproxy進程的最大連接併發數
user root #用戶
group nobody #組
daemon ##以後臺形式運行ha-proxy
nbproc 1 #啓動3個ha-proxy進程,可以設置多個進程提高性能
pidfile /usr/local/haproxy/logs/haproxy.pid ##pid文件位置
#爲frontend, listen, backend提供默認配置
defaults
#log global #集成全局配置中的日誌格式
log 127.0.0.1 local0 info
mode http #所處理的類別(#7層 http;4層tcp) tcp模式一般用於,SSL,SSH,SMTP,MySQL等應用
retries 3 #3次連接失敗就認爲該服務不可用
balance roundrobin # rr 輪詢負載均衡
timeout connect 10s #連接超時
timeout client 20s #客戶端超時
timeout server 30s #後端服務器超時
timeout check 5s #設置對後端服務器的檢測超時時間,默認單位是毫秒
timeout http-request 10s # 請求報文的超時時長
#此部分用於設置接收用戶請求的前端虛擬節點,並根據ACL規則直接指定要使用的後端backend
frontend www
bind 0.0.0.0:8008
mode http
option httplog ##啓用日誌記錄http請求
option forwardfor #通過X-Forwarded-For信息,來記錄客戶端來源IP
option httpclose #表示在客戶端和服務器端完成一次連接請求後,HAproxy將主動關閉此TCP連接
log global
default_backend htmpool
#此部分用於設置羣集後端服務集羣的配置,處理前端用戶的請求,添加真實的服務器
backend htmpool
mode http
option redispatch #如果後端服務器發生故障,會通過此參數,將客戶的請求強制定向到另外一臺健康的後端服務器上,以保證服務正常
option abortonclose #此參數可以在服務器負載很高的情況下,自動結束當前隊列中處理時間比較長的連接
balance roundrobin #定義負載均衡算法
cookie SERVERID #表示允許向cookie插入serverid
#option httpchk GET /index.html #啓用http的服務狀態檢測功能
#option httpchk HEAD /index.html HTTP/1.1\r\nHost:\ www.xxx.com # 頭部檢測格式
server web1 192.168.147.129:8001 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 192.168.147.130:8001 cookie server2 weight 6 check inter 2000 rise 2 fall 3
# 註釋如下:
#服務器定義web1,cookie表示serverid爲web1
#check inter 2000 檢測心跳頻率
#rise 3 是三次正確認爲服務器可用 fall 3 是三次失敗認爲服務器不可用
#weight代表權重,backup爲備份節點
#用來設置haproxy代理服務頁面,監聽整個後端集羣狀態
listen admin_stats
bind 0.0.0.0:9188
mode http
log global
stats refresh 30s #設置HAproxy監控統計頁面自動刷新時間
stats uri /haproxy-status #設置HAproxy監控統計頁面的URL路徑
stats realm welcome login\ Haproxy #設置登錄HAproxy監控統計頁面時,密碼框上的文本提示信息
stats auth admin:admin123 #設置登錄HAproxy統計頁面的用戶名和密碼,可以爲監控頁面設置多個用戶名和密碼,每行一個
stats hide-version #用來隱藏統計頁面上HAproxy的版本信息
stats admin if TRUE #可以在監控頁面上手工啓用或禁用後端真實服務器
#balance roundrobin
#server system_01 192.168.147.129:8001 check inter 2000 rise 3 fall 3
#server system_02 192.168.147.130:8001 check inter 2000 rise 3 fall 3
要轉發的後端地址可以在backend,也可以在listen中配置:
1.frontend+backend: frontend監聽某端口,攔截對該端口的請求,轉發到backend
2.listen:直接監聽某端口,定義負載均衡算法(共7種),綁定後端地址
啓動:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
後端沒開啓監聽的服務,所以會報沒有可用服務,先開啓一個服務
listen中配置了一個前端服務頁面: ip:9188/haproxy-status
可以看到一個服務開啓,一個服務關閉
查看haproxy的日誌:
可以在配置文件中看到關於日誌的設置 log 127.0.0.1 local0 debug ,需要在系統日誌進行設置
vim /etc/rsyslog.conf
添加
local0.* /var/log/haproxy/haproxy.log #日誌位置
重啓 service rsyslog restart
2.haproxy集羣和keepalived
部署一個haproxy解決了對karaf集羣的負載均衡,如果haproxy掛了呢?是不是就沒法訪問後臺兩個服務.
解決 :在每臺服務器上部署haproxy+keepalived搭建高可用集羣
思路: 兩臺keepalived會搶佔虛擬ip100, 當主服務器master掛掉, 虛擬ip會自動漂移到備服務器,保證後臺服務的高可用.
keepalived簡介
KeepAlived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗餘協議)的縮寫, VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行.所以,Keepalived一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能.
keepalived安裝
1.yum安裝
不推薦, 我第一次這麼安裝的, 版本太低,導致後期出現了bug,調不通
2.安裝包安裝
版本: keepalived-2.0.18.tar.gz
源碼目錄: /usr/local/keep
安裝目錄: /usr/local/keepalived
源碼目錄下:
[root@localhost keep]# ls
keepalived-2.0.18 keepalived-2.0.18.tar.gz
[root@localhost keep]# cd keepalived-2.0.18
[root@localhost keepalived-2.0.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-2.0.18]# make && make install
./configure後出現的問題:
報錯:OpenSSL is not properly installed on your system
解決:yum -y install openssl-devel
報錯:this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS
解決:yum -y install libnl libnl-devel
編譯後:
[root@localhost local]# cd /usr/local/keepalived/
[root@localhost keepalived]# ls
bin etc sbin share
安裝目錄下會自動生成文件:
/usr/local/etc/keepalived/keepalived.conf
/usr/local/etc/sysconfig/keepalived
/usr/local/sbin/keepalived
設置服務啓動:
[root@localhost keepalived]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
[root@localhost keepalived]# cp /usr/local/keep/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
[root@localhost keepalived]# mkdir /etc/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
keepalived啓動/狀態/停止: systemctl start/status/stop keepalived
keepalived配置
[root@localhost keepalived]# vim /etc/keepalived/keepalived.conf
!Configuration File for keepalived
global_defs
{
# notification_email { #發生故障時,接受信息的郵箱地址
# [email protected]
# [email protected]
# [email protected]
# }
# notification_email_from [email protected]
script_user root
# enable_script_security
smtp_server 127.0.0.1
smtp_connect_timeout 30 #連接超時時間
router_id LVS_DEVEL #服務器名稱
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_haproxy
{
script "/etc/keepalived/check_ha.sh" #對haproxy的檢測腳本
interval 2 #時間間隔/s
weight 2
}
vrrp_instance VI_1 {
state MASTER #主
interface ens33 #監聽接口
virtual_router_id 51
priority 100 #優先級
advert_int 1 #檢查間隔
authentication {
auth_type PASS #認證類型
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
192.168.147.100 #虛擬ip,可以設置多個
}
track_script {
chk_haproxy
}
}
vrrp_script定義了haproxy的檢測腳本位置以及檢測時間間隔
腳本check_ha.sh:
#!/bin/bash
echo "start check"
A=`ps -C haproxy --no-header |wc -l` ## 查看是否有 haproxy進程 把值賦給變量A
if [ $A -eq 0 ];then ## 如果沒有進程值得爲 零
#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
#sleep 3
#if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
#service keepalived stop
systemctl stop keepalived
fi
#fi
備服務器上修改配置文件,其他的都不變:
state BACKUP #備
priority 90 #優先級
啓動日誌: /var/log/messages
報錯: Unsafe permissions found for script '/etc/keepalived/check_ha.sh' - disabling.
Disabling track script chk_haproxy due to insecure
解決: --global_defs 中不要使用enable_script_security,而應該使用user root.正如上面給出的keepalived.conf一樣
問題: 如果出現systemctl stop keepalived關閉不了keepalived進程
解決: vim /usr/lib/systemd/system/keepalived.service
註釋掉 #KillMode=process
systemctl daemon-reload
演示:
1.啓動129,130上的karaf
2.啓動129,130上的haproxy
3.啓動129,130上的keepalived,可以看到目前虛擬ip在129上
4.postman請求接口兩次,輪詢,訪問到129,130的karaf各一次
5.手動關閉129的haproxy,可以看到虛擬ip已經漂移到130上
6.postman請求接口兩次,輪詢,訪問到129,130的karaf各一次,正常