Keepalivedg高可用
keepalived介绍
Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如: Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
Keepalived三个重要功能
- 管理LVS负载均衡
- 对LVS节点做健康检查(基于端口和URL)healthcheck
- VRRP高可用 ★failover
Keepalived高可用故障切换转移原理
- keepalived之间通过VRRP实现高可用的。
- 通过竞选机制实现高可用,或者说是配置优先级,大的是主,小的是备。
Keepalived服务正常工作时,主master节点会不断地向备节点发送(多播的方式)心跳消息用来告诉Backup自己还活着,当主Master节点发生故障就无法发送心跳消息了,备节点就无法检测到来自Master节点的心跳了,备节点进而调用自身接管程序,接管主Master节点的IP资源和服务。而当主Master节点恢复时,备Backup服务全部交给主Master节点。
VRRP
1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3)VRRP是用过P多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
Keepalived
Keepalived高可用对之间是通过VRRP协议进行通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
准备两个节点
配置 | ip | 名称 |
4h4g | 192.168.174.132 | master |
4h4g | 192.168.174.133 | node |
Nginx的安装
下载nginx
上传解压
tar -xvf nginx-1.20.2.tar.gz #解压到当前文件夹也可
准备编译工具
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
工具名称 | 环境介绍 |
---|---|
gcc | 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境 |
PCRE | PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库,nginx 的 http 模块使用 pcre 来解析正则表达式 |
pcre-devel | pcre-devel 是使用 pcre 开发的一个二次开发库 |
zlib | zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip |
OpenSSL | OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http) |
编译安装
cd nginx-1.20.2 #进入到文件夹中
./configure --with-http_stub_status_module --with-http_ssl_module --with-debug #执行编译脚本
make && make install #编译安装
注意:这里执行编译脚本时,没有设置地址,默认地址为/usr/local/nginx
配置环境变量
vim /etc/profile #进入配置文件
export PATH=/usr/local/nginx/sbin:$PATH
source /etc/profile #刷新配置文件
此时输入nginx就启动了nginx
Keepalived的安装
Keeaplived对版本要求并不是很高,所以这里用yum安装即可。
yum install -y keepalived #安装keepalived
此时两个节点,master和node都安装了keepalived和nginx
1.配置keepalived
在master节点配置
1 vim /etc/keepalived/keepalived.conf #进入配置文件 2 #配置文件中有很多用不到的功能,这里只讲和修改用到的 3 4 ! Configuration File for keepalived 5 6 global_defs { 7 notification_email { #自带的邮件提醒功能 8 1182350036@qq.com #表示发送通知邮件时邮件源地址是谁 9 } 10 notification_email_from test@test.com#表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个 11 smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现 12 smtp_connect_timeout 30 #连接smtp连接超时时间 13 router_id a136 #机器标识,在一个网络应该是唯一的 14 #这里还有4个配置,也一并删除 15 } 16 17 vrrp_script chk_config { #脚本配置 18 script "/usr/local/sbin/check_ng.sh" #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态 19 interval 3 #检查时间间断是3秒 20 } 21 22 vrrp_instance VI_1 { #VRRP配置标识 VI_1是实例名称 23 state MASTER #定义master相关 24 interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名 ens33和eth33要注意别写错。 25 virtual_router_id 136 #定义路由器ID ,配置的时候和从机器一致 26 priority 100 #权重,主角色和从角色的权重是不同的,一般主比从大 27 advert_int 1 #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒 28 authentication { #认证相关信息 29 auth_type PASS #认证类型 30 auth_pass 1111 #密码的形式是一个字符串 31 } 32 virtual_ipaddress { #虚拟IP 33 192.168.218.100 34 } 35 track_script{ #跟踪执行脚本 36 chk_nginx 37 } 38 } 39 #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!! 40 #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!! 41 #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!! 42 virtual_server 192.168.200.100 443 { 43 delay_loop 6 44 lb_algo rr 45 lb_kind NAT 46 persistence_timeout 50 47 protocol TCP 48 49 real_server 192.168.201.100 443 { 50 weight 1 51 SSL_GET { 52 url { 53 path / 54 digest ff20ad2481f97b1754ef3e12ecd3a9cc 55 } 56 url { 57 path /mrtg/ 58 digest 9b3a0c85a887a256d6939da88aabd8cd 59 } 60 connect_timeout 3 61 nb_get_retry 3 62 delay_before_retry 3 63 } 64 } 65 } 66 67 virtual_server 10.10.10.2 1358 { 68 delay_loop 6 69 lb_algo rr 70 lb_kind NAT 71 persistence_timeout 50 72 protocol TCP 73 74 sorry_server 192.168.200.200 1358 75 76 real_server 192.168.200.2 1358 { 77 weight 1 78 HTTP_GET { 79 url { 80 path /testurl/test.jsp 81 digest 640205b7b0fc66c1ea91c463fac6334d 82 } 83 url { 84 path /testurl2/test.jsp 85 digest 640205b7b0fc66c1ea91c463fac6334d 86 } 87 url { 88 path /testurl3/test.jsp 89 digest 640205b7b0fc66c1ea91c463fac6334d 90 } 91 connect_timeout 3 92 nb_get_retry 3 93 delay_before_retry 3 94 } 95 } 96 97 real_server 192.168.200.3 1358 { 98 weight 1 99 HTTP_GET { 100 url { 101 path /testurl/test.jsp 102 digest 640205b7b0fc66c1ea91c463fac6334c 103 } 104 url { 105 path /testurl2/test.jsp 106 digest 640205b7b0fc66c1ea91c463fac6334c 107 } 108 connect_timeout 3 109 nb_get_retry 3 110 delay_before_retry 3 111 } 112 } 113 } 114 115 virtual_server 10.10.10.3 1358 { 116 delay_loop 3 117 lb_algo rr 118 lb_kind NAT 119 persistence_timeout 50 120 protocol TCP 121 122 real_server 192.168.200.4 1358 { 123 weight 1 124 HTTP_GET { 125 url { 126 path /testurl/test.jsp 127 digest 640205b7b0fc66c1ea91c463fac6334d 128 } 129 url { 130 path /testurl2/test.jsp 131 digest 640205b7b0fc66c1ea91c463fac6334d 132 } 133 url { 134 path /testurl3/test.jsp 135 digest 640205b7b0fc66c1ea91c463fac6334d 136 } 137 connect_timeout 3 138 nb_get_retry 3 139 delay_before_retry 3 140 } 141 } 142 143 real_server 192.168.200.5 1358 { 144 weight 1 145 HTTP_GET { 146 url { 147 path /testurl/test.jsp 148 digest 640205b7b0fc66c1ea91c463fac6334d 149 } 150 url { 151 path /testurl2/test.jsp 152 digest 640205b7b0fc66c1ea91c463fac6334d 153 } 154 url { 155 path /testurl3/test.jsp 156 digest 640205b7b0fc66c1ea91c463fac6334d 157 } 158 connect_timeout 3 159 nb_get_retry 3 160 delay_before_retry 3 161 } 162 } 163 }
node节点
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id a137 } vrrp_script chk_config{ script "/usr/local/sbin/check_ng.sh" interval 3 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 136 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.100 } track_script{ chk_config } }
设置脚本,两个节点的脚本皆是如此
[master/node] vim /usr/local/sbin/check_ng.sh #在两个节点中创建脚本文件,内容如下:
d='date --date today +%Y%m%d_%H:%M:S'
n='ps -C nginx --no-heading|wc -l'
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2='ps -C nginx --no-heading|wc -l'
if [ $n -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
2.重启nginx和keepalived
创建nginx.service配置nginx自启
我们用tar包安装的时候,虽然配置了环境变量,但是依然无法使用systemctl控制nginx的启动,所以创建文件设置自启!
[master/node]vim /lib/systemed/system/nginx.serivce
#写入以下内容
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx #这里注意nginx的位置
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[master/backup]systemctl enable nginx #设置nginx自启
[master/backup]systemctl enable keepalived #设置keepalived自启
[master/backup]systemctl restart nginx keepalived #重启两个服务
查看高可用
前面我们给两个节点配置的IP为192.168.174.100
,并且网卡中会出现该IP!所以通过192.168.174.100
就可以进入主节点的nginx服务器。
此时192.168.174.100
进入的是master的123456
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)