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  

nginx: download

 

上传解压

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

 

posted @   王路飞飞飞  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示