工作原理
keepalived高可用之间是通过VRRP通信的。 VRRP中文名字虚拟路由冗余协议,VRRP的出现是为了解决静态的单点故障。 VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的 VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间的通信 工作时主节点发包,备节点接包,当备节点接受不到主节点发的数据包的时候,就启动接管程序主节点的资源,备节点可以有多个,通过优先级竞选,但一般Keepalived就系统运维工作中是一对的 VRRP使用了加密协议加密数据,但Keepalived 官方目前还是推荐用明文的方式配置认证类型和密码 介绍完了VRRP,接下来在介绍一下Keepalived服务的工作原理 Keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此工作时主会优先获取所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供访问。 在Keepalived服务对之间,只有作为住的服务会一直发s送VRRP广播包,告诉备它还活着,此时备不会抢占住,当主不可用时,即备监听不要发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒
组件介绍
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护 及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式,vrrp模块是来实现VRRP协议的
主配置文件
[root@lb--01 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 666 priority 199 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
备配置文件
[root@lb--02 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 666 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
这种配置检测不太准确,因为只是根据服务器宕机,来判定主备切换的话是不严谨的。(仅限小白使用)
公司级别keepalived + haproxy
主要实现方式是: keepalived 中实时的在执行一个检查脚本,脚本主要内容是通过socket文件给haproxy监听的url 端口,发送1024数据包,判断当收到数据的值,如果这个收到的值为为0 的话就会返回2 ,反之就返回0, 然后keepalived中设置了 weight 的值,并且weight配置的值大于0,则优先级相应的增加。 keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
cat /etc/keepalived/keepalived.conf global_defs { notification_email { keeplived@system.com } notification_email_from lcoalhost@system.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id test-10e150e71e180 } vrrp_script chk_http_port { script "/etc/keepalived/check_haproxy.sh" interval 2 weight 2 } vrrp_instance VI_1 { interface eth0 virtual_router_id 75 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 2376 } virtual_ipaddress { 10.150.71.191/22 dev eth0 } virtual_routes { default via 192.168.247.1 dev eth0 } unicast_src_ip 10.150.71.180 unicast_peer { 10.150.71.181 } track_script { chk_http_port } notify_master "/etc/keepalived/notify.sh 0" notify_backup "/etc/keepalived/notify.sh 1" notify_fault "/etc/keepalived/notify.sh 2" }