企業級自動化部署方案——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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...