Keepalived 是一个类似于layer3, 4 & 5交换机制的软件, 是一个高可用解决方案,通过虚拟IP地址和心跳检测对方状态来实现高可用功能。Keepalived是由两台服务器分别指定Master与Backup两个角色,而指定Master的优先级比Backup的高;所以默认情况下虚拟IP会绑定到Master服务器上,对外提供服务。而Master、Backup服务器会在一定的时间间隔向对方发送心跳信息来检测对方的存活状态,时间间隔一般为2秒钟可以修改,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,然后把虚拟IP绑定到自己的网卡上,此时Backup对外提供服务,实现了自动化的故障转移,当Master恢复的时会重新接管所有资源。
1、准备好 keepalived 安装包 (keepalived-2.0.20.tar.gz) ,还有ISO镜像 (CentOS-7-x86_64-Everything-1708.iso) ,用于解决依赖问题。
2、首先在VM上挂载ISO镜像,然后再到该虚拟机上创建挂载位置:mount /dev/cdrom /mnt
3、备份 yum 仓库所有文件,新建编辑本地repo文件(主要针对不能联网):vim /etc/yum.repos.d/local.repo
[iso]
name=iso repo
baseurl=file:///mnt
gpgcheck=0
enabled=1
4、安装相关依赖:
yum -y install gcc openssl-devel
5、解压并安装:
cd /usr/local/
tar xf keepalived-2.0.20.tar.gz
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
配置解释:
--prefix=/usr/local/keepalived :指定安装在/usr/local/keepalived 路径下
--sysconf=/etc : 指定keepalived的conf配置文件路径
6、完善启动脚本:vim /etc/init.d/keepalived
#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: 35 21 79
# description: Start and stop Keepalived
# Global definitions
PID_FILE="/var/run/keepalived.pid"
# source function library
. /etc/init.d/functions
RETVAL=0
start() {
echo -n "Starting Keepalived for LVS: "
daemon keepalived -D
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/keepalived
return $RETVAL
}
stop() {
echo -n "Shutting down Keepalived for LVS: "
killproc keepalived
RETVAL=0
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/keepalived
return $RETVAL
}
reload() {
echo -n "Reloading Keepalived config: "
killproc keepalived -1
RETVAL=$?
echo
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
status)
status keepalived
;;
condrestart)
[ -f /var/lock/subsys/keepalived ] && $0 restart || :
;;
*)
echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
exit 1
esac
exit 0
7、为启动脚本增加写权限:
chmod +x /etc/init.d/keepalived
8、加进系统服务,并设置开机自启动:
chkconfig --add keepalived
chkconfig keepalived on
9、关闭防火墙,防止后面 keepalived 运行中出现“脑裂”问题:
systemctl stop firewalld
service iptables stop
10、正常启动 keepalived 后,即完成基本的安装:
service keepalived start
service keepalived status
一般情况下,keepalived 就能满足 Mycat 的高可用了,Mycat的两个节点其实只有一个对外服务,另一个完全备用(以备基本不会发生的宕机),宕机的概率本来就小,备用机基本相当于没用了。
但是我们可以将主备Mycat都利用起来,并进行负载均衡,减小主Mycat的压力,如果其中一个节点宕机了,则由另一个节点完全接管,继续正常提供服务。
组件结构图如上所示,keepalived负责lvs的健康检测与高可用,lvs负责mycat的负载均衡与心跳检测。具体配置文件如下:
Keepalived-master(192.168.8.53)上的 vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
router_id lvs_master # 设置lvs master的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
virtual_router_id 66 # 虚拟路由编号,同集群,主备必须一致
priority 100 # 优先级,数值越大,获取处理请求的优先级越高,主机必需大于备机
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.253 # 定义虚拟ip(VIP),可多设,每行一个
}
}
virtual_server 192.168.8.253 8066 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒
lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
nat_mask 255.255.255.0
persistence_timeout 0 #会话保持时间,单位是秒;同一IP x秒内的请求都发到同个real server
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.8.162 8066 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK { #realserver的状态检测设置部分
connect_timeout 10 #表示10秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
real_server 192.168.8.156 8066 { #配置服务节点2,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
}
Keepalived-backup(192.168.8.107)上的 vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
router_id lvs_backup # 设置lvs backup的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
virtual_router_id 66 # 虚拟路由编号,同集群,主备必须一致
priority 99 # 优先级,数值越大,获取处理请求的优先级越高,主机必需大于备机
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.253 # 定义虚拟ip(VIP),可多设,每行一个
}
}
virtual_server 192.168.8.253 8066 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒
lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
nat_mask 255.255.255.0
persistence_timeout 0 #会话保持时间,单位是秒;同一IP x秒内的请求都发到同个real server
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.8.162 8066 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK { #realserver的状态检测设置部分
connect_timeout 10 #表示10秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
real_server 192.168.8.156 8066 { #配置服务节点2,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
}
Mycat-master(192.168.8.162)、Mycat-slave(192.168.8.156)上的 realserver 文件内容一致
1、将这两台 Mycat 服务器都配置成 lvs 的 real server,编辑 realserver 脚本文件:vim /etc/init.d/realserver
#!/bin/bash
VIP=192.168.8.253
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
2、保存脚本文件后更改该文件权限:chmod -R 755 /etc/init.d/realserver
3、同时再更改 functions 文件权限:chmod -R 755 /etc/init.d/functions
4、排雷:centos7 之后的虚拟机都不再自带 ifconfig 和 route 的命令了!如果没有这两个命令的话,只需要安装一个网络组件即可解决问题:yum -y install net-tools
5、按照上述组件结构图,从右往左逐个启动组件:首先启动 mysql,接着启动 mycat,然后启动 realserver(./realserver start),再启动 keepalived
下图是一主两从搭建的组件结构图:
1、很多时候我们都只需要实现 mycat 的高可用,而不需要实现 mycat 的负载均衡;组件越多,越容易出错,也更难以维护;没有一成不变的最优方案,只有在合适时机的最佳方案。
2、keepalived 的作用,有没有 lvs,keepalived 启动的作用是有所区别的。没有 lvs 时,keepalived 负责 vip 的映射与转移、mycat 的存活检测;有 lvs 时,keepalived 负责 vip 的映射与转移、RealServer 的健康状态检查。不管有没有 lvs,keepalived 都会负责 vip 的映射与转移,实现 master 和 slave 主机之间的通信,达到高可用目的。
3、各个组件的职责都很明显,mysql 负责 sql 的执行,mycat 负责 mysql 的读写分离与高可用,lvs 负责 mycat 的负载均衡与高可用,keepalived 负责 vip 相关工作以及 lvs 的高可用。
4、关于搭建过程中遇到的问题,像 keepalived "脑裂" 问题(两个keepalived都拿到了VIP),还是要逐一排查(配置文件 / 是否同网段 / iptables与防火墙有没有关 / 交换机有没有打开组播)。
Mycat 高可用与负载均衡实现,满满的干货!