文章目录
1、Keepalived介绍
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
keepalived的工作原理:
keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。
2、Nginx介绍
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,
Nginx的特点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略;
2、Nginx对网络的依赖非常小;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
6、Nginx仅能支持http和Email;
3、Keepalived + nginx
keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
4、安装keepalived 2.0
环境
服务器系统版本:CentOS 7
两台服务器,一台做主节点,一台做备节点;
192.168.47.128 (主节点) 192.168.47.129 (备节点)
两台服务器都安装上 keepalived 2.0
# 安装依赖包:
[root@ chenc01 ~]# yum install -y libnl-devel libnl3-devel libnfnetlink-devel gcc openssl-devel
# 访问keepalived官网下载安装包:
[root@ chenc01 ~]# wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
# 解压keepalived安装包:
[root@ chenc01 ~]# tar -zxvf keepalived-2.0.18.tar.gz
# 安装keepalived:
[root@ chenc01 ~]# mkdir /usr/local/keepalived
[root@ chenc01 ~]# cd keepalived-2.0.18
[root@ chenc01 ~]# ./configure --prefix=/usr/local/keepalived
[root@ chenc01 ~]# make
[root@ chenc01 ~]# make install
# 检查keepalived版本号
[root@ chenc01 ~]# /usr/local/keepalived/sbin/keepalived -v
Keepalived v2.0.18 (07/26,2019)
Copyright(C) 2001-2019 Alexandre Cassen, <acassen@gmail.com>
# 复制keepalived配置文件到 /etc/keepalived/ 目录下:
[root@ chenc01 ~]# mkdir /etc/keepalived
[root@ chenc01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
(启动 keepalived 时,默认会去 /etc/keepalived 目录下找 keepalived.conf 文件)
# keepalived日志文件路径:/var/log/messages
配置keepalived
192.168.47.128(主节点)上操作:
# 将默认的配置文件内容清空,输入以下内容:
[root@ chenc01 ~]# vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { # 实例名称,VI_1即实例名。
state MASTER # 标记该节点是主节点(master)
interface eno16777736 # 配置vip绑定的网卡,eno16777736是网卡名,按照实际情况修改成你自己的网卡名。vip指的是虚拟ip地址。
virtual_router_id 51 # 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组。 priority 100 # 权重,数值大的节点是master。
advert_int 1 # 主备节点之间通讯的间隔秒数,用于判断主节点是否存活。
authentication {
auth_type PASS # 认证方式
auth_pass 1111 # 认证密码
}
virtual_ipaddress {
192.168.47.200 # vip地址
}
}
# 启动keepalived:
[root@ chenc01 ~]# systemctl start keepalived
# 查看主节点的地址信息:
[root@ chenc01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
valid_lft 1078sec preferred_lft 1078sec
inet 192.168.47.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 可以看到,已经出现了vip:192.168.47.200
192.168.47.129(备用节点)上操作:
# 编辑keepalived.conf配置文件:
[root@ chenc01 ~]# vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP # 标记该节点是备用节点(backup)
interface eno16777736 # 配置vip绑定的网卡,eno16777736是网卡名,按照实际情况修改成你自己###的网卡名。### vip指的是虚拟ip地址。
virtual_router_id 51 # 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组。
priority 66 # 权重,数值小的节点是backup。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.47.200 # 设置成跟主节点一样的vip地址。
}
}
# 启动 keepalived:
[root@ chenc01 ~]# systemctl start keepalived
# 查看备用节点的地址信息:
[root@ chenc01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0b:b4:73 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.129/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
valid_lft 1632sec preferred_lft 1632sec
inet6 fe80::6315:fec7:faef:82a3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 从上面可以看出,备用节点没有vip地址。vip地址在主节点上。
5、验证Nginx+keepalived高可用
在主备节点上都安装好nginx
# 下载nginx安装包
[root@ chenc01 ~]# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 解压nginx包
[root@ chenc01 ~]# rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装nginx
[root@ chenc01 ~]# yum -y install nginx
# 设置nginx开机自动启动
[root@ chenc01 ~]# systemctl enable nginx.service
# 查看nginx版本
[root@ chenc01 ~]# nginx -v
nginx version: nginx/1.16.1
打开浏览器,输入http://服务器ip地址,出现以下页面即表示安装成功:
安装好之后,编辑nginx的主页文件。
192.168.47.128 (主节点) 上操作:
[root@ chenc01 ~]# vi /usr/share/nginx/html/index.html
清空该文件的内容,输入以下内容:
nginx1
192.168.47.129 (备节点)上操作:
[root@ chenc01 ~]# vi /usr/share/nginx/html/index.html
清空该文件的内容,输入以下内容:
nginx2
接下来通过停止主节点的 keepalived服务来模拟故障。
192.168.47.128 (主节点) 上操作:
# 停止keepalived服务:
[root@ chenc01 ~]# systemctl stop keepalived
# 查看192.168.47.128 (主节点) 的地址信息:
[root@ chenc01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0b:b4:73 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
valid_lft 1632sec preferred_lft 1632sec
inet6 fe80::6315:fec7:faef:82a3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
192.168.47.129 (备节点)的地址信息:
[root@ chenc01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.129/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
valid_lft 1078sec preferred_lft 1078sec
inet 192.168.47.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 从上面可以看出,vip地址(192.168.47.129)跑到备用节点上去了。
因为vip地址在备用节点 192.168.47.129 上,所以访问vip地址会跳转到备用节点上。
接下来通过启用主节点的keepalived服务来模拟故障恢复。
查看192.168.47.129(备节点)上操作:
# 停止keepalived服务:
[root@ chenc01 ~]# systemctl stop keepalived
# 查看192.168.47.129(备节点)的地址信息:
[root@ chenc01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
valid_lft 1078sec preferred_lft 1078sec
inet 192.168.47.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 从上面可以看出,vip地址又回到了主节点上。
综上可以得出结论,主节点出故障后,备用节点会自动顶替主节点的位置,达到高可用的目的。
在现实环境中,把vip地址(或者vip地址对应的域名)提供给用户访问,以达到高可用的目的。