1、keepalived是什么?

1、keepalived是什么?

  1. keepalived是集群管理中保证集群高可用的一个服务软件,它的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后,自动将web服务器加入到服务器集群中。解决了静态路由的单点故障问题。

2、工作原理

  1. keepalived是以VRRP协议为实现基础的,VRRP全程Virtual Router Redundancy Protocol ,即虚拟路由冗余协议。
  2. 虚拟路由冗余协议,可以认为是实现路由器高可用的协议。也就是说N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backupmaster上面有一个对外提供服务的vipmaster不断向backup发送心跳信息,告诉backup自己还活着,当backup收不到心跳消息时就认为master已经宕机啦,这时就需要根据VRRP的优先级来选举一个backupmaster。从而保证高可用。
  3. keepalived主要有三个模块,分别是corecheckvrrpcore模块为keepalived的核心,负责主进程的启动、维护、以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。。

3、配置文件

  1. keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defsstatic_ipaddressvrrp_scriptvrrp_instancevirtual_server.

1、global_defs区域

主要是配置故障发生时的通知对象以及机器标志

  1. global_defs {
  2. notification_email {
  3. acassen@firewall.loc
  4. failover@firewall.loc
  5. sysadmin@firewall.loc
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 192.168.200.1
  9. smtp_connect_timeout 30
  10. router_id 192.168.224.206
  11. vrrp_skip_check_adv_addr
  12. vrrp_strict
  13. vrrp_garp_interval 0
  14. vrrp_gna_interval 0
  15. }

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减少相应的值,

  1. vrrp_script chk_nginx {
  2. script "/usr/local/keepalived-1.3.4/nginx_check.sh"
  3. interval 2
  4. weight -20
  5. }

script:自己写的监测脚本。
interval 2:每2s监测一次
weight -20:监测失败,则相应的vrrp_instance的优先级会减少20个点

3、vrrp_instance 区域

  1. vrrp_instance VI_1 {
  2. state BACKUP
  3. interface ens33
  4. virtual_router_id 51
  5. mcast_src_ip 192.168.224.206
  6. priority 100
  7. advert_int 1
  8. authentication {
  9. auth_type PASS
  10. auth_pass 1111
  11. }
  12. virtual_ipaddress {
  13. 192.168.224.208
  14. }
  15. track_script{
  16. chk_nginx
  17. }
  18. }

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安装)

  1. yum install keepalived -y

2、配置Master

1、配置keeplived

  1. mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #把默认的配置文件备份一下
  2. vi /etc/keepalived/keepalived.conf
  3. 添加以下配置文件
  4. ! Configuration File for keepalived
  5. global_defs { #全局定义
  6. router_id M1 #唯一不重复
  7. }
  8. vrrp_script chk_mysql {
  9. script /etc/keepalived/chk_mysql.sh #检测脚本的路径及名称
  10. interval 2 #(检测脚本执行的间隔)
  11. weight -20 #权重。设置当前服务器的权重,此处的配置说明:当前服务器如果宕机了,那么该服务器的权重降低20
  12. fall 3 # 检测失败的最大次数,超过两次认为节点资源发生故障
  13. rise 2 # 请求一次成功认为节点恢复正常
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER #主服务器写MASTER、备份服务器写BACKUP
  17. interface eth0 #网卡名称
  18. virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
  19. priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
  20. advert_int 1 #时间间隔。每隔多少秒发送一次心跳检测服务器是否还活着,默认1秒发送一次心跳
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. virtual_ipaddress {
  26. 172.17.244.35 # VRRP H 虚拟IP地址,网段要和linux的网段一致,可以绑定多个虚拟ip
  27. }
  28. notify /etc/keepalived/kpad_notify.sh # keep状态传入脚本,通过该脚本可得知当前keep运行状态
  29. track_script {
  30. chk_mysql # 健康检查配置
  31. }
  32. }

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进程已退出)

  1. # 创建个日志文件
  2. mkdir -p /var/log/keepalived && touch /var/log/keepalived/chk_mysql.log
  3. touch /etc/keepalived/chk_mysql.sh
  4. chmod +x /etc/keepalived/chk_mysql.sh
  5. vi /etc/keepalived/chk_mysql.sh
  6. #!/bin/bash
  7. STATE=`cat /tmp/keepalived-state`
  8. log_file="/var/log/keepalived/chk_mysql.log"
  9. service_name="mysqld"
  10. service_cmd="/etc/init.d/mysqld"
  11. get_pid=`pidof $service_name`
  12. log() {
  13. echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file
  14. }
  15. case $STATE in
  16. "MASTER")
  17. if [ "${get_pid}" == "" ]; then
  18. log "$service_name service isn't exist."
  19. log "Try to restart $service_name service."
  20. $service_cmd start
  21. if [ $? -eq 0 ]; then
  22. log "restart $service_name service successfully."
  23. else
  24. log "restart $service_name service failed."
  25. exit 1
  26. fi
  27. fi
  28. exit 0
  29. ;;
  30. "BACKUP")
  31. if [ "${get_pid}" == "" ]; then
  32. log "$service_name service isn't exist."
  33. log "Try to restart $service_name service."
  34. $service_cmd start
  35. if [ $? -eq 0 ]; then
  36. log "restart $service_name service successfully."
  37. else
  38. log "restart $service_name service failed."
  39. exit 1
  40. fi
  41. fi
  42. exit 0
  43. ;;
  44. "FAULT")
  45. exit 0
  46. ;;
  47. *)
  48. exit 1
  49. ;;
  50. esac

