LVS+Keepalived 高可用集群搭建

?一、高可用集群:

1.什么是高可用集群:


高可用集群(High Availability Cluster)是以減少服務中斷時間為目地的服務器集群技術它通過保護用戶的業務程序對外不間斷提供的服務,把因軟件、硬件、人為造成的故障對業務的影響降低到最小程度。

2.高可用的自動切換/故障轉移(FailOver)


通俗地說,即當A無法為客戶服務時,系統能夠自動地切換,使B能夠及時地頂上繼續為客戶提供服務,且客戶感覺不到這個為他提供服務的對象已經更換。 通過上面判斷節點故障后,將高可用集群資源(如VIP、httpd等)從該不具備法定票數的集群節點轉移到故障轉移域(Failover Domain,可以接收故障資源轉移的節點)。

3.高可用中的自動偵測:


自動偵測階段由主機上的軟件通過冗余偵測線,經由復雜的監聽程序,邏輯判斷,來相互偵測對方運行的情況。 常用的方法是:集群各節點間通過心跳信息判斷節點是否出現故障。

4.腦裂現象:


在高可用(HA)系統中,當聯系2個節點的“心跳線”斷開時,本來為一整體、動作協調的HA系統,就分裂成為2個獨立的個體。由于相互失去了聯系,都以為是對方出了故障。兩個節點上的HA軟件像“裂腦人”一樣,爭搶“共享資源”、爭起“應用服務”,就會發生嚴重后果——或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享存儲”,導致數據損壞(常見如數據庫輪詢著的聯機日志出錯)。

5.腦裂的原因:


因心跳線壞了(包括斷了,老化)。 因網卡及相關驅動壞了,ip配置及沖突問題(網卡直連)。 因心跳線間連接的設備故障(網卡及交換機)。 因仲裁的機器出問題(采用仲裁的方案)。 高可用服務器上開啟了 iptables防火墻阻擋了心跳消息傳輸。 高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗。 其他服務配置不當等原因,如心跳方式不同,心跳廣插沖突、軟件Bug等。

??二、keepalived原理與簡介:

1.keepalived是什么


keepalived是集群管理中保證集群高可用的一個服務軟件,用來防止單點故障。

2.keepalived工作原理:


keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。

將N臺提供相同功能的服務器組成一個服務器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該服務器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master

3.keepalived主要有三個模塊:


分別是core、check和vrrp。 core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。 check負責健康檢查,包括常見的各種檢查方式。 vrrp模塊是來實現VRRP協議的。

?三、VRRP虛擬路由冗余協議

虛擬路由冗余協議(Virtual Router Redundancy Protocol,簡稱VRRP)是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議,1998年已推出正式的RFC2338協議標準。

VRRP廣泛應用在邊緣網絡中,它的設計目標是支持特定情況下IP數據流量失敗轉移不會引起混亂,允許主機使用單路由器,以及即使在實際第一跳路由器使用失敗的情形下仍能夠維護路由器間的連通性。

那么這個VRRP協議是干嘛用呢?傳統上來說我們通過一個路由器上網,如果故障那就不能用了,如果使用2個路由器,有一個故障你就需要手動的設置客戶端切換到另外的路由器上,或者使用ARP客戶端也可以實現,但總之部署比較麻煩不利于管理,就像下圖

image

有沒有一種辦法可以自動轉移而省去手動配置呢?我們就可以通過VRRP協議來實現路由器的故障轉移。如下圖

image

虛擬路由器是VRRP備份組中所有路由器的集合,它是一個邏輯概念,并不是正真存在的。從備份組外面看備份組中的路由器,感覺組中的所有路由器就像一個 一樣,可以理解為在一個組中: 主路由器+所有備份路由器=虛擬路由器。

四、LVS+keepalived高可用集群的大致工作流程:?

在lvs沒有實現高可用之前,我們的架構是一臺lvs服務器和兩臺web服務器,由lvs做負載均衡, 將用戶的請求按照一定的負載均衡算法,分發給兩臺web服務器。然而,這種架構有一個很大的痛點,由于我們訪問web服務器是由lvs來進行負載均衡,也就是必須經過lvs服務器,從而訪問到real-server也就是我們的web服務器。那么當lvs服務器掛掉之后 ,我們就無法達到均衡的去訪問web服務器了。所以我們必須使用高可用技術,就是配置兩臺lvs服務器,在這兩臺lvs服務器上面都安裝上keepalived。在正常情況下,一臺lvs服務器作為master另一臺lvs服務器作為backup,虛擬的vip只在master服務器上出現。我們只對外暴露出vip讓客戶進行訪問,并不將真實的web服務器的ip暴露給用戶,這樣能夠保證我們web服務器的安全,所以客戶只能通過vip來訪問我們的web服務器。 當客戶通過vip來訪問web服務器的時候,會先經過帶有vip的服務器,也就是master,再通過master來進行負載均衡。當發生特殊情況:master服務器掛了的時候。此時的vip就會自動跳到backup服務器上,此時我們通過vip來訪問web服務器的時候,也會先經過帶有vip的服務器,也就是backup,再通過backup來進行負載均衡,從而實現了lvs的高可用。

