耗時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臺虛擬機的原因,也可能是網路原因
調整
1.調整了keepalived的playbook順序:將 Modify configuration 最后執行,并添加handler
- name: Modify configuration
template: src=https://www.cnblogs.com/zhaoya2019/p/keepalived_conf.j2 dest=/etc/keepalived/keepalived.conf
notify:
- Restart_keepalived
2.靜態檔案 keepalived.service 放到了files
3.準備優化rs數量,但語法未通過 待更新
{% for i in range(1,{{ rs_num }}+1) %}
real_server {{ rs{{ i }}_ip }} 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
{% endfor %}

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/116689.html
標籤:Linux