3、Keepalived状态变更脚本

  1. touch /etc/keepalived/kpad_notify.sh
  2. chmod +x /etc/keepalived/kpad_notify.sh
  3. vi /etc/keepalived/kpad_notify.sh
  4. #!/bin/bash
  5. TYPE=$1
  6. NAME=$2
  7. STATE=$3
  8. log_file="/var/log/keepalived/kpad_notify.log"
  9. log() {
  10. echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file
  11. }
  12. case $STATE in
  13. "MASTER")
  14. echo 'MASTER' > /tmp/keepalived-state
  15. # Slave自动切换Master
  16. /etc/keepalived/chg_master.sh >> $log_file
  17. log "changed master status $STATE"
  18. exit 0
  19. ;;
  20. "BACKUP")
  21. echo 'BACKUP' > /tmp/keepalived-state
  22. log "do nothing $STATE"
  23. exit 0
  24. ;;
  25. "FAULT")
  26. echo 'FAULT' > /tmp/keepalived-state
  27. log "keepalived status is fault."
  28. exit 0
  29. ;;
  30. *)
  31. log "unknown keepalived status. $STATE"
  32. exit 1
  33. ;;
  34. esac

4、Slave自动切换Master脚本

  1. touch /etc/keepalived/chg_master.sh
  2. chmod +x /etc/keepalived/chg_master.sh
  3. vi /etc/keepalived/chg_master.sh
  4. #!/bin/bash
  5. echo '====================================start master change==============================================='
  6. # 目标IP,指的是Slave的IP,可以是多个
  7. target_ip=(172.17.53.79)
  8. # 本机IP
  9. local_ip=`ifconfig eth0 | sed -n '2p' | awk '{ print $2 }'`
  10. # 获取本机master信息,mysql免密登录
  11. status=`mysql -uroot -e "show master status" | sed -n '2p'`
  12. # binlog文件名字
  13. binlog_file=`echo $status | awk '{ print $1 }'`
  14. # binlog同步偏移量
  15. binlog_pos=`echo $status | awk '{ print $2 }'`
  16. echo "Got local ip is $local_ip and binary log is $binlog_file and binary log position is $binlog_pos"
  17. # 循环执行转移Slave到自己身上
  18. for t_ip in $target_ip
  19. do
  20. echo "start change slave for $t_ip to $local_ip"
  21. # ssh远程到slave上执行切换master操作,需要ssh免密登录
  22. ssh 172.17.53.79 <<SOF
  23. mysql -uroot <<EOF
  24. STOP SLAVE;
  25. RESET SLAVE;
  26. CHANGE MASTER TO
  27. MASTER_HOST='$local_ip',
  28. MASTER_USER='repl',
  29. MASTER_PASSWORD='repl',
  30. MASTER_LOG_FILE='$binlog_file',
  31. MASTER_LOG_POS=$binlog_pos;
  32. START SLAVE;
  33. EOF
  34. sleep 0.1
  35. mysql -uroot -e "SHOW SLAVE STATUS\G";
  36. SOF
  37. done
  38. echo '====================================end master change==============================================='

这个脚本用到了mysql -uroot免密登录和ssh免密登录,所以这里需要配置一下

  • mysql免密登录,在Master主机和Master备机上已经配置过了,这里无需配置,另外Slave节点上面也需要配置
  • ssh免密登录,上面已经安装过ssh服务端/客户端了,现在需要在Slave节点上配置ssh让Master主机/Master备机能登录上来操作

未完待续!!!