使用keepalived實現HA Cluster集羣,下面以示例來演示keepalived的使用和keepalived的相關知識
php
HA Cluster配置前提:linux
1、本機的主機名,要與hostname(uname-n)得到的名稱保持一致;nginx
CentOS6: /etc/sysconfig/networkweb
CentOS7: hostnamectl set-hostname HOSTNAMEcentos
各節點要能互相解析主機名;通常建議經過hosts文件進行解析;瀏覽器
修改主機名爲centos7和centos6.1.com,而後修改hosts文件,能讓兩邊能相互解析到bash
2、各節點時間同步;ntpdate 172.16.249.195把這個主機當成時間服務器,而後進行時間同步服務器
設置ntp時間同步服務器網絡
修改/etc/ntp.conf文件架構
內容以下:
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict ::1
restrict 172.16.0.0 mask 255.255.0.0nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 8
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
3、確保iptables及selinux不會成爲服務阻礙;
nopreempt:非搶佔模式;默認爲搶佔模式;
在調度器上,首先安裝keepalived程序,而後把時間同步成同樣的
ntpdate 172.16.249.195
檢查iptables和selinux是否開啓了
而後在CentOS7中進行實驗
yum install keepalived
用兩臺機器一臺CentOS7,一臺CentOS6看是否有問題
CentOS7中
修改位置文件(/etc/keepalived/keepalived.conf)
首先把「virtual_server 192.168.200.100 443 {」這一行如下的所有註釋掉
而後修改內容以下
爲了完整,把這後面的信息補全
而後複製這個文件到另外一個主機
scp keepalived.conf 172.16.249.147:/etc/keepalived/
而後稍微修改下
這樣就能夠了,這樣就能夠啓動測試了
systemctl start keepalived.service;ssh172.16.249.147 'service keepalivedstart' 由於我使用的是一個centos7和一個centos6,因此先後的啓動命令不同,若是使用的是一樣的就不需這樣了
使用 ps aux 查看keepalived是否啓動
而後在centos7上使用ifconfig進行查看,能夠看到地址加上來了
而後咱們把centos7下的keepalived關閉,而後查看地址
地址沒有了,去centos6上查看會發現地址在6上看,這就是高可用了,就是當一臺負載均衡器下線時,另外一臺能當即啓用,實現高可用
沒有日誌信息,咱們本身定義一個
首先修改/etc/sysconfig/keepalived這個文件,
而後修改/etc/rsyslog.conf這個文件
而後使用systemctl restart rsyslog.service重啓日誌服務
另外一個主機一樣修改重啓日誌服務使用(service rsyslog restart)
而後重啓keepalived服務查看日誌就有了
而後作兩個虛擬路由,即雙主模式
修改keepalived的配置文件,增長下面一段
而後另外一臺主機修改keepalived的配置文件爲下面一段
而後重啓服務就能夠查看了(若是由於網絡環境比較複雜的話,等的時間可能要長一點)
若是停掉一臺的keepalived服務,另外一臺會包括全部的地址
這樣停服務在生產中,是不行的,下面來添加腳本實現動態切換
修改配置文件,添加下面配置
這一段要加在vrrp_instance 字段外面
另外一個主機也作這樣的配置
這就能夠啓用了
而後在172.16.249.195的/etc/keepalived目錄下建立一個down文件,而後查看地址
另外一臺主機上就有兩個地址了
定義郵件的發送,須要自行定義,須要本身寫一個腳本
腳本內容:
#!/bin/bash
#Author: MageEdu <linuxedu@foxmail.com>
#description: An example of notify script
#
vip=172.16.100.88
contact='root@localhost'
notify(){
mailsubject="`hostname` to be $1: $vipfloating"
mailbody="`date '+%F %H:%M:%S'`: vrrptransition, `hostname` changed to be $1"
echo $mailbody | mail -s"$mailsubject" $contact
}
case"$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0`{master|backup|fault}'
exit 1
;;
esac
在/etc/keepalived/目錄下建立一個名爲notify.sh的腳本
給這個腳本一個執行權限chmod +x notify.sh
配置文件中vrrp_instance VI_1這一段裏寫入下面三行
notify_master"/etc/keepalived/notify.sh master"
notify_backup"/etc/keepalived/notify.sh backup"
notify_fault"/etc/keepalived/notify.shfault"
驗證下,
而後把這個腳本複製到另外一個負載均衡器上,而後修改配置文件
scp -rp notify.sh172.16.249.147:/etc/keepalived/
這樣郵件的發送就弄好了
另外一個虛擬路由就再也不演示了,跟這個步驟同樣
咱們加入lvs和nginx來實現高可用的負載均衡器的實現(作的是雙主模型)
下面先以lvs作負載均衡器,進行高可用負載均衡,以lvs的DR模式爲例,規劃以下
首先兩個RS打開web服務,配好測試頁,訪問測試如下,沒問題了,
而後配置第一個Director(負載均衡器),安裝ipvsadm,配置lvs規則(若是不會配置能夠上網搜索,或者查看本人的lvs的博客),首先測試是能正常工做的
首先加入VIP,
用其餘主機ping測試一下,這個地址通不通,通了就沒問題了,就差lvs規則了,
而後配置兩個RS,首先配置arp_ignore和arp_annoce,而後配置VIP和路由
寫一個腳本實現一些功能,而後直接在兩臺RS上運行一下,就能夠了
而後 bash set.sh start 而後cat看一下是否成功了;把這個腳本複製給另外一臺RS執行一次
而後添加地址和路由
ifconfig lo:0 172.16.249.18 netmask255.255.255.255 broadcast 172.16.249.18
route add -host 172.16.249.18 dev lo:0
ifconfig lo:1 172.16.249.19 netmask255.255.255.255 broadcast 172.16.249.19
route add -host 172.16.249.19 dev lo:1
另外一臺RS也添加地址和路由
ifconfig lo:0 172.16.249.18 netmask255.255.255.255 broadcast 172.16.249.18
route add -host 172.16.249.18 dev lo:0
ifconfig lo:1 172.16.249.19 netmask255.255.255.255 broadcast 172.16.249.19
route add -host 172.16.249.19 dev lo:1
由於作的是兩個虛擬路由器的即雙主的,就是經過DNS在前面分流,一部分走172.16.249.18這個地址一部分走172.16.249.19,因此RS要配置兩個VIP
而後RS的配置就作完了,而後回到Director上寫入ipvs規則
ipvsadm -A -t 172.16.249.18:80 -s rr
ipvsadm -a -t 172.16.249.18:80 -r172.16.249.116 -g
ipvsadm -a -t 172.16.249.18:80 -r172.16.249.123 -g
而後測試是否能正常輪調
若是用物理機的瀏覽器訪問不輪調,是網絡的影響,開一個虛擬機進行測試,若是沒有問題,就證實lvs的dr模式的負載均衡作好了
另外一臺lvs服務器也作一下這個規則,而後測試一下,證實lvs的負載均衡沒有問題了
而後咱們把lvs服務器上的規則清掉,地址刪除
而後在兩臺lvs上作sorry server 啓動httpd服務,而後寫一個頁面,而後訪問
測試沒問題,就能夠了
下面作keepalived高可用的負載均衡器(安裝keepalived)
直接作成兩臺虛擬路由器的,
修改第一臺lvs主機的keepalived的配置文件以下
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos7
}
vrrp_script chk_schedown {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 5b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16dev eth0 label eth0:0
}
track_script {
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 61
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 20b662c6c06d
}
virtual_ipaddress {
172.16.249.19/16dev eth0 label eth0:1
}
}
virtual_server 172.16.249.18 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
real_server 172.16.249.116 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.249.123 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 172.16.249.19 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
real_server 172.16.249.116 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.249.123 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
而後配置另外一臺lvs主機中的的keepalived以下:
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos6.1.com
}
vrrp_script chk_schedown {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 5b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16dev eth0 label eth0:0
}
track_script {
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 61
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 20b662c6c06d
}
virtual_ipaddress {
172.16.249.19/16 dev eth0 label eth0:1
}
}
virtual_server 172.16.249.18 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
real_server 172.16.249.116 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.249.123 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 172.16.249.19 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
real_server 172.16.249.116 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.249.123 80 {
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
這隻在第一個虛擬路由器中作腳本,第二個沒有作,要想作了,跟第一個的同樣
而後就能夠啓動keepalived服務了
而後訪問測試一下
能夠看到兩個地址都能負載均衡
下面讓一臺lvs的keepalived下線
這樣兩個地址都在一臺lvs上了,訪問測試下
能夠看到也沒有問題,
若是把一臺RS下線,全部請求就都在一個RS上了;若是RS都下線,sorry server就能夠發揮做用了。(這裏再也不演示了)
這樣高可用的lvs的負載均衡就作好了
下面作下nginx的高可用的負載均衡,就是用nginx作負載均衡器
使用nginx作負載均衡器,架構以下:
安裝nginx,而後啓動起來,配置成負載均衡服務器
修改/etc/nginx/nginx.conf
另外一臺負載均衡器一樣這樣配置
而後修改這一臺nginx的keepalived的配置文件
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos7
}
vrrp_script chk_nginx {
script "killall -0 nginx &> /dev/null"
interval 1
weight -10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 5b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16dev eth0 label eth0:0
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault
}
另外一臺nginx的keepalived配置文件爲
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos6.1.com
}
vrrp_script chk_nginx {
script "killall -0 nginx &> /dev/null"
interval 1
weight -10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 5b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16dev eth0 label eth0:0
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
而後啓動keepalived
能夠看到地址配好了,測試下
能夠看到作好了,而後把一臺nginx的nginx服務停掉,看另外一臺可否上線
訪問也沒有問題,這樣nginx的高可用就作好了,
作雙主模式的,只須要在keepalived配置文件里加入下面這些內容就好了
第一臺(172.16.249.195)
第二臺(172.16.249.147)
而後重啓keepalived服務
查看ip
訪問測試,
讓一臺的nginx服務停掉
能夠看到能正常切換,這樣nginx高可用的雙主模式就作好了