1、keepalived是什么?
1、keepalived是什么?
keepalived是集群管理中保证集群高可用的一个服务软件,它的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后,自动将web服务器加入到服务器集群中。解决了静态路由的单点故障问题。
2、工作原理
keepalived是以VRRP协议为实现基础的,VRRP全程Virtual Router Redundancy Protocol ,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议。也就是说N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master不断向backup发送心跳信息,告诉backup自己还活着,当backup收不到心跳消息时就认为master已经宕机啦,这时就需要根据VRRP的优先级来选举一个backup当master。从而保证高可用。keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护、以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。。
3、配置文件
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、vrrp_script、vrrp_instance和virtual_server.
1、global_defs区域
主要是配置故障发生时的通知对象以及机器标志
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id 192.168.224.206vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0}
notification_email 故障发生时给谁发邮件通知
notification_email_from 通知邮件从哪个地址发出
smtp_server 通知邮件的smtp地址
smtp_connect_timeout 连接smtp服务器的超时时间
enable_traps开启SNMP(Simple Network Management Protocol)陷阱
router_id 标志本节点的字符串,通常为ip地址,故障发生时邮件会通知到
2、vrrp_script区域
用来做健康检查的,当检查失败时会将vrrp_instance的priority减少相应的值,
vrrp_script chk_nginx {script "/usr/local/keepalived-1.3.4/nginx_check.sh"interval 2weight -20}
script:自己写的监测脚本。
interval 2:每2s监测一次
weight -20:监测失败,则相应的vrrp_instance的优先级会减少20个点
3、vrrp_instance 区域
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51mcast_src_ip 192.168.224.206priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.224.208}track_script{chk_nginx}}
state:只有BACKUP和MASTER。MASTER为工作状态,BACKUP是备用状态
interface:为网卡接口:可通过ip addr查看自己的网卡接口
virtual_router_id:虚拟路由标志。同组的virtual_router_id应该保持一致。它将决定多播的MAC地址。
priority:设置本节点的优先级,优先级高的为master
advert_int:MASTER与BACKUP同步检查的时间间隔
virtual_ipaddress:这就是传说中的虚拟ip
2、搭建keepalived
1、安装keepalived
开始搭建keepalived,主备节点分别上分别安装keepalived。(也可以使用源码安装,我这里直接使用yum安装)
yum install keepalived -y
2、配置Master
1、配置keeplived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #把默认的配置文件备份一下vi /etc/keepalived/keepalived.conf添加以下配置文件! Configuration File for keepalivedglobal_defs { #全局定义router_id M1 #唯一不重复}vrrp_script chk_mysql {script /etc/keepalived/chk_mysql.sh #检测脚本的路径及名称interval 2 #(检测脚本执行的间隔)weight -20 #权重。设置当前服务器的权重,此处的配置说明:当前服务器如果宕机了,那么该服务器的权重降低20fall 3 # 检测失败的最大次数,超过两次认为节点资源发生故障rise 2 # 请求一次成功认为节点恢复正常}vrrp_instance VI_1 {state MASTER #主服务器写MASTER、备份服务器写BACKUPinterface eth0 #网卡名称virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小advert_int 1 #时间间隔。每隔多少秒发送一次心跳检测服务器是否还活着,默认1秒发送一次心跳authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.17.244.35 # VRRP H 虚拟IP地址,网段要和linux的网段一致,可以绑定多个虚拟ip}notify /etc/keepalived/kpad_notify.sh # keep状态传入脚本,通过该脚本可得知当前keep运行状态track_script {chk_mysql # 健康检查配置}}
router_id:标识,两台需不一样
state MASTER:表明这台是Master角色
priority:优先级,MASTER角色比BACKUP高!
virtual_router_id:虚拟路由编号,两台需要一致
172.17.244.35 :这就是我们配置的VIP:172.17.244.35
cript /etc/keepalived/chk_mysql.sh:MySQL的检测脚本,定时去检测MySQL进程是否挂掉,如果挂掉,在脚本里面重启之,定时通过interval配置,上面配置的是2s检测一次
notify /etc/keepalived/kpad_notify.sh:当Keepalived状态发生变化时,会调用该脚本,这也是我们实现Slave自动挂载Master的关键!!
当Keepalived从BACKUP提升为MASTER时,那么VIP就会漂移到自己身上,这个时候我们只需要将Slave挂载在自己身上即可
2、创建MySQL状态监测脚本
chk_mysql.sh内容如下,可以看到可以根据当前Keepalived的状态分别处理,但是此处的处理都是启动MySQL(如果MySQL进程已退出)
# 创建个日志文件mkdir -p /var/log/keepalived && touch /var/log/keepalived/chk_mysql.logtouch /etc/keepalived/chk_mysql.shchmod +x /etc/keepalived/chk_mysql.shvi /etc/keepalived/chk_mysql.sh#!/bin/bashSTATE=`cat /tmp/keepalived-state`log_file="/var/log/keepalived/chk_mysql.log"service_name="mysqld"service_cmd="/etc/init.d/mysqld"get_pid=`pidof $service_name`log() {echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file}case $STATE in"MASTER")if [ "${get_pid}" == "" ]; thenlog "$service_name service isn't exist."log "Try to restart $service_name service."$service_cmd startif [ $? -eq 0 ]; thenlog "restart $service_name service successfully."elselog "restart $service_name service failed."exit 1fifiexit 0;;"BACKUP")if [ "${get_pid}" == "" ]; thenlog "$service_name service isn't exist."log "Try to restart $service_name service."$service_cmd startif [ $? -eq 0 ]; thenlog "restart $service_name service successfully."elselog "restart $service_name service failed."exit 1fifiexit 0;;"FAULT")exit 0;;*)exit 1;;esac
3、Keepalived状态变更脚本
touch /etc/keepalived/kpad_notify.shchmod +x /etc/keepalived/kpad_notify.shvi /etc/keepalived/kpad_notify.sh#!/bin/bashTYPE=$1NAME=$2STATE=$3log_file="/var/log/keepalived/kpad_notify.log"log() {echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file}case $STATE in"MASTER")echo 'MASTER' > /tmp/keepalived-state# Slave自动切换Master/etc/keepalived/chg_master.sh >> $log_filelog "changed master status $STATE"exit 0;;"BACKUP")echo 'BACKUP' > /tmp/keepalived-statelog "do nothing $STATE"exit 0;;"FAULT")echo 'FAULT' > /tmp/keepalived-statelog "keepalived status is fault."exit 0;;*)log "unknown keepalived status. $STATE"exit 1;;esac
4、Slave自动切换Master脚本
touch /etc/keepalived/chg_master.shchmod +x /etc/keepalived/chg_master.shvi /etc/keepalived/chg_master.sh#!/bin/bashecho '====================================start master change==============================================='# 目标IP,指的是Slave的IP,可以是多个target_ip=(172.17.53.79)# 本机IPlocal_ip=`ifconfig eth0 | sed -n '2p' | awk '{ print $2 }'`# 获取本机master信息,mysql免密登录status=`mysql -uroot -e "show master status" | sed -n '2p'`# binlog文件名字binlog_file=`echo $status | awk '{ print $1 }'`# binlog同步偏移量binlog_pos=`echo $status | awk '{ print $2 }'`echo "Got local ip is $local_ip and binary log is $binlog_file and binary log position is $binlog_pos"# 循环执行转移Slave到自己身上for t_ip in $target_ipdoecho "start change slave for $t_ip to $local_ip"# ssh远程到slave上执行切换master操作,需要ssh免密登录ssh 172.17.53.79 <<SOFmysql -uroot <<EOFSTOP SLAVE;RESET SLAVE;CHANGE MASTER TOMASTER_HOST='$local_ip',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='$binlog_file',MASTER_LOG_POS=$binlog_pos;START SLAVE;EOFsleep 0.1mysql -uroot -e "SHOW SLAVE STATUS\G";SOFdoneecho '====================================end master change==============================================='
这个脚本用到了mysql -uroot免密登录和ssh免密登录,所以这里需要配置一下
- mysql免密登录,在Master主机和Master备机上已经配置过了,这里无需配置,另外Slave节点上面也需要配置
- ssh免密登录,上面已经安装过ssh服务端/客户端了,现在需要在Slave节点上配置ssh让Master主机/Master备机能登录上来操作
未完待续!!!
