keepalived

来源:http://www.cnblogs.com/wangxiaoqiangs/archive/2016/06/30/5630490.html
-Advertisement-
Play Games

簡介: Keepalived 是一個基於 VRRP 協議來實現 WEB 服務高可用的解決方案,用來避免單點故障。主伺服器會發送特定的消息給備份伺服器,當備份伺服器收不到這個消息時,即主伺服器宕機的時候,備份伺服器就會接管虛擬 IP ,繼續提供服務,從而保證高可用性。 下載地址:http://www. ...



簡介:

Keepalived 是一個基於 VRRP 協議來實現 WEB 服務高可用的解決方案,用來避免單點故障。主伺服器會發送特定的消息給備份伺服器,當備份伺服器收不到這個消息時,即主伺服器宕機的時候,備份伺服器就會接管虛擬 IP ,繼續提供服務,從而保證高可用性。

下載地址:http://www.keepalived.org/download.html

1、安裝 keepalived

shell > tar zxf keepalived-1.2.10.tar.gz -C ../
shell > cd ../keepalived-1.2.10/
shell > ./configure --prefix=/usr/local/keepalived --disable-lvs

## 這裡不使用 lvs ,所以要禁用它,不然會報錯無法通過,如果使用 lvs ,那麼先安裝 ipvsadm 。

shell > make ; make install

2、調整 keepalived

shell > cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

shell > cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

shell > cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

shell > mkdir /etc/keepalived

shell > cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

3、修改主伺服器上的 keepalived.conf

shell > vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {                # 全局配置
  notification_email {       # 設置報警郵件地址 ,多個地址換行寫 ,如開啟郵件報警本機需啟動 sendmail 服務
    [email protected]
    [email protected]
    [email protected]
  }
  notification_email_from [email protected]     # 郵件發送地址
  smtp_server 192.168.200.1                                 # 設置郵件的 smtp server 地址
  smtp_connect_timeout 30                                   # 設置連接 smtp server 的超時時間
  router_id LVS_DEVEL                                       # keepalived 標識 ,郵件主題內容
}

## 以上信息保持預設即可 ,我們不使用 keepalived 的郵件功能

vrrp_instance VI_1 {        # VRRP 實例配置 ,VI_1 實例名稱
  state MASTER              # keepalived 角色 ,MASTER 為主伺服器 ,BACKUP 為備用伺服器
  interface eth0            # 指定監聽的網路介面
  virtual_router_id 80      # 虛擬路由標識 ,表示為一個數字 ,同一個 VRRP 實例使用唯一的標識 ,MASTER BACKUP 必須一致
  priority 100              # 節點優先順序 ,數字越大 優先順序越高 ,範圍 0-255 ,同一 VRRP 實例中 MASTER 的優先順序必須大於 BACKUP 的優先順序
  advert_int 1              # MASTER 與 BACKUP 同步檢查時間間隔 ,單位為 秒
# mcast_src_ip 192.169.1.88 # 發送多播包的地址 ,不設置時將使用綁定網卡所對應的 IP 地址
# garp_master_delay 10      # 切換到 MASTER 狀態後延時進行 Gratuitous arp 請求的時間
  authentication {      # 設置節點通信驗證類型和密碼
    auth_type PASS      # 類型有 PASS 和 AH 兩種
    auth_pass 888888    # 驗證密碼 ,同一 VRRP 實例中 ,MASTER BACKUP 必須使用相同的密碼才能正常通信
  }
  virtual_ipaddress {    # 虛擬 IP ,又稱漂移 IP 地址 ,有多個時每行一個 。當 keepalived 為 MASTER 狀態時 ,這個 IP 會自動添加到系統
    192.168.1.35           中 ,而切換到 BACKUP 時 ,這些 IP 又會自動從系統中刪除 。可以通過 ip add 命令查看。
  }                        可以寫成 :192.168.1.35192.168.1.35 dev eth0 或 192.168.1.35/24 dev eth0

# nopreempt            # 高可用集群中的不搶占功能 。只能在"狀態"為 BACKUP 的節點上設置 ,並且優先順序必須高於其他節點(1)
# preemtp_delay 120    # 搶占延時時間 ,單位為 秒 。( 我定義為:常用在備節點上 # 沒研究透 ,慎用 )(2)
}

## 1、如果不設置 nopreempt 參數 ,當主節點無法正常提供服務時 ,備節點會接管服務 ,而當主節點恢復正常時 ,主節點會再次自動接管服務 。
這種來回切換的操作對實時性和穩定性要求很高的業務來說是不理想的 ,存在著一定的風險和不穩定性 。配置此參數後 ,主節點恢復正常後不自動接管服務 ,服務會一直運行在備用節點上 ,直到備用節點發生故障才進行切換 。

