简介:
vrrp, virtual routing redundant protocol, 虚拟路由协议, 是为了解决局域网中配置静态网关出现单点失败现象的路由协议; 设计目标时是支持特定情况下IP数据流量失败转移不会引起混乱, 允许主机使用单路由器, 以及及时在实际第一跳路由器使用失败的情形下, 仍然能够维护路由器间的连通性. keepalived的是vrrp协议的软件实现; 作用是检测服务器的状态, 如果有一台web服务器死机, 或工作出现故障, keepalived将检测到, 并将有故障的服务器从系统中剔除, 同时使用其他服务器代替该服务器的工作, 当服务器工作正常后keepalived自动将服务器加入到服务器集群中, 这些工作全都自动完成, 不需要人工干涉, 需要人工做的只是修复故障的服务器.
keepalived的安装前提:
(1) 各节点时间必须同步;
(2) 确保iptables及selinux不会成为阻碍;
(3) 各节点之间可通过主机名互相通信(对KA并非必须);
建议使用/etc/hosts文件实现;
(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;
keepalived的安装配置
程序环境:
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service
配置文件组件部分:
TOP HIERACHY GLOBAL CONFIGURATION Global definitions Static routes/addresses VRRPD CONFIGURATION VRRP synchronization group(s) VRRP instance(s) LVS CONFIGURATION Virtual server group(s) Virtual server(s)
配置语法
1. 配置虚拟路由器
vrrp_instance <STRING> { .... }
专用参数:
state MASTER|BACKUP #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP; interface IFACE_NAME #绑定为当前虚拟路由器使用的物理接口; virtual_router_id VRID #当前虚拟路由器的惟一标识,范围是0-255; priority 100 #当前主机在此虚拟路径器中的优先级;范围1-254; advert_int 1 #vrrp通告的时间间隔; authentication { auth_type AH|PASS auth_pass <PASSWORD> } virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } track_interface { eth0 eth1 ... } #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态; nopreempt #定义工作模式为非抢占模式; preempt_delay 300 #抢占式模式下,节点上线后触发新选举操作的延迟时长; #定义通知脚本 notify_master <STRING>|<QUOTED-STRING> #当前节点成为主节点时触发的脚本; notify_backup <STRING>|<QUOTED-STRING> #当前节点转为备节点时触发的脚本; notify_fault <STRING>|<QUOTED-STRING> #当前节点转为“失败”状态时触发的脚本; notify <STRING>|<QUOTED-STRING> #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
2. 虚拟服务器
配置参数
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... }
常用参数
delay_loop <INT> #服务轮询的时间间隔 lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法 lb_kind NAT|DR|TUN #集群的类型 persistence_timeout <INT> #持久连接时长 protocol TCP #服务协议, 仅支持TCP sorry_server <IPADDR> <PORT> #备用服务器地址 real_server <IPADDR> <PORT> { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机的健康状态检测方法 } HTTP_GET|SSL_GET { url { path <URL_PATH> #定义要监控的URL status_code <INT> #判断上述检测机制为健康状态的响应码 digest <STRING> #判断上述检测机制为健康状态的响应的内容的校验码 } nb_get_retry <INT> #重试次数 delay_before_retry <INT> #重试之前的延迟时长 connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址 bind_port <PORT> #发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER> #连接请求的超时时长 } TCP_CHECK { connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址 bind_port <PORT> #发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER> #连接请求的超时时长 }
配置示例
示例一: 单主模型
前提:
1. 在两台server上添加/etc/hosts解析文件
2. 建立ssh的连接
步骤:
在node1上生成自己的公钥
ssh-keygen -t rsa -P ''
将自己的公钥拷贝给node2
ssh-copy-id -i .ssh/id_rsa.pub root@node2
同样的在node2上建立与node1的连接
4. 确定ssh通信是否成功, 同时确定时间是否完全同步
date && ssh node2 'date'
若不能同步, 使用ntpdate TIME_SERVER_IP同步
直到时间完全同步为止
配置文件
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19 #需要打开多播, # ip link set dev eno16777736 multicast on } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 15 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.52.123/24 dev 16777736 } }
配置完之后, 实验, 当两个同时启动, IP地址主节点上, 当主节点的服务停止后, 备用节点将IP地址拿到; 当主节点的服务启动后, 又把IP地址抢回来.
示例二: 双主模型
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 #两个虚拟路由ID要不同 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.234/16 dev eno16777736 } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 168 #与上边的虚拟路由要不同 priority 98 advert_int 1 authentication { auth_type PASS auth_pass b823e7f0 } virtual_ipaddress { 10.1.52.235/16 dev eno16777736 } }
首先启动第一个节点, 能够拿到两个IP, 当第二节点也启动后, 将备用IP抢夺过去; 第一个节点服务停止后, 第二个节点能够将另外一个IP地址也拿到;
示例三: 基于lvs-dr模型的keepalived单主实践
规划:
10.1.52.2和10.1.52.3当做RS主机, 安装httpd, 搭建lvs-dr.
10.1.52.11和10.1.51.22提供负载均衡
RS配置脚本
#!/bin/bash # vip='10.1.52.123' vport='80' netmask='255.255.255.255' iface='lo:0' 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 $iface $vip netmask $netmask broadcast $vip up route add -host $vip dev $iface ;; stop) ifconfig $iface down 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 esac
提供负载均衡主机的keepalived配置文件
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.123/16 dev eno16777736 } } virtual_server 10.1.52.123 80 { delay_loop 3 virtual_server 10.1.52.123 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
示例四: 基于lvs-dr模型的双主实践
规划:
10.1.52.2和10.1.52.3当做RS主机, 安装httpd, 搭建lvs-dr.
10.1.52.11和10.1.51.22提供负载均衡
RS配置脚本
#!/bin/bash # vip_1='10.1.52.123' vip_2='10.1.52.124' vport='80' netmask='255.255.255.255' iface_1='lo:0' iface_2='lo:1' 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 ${iface_1} ${vip_1} netmask $netmask broadcast ${vip_1} up route add -host ${vip_1} dev ${iface_1} ifconfig ${iface_2} ${vip_2} netmask $netmask broadcast ${vip_2} up route add -host ${vip_2} dev ${iface_2} ;; stop) ifconfig $iface_1 down ifconfig $iface_2 down 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 esac
其中一台keepalived服务的配置示例
global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_mcast_group4 224.0.52.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 167 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.123/16 dev eno16777736 } } virtual_server 10.1.52.123 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 163 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 536ecfc2 } virtual_ipaddress { 10.1.52.124/16 dev eno16777736 } } virtual_server 10.1.52.124 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 10.1.52.2 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.52.3 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
原创文章,作者:black_fish,如若转载,请注明出处:http://www.178linux.com/56582