问题:
lvs单点故障:
因为是单点的,lvs挂了后边整个服务都访问不到;整个业务下线;
RS健康状态检查:
node01挂了,node02没挂。其中一部分请求负载到node01上,一部分请求异常连接不上,因为lvs还存在RS的负载记录,lvs分发时就不像node01分发数据包;
解决问题:
lvs单点故障:
- 它是1个,那就让它变成多个;lvs01不能用lvs02还能用;
- lvs变多了VIP不能每个lvs都配;
- 2个思路:
1、主备(主机上有VIP,备机上没有VIP):主挂了备机快速接管VIP接收数据包分发;
2、主主:动态DNS;
- 主备:
- 方向性:
-
主动
访问主健康状态:备机定时轮询去访问主机健康状态;接收心跳包和数据包会增加压力; -
被动
接收主健康状态:定点发送广播包通告给备机,收到广播包说明主还活着;
- 效率性:
- 加
权重
值:主机挂掉后,备机都亮出自己的权重值,备机都知道其他备机的权重值,谁的权重值最大谁就是主,使用的推让制选主(官方验证耗时200ms);
RS健康状态:
- 如何确定一个应用服务是否好的:
ping
:是不行的,因为ping是网络层命令,连tcp传输控制那一层都没到,更别说应用层了!- 访问一下看看,底层:验证的是应用层的http协议;发请求判断返回code=200OK返回成功;
keepalived第三方用户空间应用程序(高可用HA工具)
理论知识
代替人自动运维,解决lvs、nginx等单点故障,实现HA;
- 监控自己的lvs服务
- master通告自己还活着;备机监听master状态,master挂了备机推举出新master;
- 配置:
- VIP,
- 添加ipvs模块的配置:keepalived是由配置文件的,
- 监控自己的lvs服务,
- 对RS做健康检查:如果RS挂了lvs剔除挂了的RS负载条目不向它负载;
只有主的VIP挂了备才有会VIP;
在每台lvs服务器都要装keepalived,来决定谁有VIP谁来接收通信,RS配置不变;
lvs服务器之前手动配置的lvs配置先清除掉,因为keepalived会有配置文件会自动配置lvs;
搭建keepalived
- keepalived可以替代lvs操作ipvs内核模块,所以可以不装lvs;
安装keeplived
yum install keepalived ipvsadm -y
配置
- 进入keeplived目录
- 备份配置文件
- 修改配置文件
配置文件解读
global
_defs:全局配置;
- 配置邮件,keeplived有问题发送邮件通知;
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
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#注释下行否则ping 不通
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
(配置VIP)vrrp
_instance VI_1:虚拟路由冗余协议(谁激活了谁是主,但是备机上也要有能力让自己有vip,因为主挂了备机就能马上有VIP,也叫做IP漂移,整个这个事情叫做:虚拟路由冗余协议)
;
下面帮助文档介绍了配置说明怎么写
- state:lvs的主备状态;主机花10万,备机买便宜点几万;
- interface:广播健康状态用的哪块网卡;服务器会有多个网卡,其中一块网卡坏了其他网卡还可以通信;
- virtual_router_id:虚拟路由id;一个物理网络有多个keeplived集群,每个集群id要区分开归属哪个集群;相当于家门牌号不能回别人家;一群keeplived都应该是同一个id,不能别的id过来加入我的集群;
- priority:权重值;长兄为父的原则,主机挂了后备机数值越大的就是主;
- authentication:权限认证,防止别人进入我的网络;
- virtual_ipaddress:就是VIP;数据应该走哪块网卡都是在这定义的;
node01的vip配置:MASTER
vrrp_instance VI_1 {
#主机设置master
state MASTER
#监听网卡设置
interface ens33
#虚拟路由ID 保持主从配置相同
virtual_router_id 51
#权重主的大于从的
priority 100
advert_int 1
#主备同样配置
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟IP设置
virtual_ipaddress {
192.168.16.100/24 dev ens33 label ens33:2
}
}
node04的vip配置:BACKUP、权重50
#vrrp_strict
state BACKUP
priority 50
(配置路由规则)virtual
_server:虚拟服务;
添加TCP协议的负载到VIP的负载规则;
- lb_algo:轮询方式:rr;
- lb_kind:路由模型:NET、DR、TUN;
- nat_mask:掩码
- persistence_timeout:初始化_超时;负载参照;
在第一次断开连接的时间段内,再次访问默认负载到上次建立连接的RS,为了避免重复浪费线程重复开辟资源,访问过第二次请求有缓存这个用户资源就可以直接拿来用了; - protocol:数据包协议;
- url:给keeplived单独写个页面查询写动态信息,确认后端服务是好的,做健康检测;
- connect_timeout:连接超时时间;
- nb_get_retry:重试次数
- delay_before_retry:重试次数
virtual_server 102.168.16.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.16.11 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.16.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
远程拷贝配置文件到备机
scp /etc/keeplived.conf root@192.168.16.13:/etc/keeplived.conf
# 简写:当前路径、主机、当前路径变量;
scp ./keeplived.conf root@192.168.16.13:`pwd`/keeplived.conf
启动keeplived
- VIP主有备没有;备机配出来是为了主挂了,备机立马就能用速度最快,可以实时负载;
- 内核模块主备都有;
测试keeplived
- 访问VIP查看是否可以负载;
-
ipvsadm -lnc
偷窥负载数据包 - 验证HA:
因为lvs没有太多数据同步的事情,所以可以把master抢回来
- 主网卡down掉,备机立马就有VIP;VIP就从主ip飘逸到备机;
ifconfig eth0 down
- 访问VIP
ipvsadm -lnc
偷窥可以看到新主负载数据包; - 过了几分钟主修好了,VIP会立马飘逸回来;因为权重高抢回了主;
ifconfig eth0 up
- 偷窥记录本就跑到了master上,备机上就没记录了;
- RS-node02服务挂了,keepliced健康检查lvs的路由条目就会把node02剔除;备机同样做健康检查也会踢掉;
- RS-node02服务修好了,keepliced健康检查lvs的路由条目就会把node02自动加回来;
安装man帮助文档
man可以看系统的帮助文档,也可以看应用程序的帮助文档;
- 安装man命令首先登陆系统看看man有没有安装,如图输入man提示找不到 就是没有安装的
- 查看keeplived的帮助文档;
一共有8类,应用程序查看5类;
man 5 keepalived.conf
- 查找virtual_ipaddress查看帮助文档
- 查找SSL_GET查看帮助文档
keeplived问题
应用程序突然异常退出
- VIP未收回;
- 内核配置也未收回;
- keeplived本身还死了;
不会通告备机自己还活着,所以备机网卡也会出现VIP;结论
:
- 互联网数据包混乱,不确定去了哪个lvs,出现原子性;
- 为了解决单点问题引入1个新技术,结果这个新技术本身自己还不可靠;
最终:把keeplived换成zk集群,利用分布式协调集群可以解决这个事,