## 2、有時系統啟動或重啟之後 ,網路需要經過一段時間才能正常工作 ,在這種情況下是無需進行切換的 ,preemtp_delay 參數用來設置這種情況的發生間隔。
在此時間內發生的故障將不會進行切換 ,如果超過 preemtp_delay 指定的時間 ,並且網路異常時 ,進行主備切換。

4、備機

1)、與 MASTER 相同
2)、與 MASTER 相同

3)、keepalived.conf

! Configuration File for keepalived

global_defs {
  notification_email {
    [email protected]
    [email protected]
    [email protected]
  }
  notification_email_from [email protected]
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}

vrrp_instance VI_1 {
  state BACKUP            # keepalived 備機狀態
  interface eth0
  virtual_router_id 80    # 虛擬路由標識要跟 MASTER 一致
  priority 90             # 優先順序要比 MASTER 低
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 888888      # 驗證密碼要跟 MASTER 一致
  }
  virtual_ipaddress {
    192.168.1.35       # 虛擬 IP 地址
  }
  preemtp_delay 120    # 當備節點 120 秒沒有接收到主節點發送的 VRRP 數據包時進行主備切換 
}

5、主、備節點啟動 keepalived ( service keepalived start )

主節點日誌:

shell > tail -14 /var/log/messages
Dec 30 13:31:32 study Keepalived[2987]: Starting Keepalived v1.2.10 (12/30,2014)
Dec 30 13:31:32 study Keepalived[2988]: Starting VRRP child process, pid=2990
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Registering Kernel netlink reflector
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Registering Kernel netlink command channel
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Registering gratuitous ARP shared channel
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Opening file '/etc/keepalived/keepalived.conf'.
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Configuration is using : 63321 Bytes
Dec 30 13:31:32 study Keepalived_vrrp[2990]: Using LinkWatch kernel netlink reflector...
Dec 30 13:31:32 study Keepalived_vrrp[2990]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Dec 30 13:31:33 study Keepalived_vrrp[2990]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 30 13:31:34 study Keepalived_vrrp[2990]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 30 13:31:34 study Keepalived_vrrp[2990]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 30 13:31:34 study Keepalived_vrrp[2990]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35
Dec 30 13:31:44 study Keepalived_vrrp[2990]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35

## 可以看到倒數第四行 ,Entering MASTER STATE (進入 MASTER 狀態),並且將虛擬 IP 192.168.1.35 綁定在了 eth0 上

shell > ip add | grep -A 5 ^2:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d0:99:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.1.88/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.35/32 scope global eth0
inet6 fe80::20c:29ff:fed0:99fa/64 scope link
valid_lft forever preferred_lft forever

## 可以看到虛擬 IP 192.168.1.35

備節點日誌:

shell > tail -15 /var/log/messages
Dec 30 13:19:11 localhost Keepalived[2757]: Starting Keepalived v1.2.10 (12/30,2014)
Dec 30 13:19:11 localhost Keepalived[2758]: Starting VRRP child process, pid=2760
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Registering Kernel netlink reflector
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Registering Kernel netlink command channel
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Registering gratuitous ARP shared channel
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Opening file '/etc/keepalived/keepalived.conf'.
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Configuration is using : 63302 Bytes
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Using LinkWatch kernel netlink reflector...
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Dec 30 13:19:15 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35
Dec 30 13:19:21 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35

## 發現備節點居然也進入了 MASTER 狀態

shell > ip add | grep -A 5 ^2:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:46:d3:7c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.80/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.35/32 scope global eth0
inet6 fe80::20c:29ff:fe46:d37c/64 scope link
valid_lft forever preferred_lft forever

## 也可以看到虛擬 IP 192.168.1.35

## 經過分析:
1、首先配置文件沒有錯
2、其次就是主備的選舉中出現了問題 ,主備選舉按優先順序來判定 ,優先順序高的為 MASTER ,低的為 BACKUP ,按配置文件來看也沒有問題
3、那麼就是主備檢測出了問題 ,正常情況下主會定期給備發送 VRRP 數據包 ,當備接收不到主發來的 VRRP 數據包時認為主不可用,然後從多個備中選舉新的 MASTER。
     我們這個例子中只有一個備 ,所以當備無法收到主發來的 VRRP 數據包時 ,備就成為了主 ,而主還是主( 因為自己沒問題 )。
## 所以將故障定位在了備節點的 iptables( 因為備節點無法接收到主節點發來的 VRRP 數據包 )

備節點操作:

shell > iptables --line-numbers -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

shell > iptables -I INPUT 4 -s 192.168.1.88 -j ACCEPT # 記得保存規則 ,否則重啟失效

馬上就會發現備節點從 MASTER 狀態切換回了 BACKUP 狀態:

