1.Keepalived VRRP 介绍
keepalived是什么
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。(云服务器不支持VRRP)
虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
=========================================================================================
脑裂(裂脑):
Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
解决方式:
1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率);
2、做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
3、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信
2.项目准备
1、准备三台虚拟机,选择两台mysql作为keepalived(一台master 一台backup),一台做客户端访问用。
2、给两台mysql安装keepalived制作高可用生成VIP
[root@mysql-master ~]# 192.168.13.128 主节点
[root@mysql-backup ~]# 192.168.13.129 备用节点
[root@client ~]# 192.168.13.133 第一台真实服务器
VIP 192.168.13.144
3.mysql + KeepAlived 自动切换
我这里用的是mysqld
yum安装mysql
实施步骤:
一、mysql 主主同步 <略>
二、安装keepalived—两台机器都操作
192.168.13.128
[root@mysql-master ~]# yum -y install ipvsadm keepalived
[root@mysql-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #备份
[root@mysql-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #只是名字而已,辅节点改为directory2(两个名字一定不能一样)
}
vrrp_script check_run {
script "/etc/keepalived/keepalived_chech_mysql.sh"
interval 5 #5秒执行一次脚本
}
vrrp_instance VI_1 {
state MASTER #定义主还是备,备用的话写backup
interface ens33 #VIP绑定接口
virtual_router_id 89 #整个集群的调度器一致(在同一个集群)
priority 100 #(优先权)back改为50(50一间隔)
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS #主备节点认证
auth_pass 1111
}
virtual_ipaddress {
192.168.13.144/24 #VIP(自己网段的)
}
track_script {
check_run
}
}
[root@mysql-master ~]# vim /etc/keepalived/keepalived_chech_mysql.sh
#!/bin/bash
/usr/bin/mysql -uroot -p'你自己的数据库密码' -e "show status" &>/dev/null
if [ $? -ne 0 ] ;then
# service keepalived stop
systemctl stop keepalived
fi
[root@mysql-master ~]# chmod +x /etc/keepalived/keepalived_chech_mysql.sh
192.168.13.129
[root@mysql-backup ~]# yum install -y ipvsadm keepalived
[root@mysql-backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@mysql-backup ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory2
}
vrrp_script check_run {
script "/etc/keepalived/keepalived_check_mysql.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP #设置为backup
interface ens33
nopreempt #设置到back上面,不抢占资源
virtual_router_id 89
priority 50 #备用改为50
advert_int 1 #检测间隔1s
authentication {
auth_type PASS
auth_pass 1111 #认证类型和密码主备一样,要不然无法互相认证
}
virtual_ipaddress {
192.168.13.144/24 #抢占的VIP也一样
}
track_script {
check_run
}
}
[root@mysql-backup ~]# vim /etc/keepalived/keepalived_chech_mysql.sh
#!/bin/bash
/usr/bin/mysql -uroot -p'你自己的数据库密码' -e "show status" &>/dev/null
if [ $? -ne 0 ] ;then
# service keepalived stop
systemctl stop keepalived
fi
[root@mysql-backup ~]# chmod +x /etc/keepalived/keepalived_chech_mysql.sh
三添加库用于测试
192.168.13.128
[root@mysql-master ~]# mysql -uroot -p'你自己的数据库密码' -e "create database master" #创建一个名为master的数据库
[root@mysql-master ~]# mysql -uroot -p'你自己的数据库密码' -e "grant all on *.* to root@'%' identified by '你自己的数据库密码'" #设置访问权限
[root@mysql-master ~]# mysql -uroot -pQianFeng@123 -e "flush privileges" #刷新
[root@mysql-master ~]# systemctl start keepalived
[root@mysql-master ~]# systemctl stop firewalld && setenforce 0
192.168.13.129
[root@mysql-backup ~]# mysql -uroot -p'你自己的数据库密码' -e "create database backup" #创建一个名为backup的数据库
[root@mysql-backup ~]# mysql -uroot -p'你自己的数据库密码' -e "grant all on *.* to root@'%' identified by '你自己的数据库密码'" #设置访问权限
[root@mysql-backup ~]# mysql -uroot -pQianFeng@123 -e "flush privileges" #刷新
[root@mysql-backup ~]# systemctl start keepalived
[root@mysql-backup ~]# systemctl stop firewalld && setenforce 0
四 在任意一台机器作为客户端
测试的时候记得检查mysql用户的可不可以远程登录。
192.168.13.133
[root@client ~]# systemctl stop firewalld && setenforce 0
[root@client ~]# mysql -uroot -p'master虚拟机上mysql密码' -h192.168.13.144 #远程登录VIP,这时候是master
192.168.13.128
[root@mysql-master ~]# systemctl stop keepalived #我们将服务停掉
192.168.13.133
[root@client ~]# mysql -uroot -p'backup虚拟机上mysql密码' -h192.168.13.144 #远程登录VIP,这时候是backup
实现了VIP的漂移,实现了mysql的高可用。