先準備兩臺機器,用於測試,這裏使用 192.168.1.168
和 192.168.1.146
兩臺機器測試。
默認你的nginx已經搭建好了,我這裏使用的是docker方式搭建的,只是一個簡單的模擬
docker run -p 8123:80 \ -dit \ --name nginx-web \ -v /opt/project/apps/nginx-web/nginx.conf:/etc/nginx/nginx.conf \ -v /opt/project/apps/web/:/usr/share/nginx/html \ --privileged=true \ --restart=always nginx
先決條件
禁用SElinux、清除iptables規則、關閉防火牆。就算因某種原因不能清除iptables規則,那麼你需要增加一條規則放行多播
各個節點時間同步,啓用時間同步服務systemctl start chronyd
確保Keepalive使用的網卡開啓了多播
如果沒有開啓,可以使用該命令打開ip link set multicast on dev ens33
,ens33是網卡名稱。
怎麼查看網卡和子網掩碼等信息,執行 ifconfig 命令
找到上面的ip 192.168.1.168
,這個就是我們要找的網卡信息, netmask 是子網掩碼信息 esn192 是網卡信息。
多播配置
先在 192.168.1.168
主機上進行操作。
第一步,安裝keepalived
yum install -y keepalived
第二步,配置keepalived
# 進入keepalived.conf所在目錄: cd /etc/keepalived # 清除掉keepalived原有配置 > keepalived.conf
第三步,複製下面的配置文件,根據需要修改相關配置。比如網卡名等
global_defs { # 郵件通知配置,發生故障時候通知的人員 notification_email { 740610314@qq.com # 定義收件人 } notification_email_from sns-lvs@gmail.com # 定義發件人 smtp_server 192.168.1.114 # SMTP服務器地址 smtp_connection_timeout 30 router_id LVS_MASTER # 設置lvs的id,在一個網絡應該是唯一的,一般不用改,也可以寫成每個主機自己的主機名 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface ens192 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡),不知道就用 ifconfig 查一下 virtual_router_id 66 # 虛擬路由編號,主從要一致 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { # 通信認證機制,這裏是明文認證還有一種是加密認證 auth_type PASS auth_pass 1111 #密鑰 } virtual_ipaddress { # 設置虛擬VIP地址,一般就設置一個,在LVS中這個就是爲LVS主機設置VIP的,這樣你就不用自己手動設置了 192.168.1.21 # 定義虛擬ip(VIP),可多設,每行一個 # IP/掩碼 dev 配置在哪個網卡 # 192.168.200.16/24 dev eth1 } } # 定義LVS集羣服務,可以是IP+PORT;也可以是fwmark 數字,也就是防火牆規則 virtual_server 192.168.1.21 8123 { delay_loop 6 # 設置健康檢查時間,單位爲秒 lb_algo wrr # 設置負載調度的算法爲wrr lb_kind DR # 設置lvs實現負載的機制,有NAT、TUN、DR三個模式 nat_mask 255.255.255.0 # 子網掩碼,這個掩碼是VIP的掩碼 persistence_timeout 0 # 同一IP 0秒內的請求都發到同個real server protocol TCP # 定義協議 # 後端應用服務器 IP PORT real_server 192.168.1.168 8123 { # 指定real server1的ip地址 weight 3 # 配置節點權值,數值越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } # 後端應用服務器 IP PORT real_server 192.168.1.146 8123 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
第四步,在另外一臺 192.168.1.146
上進行操作,
先安裝 keepalived ,然後也是進入到配置,修改配置文件。
global_defs { notification_email { 740610314@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.112 smtp_connection_timeout 30 router_id LVS_BACKUP # 設置lvs的id,在一個網絡應該是唯一的 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface eno16780032 # 當前進行vrrp通訊的網絡接口卡(當前進行vrrp通訊的網絡接口卡) virtual_router_id 66 # 虛擬路由編號,主從要一致 priority 99 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.21 # 定義虛擬ip(VIP),可多設,每行一個 } } # 定義對外提供的LVS的VIP以及port virtual_server 192.168.1.21 8123 { delay_loop 6 # 設置健康檢查時間,單位爲秒 lb_algo wrr # 設置負載調度的算法爲wrr lb_kind DR # 設置lvs實現負載的機制,有NAT、TUN、DR三個模式 nat_mask 255.255.255.0 persistence_timeout 0 # 同一IP 0秒內的請求都發到同個real server protocol TCP real_server 192.168.1.168 8123 { # 指定real server1的ip地址 weight 3 # 配置節點權值,數值越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.146 8123 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
第五步,主從都啓動服務,service keepalived start
單播配置
如果跨網段了,很可能無法訪問到這個IP,比如我的網段是23,這個時候就需要關閉多播,因爲數據未返回。一般情況下,上面的配置就已經支持nginx的高可用了。
192.168.1.168
使用如下配置:
global_defs { # 郵件通知配置,發生故障時候通知的人員 notification_email { 740610314@qq.com # 定義收件人 } notification_email_from sns-lvs@gmail.com # 定義發件人 smtp_server 192.168.1.114 # SMTP服務器地址 smtp_connection_timeout 30 router_id LVS_MASTER # 設置lvs的id,在一個網絡應該是唯一的,一般不用改,也可以寫成每個主機自己的主機名 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface ens192 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡),不知道就用 ifconfig 查一下 virtual_router_id 66 # 虛擬路由編號,主從要一致 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { # 通信認證機制,這裏是明文認證還有一種是加密認證 auth_type PASS auth_pass 1111 #密鑰 } unicast_src_ip 192.168.1.168 #單播的源地址,寫本機上的ip即可 unicast_peer { 192.168.1.146 #如果有多個主機組成集羣,把其它主機ip都寫上 } virtual_ipaddress { # 設置虛擬VIP地址,一般就設置一個,在LVS中這個就是爲LVS主機設置VIP的,這樣你就不用自己手動設置了 192.168.1.21 # 定義虛擬ip(VIP),可多設,每行一個 # IP/掩碼 dev 配置在哪個網卡 # 192.168.200.16/24 dev eth1 } }
192.168.1.146
上將配置修改爲如下:
global_defs { notification_email { 740610314@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.112 smtp_connection_timeout 30 router_id LVS_BACKUP # 設置lvs的id,在一個網絡應該是唯一的 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface eno16780032 # 當前進行vrrp通訊的網絡接口卡(當前進行vrrp通訊的網絡接口卡) virtual_router_id 66 # 虛擬路由編號,主從要一致 priority 99 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.1.146 #單播的源地址,寫本機上的ip即可 unicast_peer { #注意:花括號前有空格 192.168.1.163 #如果有多個主機組成集羣,把其它主機ip都寫上 } virtual_ipaddress { 192.168.1.21 # 定義虛擬ip(VIP),可多設,每行一個 } }
常用命令
// 啓動 service keepalived start (建議用這個) systemctl start keepalived // 停止 service keepalived stop (備用,有時候關閉不了) systemctl stop keepalived (建議用這個) // 重啓 systemctl restart keepalived // 查看日誌 tail -f /var/log/messages
至此,nginx的高可用配置完成,注意,當測試的時候,關閉了 keepalived 也可能會有一會負載還生效,但過一會就不行了。