vrrp:virtual route redundent protocol,虚拟路由冗余协议,早期是为了让网络设备能够冗余的协议
vrrp stack checkers ipvs wrapper --> ipvs
1、本机的主机名要与hostname(uname -n)获得的名称保持一致;
修改主机名: CentOS 6: /etc/sysconfig/network CentOS 7: hostnamectl set-hostname HOSTNAME 各节点要能互相解析主机名,一般建议通过hosts文件进行解析
2、各节点时间同步
我们要搭建keepalived集群,就需要至少两个节点,这里准备了两个节点是:192.168.2.50和192.168.2.20
1.查看系统版本号,针对不同的版本号,配置主机名的方式不一样
# cat /etc/centos-release CentOS Linux release 7.4.1708 (Core)
2.配置主机名
(1)查看主机名
# hostname localhost.localdomain //发现两个节点的主机名都是localhost.localdomain
(2)修改主机名
将192.168.2.40这个节点的主机名更改为node1.ckh.com
将192.168.2.20这个节点的主机名更改为node2.ckh.com
由于我们有意的使用了两个版本的节点:一个是centos7版本,一个是centos6版本:
对于CentOS7: hostnamectl set-hostname node1.ckh.com 对于CentOS6: vim /etc/sysconfig/network
NETWORKING=yes HOSTNAME=node2.ckh.com
然后还要让两个节点能够互相解析对方:
# vim /etc/hosts //两台主机同样的配置
192.168.2.40 node1.ckh.com node1 192.168.2.20 node2.ckh.com node2
3 同步时间
(1) 查看两个节点的时间
# date;ssh node2 ‘date‘; //ssh可以配置成免密码登录,详情可见ssh的博文:https://www.cnblogs.com/ckh2014/p/14225428.html
2021年 02月 04日 星期四 23:03:09 EST //两个节点时间不同步 root@node2‘s password: 2021年 02月 03日 星期三 22:16:01 CST
(2)同步时间
可参照博文:https://www.cnblogs.com/ckh2014/p/14379120.html
4. 确保iptables和selinux不会成为服务的阻碍
centos4之后,keepalived就直接收录进yum源的base条目中了,所以,我们如果要使用keepalived的话,直接yum源安装就可以
# yum install keepalived -y
常看keepalived安装后生成等哪些文件
# rpm -ql keepalived
配置文件
/etc/keepalived/keepalived.conf
配置文件的组成部分:
GLOBAL CONFIGURATION:全局配置段
VRRPD CONFIGURATION:VRRP守护进程配置段
vrrp instance:虚拟路由器,可以有多个
vrrp synchronization group:vrrp同步组
LVS CONFIGURATION:lvs的配置段,也可以有多个
# cd /etc/keepalived # cp keepalived.conf{,.bak} # vim keepalived.conf
首先我们可以将所有的virtual_server全部注释掉,因为暂时用不到。
剩下的内容:配置文件的帮助文档:# man keepalived.conf
global_defs { //全局定义 notification_email { //当路由器任何一个节点(当然这里是keepalived实例)发生故障或其他原因,导致了VIP资源从一个节点转移到了另一个节点上,那我们应该通知管理员 acassen@firewall.loc //发邮件给这三个邮箱 failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc //发邮件时的发件人 smtp_server 192.168.200.1 //指明通过哪个邮件服务器发送邮件 smtp_connect_timeout 30 //超时时长 router_id LVS_DEVEL //定义当前物理设备的唯一标识 } vrrp_instance VI_1 { //虚拟路由实例,如果有多个示例的话,名称不能一样 state MASTER //自己的初始状态,状态只有两个:MASTER和BACKUP interface eth0 //vrrp主要是流动IP地址的,那这个IP地址是配置哪个网卡上呢 #use_vmac <VMAC_INTERFACE> //虚拟MAC,可以自己指定,也可以使用vrrp协议中的固定格式:比如:00-00-5E-00-01-{VRID}
virtual_router_id 51 //虚拟路由器id号:0-255之间的数字,唯一的;两个或两个以上的物理路由器可以做成一个虚拟路由,也可以做成多个虚拟路由,每一个虚拟路由有自己的唯一标识,
//而且这个虚拟路由id号也是作为虚拟MAC地址最后一段的数字的 priority 100 //定义优先级:0-255之间的数字 advert_int 1 //主节点需要周期性的向其他所有的备用节点通告自己的优先级和状态信息,即心跳,那这个心跳每隔多长时间发一次;这里表示:每隔多少秒发送一次心跳 authentication { //主节点发送的心跳信息不能随便接收,需要做验证,验证方式有简单字符验证和md5验证,这里使用的是简单字符验证 auth_type PASS //简单字符串 auth_pass 1111 //字符串为"1111" } virtual_ipaddress { //配置虚拟IP地址 192.168.200.16 192.168.200.17 192.168.200.18 } }
配置虚拟IP地址的格式:
virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> //brd:广播地址;scope:作用域,默认是全局的;label:别名 192.168.200.17/24 dev eth1 //可以直接使用默认的,直接使用ip命令加一个辅助地址 192.168.200.18/24 dev eth2 label eth2:1 }
vrrp其他配置:
nopreempt:非抢占模式,默认是抢占模式,
Note:
抢占模式:当keepalived的某台机器挂了之后VIP漂移到了备节点BACKUP,当主节点MASTER恢复后主动将VIP再次抢回。 非抢占模式:当主节点挂了再次起来后不再抢回VIP。两个节点的state都必须配置为BACKUP,两个节点都必须加上配置 nopreempt。
global_defs中配置示例:
global_defs { notification_email { root@localhost //邮件发给本机上root用户 } notification_email_from kaadmin@localhost //发件人为kaadmin@localhost;发件人可以伪装,所以发件人是谁可以随便定义 smtp_server 127.0.0.1 //将本机作为邮件服务器发送邮件 smtp_connect_timeout 30 router_id node2.ckh.com
vrrp_mcast_group4 224.18.0.100 //添加这一行:定义多播组,group4:ipv4的,group6:ipv6的 }
vrrp_instance VI_1配置示例:
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 81b998cd //验证时简单字符串为”81b998cd“ } virtual_ipaddress { 192.168.2.200/24 dev eth0 label eth0:0 //配置虚拟IP地址 } }
修改另一个节点的配置:
# scp keepalived.conf 192.168.2.50:/etc/keepalived/
# vim /etc/keepalived/keepalived.conf
state BACKUP
router_id node1.ckh.com priority 99
启动两个节点keepalived:
# systemctl start keepalived;ssh node2 ‘service keepalived start‘;
默认日志都记录在/var/log/messages中,如果想单独用一个文件来保存keepalived日志:
# man keepalived
keepalived [-f|--use-file=FILE] [-P|--vrrp] [-C|--check] [-l|--log-console] [-D|--log-detail] [-S|--log-facility={0-7}] [-V|--dont-release-vrrp] [-I|--dont-release-ipvs] [-R|--dont-respawn] [-n|--dont-fork] [-d|--dump-conf] [-p|--pid=FILE] [-r|--vrrp_pid=FILE] [-c|--checkers_pid=FILE] [-v|--version] [-h|--help]
只要在keepalived启动脚本中加上指明日志级别,再在rsyslog中开启就可以了
# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 3" //添加日志级别: -S 3
# vim /etc/rsyslog.conf
local3.* /var/log/keepalived.log
# service rsyslog restart
# service keepalived restart
另一个节点一样的操作,这样就可以单独用一个文件来查看keepalived日志
如果将MASTER上的keepalived服务结束掉,那么BACKUP上就会添加虚拟IP地址;当然,这里默认是抢占模式,所以一旦MASTER上启动keepalived服务,虚拟IP地址就又会被添加到原来的MASTER,BACKUP上虚拟IP地址又会删除掉。
如果我们期望手动的让主节点成为备用的节点,或者要将主节点升级一下,先升级备用节点。我们期望不停掉服务而手动的调度主节点,可以这么做,降低主节点的优先级就可以了。
配置如下:
# vim keepalived.conf
vrrp_script chk_maintanance { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 }
vrrp_instance VI_1 {
...
track_script { //在instance中添加 chk_maintanance }
}
这时候,只要在MASTER节点的/etc/keepalived目录中:# touch down;MASTER的虚拟IP地址就会删除,而BACKUP则配置有虚拟IP地址。
如果删除down文件,则MASTER上虚拟地址又回来了。
1.如果要实现LVS-NAT高可用,如何实现?
可以使用如下方法,定义同步组,定义两个instance:
vrrp_sync_group VG_1 { //定义同步组 group { VI_1 # name of vrrp_instance (below) VI_2 # One for each moveable IP. }
}
vrrp_instance VI_1 { //配置外网网卡
配置在eth0上,
还要有vip
}
vrrp_instance VI_2 { //配置内网网卡
配置在eth1上,
还要有dip
}
上面的情况,在任何时候,总有一个节点是空闲的。我们可以做双主模型,让两个路由器都工作起来,各承担一部分工作。我们这里先不考虑dip内网地址的情形,我们可以对同一个域名解析为两个A记录,虚拟ip1和虚拟ip2,而且都配置在外网接口上,配置成两个别名,eth:0和eth:1,这样做的好处是:客户端请求解析时,有一部分人访问的是虚拟ip1,有一部分人访问的是虚拟ip2。
所以仍然需要做两个instance,只是对于第一个实例来说,node1上优先级高,node2上优先级低,虚拟地址在node1;对于第二个实例来说,虚拟地址在node2,node2优先级高,node1优先级低。
一旦node1故障,虚拟ip1就会流动到node2上,这时候两个虚拟ip都在node2上; 一旦node1上线,虚拟ip1再回到node1,这样就实现了均衡效果,这样的情况就不能同步进退了。
配置如下:
对于192.168.2.20这个节点:
我们需要增加一个instance:
vrrp_instance VI_2 { state BACKUP //VI_1是MASTER的话,就将这里的VI_2设为BACKUP interface eth //第二个虚拟iP我们同样配置在外网网卡eth0上 virtual_router_id 52 //虚拟路由id号改一下,和vrrp_instance VI_1中不一样 priority 99 //这里是备节点,优先级就设置低一点 advert_int 1 vrrp_mcast_group4 224.18.0.102 authentication { auth_type PASS auth_pass 81b998ce //简单字符认证这里的字符改一下,表示另一组vrrp_instance } virtual_ipaddress { 192.168.2.110/24 dev eth0 label eth0:1 //这里我们需要配置另外一个外网地址 } }
对于192.168.2.40:arrp_instance VI_1的配置我们不需要修改,我们只需要加一个VI_2的实例配置:
vrrp_instance VI_2 { state MASTER //node1中是BACKUP,node2就为MASTER interface eth0 //同样虚拟ip配置在外网接口eth0上 virtual_router_id 52 //这里要和node1中的虚拟路由id一样 priority 100 //优先级闭BACKUP高 advert_int 1 vrrp_mcast_group4 224.18.0.102 //组播地址两个节点中要一样 authentication { auth_type PASS auth_pass 81b998ce //这里也要和node1中字符串一样 } virtual_ipaddress { 192.168.2.110/24 dev eth0 label eth0:1 //配置另一个外网ip } }
在vrrp_instance中的主机状态发生变化时,发送警告信息:
# notify scripts, alert as above //我们要写一个scripts notify_master <STRING>|<QUOTED-STRING> //只有当当前节点转换为MASTER时,就发送这里指明的通知信息 notify_backup <STRING>|<QUOTED-STRING> //只有当当前节点转换为BACKUP时,就发送这里指明的通知信息 notify_fault <STRING>|<QUOTED-STRING> //当前节点转换为fault状态时,就发送这里的通知信息 notify <STRING>|<QUOTED-STRING> //只要状态发生改变,就发送通知 smtp_alert
示例:
notify_master "/etc/keepalived/notify.sh master" //我们自己定义通知脚本,传递不同的参数
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
notify.sh脚本内容如下:
将notify.sh复制一份给node1
# cd /etc/keepalived
# scp notify.sh node1:/etc/keepalived/
在keepalived.conf配置文件中配置通知
# vim keepalived.conf
在vrrp_instance VI_1中添加:
notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
复制这三行到node2节点的keepalived配置文件中
重启keepalived服务,然后两个节点都会收到一封邮件。
下面我们来实现keepalived另一个重要的功能:提供ipvs规则
LVS configuration
Virtual server group(s) //多个虚拟服务器可以分组
Virtual server(s)
Virtual server(s)有三种定义方式: vip vport //地址加端口的方式,这种方式支持tcp和udp fwmark <INT> //防火墙标记的方式 (virtual server) group <STRING> //virtual server中通过group的方式定义,这种方式很少用到
Virtual server配置说明:
virtual_server IP port | virtual_server fwmark int | virtual_server group string //三种定义方式
{ //相关参数定义
delay_loop <INT> //keepalived不仅仅能够实现lvs规则的自动生成,还能够对各Real Server做健康状态检测;这个参数表示每隔多久向各Real Server发送一次健康状态探查命令;这里不光指定多久,还能指定多少次
lb_algo rr|wrr|lc|wlc|lblc|sh|dh //负载均衡的调度算法
ops //UDP每发一次报文都是一个新请求,这里表示是不是对UDP发送的每一个报文都单独调度,否则还可以计时限,让ipvs时限追踪效果
lb_kind NAT|DR|TUN //lvs的类型
persistence_timeout <INT> //持久时长,如果不要做持久的话,就定义为0
protocol TCP //目前只能指明TCP,如果要使用UDP的话,就是用上面的ops参数
ha_suspend //如果没有设置虚拟IP地址的话,就不要做健康状态监测了
VirtualHost <STRING> //对哪一个虚拟主机做HTTP_GET或SSL_GET健康状态监测
sorry_server <IPADDR> <PORT> //当所有的Real Server都挂了,我们找一个主机用来提示错误信息
real_server <IPADDR> <PORT> //定义一个Virtual server中有哪些Real Server
{
weight <INT> //权重
notify_up <STRING> | <QUOTED-STRING> //每一个real server上线时通知
notify_down <STRING> | <QUOTED-STRING> //每一个real server宕机时通知
//健康状态检测机制:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK //前两种是应用层协议的,一个专用于http协议的,一个专用于https;
//SMTP_CHECK:专用于SMTP协议的,如果rs是smtp server的话可以使用SMTP_CHECK检测
//TCP_CHECK:传输层检测;MISC_CHECK:其他的检测方式;如果是mysql服务器的话,可以使用TCP_CHECK或MISC_CHECK
HTTP_GET|SSL_GET //使用其中一个健康状态检测方式
{
url { //既然是健康状态检测,我们要向哪个URL发起秦秋
path <STRING> //URL路径
status_code <INT> //取得的结果有两种判定方式;第一种:只要状态码为200就认为是正确的
digest <STRING> //第二种:获取一个资源页面以后,我们对页面做校验码计算,(只要这个页面中内容使我们期望的内容,它的校验码都不会变。)每一次取得,只要两次校验码一样,我们就认为是通过的。
}
nb_get_retry <INT> //请求重试几次我们认为是错误的
delay_before_restry <INT> //每一次重试之前,我们要等多长时间
connect_ip <IP ADDRESS> //对哪个主机做健康状态检查
bindto <IP ADDRESS> //在本机哪个接口上发出健康状态检测
bind_port <PORT> //本机PORT
connect_timeout <INTERGE> //连接超时时间
fwmark <INTERGE> //基于fwmark方式检测
warmup <INT> //健康状态检测时可以打散了去检测
}
TCP_CHECK
{
connect_ip <IP ADDRESS> //扫描哪个IP
connect_port <PORT> //扫描哪个端口
connect_timeout <INTEGER> //连接超时时长
}
... //其他方式就不多说明了
}
}
首先,我们先搭建一个LVS-DR示例:
(1)准备两个节点做为Real Server
RS1:192.168.2.50 RS2:192.168.2.80
vip:192.168.2.120
director1:192.168.2.20
director2:192.168.2.40
并且都安装httpd服务,为各RS添加index.html测试页面
# echo "rs1 web server" > /var/www/html/index.html # echo "rs2 web server" > /var/www/html/index.html
启动httpd服务。
各RS配置vip: 写一个脚本编译配置:dr.sh
#!/bin/bash # vip=192.168.2.120 host="-host" case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask 255.255.255.255 broadcast $vip up route add $host $vip dev lo:0 ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 down ;; esac
执行脚本:./dr.sh start
(2)在第一个director上配置vip,然后配置ipvsadm规则
director1:192.168.2.20
vip:192.168.2.120
先安装ipvsadm
# yum install ipvsadm -y
配置vip
# ifconfig eth0:0 192.168.2.120/32 broadcast 192.168.2.120 up
# route add -host 192.168.2.120 dev eth0:0
在director1上添加ipvs规则
# ipvsadm -A -t 192.168.2.120:80 -s rr # ipvsadm -a -t 192.168.2.120:80 -r 192.168.2.50 -g -w 1 # ipvsadm -a -t 192.168.2.120:80 -r 192.168.2.80 -g -w 2
访问都没问题。
下面我们使用keepalived来实现这个功能
1、先清空ipvs规则
# ipvsadm -C
2、删除配置的vip
# ifconfig eth0:0 down
3、准备第二个director,配置ipvsamd规则及vip,测试能够正常使用
然后也将vip删除,清空ipvs规则
4、现在我们在两个director上安装httpd服务,我们要提供sorry server服务
# echo "Sorry,under maintanance" > /var/www/html/index.html
启动httpd服务。
5、两个director上安装keepalived,并对keepalived进行配置
完整配置:
! Configuration File for keepalived global_defs { notification_email { root@localhost //修改邮箱 } notification_email_from kaadmin@localhost //发件人 smtp_server 127.0.0.1 //本机作为邮件服务器 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_maintanance { //写一个脚本判断是否有down这个文件,并进行MASTER和BACKUP流转 script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 84ae57f7 //随机字符串建议不要随便取:# openssl rand -hex 4 } virtual_ipaddress { 192.168.2.120/32 dev eth0 label eth0:0 //配置vip } track_script { //检测脚本 chk_maintanance } notify_master "/etc/keepalived/notify.sh master" //通过notify.sh进行通知 notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 192.168.2.120 80 { //虚拟服务器,地址为vip,端口为80 delay_loop 6 lb_algo rr lb_kind DR //lvs类型 nat_mask 255.255.255.0 //掩码 protocol TCP //协议
sorry_server 127.0.0.1 80 //sorry server的定义
real_server 192.168.2.50 80 { //Real Server1 weight 1 //权重 HTTP_GET { url { path / status_code 200 //这里只对根路径进行访问来判断健康状态,只要响应码是200就通过 } connect_timeout 3 nb_get_retry 3 //重试几次 delay_before_retry 3 //重试之前延迟多久 } } real_server 192.168.2.80 80 { //Real Server2 weight 2 //权重2 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
记得再添加一个脚本notify.sh,上面已有示例可参考。
我们现在让其中一个Real Server停止httpd服务,会发现在director中的ipvs规则会少一个条目,当Real Server中再次启用httpd服务,ipvs中规则又会增加一条。
如果我们让director下线一个(创建down文件:# touch down),会发现虚拟ip地址流转到另一个director上了。
原文:https://www.cnblogs.com/ckh2014/p/14383666.html