用keepalived配置高可用
搭建高可用集群
高可用集群,即“HA集群”,也常称作“双机热备”,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。
Keepalived 工作原理
在讲述keepalived工作原理之前,大家先来了解一个协议VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时 master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
而keepalived就是采用这种VRRP协议实现的高可用。keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析; check模块负责健康检查;vrrp模块用来实现VRRP协议。
1.基础准备
(1)准备两台机器
准备两台机器130和132,130作为master,132作为backup
Master:
Backup:
(2)改名
Master:
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
Backup:
[root@localhost ~]# hostnamectl set-hostname backup
[root@localhost ~]# bash
(3)安装yum源
在两台虚拟机上:
[root@master ~]# mkdir /opt/centos
[root@master ~]# mount /dev/cdrom /opt/centos
mount: /dev/sr0 写保护,将以只读方式挂载
[root@master ~]# mv /etc/yum.repos.d/* /media
[root@master ~]# vi /etc/yum.repos.d/local.repo
[centos7]
name=centos7
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
(4)关闭防火墙
在两台虚拟机上:
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
2.安装keepalived
安装 keepalived 使用 yum 方式直接安装即可,该方式会自动安装依赖。安装 keepalived 命令:
[root@master ~]# yum -y install keepalived
在两个节点上:
安装完成后可以输入 rpm -q -a keepalived 命令检验安装是否成功:
[root@backup ~]# rpm -q -a keepalived
通过 yum 方式安装的 keepalived 在安装完成之后,会在 /ect 目录下生成一个 keepalive 目录,该目录下存放着 keepalived 的配置文件 keepalived.conf :
[root@master ~]# cd /etc/keepalived/
[root@master keepalived]# ls
keepalived.conf
3.安装nginx
安装4个依赖
[root@backup ~]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
有些系统还需要多安装几个依赖
[root@master ~]# yum -y install make gcc-c++ libtool
[root@backup ~]# yum -y install wget
[root@master ~]# wget http://nginx.org/download/nginx-1.13.7.tar.gz
[root@master ~]# tar -zxvf nginx-1.13.7.tar.gz
[root@backup ~]# cd nginx-1.13.7
[root@backup nginx-1.13.7]# ./configure --prefix=/usr/local/nginx
[root@backup nginx-1.13.7]# make && make install
修改nginx首页面内容为节点的ip地址,方便测试观察
[root@master nginx-1.13.7]# vi /usr/local/nginx/html/index.html
<body>
<h1>192.168.147.130</h1>
4.启动nginx
[root@backup nginx-1.13.7]# cd /usr/local/nginx/sbin
[root@backup sbin]# ./nginx
防火墙开启80端口
[root@backup sbin]# firewall-cmd --permanent --add-port=80/tcp
FirewallD is not running
[root@backup sbin]# firewall-cmd --reload
FirewallD is not running
5.浏览器访问nginx
http://192.168.147.130
6.编辑配置文件
(1)编辑master(主)节点配置文件
[root@master ~]# vi /etc/keepalived/keepalived.conf
#全局配置
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
#路由id,不能重复,通常为hostname
router_id 192.168.147.130
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
#如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
#如果脚本执行结果为0,并且weight配置的值小于0,则优先级相应的减少。
#其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
#检测nginx状态的脚本路径
script "etc/keepalived/nginx_check.sh"
#每2秒运行一次上面的脚本
interval 2
#失败一次,将自己的优先级-20,如果master的priority=100,backup的priority=70
#那么master要失败2次后变为60,低于backup的70,master节点会降级为backup,而backup节点升级为master
weight -20
}
#定义实例
vrrp_instance VI_1 {
#可选值为master或者backup
state MASTER
#网卡名称,与本机IP地址所在的网卡名称相同
interface eth0
#虚拟路由的id,master和backup必须是一致的。
virtual_router_id 51
#定义优先级,数字越大,优先级越高,master的优先级必须大于backup的优先级
priority 100
#设定master与backup负载均衡之间同步检查的时间间隔,单位为秒
advert_int 1
#设置验证类型和密码,两个节点必须一致
authentication {
#认证方式,此处pass表示为密码
auth_type PASS
#生产环境设置6位随机密码
auth_pass 123456
}
#设置虚拟IP地址
virtual_ipaddress {
192.168.147.250
}
#执行脚本
track_script {
#对应vrrp_script配置的脚本
chk_nginx
}
}
(2)编辑backup(备)节点配置文件
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
#路由id,不能重复,通常为hostname
router_id 192.168.147.132
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
(3)编写nginx状态检测脚本
[root@master ~]# vi /etc/keepalived/nginx_check.sh
#keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instabce的优先级。
#如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
#如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
#其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
then
exit 0
else
exit 1
fi
给脚本添加执行权限
[root@master ~]# chmod 755 /etc/keepalived/nginx_check.sh
[root@backup ~]# chmod 755 /etc/keepalived/nginx_check.sh
(4)开启组播防火墙
centos7放行组播地址224.0.0.18,协议vrrp
[root@master ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success
[root@master ~]# firewall-cmd --reload
success
[root@master ~]# firewall-cmd --permanent --direct --get-all-rules
--direct:指定将要使用直接规则
--permanent:表示永久生效 ,没有此参数重启后失效
--add-rule ipv4 filter:表示添加一个新的策略
设置一条IPV4规则,表为防火墙表 :filter, 处理输入数据包 INPUT ,0 代表在头部添加。后面就是常用的iptables语法
--in-interface ens33:设置网卡名,这里我的网卡名是ens33
--destination 224.0.0.18:设置目标ip地址,也就是设置放行组播地址224.0.0.18
--protocol vrrp:设置拦截的协议
-j ACCEPT:表示放行,-j DROP表示丢弃(不放行)
(5)启动keepalived
启动
[root@master ~]# systemctl start keepalived.service
重启
[root@master ~]# systemctl restart keepalived.service
停止
[root@master ~]# systemctl stop keepalived.service
查看运行状态
[root@master ~]# systemctl status keepalived
查看运行进程
[root@master ~]# ps -ef|grep keepalived
Master(主)节点成功标志
[root@master ~]# ip addr
可以看到,192.168.147.130拿到了VIP192.168.147.250.
Backup(备)节点成功标志
[root@backup ~]# ip addr
Backup上只有192.168.147.132这个ip,正常。
注意:master节点正常的情况下,backup节点一定不会有浮动IP,也就是VIP只能同时在一个节点上。
(6)验证VIP漂移
我们先关闭master,验证VIP是否会飘移到backup上。
关闭master(主)节点的keepalived:
[root@master ~]# systemctl stop keepalived.service
可以看到,VIP已经没了。
VIP已经成功飘到backup节点上了。
7.keepalived+nginx的高可用测试
访问浮动VIP
http://192.168.147.250
正常情况下,浮动ip飘到master(主)节点上,所以访问后显示的主节点的nginx首页
如果杀掉 MASTER(主)节点的 nginx 。如果nginx进程不存在脚本返回1,nginx进程存在脚本返回0。
脚本返回0,表示nginx进程存在,由于上面配置的weight为负数,priority 不会改变。
脚本返回1,表示nginx进程不存在,由于上面配置的weight为负数,priority 会减少,减少后的值 priority = priority+weight
失败一次,将自己的优先级-20,我这里MASTER的priority=100,BACKUP的priority=99
那么MASTER要失败1次后变为80,低于BACKUP的99,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
提示:以上脚本判断推出码是0还是1,正常退出时0,非正常退出为1;
退出码1就把对应节点的优先级降低20(通常这个降低的值要大于两节点优先级之差就行,意思就是降低后的优先级要小于备份节点优先级,这样才有意义);
脚本执行连续3次检测都为成功状态(脚本退出码都为0),则keepalived就标记该实例为OK状态,并会一直检测下去,
如果连续3次检查都为失败状态(退出码1),则标记对应实例为KO状态;
一旦标记对应实例为失败状态就会触发当前节点的优先级降低;
从而在通告心跳时,会通告降低后的优先级,从而实现备份节点接管VIP来完成vip转移。
杀掉master(主)节点的nginx后,再次访问VIP
8.常见错误
●keepalived 配置了虚拟ip,发现无法ping 通这个虚拟ip。
解决方法,把配置文件中的 vrrp_strict 给注释掉,重启 keepalived 服务后再次ping就可以了。
●网卡名称与本机ip地址所在的网卡名称一点要一致。
●配置优先级的时候,一点要区分开,否则验证的时候会区分不开。
●测试的时候,如果关闭nginx服务,虚拟ip还是在master上,那就是由于脚本的设计,关闭nginx后服务又自动起来了,可以把脚本这一行注释掉即可。
●关闭nginx服务可以注释脚本也可以把nginx的配置打乱或故意写错都可以解决这个问题。
标签:优先级,root,keepalived,nginx,集群,master,backup From: https://blog.csdn.net/Gao0Yuu/article/details/142387310