Keepalived是一个免费开源的,用C编写的,具有第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现须要依赖Linux的虚拟服务内核模块(ipvs),而高可用是经过VRRP协议实现多台机器之间的故障转移服务。
上图是Keepalived的功能体系结构,大体分两层:用户空间(user space)和内核空间(kernel space)。 内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其余相关的网络功能)两个部分。
用户空间:mysql
Keepalived的全部功能是配置keepalived.conf文件来实现的。web
[root@localhost ~]# yum install keepalived ipvsadm
[root@localhost ~]# rpm -ql keepalived
/etc/keepalived/keepalived.conf 主配置文件
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service 启动脚本算法
[root@localhost ~]# cat /etc/keepalived/keepalived.confsql
! Configuration File for keepalived global_defs { router_id maiya #路由id,不能重复 } vrrp_instance lvs_inst { #定义vrrp实例名 state BACKUP #定义vrrp角色,分为MASTER/BACKUP两种 interface ens33 #指定网络接口名 virtual_router_id 51 #同一组的vrrp成员,该id须要一致 priority 150 #优先级,范围(0-255) nopreempt #不抢占(只针对BACKUP生效) advert_int 1 #发送hello的时间间隔 authentication { #经过密码身份验证 auth_type PASS auth_pass 1111 } virtual_ipaddress { #定义虚拟IP(VIP) 10.18.42.123 } } virtual_server 10.18.42.123 80 { #定义VIP相关配置 delay_loop 6 lb_algo rr #使用rr调度算法(rr|wrr|lc |wlc|lblc|sh|dh) lb_kind DR #使用DR模式 (DR/NAT/TUN) persistence_timeout 50 #定义persistence保持时间 protocol TCP #tcp协议 real_server 10.18.42.42 80 { #定义real_server weight 1 #weight权重为1 TCP_CHECK { #定义checker的方法(TCP/HTTP/SSL/MISC) connect_port 80 #定义tcp的port connect_timeout 3 #定义本次链接的超时时长为3s nb_get_retry 3 #定义尝试3次,若是3次都失败则宣告本real_server失效 delay_before_retry 3 #定义重链接间隔时间为3s } } real_server 10.18.42.6 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
HTTP_GET | SSL_GET{ url{ #根据url check,能够指定多个 path / #定义要检查的URI地址 digest <string> #检查后的摘要信息 #(可使用genhash -s 目标服务器ip -p 端口号 status_code 200 -u uri地址获得摘要信息) status_code 200 #检查的返回状态码 } } notify_master /path/xx.sh #指定当切换到master 时执行的脚本 notify_backup /path/xx.sh #指定当切换到backup 时执行的脚本 notify_fault "path/xx.sh VG_1" #故障时执行的脚本 notify /path/xx.sh virtualhost <string> #检查的web服务器的虚拟主机 sorry_server <IPADDR> <port> #备用机的IP,全部的realserver失效后启用 notify_up <string> #检测到服务器up后执行的脚本 notify_down <string> #检测到服务器down后执行的脚本
1)、实现master与slave1两台主机的复制(AA复制)
2)、利用keepalived 的健康检查功能,检测本机的3306端口是否存活,若是端口失效,则自动执行自定义脚本
3)、自定义脚本的内容为:kill 本机的keepalived进程,并删除本机VIP;当本机keepalived进程被kill掉以后,另外一台主机的keepalived进程便可得到虚拟IP,实现的故障转移
4)、测试:客户端链接keepalived提供的虚拟IP(mysql须要事先受权grant链接)bash
[root@localhost ~]# cat /etc/keepalived/keepalived.conf服务器
! Configuration File for keepalived global_defs { router_id teacher } vrrp_instance lvs_inst { state MASTER interface ens33 virtual_router_id 51 priority 250 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.18.42.123 } } virtual_server 10.18.42.123 3306 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP real_server 10.18.42.251 3306 { weight 1 notify_down /etc/keepalived/kill.sh TCP_CHECK { connect_port 3306 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } [root@localhost ~]# cat /etc/keepalived/kill.sh #!/bin/bash pkill keepalived #systemctl stop keepalived #尽可能使用此方式关闭keepalived ip addr del dev ens33 10.18.42.123/32
[root@localhost ~]# cat /etc/keepalived/keepalived.conf网络
! Configuration File for keepalived global_defs { router_id teacher } vrrp_script chk_haproxy { script "lsof -i:80 | grep haproxy || exit 1" interval 2 fail 1 } vrrp_instance lvs_inst { state MASTER interface ens33 virtual_router_id 51 priority 250 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 10.18.42.124 } }