keepalived
1 要先对时间进行同步
时间服务器:
# yum install ntp ntpdate
# vim /etc/ntp.conf
restrict 192.168.10.10 nomodify notrrap nopeer noquery \\ 加上
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap \\ 允许192.168.10.0 网段访问
server 127.127.1.0 \\ 其他的server注释掉
Fudge 127.127.1.0 stratum 10 \\ 想配置本地时间服务器server 127.127.1.0 必须这样写
# systemctl restart ntpd \\ 已经运行ntpd,就不能用ntpdate来更新时间了
# ss -unl \\ udp123 端口被监听
# systemctl enable ntpd
# ntpdate 192.168.10.10 \\ 可在另一台机器上 同步此时间服务器的时间
网络时间同步
# ntpdate 0.asia.pool.ntp.org
# hwclock \\ 查看硬件时间
# hwclock -w \\ 将软件时间写入到硬件时间
# hwclock -r \\ 读取硬件时间
# ssh 192.168.10.11 'date'; date \\ 对比查看两个服务器时间 是否相同
2 各节点要能互相解析主机名: 一般建议通过hosts文件进行解析
修改主机名:
# hostname \\ 查看主机名
# hostname teo10.10 \\ 设置主机名 临时
# hostnamectl set-hostname Teo10.10 \\ 永久设置主机名 直接就有效
# vim /etc/hostname \\ 配置文件 永久设置主机名 重启才有效
teo10.10 \\ CentOS 6 /etc/sysconfig/network
# vim /etc/hosts \\ hosts文件
176.16.10.10 teo10.10 \\ 对方机器ip及主机名
# systemctl restart network.service \\ 使之生效
3 确保iptables及selinux不会成为服务的阻碍
keepalived 两台httpd机器做高可用 实例 \\ 首先分别安装httpd
# yum install keepalived \\ 两台机器都需要安装
# vim /etc/keepalived/keepalived.conf \\ 可直接替换使用 详细配置文件看最后详解
:.,$s/^/#/g \\ 从当前行到最后一行所有行首加#注释掉 virtual_server 可以注释掉
global_defs { \\ 全局定义
notification_email { \\ 警告信息 发送邮件
root@localhost \\ 收件人的邮箱 定义邮件服务使用
}
notification_email_from teo@localhost \\ 发件人 的邮箱
smtp_server 127.0.0.1 \\ 指明邮件服务器 linux默认邮件服务器
smtp_connect_timeout 30 \\ 链接邮件服务器超时时长
router_id teo10.10 \\ 定义当前物理设备的唯一标示 可以使用主机名
vrrp_mcast_group4 224.18.0.100 \\ 组播地址 多实例时候的 每个vrrp_instance 需要专用的组播地址
}
vrrp_instance VI_1 { \\ 虚拟路由实例 VI_1 名字 第一个实例
state MASTER \\ 定义自己的初始状态 MASTER 主 BACKUP 从
interface ens33 \\ ip配置哪块物理网卡
virtual_router_id 51 \\ 虚拟路由器id 同一个keepalived要一样 不同keepalived要不一样
priority 100 \\ 优先级 0-255 数字越大 优先级越高 第二台可以改成99
advert_int 1 \\ 通告广播 每隔多少秒发送一次 默认1s
authentication { \\ 认证
auth_type PASS \\ 简单认证 简单字符串
auth_pass 123456 \\ 字符串为 123456
}
virtual_ipaddress { \\ 虚拟ip地址 自定义就可以
192.168.10.80/24 \\ 可以是多个 可以是一个 会配置在ens33接口别名上 要和ip一个网段
}
}
# scp keepalived.conf 192.168.10.10:/etc/keepalived/ \\ 复制配置文件到另一台主机
router_id teo10.10 \\ 拷贝到第二台机器的 需要修改的三项
state BACKUP \\ 要配置抢占模式 都要配置成MASTER 根据priority判断级别
priority 95 \\ 以上配置为抢占模式 要配置非抢占模式 state都需要设置成BACKUP并关闭VIP抢占
nopreempt \\ 关闭VIP的抢占,state都为BACKUP时生效
# vim /etc/sysconfig/keepalived \\ keepalived 开启日志功能 两台机器都需要执行以下命令
KEEPALIVED_OPTIONS="-D -S 3" \\ 3 为日志级别
# vim /etc/rsyslog.conf \\ 系统里为keepalived 开启日志
local3.* /var/log/keepalived.log \\ 添加到最后
# systemctl restart rsyslog.service \\ 重启rsyslog服务
# tail /var/log/keepalived.log \\ 查看 日志文件
# systemctl restart keepalived \\ 启动
# ps aux | grep keepalived \\ 会有keepalived进程
# ip addr list \\ 192.168.10.80会被配置到网卡上
# systemctl list-unit-files | grep keep \\ 查看是否开机启动
# systemctl enable keepalived \\ 开机启动
以上为vip和dip在同一网段 如果配置不同网段
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-ens33 ifcfg-ens33:0
# vim ifcfg-ens33
BOOTPROTO="static"
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=192.168.10.254
DNS2=8.8.8.8
# vim ifcfg-ens33:0 \\ 内网配置到此网卡
BOOTPROTO="static"
IPADDR=172.16.10.12 \\ 第二机器需要改
NETMASK=255.255.255.0
NAME=ens33:0
DVICE=ens33:0 \\ 删除 UUID
# systemctl restart network.service
注:
1 state都为BACKUP时并开启nopreempt时 priority不生效 为非抢占模式
2 抢夺是否成功根据priority大小判断 抢还是不抢根据nopreempt判断
3 BACKUP时nopreempt才生效
4 对于nginx检测 需要脚本 未做进一步验证
5 以上已经做进一步验证 以下为lvs做高可用 为做进一步验证
keepalived 配置文件详解
# vim /etc/keepalived/keepalived.conf
! 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 192.168.200.1 \\ 指明邮件服务器 linux默认邮件服务器
smtp_connect_timeout 30 \\ 链接邮件服务器超时时长
router_id LVS_DEVEL \\ 定义当前物理设备的唯一标示 可以使用主机名
vrrp_mcast_group4 224.18.0.100 \\ 组播地址 ??? 多实例时候的 每个vrrp_instance 需要专用的组播地址
vrrp_skip_check_adv_addr \\ 以下四项 暂时没用 可加注释
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_mt { \\ 自定义脚本 在此目录下 touch down 文件 可使 权重-2 手动降低权限
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" \\ 手动 调度 使地址到备用服务器上 未成功
interval 1
weight -2
}
vrrp_instance VI_1 { \\ 虚拟路由实例 VI_1 名字 第一个实例
state MASTER \\ 定义自己的初始状态 MASTER 主 BACKUP 从
interface eth0 \\ ip配置哪块物理网卡
virtual_router_id 51 \\ 虚拟路由器id 同一个keepalived要一样 不同keepalived要不一样
priority 100 \\ 优先级 0-255 数字越大 优先级越高 第二台可以改成99
advert_int 1 \\ 通告广播 每隔多少秒发送一次 默认1s
authentication { \\ 认证
auth_type PASS \\ 简单认证 简单字符串
auth_pass 1111 \\ 字符串为 1111
}
virtual_ipaddress { \\ 虚拟ip地址 自定义就可以
192.168.200.16 \\ 可以是多个 可以是一个
192.168.200.17
192.168.200.18
}
track_script { \\ 调用 自定义 脚本
chk_mt
}
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.200.100 443 { \\ lvs服务器vip 地址
delay_loop 6 \\ 检查失败时 转几圈
lb_algo rr \\ lvs 方式
lb_kind NAT \\ lvs 模式 还可以为DR
persistence_timeout 50 \\ 保持连接
protocol TCP
sorry_server 127.0.0.1 80 \\ 定义 sorry_server 当所有real_server都挂掉时 提示页面
real_server 192.168.201.100 443 { \\ 对第一个real_server做健康状态检查
weight 1 \\ 权重
SSL_GET { \\ 请求的方式 还有 SSL_GET TCP_CHECK 检查是否可以使用
url { \\ 请求的url
path / \\ 根 请求的是主页
status_code 200 \\ 状态码为 200
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.100 80 { \\ 第二个real_server
weight 2
TCP_CHECK { \\ 如果使用TCP_CHECK 只需指明超时即可 其他不用 但是精度不如HTTP_GET
connect_timeout 3
}
}
}
keepalived 为 lvs 做高可用 \\ 两个director为dr模式做keepalived 两个 real server
real server: \\ 未做进一步验证
# yum install httpd
# echo "RS1 11111111111111" > /var/www/html/index.html
# systemctl restart httpd
# systemctl enabled httpd
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore \\ 临时有效 重启会失效
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
# sysctl -p
# vim /etc/sysctl.conf \\ 写入内核 使之永久有效
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
# ifconfig lo:0 192.168.10.100/32 broadcast 192.168.10.100 \\ 临时 改变网卡设置 重启会失效
# cd /etc/sysconfig/network-scripts/ \\ 修改 配置文件 使之永久有效
# cp ifcfg-lo{,:0}
# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.100
NETMASK=255.255.255.255
BROADCAST=192.168.10.100
ONBOOT=yes
NAME=loopback:0
# systemctl restart network.service
# ip addr list
# route add -host 192.168.10.100 dev lo:0 \\ 添加主机路由 临时有效
# vim /etc/sysconfig/static-routes \\ 使路由永久有效 没有此文件的话 新建
any host 192.168.10.100 dev lo:0 \\ 添加主机路由
# route -n
Director:
# ip addr add 192.168.10.100/32 dev ens33 \\ 以下十条命令可不用写 仅做测试使用
# ip addr list
# route add -host 192.168.10.100 dev ens33
# yum install ipvsadm
# ipvsadm -A -t 192.168.10.100:80 -s rr
# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.14 -g
# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.15 -g
# ipvsadm -L -n \\ 做测试 是否成功 其实用不上ipvsadm的 包卸载的都可以
# ipvsadm -C \\ 清空ipvs规则 以上做只为测试是否成功
# ip addr del 192.168.10.100/32 dev ens33 \\ 删除地址
# vim /etc/sysconfig/static-routes \\ 使路由永久有效 没有此文件的话 新建
any host 192.168.10.100 dev ens33 \\ 添加主机路由
# yum install httpd \\ 做 sorry server 使用
# echo "Sorry, sorry server111111111111111111111" > /var/www/html/index.html
# systemctl restart httpd
# openssl rand -hex 6 \\ 可生成随机数用于 auth_pass
# vim /etc/keepalived/keepalived.conf \\ 修改以下选项
root@localhost
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
router_id teo10.10
# vrrp_skip_check_adv_addr \\ 加注释 暂时没用
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
interface ens33
192.168.10.100/32
virtual_server 192.168.10.100 80 {
lb_algo rr \\ lvs 方式
lb_kind DR \\ lvs 模式
sorry_server 127.0.0.1 80 \\ 定义 sorry_server 当所有real_server都挂掉时 提示页面
real_server 192.168.10.14 80 { \\ 对第一个real_server做健康状态检查
HTTP_GET { \\ 请求的方式 还有 SSL_GET
url { \\ 请求的url
path / \\ 根 请求的是主页
status_code 200 \\ 状态码为 200
}
}
}
real_server 192.168.10.15 80 { \\ 在配置第二个real_server
}
lvs nat 模式下 需要配 同步组 没有做实验
手动 调度 使地址到备用服务器上 \\ 未能实现切换 需检查配置
# vim /etc/sysconfig/keepalived \\ 两台机器同时修改配置文件
vrrp_script chk_teo { \\ 自定义脚本 名字
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" \\ 检查是否有down文件
interval 2 \\ 每隔2秒做检查 如果有 返回1 继续执行代码 如果没有返回0 退出
weight -20 \\ 权重 减去20
vrrp_instance VI_1 {
track_script {
chk_teo
}
}