shell > tail -f /var/log/messages
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Opening file '/etc/keepalived/keepalived.conf'.
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Configuration is using : 63302 Bytes
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: Using LinkWatch kernel netlink reflector...
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 30 13:19:11 localhost Keepalived_vrrp[2760]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Dec 30 13:19:15 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 30 13:19:16 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35
Dec 30 13:19:21 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.35
Dec 30 13:34:34 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Received higher prio advert
Dec 30 13:34:34 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 30 13:34:34 localhost Keepalived_vrrp[2760]: VRRP_Instance(VI_1) removing protocol VIPs.

## 倒數三行 ,Entering BACKUP STATE( 進入了 BACKUP 狀態 ),並且移除了 VIP

shell > ip add | grep -A 5 ^2
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:46:d3:7c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.80/24 brd 192.168.1.255 scope global eth0
inet6 fe80::20c:29ff:fe46:d37c/64 scope link
valid_lft forever preferred_lft forever

## VIP 消失了 。而此時的主還是主 !

6、測試高可用是否生效

## 當主節點關閉 keepalived 服務時 ,備節點瞬間綁定虛擬 IP ,主節點移除虛擬 IP ,在此過程中 ping 包會丟一個 。
## 當主節點恢復 keepalived 服務時 ,備節點瞬間移除虛擬 IP ,主節點綁定虛擬 IP ,在此過程中 ping 包會丟一個 。

## 關於參數 nopreempt

1> 測試發現,主節點無法提供服務時 ,被切換到備節點 。當主節點修複完成 ,加入網路的時候 ,如果 state 還為 MASTER 那麼此參數不生效,會搶占 VIP
2> 主節點後加入網路並且不想搶占資源時 ,state 應設為 BACKUP ,優先順序不變 ,保持最大 ,加入 nopreempt 參數可以實現此需求,當備節點故障時才搶占 VIP


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝好MySQL以後,系統給了個預設的的密碼,然後說如果忘記了預設的密碼。。。。。。我複製了預設密碼就走過了只一步,這一步就是我漫長旅程的開始。他給的密碼太複雜了,當然我得換一個,而且我還要假裝我不記得密碼了,就這樣我走上了不歸路。。。。。。 這個過程是心酸的,網上的資料多如狗,關鍵是各有各的錯法, ...
  • 當我談論索引時,大家經常會問我在複合非聚集索引里,列的順序是否重要?簡單來說:“看情況”。我們來具體看下為啥“看情況”…… 單例查找(Singleton Lookups) 當在你的表上有進行單例查找的查詢時,在複合非聚集索引里列的順序真的不重要。假設下列查詢: 現在你可以在StateProvince ...
  • 聲明:以下的代碼成果,是參考了網上的injso技術,文章最後會給出地址。 另外一個,injso文章中的代碼實際上不能夠運行起來的,後面出現的代碼都是經過我個人修改和檢測的。 最近因為在學習一些調試的技術,但是很少有提到如何在函數運行時實現函數替換的。 為什麼會想到這一點?因為在學習調試時,難免會看到 ...
  • call和jmp都是跳轉指令,但是call的同時會把pc地址壓入堆棧,並且這兩種方式都有遠和近跳轉。下麵的分析不全,因為沒有在網上找到足夠的資料,個人創造這個情景還是有些困難。 1.例子中的call的機器碼為0xe8。 0x400204ba <+30>: e8 41 b6 05 00 call 0x ...
  • STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。 1.TIM1 CH1輸出PWM配置步驟 ①開啟TIM1時鐘,配置PA8為復用輸出 APB2外設時鐘使能寄存器(RCC_APB2ENR) APB1外設複位寄存器 ...
  • 1.什麼是kqueue和IO復用 kueue是在UNIX上比較高效的IO復用技術。 所謂的IO復用,就是同時等待多個文件描述符就緒,以系統調用的形式提供。如果所有文件描述符都沒有就緒的話,該系統調用阻塞,否則調用返回,允許用戶進行後續的操作。 常見的IO復用技術有select, poll, epol ...
  • 前幾天剛好同事問起在Cortex M上延時不准的問題,在網上也沒找到比較滿意的答案,乾脆自己對這個問題做一個總結。 根據我們的經驗,最容易想到的大概通過計算指令周期來解決。該思路在Cortex上並不是很適用:一方面MCU從Flash取指是有延時的,另一方面Cortex的指令集不是固定周期的,特別從M ...
  • 簡介: 1、在 Keepalived 集群中,其實並沒有嚴格意思上的主、備節點,雖然可以在 keepalived.conf 中定義 state 選項為 MASTER 狀態,但是這並不意味著此節點就一直是 MASTER 角色。控制節點角色的是 keepalived.conf 中的 priority 值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...