一.高可用集群
1.集群类型
2.系统可用性
3.系统故障
4.实现高可用
5.VRRP:Virtual Router Redundancy Protocol
实验结构图
![c71fd73d368c429facd8bb3a6df22821.png](https://i-blog.csdnimg.cn/direct/c71fd73d368c429facd8bb3a6df22821.png)
二.Keepalived 部署
1.keepalived 简介
2.Keepalived 架构
用户空间核心组件:
![5c46f7ddebe04b81b1a3e7aff396b9a5.png](https://i-blog.csdnimg.cn/direct/5c46f7ddebe04b81b1a3e7aff396b9a5.png)
3.Keepalived 环境准备
![c71fd73d368c429facd8bb3a6df22821.png](https://i-blog.csdnimg.cn/direct/c71fd73d368c429facd8bb3a6df22821.png)
4.Keepalived 相关文件
yum search keepalived
yum install keepalived.x86_64 -y
systemctl start keepalived
ps axf | grep keepalived
2385 pts/0 S+ 0:00 \_ grep --color=auto keepalived
2326 ? Ss 0:00 /usr/sbin/keepalived -D
2327 ? S 0:00 \_ /usr/sbin/keepalived -D
在下载完安装包以后,就到了喜闻乐见的写配置时间
vim /etc/keepalived/keepalived.conf
配置文件组成
![62e1b9ddd6de48ff82cea5e60d4135e2.png](https://i-blog.csdnimg.cn/direct/62e1b9ddd6de48ff82cea5e60d4135e2.png)
![c3fe40ee275c48af8c652c1a2e2bc756.png](https://i-blog.csdnimg.cn/direct/c3fe40ee275c48af8c652c1a2e2bc756.png)
global_defs {
notification_email {
114514@1919.com
}
notification_email_from keepalived@KA1.snow.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.snow.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
欧克这一个我们就暂时配好了,那么下一个,怎么配,一个一个往过写吗,scp命令就好了
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
这是ka2的设置,我们只需要把他改为备机就好
此时如果我们使用ifconfig,会发现ka1是有一个172.25.254.100的ip的,但是ka2是没有的,这就是高可用的原理,在运行时,ip会分配到优先度高的主机上,只有在主机挂掉以后,才会出现在备机上
我们再做一个测试
tcpdump -i ens33 -nn host 224.0.0.18
此时是ka1访问的,我们用ka2再执行命令,并且关闭ka1的keepalived服务
可以看到在关闭后只剩下ka2去访问了,并且我们使用ifconfig查看ka2的ip
出现了一个172.25.254.100
此时的ka1已经没有这个ip了,也就是说我们的ka2摇身一变,变成了master主机
启用keepalived日志功能
vim /etc/sysconfig/keepalived
我们需要改一处内容
接着我们再去log日志配置里修改配置
vim /etc/rsyslog.conf
修改完以后保存退出,重启rsyslog服务,并且重启keepalived
[root@ka2 ~]# systemctl restart rsyslog.service
[root@ka2 ~]# systemctl restart keepalived.service
[root@ka2 ~]# cat /var/log/keepalived.log
日志成功的存在设定的文件里了
实现独立子配置文件
include /etc/keepalived/conf.d/*.conf
![3dbb7e5a0d06475798bd9813ceff7427.png](https://i-blog.csdnimg.cn/direct/3dbb7e5a0d06475798bd9813ceff7427.png)
[root@ka1 ~]# mkdir /etc/keepalived/conf.d/
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
把刚刚复制的内容贴进去
保存并退出以后,重启keepalived服务,再用ifconfig命令来查看当前的ip
大家可以把vrrp_strict关掉了,在前面加一个#就可以注释掉,因为添加此选项无法访问vip
三.Keepalived 企业应用示例
1 实现master/slave的 Keepalived 单主架构
2 抢占模式和非抢占模式
非抢占模式
![2b841beb1e044a52a023688c20da64d7.png](https://i-blog.csdnimg.cn/direct/2b841beb1e044a52a023688c20da64d7.png)
![fd8d5705cc2c483b820dcab31cbc8188.png](https://i-blog.csdnimg.cn/direct/fd8d5705cc2c483b820dcab31cbc8188.png)
抢占延迟模式 preempt_delay
![b35a74fc5eac499eac85aaf3a3396e71.png](https://i-blog.csdnimg.cn/direct/b35a74fc5eac499eac85aaf3a3396e71.png)
3.VIP单播配置
global_defs {
notification_email {
114514@1919.com
}
notification_email_from keepalived@KA1.snow.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.snow.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
#vrrp_mcast_group4 224.0.0.18
vrrp_ipsets keepalived
}
#include /etc/keepalived/conf.d/*.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
#preempt_delay 10s #抢占延迟模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
unicast_src_ip 172.25.254.10 #本机ip
unicast_peer {
172.25.254.20 #对方ip
}
}
保存并退出即可
4 Keepalived 通知脚本配置
1.通知脚本类型
2 脚本的调用方法
[root@KA1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='114514@1919.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移, $HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
配置完以后,我们下载邮箱通知工具
yum install mailx -y
[root@KA1 ~]# vim /etc/mail.rc
#######mail set##########
set from=114514@1919.com
set smtp=smtp.qq.com
set smtp-auth-user=114514@1919.com
set smtp-auth-password=1145141919810
set smtp-auth=login
set ssl-verify=ignore
这里是邮箱配置
注意,这个工具需要你打开QQ邮箱的pop3功能,具体怎么操作可以上百度搜一下,很简单,set smtp-auth-password是你的pop3授权码,记得改过来哦
实现 Keepalived 状态切换的通知脚本
然后我们给这个文件加上权限
chmod +x /etc/keepalived/mail.sh
然后keepalived配置需要加上三行命令
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
#preempt_delay 10s #抢占延迟模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
unicast_src_ip 172.25.254.10 #本机ip
unicast_peer {
172.25.254.20 #对方ip
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
并且要改global处的邮箱和vrrp_mcast_group4
保存退出,然后我们模拟master故障,关掉keepalived进程
killall keepalived
systemctl start keepalived
5 实现 master/master 的 Keepalived 双主架构
![93990309c23c44cfa8cc0813fa270563.png](https://i-blog.csdnimg.cn/direct/93990309c23c44cfa8cc0813fa270563.png)
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 150
#preempt_delay 10s #抢占延迟模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 200
priority 80
#preempt_delay 10s #抢占延迟模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev ens33 label ens33:2
![69c29b5b3d144e06b8589cb54074609f.png](https://i-blog.csdnimg.cn/direct/69c29b5b3d144e06b8589cb54074609f.png)
6 实现IPVS的高可用性
1 IPVS相关配置
虚拟服务器配置结构
virtual server (虚拟服务器)的定义格式
虚拟服务器配置
应用层监测
TCP监测
2 实战案例
实现单主的 LVS-DR 模式
[root@rs1 ~]# yum install httpd
[root@rs1 ~]# echo rs1 172.25.254.110 > /var/www/html/index.html
[root@rs2 ~]# yum install httpd
[root@rs2 ~]# echo rs2 172.25.254.120 > /var/www/html/index.html
还记得lvs的dr模式吗,我们要给四个文件改参数
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
最后再给两台真实服务器配上vip就好啦
ip a a 172.25.254.100/32 dev lo
sysctl --system
进ka1配置文件,在下面写
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr #调度算法为加权轮询
lb_kind DR #lvs为dr模式
protocol TCP #TCP协议
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3 #连接3秒不成功为超时
nb_get_retry 2 #失败后尝试两次
delay_before_retry 2 #两秒连接一次
}
}
real_server 172.25.254.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
yum install ipvsadm -y
systemctl start ipvsadm
ipvsadm -Ln #查看keepalived的策略有没有挂上
挂上以后就可以用其他机器来curl一下vip了,由于是加权轮询并且权重相同,所以这里是一个轮着一个访问的
![f535c22e90c44945a98c160e24a9aedf.png](https://i-blog.csdnimg.cn/direct/f535c22e90c44945a98c160e24a9aedf.png)
![5b9ff5dc33f34704a5b6d1791ff5dae3.png](https://i-blog.csdnimg.cn/direct/5b9ff5dc33f34704a5b6d1791ff5dae3.png)
![ac5a432b812d44ee91ef4f600a281059.png](https://i-blog.csdnimg.cn/direct/ac5a432b812d44ee91ef4f600a281059.png)
7 实现其它应用的高可用性 VRRP Script
1 VRRP Script 配置
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
定义 VRRP script
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell命令或脚本路径
interval <INTEGER> #间隔时间,单位为秒,默认1秒
timeout <INTEGER> #超时时间
weight <INTEGER:-254..254> #默认为0,如果设置此值为负数,
#当上面脚本返回值为非0时
#会将此值与本节点权重相加可以降低本节点权重,
#即表示fall.
#如果是正数,当脚本返回值为0,
#会将此值与本节点权重相加可以提高本节点权重
#即表示 rise.通常使用负值
fall <INTEGER> #执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise <INTEGER> #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
调用 VRRP script
vrrp_instance test {
... ...
track_script {
check_down
}
}
实战案例:利用脚本实现主从角色切换
我们先写一个脚本出来
[root@ka1 ~]# vim /etc/keepalived/test.sh
[root@ka1 ~]# cat /etc/keepalived/test.sh
#!/bin/bash
[ ! -f "/mnt/snow" ]
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
这是keepalived的配置
vrrp_script check_snow {
scrpit "/mnt/check_snow.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance web {
state MASTER
interface ens33
virtual_router_id 50
priority 100
#preempt_delay 10s #抢占延迟模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:0
}
track_script {
check_snow
}
}
做完之后运行
touch /mnt/snow
tail -f /var/log/messages
会发现ka1在一直疯狂的刷日志,权重下降了30,所以此时应该是ka2为master
于是我们在ka2看一下ip,果然172.25.254.100在ka2这边
实战案例:实现HAProxy高可用
vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
server web1 172.25.254.101:80 check
server web2 172.25.254.102:80 check
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
进入haproxy的配置文件写一个策略
vim /etc/haproxy/haproxy.cfg
![e5e24c6ff4b74a1b9ed9208cabc620d8.png](https://i-blog.csdnimg.cn/direct/e5e24c6ff4b74a1b9ed9208cabc620d8.png)
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl --system
systemctl restart network
![991330132fb64c87ab700ada0021c3af.png](https://i-blog.csdnimg.cn/direct/991330132fb64c87ab700ada0021c3af.png)
![fe6e0e3b12ea494c893cf7850e7fed50.png](https://i-blog.csdnimg.cn/direct/fe6e0e3b12ea494c893cf7850e7fed50.png)
![43485606285c4485bb9c453c34f88f15.png](https://i-blog.csdnimg.cn/direct/43485606285c4485bb9c453c34f88f15.png)