企業級自動化部署方案——ansible實現lvs+keepalived高可用架構

来源:https://www.cnblogs.com/zhaoya2019/archive/2020/03/31/12609142.html
-Advertisement-
Play Games

==耗時8小時左右== 總體設計 ansible playbook目錄結構 入口文件 因為不同的主機配置不同,所以按主機分類設置了3個role NFS服務playbook結構 WEB服務playbook結構 Keepalived+LVS服務playbook結構 執行過程 結果測試 1.查看浮動ip ...


耗時8小時左右

總體設計

在這裡插入圖片描述

ansible-playbook目錄結構

入口文件
因為不同的主機配置不同,所以按主機分類設置了3個role

[root@ansible ~]# cat /etc/ansible/work_dir/lvs.yaml
- hosts: [nfs]
  roles:
    - nfs
- hosts: [rs]
  roles:
    - web
- hosts: [ds]
  roles:
    - keepalived

NFS服務playbook結構

[root@ansible ~]# tree /etc/ansible/roles/nfs
/etc/ansible/roles/nfs
├── files
├── handlers
│   └── main.yaml
├── tasks
│   └── main.yaml
├── templates
└── vars
    └── main.yaml

WEB服務playbook結構

[root@ansible ~]# tree /etc/ansible/roles/web
/etc/ansible/roles/web
├── files
├── handlers
│   └── main.yaml
├── tasks
│   └── main.yaml
├── templates
│   ├── ifcfg-lo.j2
│   └── rs_test.j2
└── vars
    └── main.yaml

Keepalived+LVS服務playbook結構

[root@ansible ~]# tree /etc/ansible/roles/keepalived
/etc/ansible/roles/keepalived
├── files
├── handlers
├── tasks
│   └── main.yaml
├── templates
│   ├── keepalived_conf.j2
│   └── keepalived_service.j2
└── vars
    └── main.yaml

執行過程

[root@ansible work_dir]# pwd
[root@ansible work_dir]# ansible-playbook lvs.yaml

在這裡插入圖片描述在這裡插入圖片描述

結果測試

1.查看浮動ip
在ds1 (主) 上查看IP信息
在這裡插入圖片描述在ds2(備) 上查看IP信息
在這裡插入圖片描述浮動IP在負載均衡主節點上
在網頁上訪問測試
在這裡插入圖片描述在這裡插入圖片描述通過LVS訪問NFS(把NFS掛載到了/var/www/html/nfs)
在這裡插入圖片描述實際頁面應該只有一個 Welcome to NFS! ,這是多次測試ansible-playbook導致的
2.測試故障切換

[root@ftp ~]# while :; do curl 192.168.213.200;sleep 2;done

停止rs1的httpd服務,業務沒有中斷
在這裡插入圖片描述當rsl systemctl start httpd 停止httpd服務後,所有的訪問請求都分配到rs2上;當rsl啟動httpd服務,所有的訪問請求都平均分配到兩個rs節點上(wrr演算法,weight都為1)

在sleep 2的時候會出現2次訪問不到的情況curl: (7) Failed connect to 192.168.213.200:80; Connection refused
在sleep 3/4/5的時候會出現1次訪問不到的情況
在sleep 6的時候訪問正常
可見,這個節點移除是需要時間的

停止ds1(主)的keepalived服務,服務不受影響,vip漂移到了ds2(備)上
在這裡插入圖片描述在這裡插入圖片描述當dsl重啟keepalived服務後,vip會漂移回來

實現過程問題記錄

1.在rs1,rs2上綁定VIP到迴環網卡
2.調整內核參數,關閉arp響應要 sysctl -p
3.keepalived首次啟動失敗
通過日誌文件/var/log/messages查看錯誤

(Line 12) WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist

問題: keepalived新版本會檢查/etc/keepalived/keepalived.conf配置文件,配置有誤會導致程式啟動失敗(如預設的配置文件中網卡為eth0,而實際網卡為ens33)

解決方法: 修改配置文件後再啟動進程(用以下方法可以方便的修改網卡名稱)

#/etc/ansible/roles/keepalived/templates/keepalived_conf.j2
interface {{ net_name }}

4.systemctl無法徹底停掉keepalived
現象描述: 無法正常stop掉keepalived進程,再次啟動時雖然可以啟動,但進程狀態裡面會提示:Can’t open PID file /var/run/keepalived.pid (yet?) after start

問題: systemd的啟動腳本有問題,無法創建PID文件

解決方法: 註釋掉啟動腳本中的如下行,重載 systemctl daemon-reload

#/lib/systemd/system/keepalived.service
KillMode=process #只殺掉程式的主進程,不管打開的子進程

