一.高可用集群
1.1 集群類型
1.2 系統可用性
1.3 系統故障
1.4 實現高可用
- active/passive 主/備
- active/active 雙主
- active --> HEARTBEAT --> passive
- active <--> HEARTBEAT <--> active
1.5.VRRP:Virtual Router Redundancy Protocol
- 物理層:路由器、三層交換機
- 軟件層:keepalived
1.5.1 VRRP 相關術語
- 虛擬路由器:Virtual Router
- 虛擬路由器標識:VRID(0-255),唯一標識虛擬路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主設備
- backup:備用設備
- priority:優先級
1.5.2 VRRP 相關技術
- 無認證
- 簡單字符認證:預共享密鑰
- MD5
- 主/備:單虛擬路由器
- 主/主:主/備(虛擬路由器1),備/主(虛擬路由器2)
二.Keepalived 部署
2.1 keepalived 簡介
- 基于vrrp協議完成地址流動
- 為vip地址所在的節點生成ipvs規則(在配置文件中預先定義)
- 為ipvs集群的各RS做健康狀態檢測
- 基于腳本調用接口完成腳本中定義的功能,進而影響集群事務,以此支持nginx、haproxy等服務
2.2 Keepalived 架構
- 用戶空間核心組件:
- vrrp stack:VIP消息通告
- checkers:監測real server
- system call:實現 vrrp 協議狀態轉換時調用腳本的功能
- SMTP:郵件組件
- IPVS wrapper:生成IPVS規則
- Netlink Reflector:網絡接口
- WatchDog:監控進程
- 控制組件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO復用器:針對網絡目的而優化的自己的線程抽象
- 內存管理組件:為某些通用的內存管理功能(例如分配,重新分配,發布等)提供訪問權限
2.3 Keepalived 環境準備
拓撲:
- 各節點時間必須同步:ntp, chrony
- 關閉防火墻及SELinux
- 各節點之間可通過主機名互相通信:非必須
- 建議使用/etc/hosts文件實現:非必須
- 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信:非必須
2.4 Keepalived 相關文件
- 軟件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的環境配置文件:/etc/sysconfig/keepalived
2.5 Keepalived 安裝
[root@KA1 ~]# dnf install keepalived -y
[root@KA1 ~]# systemctl start keepalived
2.6 KeepAlived 配置說明
2.6.1 配置文件組成部分
- GLOBAL CONFIGURATION
- VRRP CONFIGURATION
- LVS CONFIGURATION
三.實驗步驟
設備 | IP |
KA1 | 172.25.254.20 |
KA2 | 172.25.254.30 |
RS1 | 172.25.254.40 |
RS2 | 172.25.254.50 |
cilent | 172.25.254.110 |
1.設置IP地址和主機名,并關閉防火墻
通過腳本,前兩篇文章有腳本
KA1、KA2
RS1、RS2
所有機器:
2.KA1和KA2間設置NTP(時間同步)
KA1:KA1設置允許其他主機找自己進行時間同步
KA2:KA2找KA1進行時間同步
KA2校驗時間同步:
3.KA1、KA2安裝keepalived和ipvsadm包,RS1、RS2安裝nginx和mariadb-server包,cilent安裝mariadb包
KA1、KA2:
RS1、RS2:
cilent:
4.配置主備模式
4.1配置全局參數:global_defs:(KA1、KA2都配置一樣)
4.2配置虛擬路由器
KA1:
KA1使用-t -f 檢測配置:
KA2:
KA2使用 -t -f檢測配置:
也可以使用單播進行配置:
單播效果:
4.3檢驗效果
KA1監聽組播地址
當KA1的keepalived掛掉的時候,再查看監聽:
說明KA1掛掉的時候,KA2已經接替了KA1的工作,VIP現在在KA2上:
KA2,VIP在KA2上:
KA1,當KA1再次啟動的時候,VIP又因為KA1的優先級高,自動切換回來:
5.啟動keepalived日志功能:
編輯.etc.sysconfig.keepalived文件,啟動日志功能:
編輯.etc.rsyslog.conf文件:
重啟syslog服務:
成功啟動日志:
6.配置獨立子配置文件
7.非搶占模式配置、搶占模式延遲
非搶占模式:
搶占模式延遲:
8.企業級應用實例(雙主模式)
KA1配置:
global_defs {notification_email {weiyihong@163.com}notification_email_from keepalived@KA1.comsmtp_server 172.0.0.1smtp_connect_timeout 30router_id KA1.wyh.comvrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:0}
}vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 52priority 80nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:1}
}virtual_server 172.25.254.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 80}}real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1retry 3delay_before_retry 1}}
}
KA2配置:
global_defs {notification_email {weiyihong@163.com}notification_email_from keepalived@KA1.comsmtp_server 172.0.0.1smtp_connect_timeout 30router_id KA1.wyh.comvrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:0}
}vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 52priority 100nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:1}
}virtual_server 172.25.254.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 80}}real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1retry 3delay_before_retry 1}}
}
開啟雙主模式:
KA1:
KA2:
效果1:
效果2:
效果3:
9.在其基礎上配置后端RS服務
RS1、RS2寫默認網頁區別:
RS1使用腳本綁定VIP至web服務器lo網卡:
RS2使用腳本綁定VIP至web服務器lo網卡:
KA1服務配置,KA2同理:
后端RS1、RS2配置回環IP:
RS1、RS2都添加環回網卡100:
IPVS效果1:
IPVS效果2:ipvs高可用,當RS1故障時,流量自動打到RS2上
當RS1恢復的后,流量又開始負載均衡
ipvs高可用,當ka1失效時,ka2接管VIP,流量也同樣可以負載均衡:
10.再次基礎上再在RS上加一個服務,使得兩個VIP都可以用上,實現KA的互相負載,RS的互相負載。
RS1、RS2都添加環回網卡200:
KA1、KA2配置都一樣:
virtual_server 172.25.254.200 3306 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.40 3306 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 3306}}real_server 172.25.254.50 3306 {weight 1TCP_CHECK {connect_timeout 5retry 3delay_before_retry 3connect_port 3306}}
}
編輯/etc/my.cnf文件,測試的時候標識是哪臺數據庫
標識RS1:
標識RS2: