一 高可用介紹
1.1 概念簡介
HA即(High Available)高可用,又被叫做雙機熱備,用于關鍵性業務。簡單了解就是,有2台機器 server1和server2,正常是server1提供服務,server2待命閑置,當server1當機或服務宕掉,會切換至server2機器繼續提供服務。常見的實作高可用的開源軟體有 heartbeat 和 keepalived。
1.2 場景介紹
一台web伺服器一天24小時提供服務,難免會存在服務挂掉或伺服器當機的情況,那麼使用者就通路不了服務了,生産環境肯定是接受不了的。
但如果有2台伺服器,server1對外提供web服務,server2作為備用,如果server1挂掉,那麼server2立刻替代server1去提供服務,這樣對使用者來說是無感覺的。
但是這裡有個問題,server1的ip是 192.168.0.99,server2的ip是192.168.0.100,顯然向使用者提供server1或server2的ip位址是不可行的,因為使用者總不能去切換ip來通路。
這時heartbeat或keepalived可以提供一個虛拟VIP:192.168.0.97,使用者隻需要通路192.168.0.97,當server1提供服務時,VIP 會漂移到server1伺服器上,當server2提供服務時,VIP會漂移到server2伺服器上,這樣就可以讓使用者通過通路192.168.0.97來擷取web服務,即使server1或server2伺服器切換也不影響使用者的正常通路。
1.3 keepalived介紹
Keepalived的作用是檢測伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的伺服器從系統中剔除,同時使用其他伺服器代替該伺服器的工作,當伺服器工作正常後Keepalived自動将伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的伺服器。
下面使用keepalived來做 HA 叢集,并且把 nginx 服務作為 HA 對應的服務。
二 Nginx+Keepalived安裝
2.1 準備環境
伺服器1:
- 主機名:keepalived01
- 作業系統:CentOS7.8 64位
- IP位址:192.168.0.99
伺服器2:
- 主機名:keepalived02
- 作業系統:CentOS7.8 64位
- IP位址:192.168.0.100
虛拟VIP:
- VIP:192.168.0.97
2.2 設定主機名
伺服器1設定hostname
hostnamectl set-hostname keepalived01
退出重新登入
伺服器2設定hostname
hostnamectl set-hostname keepalived02
2.3 關閉防火牆和selinux(2台節點都要操作)
關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
關閉selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.4 配置hosts檔案(2台伺服器都要操作)
vim /etc/hosts
增加内容如下:
192.168.0.97 VIP
192.168.0.99 keepalived01
192.168.0.100 keepalived02
2.5 安裝nginx(2台伺服器都操作)
yum install nginx nginx-mod-stream -y
vim /etc/nginx/nginx.conf
在檔案最後添加如下内容
stream {
log_format proxy '$time_local|$remote_addr|$upstream_addr|$protocol|$status|'
'$session_time|$upstream_connect_time|$bytes_sent|$bytes_received|'
'$upstream_bytes_sent|$upstream_bytes_received' ;
upstream web {
server 192.168.0.99:81 max_fails=3 fail_timeout=30s;
server 192.168.0.100:81 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
proxy_connect_timeout 2s;
proxy_timeout 900s;
proxy_pass web;
access_log /var/log/nginx/proxy.log proxy;
}
}
啟動nginx
systemctl enable nginx --now
2.6 安裝keepalived(2台伺服器都操作)
yum install keepalived -y
添加檢測腳本
vim /etc/keepalived/check_port.sh
#!/bin/bash
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
PORT_PROCESS=`ss -lnt|grep $CHK_PORT|wc -l`
if [ $PORT_PROCESS -eq 0 ];then
echo "Port $CHK_PORT is not used,end."
fi
if [ $PORT_PROCESS -eq 0 ];then
systemctl stop keepalived
fi
else
echo "Check Port Can Be Empty!"
fi
授予可執行權限
chmod +x /etc/keepalived/check_port.sh
2.7 keepalived01伺服器操作
cat >/etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived
global_defs {
router_id 192.168.0.99
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 251
priority 100
advert_int 1
mcast_src_ip 192.168.0.99
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.0.97
}
}
EOF
啟動keepalived
systemctl enable keepalived --now
2.8 keepalived02伺服器操作
cat >/etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived
global_defs {
router_id 192.168.0.100
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_port.sh 80"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens3
virtual_router_id 251
priority 90
advert_int 1
mcast_src_ip 192.168.0.100
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.0.97
}
}
EOF
啟動keepalived
systemctl enable keepalived --now
2.9 測試高可用
先确定VIP在哪台伺服器
浏覽器通路
http://192.168.0.97
停止keepalived01伺服器的nginx
pkill nginx
發現VIP漂移到keepalived02伺服器上了
而此時,浏覽器還是可以正常通路
http://192.168.0.97
至此,基于Keepalived的雙機熱備安裝完成。