這個問題可能和keepalived的版本有關,不一定都需要處理這個問題
5.keepalived開啟順序影響部分配置
當2台伺服器都設置為BACKUP模式時,先開啟keepalived進程的會先綁定VIP,後開啟的即使優先順序高也不會去搶占,除非先開啟的掛掉,即雙BACKUP模式下,要先開啟優先順序高的伺服器的keepalived進程(個人驗證的是這樣的)

6.keepalived中的兩種模式

(1)master->backup模式
一旦主庫宕機,虛擬ip會自動漂移到從庫,當主庫修複後,keepalived啟動後,還會把虛擬ip搶占過來,即使設置了非搶占模式(nopreempt)搶占ip的動作也會發生。
(2)backup->backup模式
當主庫宕機後虛擬ip會自動漂移到從庫上,當原主庫恢復和keepalived服務啟動後,並不會搶占新主的虛擬ip,即使是優先順序高於從庫的優先順序別,也不會發生搶占。為了減少ip漂移次數,通常是把修複好的主庫當做新的備庫。

在資料庫的應用場景中,不建議資料庫的頻繁切換,可配置為keepalived的VIP不搶占模式
7.在Linux中,掛載到目錄後,文件夾原來的數據會被隱藏,無法看到測試結果(只能看到NFS上的文件),所以新建了目錄 /var/www/html/nfs 進行掛載,既能看到測試結果,又能訪問到NFS伺服器

8.ds1和ds2的keepalived.conf文件除了一些參數不同,其餘都一樣,可以應用templates處理

vrrp_instance VI_1 {
    {% if ds_master == ansible_hostname%}
	state MASTER
    priority 150
    {% elif ds_slave == ansible_hostname%}
	state BACKUP
	priority 100
    {% endif %}
}

vars變數有部分重覆定義,但只寫一個role中對集群不同主機的配置會有影響,暫時未想到解決辦法

執行有些慢,可能是因為開了7台虛擬機的原因,也可能是網路原因


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

-Advertisement-
Play Games
更多相關文章
  • ViewComponent的一種使用方法 最近在一個自己新建的Core項目中想使用Html.Action(),突然發現這個方法已經沒了,下麵我按照官網(https://docs.microsoft.com/zh cn/aspnet/core/mvc/views/view components?vie ...
  • 一、什麼是ThreadPool 線程池(源碼) 1.線程池顧名思義,有我們的系統創建一個容器裝載著我們的線程,由CLR控制的所有AppDomain共用。線程池可用於執行任務、發送工作項、處理非同步 I/O、代表其他線程等待以及處理計時器。所以使用線程池不需要自己創建線程,而是通過線程池來創建和執行和管 ...
  • 配置規則 命令行配置提供程式 環境變數配置提供程式 文件配置提供程式 配置的讀取 自定義配置數據源 ASP.NET Core中的配置項可以通過命令行、環境變數、json/xml/ini配置文件來提供。 Web應用在生成主機時會調用CreateDefaultBuilder方法,這個方法按照下麵的順序添 ...
  • 下麵2個service中,方法體均一樣。只是其中service名,參數和url路徑不一樣。 原因是曾經對項目升級或是重構留下來的結果。 由於程式中N多處地方有引用,又不能合併它,刪除更不用說了。 因為,Insus.NET為了讓其更好維護,因此寫了另外一個Service來進行重構它們: 好了,博文中最 ...
  • 1、創建一個Asp.Net Core Web應用程式 1.1、打開VS2019 新建項目 1.2、選好項目位置後進入選擇界面,選擇Web應用程式 1.3、進去的頁面結構如下 Pages 文件夾:包含 Razor 頁面和支持文件。 每個 Razor 頁面都是一對文件: 一個 .cshtml 文件,其中 ...
  • 相關主頁 Prometheus https://prometheus.io/ grafana https://grafana.com/ 安裝Prometheus Linux 可以參考https://www.cnblogs.com/linkanyway/p/Configure-a-Prometheus ...
  • 我從一萬二千年前開始寫XAML,這麼多年用了很多各式各樣的工具,現在留在電腦里的、現在還在用的、在寫WPF時用的也就那麼幾個。這篇文章總結了這些工具,希望這些工具可以讓WPF開發者事半功倍。 1. Visual Studio Visual Studio應該無需介紹,它是“面向任何開發者的同類最佳工具 ...
  • 假如有這麼一個數據網關服務服務,客戶端有三種賬號角色(普通用戶、管理員用戶、超級管理員用戶),數據網關針對這三種角色用戶分配不同的數據訪問許可權,那怎麼樣通過IdentityServer4 來實現角色的授權呢?它又是怎樣的一個過程? ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...