?五、搭建LVS+Keepalived 高可用集群

服務器說明IPopenEuler主機名稱
lvs調度器192.168.46.110lvs01
lvs調度器192.168.46.120lvs02
web服務器192.168.46.130server1
web服務器192.168.46.140server2
client192.168.46.150client

DIP: 192.168.46.100

1. 配置lvs調度器(以master為例)

(1)安裝LVSkeepalived軟件包

yum install -y keepalived ipvsadm# 檢查LVS
lsmod | grep ip_vs

(2)配置轉發及防火墻

#修改配置文件
[root@lvs01 ~]# vim /etc/sysctl.conf
#將0改為1
net.ipv4.ip_forward=1# 啟動
[root@lvs01 ~]# sysctl -p

(3)配置keepalived實現LVS負載均衡

a. 首先進行原配置文件的備份保存
[root@lvs01 ~]# cd /etc/keepalived/# 進行備份
[root@lvs01 keepalived]# cp keepalived.conf{,.bak}# 進行查看
[root@lvs01 keepalived]# ls
keepalived.conf  keepalived.conf.bak
b. 修改原配置文件(注意:大括號是否完整)
[root@lvs01 keepalived]# vim keepalived.conf
[root@lvs01 keepalived]# cat keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_1
}vrrp_instance VI_1 {state MASTERinterface ens160virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.46.100}
}virtual_server 192.168.46.100 80 {delay_loop 3lb_algo rrlb_kind DR# persistence_timeout 50  #對該地方進行注釋,方便測試實驗結果protocol TCPreal_server 192.168.46.130 80 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 80}}real_server 192.168.46.140 80 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 80}}
}
參數說明:
virtual_server 192.168.79.110 80 { #定義虛擬服務,需指定IP地址和端口,空格隔開
delay_loop 6 #定義RS運行情況監測時間間隔
lb_algo wrr #定義負載調度算法
lb_kind DR #定義LVS的工作模式
nat_mask 255.255.255.0 #定義虛擬服務的mask
persistence_timeout 300 #定義會話保持時間,S為單位
protocol TCP #指定轉發協議
real_server 192.168.79.118 80 { #定義真實服務器IP地址和端口
weight 1 #定義RS的權重
TCP_CHECK { #RS server 健康檢查部分
connect_timeout 8 #定義超出8s連接超時
nb_get_retry 3 #定義重試次數
delay_before_retry 3 #定義重試時間間隔
connect_port 80 #定義健康檢查端口
}

(4)拷貝master上的keepalived.conf到backup上

[root@lvs01 keepalived]# scp keepalived.conf 192.168.46.120:$PWD

(5)拷貝后,修改配置文件

只需修改三個地方:1.router_id Director22.state BACKUP3.priority 80

?(6)啟動keepalived服務

[root@lvs01 keepalived]# systemctl start keepalived.service# 查看ip綁定情況
[root@lvs01 keepalived]# ip ad

可以看出lvs01上的ens160上出現了虛擬IP地址,而lvs02上沒有出現說明配置正確,否則兩臺及其都有虛擬IP的話就出現了腦裂。

2. 配置web服務器

(1)安裝nginx測試點

[root@server1 ~]# yum install -y nginx

(2)查看80端口是否啟動

[root@server1 ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3046/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      3046/nginx: master

(3)自定義web主頁

# 編寫默認主頁內容
echo "test page, `hostname -I`" > /usr/share/nginx/html/index.html# 設置開機自啟動
systemctl enable --now nginx.service# 進行測試
[root@server1 ~]# curl localhost
test page, 192.168.46.130

(4)編寫腳本,進行綁定VIP和抑制arp

配置腳本如下:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.46.150
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep lo:10 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-DR-RIP Server is already running !"
else
/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:10
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch $LOCK
echo "starting LVS-DR-RIP server is ok !"
fi
}
stop() {
/sbin/route del -host $VIP dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
rm -rf $LOCK
echo "stopping LVS-DR-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RIP Server is already running !"
else
echo "The LVS-DR-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
# 創建開機自啟動腳本lvs_dr
[root@openEuler ~]# vim /etc/init.d/lvs_rs# 設置編輯權限
[root@openEuler ~]# chmod +x /etc/init.d/lvs_rs# 修改腳本內容
[root@openEuler ~]# vim /etc/init.d/lvs_rs
VIP=192.168.46.100echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announceecho "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce# 將 lvs_dr 服務添加到系統的服務列表中
[root@openEuler ~]# chkconfig --add lvs_rs# 將 lvs_dr 服務設置為在系統運行級別 3、4 和 5 時自動啟動
[root@openEuler ~]# chkconfig lvs_rs on# 啟動該服務
[root@openEuler ~]# systemctl start lvs_rs.service# 查看服務是否啟動
[root@openEuler ~]# systemctl status lvs_rs.service# 查看是否運行腳本,存在VIP
[root@openEuler ~]# ip ad

# 查看是否配置成功
[root@openEuler ~]# route -n

3. 測試?

(1)查看VIP在哪個機器上

VIP在lvs01上

(2)在client上訪問192.168.46.100

[root@slient ~]# for ((i=1;i<7;i++)) ; do curl 192.168.46.100; done

實現負載均衡!

(3)假設master上的keepalived停止服務,看lvs02是否承擔master任務

# 在lvs01 上停止服務
[root@lvs01 ~]# systemctl stop keepalived.service#查看lvs02 IP地址
[root@lvs02 ~]# ip ad

現象表明,VIP漂移到lvs02上,實現高可用!

(4)關閉server1站點服務

[root@server1 ~]# systemctl stop nginx.service

server1 站點關閉后,再次訪問vip我們發現仍能訪問到業務。說明我們的高可用集群試驗成功。到此實驗完畢!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/71978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/71978.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/71978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從【人工智能】到【計算機視覺】,【深度學習】引領的未來科技創新與變革

前幾天偶然發現了一個超棒的人工智能學習網站&#xff0c;內容通俗易懂&#xff0c;講解風趣幽默&#xff0c;簡直讓人欲罷不能。忍不住分享給大家&#xff0c;點擊這里立刻跳轉&#xff0c;開啟你的AI學習之旅吧&#xff01; 前言 – 人工智能教程https://www.captainbed.cn/l…

銀河麒麟高級服務器操作系統在線調整/pro/{PID}/limits文件中nofile的軟限制和硬限制參數值操作方法

銀河麒麟高級服務器操作系統在線調整/pro/{PID}/limits文件中nofile的軟限制和硬限制參數值操作方法 一 系統環境二 使用場景三 操作步驟 一 系統環境 [rootlocalhost ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server…

數據結構-直接插入和希爾排序

這次&#xff0c;我們來講數據結構的排序的直接插入。 一&#xff1a;排序的思想&#xff1a;把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中&#xff0c;直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 相當于&#xff0c;我們打牌如上圖…

基于coze+微信小程序的ai對話

界面介紹&#xff1a; 代碼&#xff1a;&#xff08;替換你的coze的配置&#xff09; <template><view class"container"><!-- 高斯模糊背景 --><view class"animated-bg"><view class"gradient-blob"></view…

Day11,Hot100(貪心算法)

貪心 &#xff08;1&#xff09;121. 買賣股票的最佳時機 第 i 天賣出的最大利潤&#xff0c;即在前面最低價的時候買入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…

Linux內核自定義協議族開發指南:理解net_device_ops、proto_ops與net_proto_family

在Linux內核中開發自定義協議族需要深入理解網絡協議棧的分層模型。net_device_ops、proto_ops和net_proto_family是三個關鍵結構體,分別作用于不同的層次。本文將詳細解析它們的作用、交互關系及實現方法,并提供一個完整的開發框架。 一、核心結構體的作用與層級關系 struct…

SpringBoot 中的 Redis 序列化

SpringBoot 中的 Redis 序列化 在 Spring Boot 中&#xff0c;Redis 的序列化是指將 Java 對象轉換為字節流&#xff08;序列化&#xff09;以便存儲到 Redis 中&#xff0c;以及從 Redis 中讀取字節流并將其轉換回 Java 對象&#xff08;反序列化&#xff09;。 這是因為在 R…

vLLM服務設置開機自啟動(Linux)

要在開機時進入指定的 conda 環境并啟動此 vllm 服務&#xff0c;您可以通過以下步驟設置一個 systemd 服務來自動執行腳本。 一、第一步&#xff1a;創建一個啟動腳本 1.打開終端并創建啟動腳本&#xff0c;例如 /home/username/start_vllm.sh&#xff08;請替換 username 為…

AI繪畫軟件Stable Diffusion詳解教程(3):Windows系統本地化部署操作方法(通用版)

上一篇教程介紹了如何在本地部署Stable Diffusion專業版&#xff0c;雖然便于技術人員研究&#xff0c;但是普通人使用起來不便捷&#xff0c;每次只能通過cmd窗口的指令形式或者python代碼方式來畫圖&#xff0c;要記很多的指令很繁瑣。 本篇教程教您搭建webui版的&#xff0…

大數據SQL調優專題——調優切入

引入 我們都知道大數據的SQL優化&#xff0c;并非一蹴而就的簡單任務&#xff0c;而是一個涉及多個環節的復雜過程。雖然我們的專欄名字叫大數據SQL調優&#xff0c;但是調優并不是簡單對SQL優化&#xff0c;而是一個涉及多個環節的復雜過程。實際上從需求接入到最終交付&…

貪心算法精品題

1.找錢問題 本題的貪心策略在于我們希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

spring結合mybatis多租戶實現單庫分表

實現單庫分表 思路&#xff1a;student表數據量大&#xff0c;所以將其進行分表處理。一共有三個分表&#xff0c;分別是student0&#xff0c;student1&#xff0c;student2&#xff0c;在新增數據的時候&#xff0c;根據請求頭中的meta-tenant參數決定數據存在哪張表表。 數…

Ecode前后端傳值

說明 在泛微 E9 系統開發過程中&#xff0c;使用 Ecode 調用后端接口并進行傳值是極為常見且關鍵的操作。在上一篇文章中&#xff0c;我們探討了 Ecode 調用后端代碼的相關內容&#xff0c;本文將深入剖析在 Ecode 中如何向后端傳值&#xff0c;以及后端又該如何處理接收這些值…

黑馬Java面試教程_P5_微服務

系列博客目錄 文章目錄 系列博客目錄1.引言2.Spring Cloud2.1 Spring Cloud 5大組件有哪些?面試文稿 2.2 服務注冊和發現是什么意思?Spring Cloud 如何實現服務注冊發現?面試文稿 2.3 我看你之前也用過nacos、你能說下nacos與eureka的區別?面試文稿 2.4 你們項目負載均衡如…

【2025深度學習環境搭建-2】pytorch+Docker+VS Code+DevContainer搭建本地深度學習環境

上一篇文章&#xff1a;【2025深度學習環境搭建-1】在Win11上用WSL2和Docker解鎖GPU加速 先啟動Docker&#xff01;對文件內容有疑問&#xff0c;就去問AI 一、用Docker拉取pytorch鏡像&#xff0c;啟動容器&#xff0c;測試GPU docker pull pytorch/pytorch:2.5.0-cuda12.4…

Linux驅動開發實戰(一):LED控制驅動詳解

Linux驅動開發野火實戰&#xff08;一&#xff09;&#xff1a;LED控制驅動詳解 文章目錄 Linux驅動開發野火實戰&#xff08;一&#xff09;&#xff1a;LED控制驅動詳解引言一、基礎知識1.1 什么是字符設備驅動1.2 重要的數據結構read 函數write 函數open 函數release 函數 二…

Linux上用C++和GCC開發程序實現不同MySQL實例下單個Schema之間的穩定高效的數據遷移

設計一個在Linux上運行的GCC C程序&#xff0c;同時連接兩個不同的MySQL實例&#xff0c;兩個實例中分別有兩個Schema的表結構完全相同&#xff0c;復制一個實例中一個Schema里的所有表的數據到另一個實例中一個Schema里&#xff0c;使用以下快速高效的方法&#xff0c;加入異常…

Redis除了做緩存還能做什么?

Redis 除了作為高性能緩存外&#xff0c;還因其豐富的數據結構和功能&#xff0c;廣泛應用于多種場景。以下是 Redis 的十大核心用途及具體示例&#xff1a; 1. 分布式會話存儲 用途&#xff1a;存儲用戶會話信息&#xff08;如登錄狀態&#xff09;&#xff0c;實現多服務間共…

JBoltAI_SpringBoot如何區分DeepSeek R1深度思考和具體回答的內容(基于Ollama)?

當我們用Ollama運行DeepSeek R1模型&#xff0c;向它提問時&#xff0c;會發現它的回答里是有think標簽的 如果我們直接將Ollama的回復用于生產環境&#xff0c;肯定是不行的&#xff0c;對于不同的場景&#xff0c;前面輸出的一堆內容&#xff0c;可能并不需要在客戶端展示&a…

MySQL 使用 `WHERE` 子句時 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的區別解析

文章目錄 1. COUNT() 函數的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的詳細對比2.1 COUNT(*) —— 統計所有符合條件的行2.2 COUNT(1) —— 統計所有符合條件的行2.3 COUNT(column) —— 統計某一列非 NULL 的記錄數 3. 性能對比3.1 EXPLAIN 分析 4. 哪種方式更好&…