(5.16)mysql高可用系列——keepalived+mysql双主ha

【1】KeepAlived的基本概念与原理

       双主KeepAlived

  利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障转移群集)

更高级的架构如下:

keepalived架在双主上,双主互为主从,多个从库连接keepalived的VIP。外部使用mycat做读写分离与读负载均衡

  

 

 

【1.1】keepalived 简介

 参考:(5.1)mysql高可用系列——高可用架构方案概述 中的【4】双主keepalive

  (1.1.1)Keepalived服务的工作原理

  Keepalived服务对之间通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的(有点像故障转移群集中的投票仲裁形式),主的优先级高于备,因此工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外服务。

  在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用(也就是备没有受到VRRP广播包信息),就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

  (1.1.2)keepalived 的三个核心模块

    分别是core/check/vrrp

    core:keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

    check:负责健康检查,包括常见的各种检查方式。

    vrrp:是用来实现VRRP协议的;(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

  (1.1.3)什么是VRRP?

  VRRP,全称 virtual router redundancy protocol,虚拟路由冗余协议。

  VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。 

  Keepalived通过组播(默认)、单播(自定义),实现keepalived主备推选,工作模式分为抢占和非抢占。

  《1》抢占模式

    主服务器正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不供服务,备提供服务。

    也就是说,抢占模式下,不分主备,只管优先级。

    不管 keepalived.conf 里的 state 配置成 master 还是 backup ,只看谁的priority 优先级高, priority 优先级高的那一个,在故障恢复后,会自动将VIP资源再次抢回来。

    举例:

1)俩台都为master/backup时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。

   此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。

2)  server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。

     当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式

3)  server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。

     当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式

 

 

  《2》非抢占模式

    这种方式通过参数nopreempt(一般设置在advert_int 的那一行下面)来控制。不管priority优先级,只要master机器发生故障,VIP资源就会被切换到backup上。

    并且,当master机器恢复后,也不会将VIP资源抢回来。除非Backup机器发生故障,才能自动把VIP等资源切换会主库。

    

    nopreempt 这个参数只能用户state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!

    也就是说

    d)  当state状态都为master或者都为backup的时候,没有加nopreempt参数,那么

    a)当state状态一个为master,一个为backup的时候,加不加nopreempt 这个参数都是一样的效果。

      即都是根据priority优先级来决定谁抢占VIP资源,属于抢占模式

    b)当state状态都设置成backup,如果不配置nopreempt参数。

      也是根据priority优先级来决定谁抢占VIP资源,属于抢占模式

    c)当state状态都设置成backup,如果配置了 nopreempt 参数,那么久不会去考虑priority优先级了。

      是非抢占模式! 即只有VIP当前所在机器发生故障,另一台机器才能接管VIP。 不考虑优先级问题。

      注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了

【1.2】Keepalived在MySQL上有什么作用?

  mysql双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备。

  但一个Master宕机后不能实现动态切换,使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

【1.3】较为详细的介绍

Keepalived是一个高度模块化设计的软件,从源代码结构似乎也很容易看出这一点。Keepalived 1.2.13源代码中只有如下目录:check  core  etc  include  libipvs-2.4  libipvs-2.6  vrrp

check:Keepalived的healthchecker子进程的目录,包括了所有的健康检查方式以及对应配置的解析,LVS的配置解析也在这个里面。
core:Keepalived的核心程序,如全局配置的解析,进程启动等等。
etc:包含Keepalived的配置模板和启动脚本等文件。
include:头文件目录。
libipvs*:LVS使用的库文件。
vrrp:Keepalived的vrrpd子进程以及相关的代码。

 

(1) 多进程模式
        Keepalived采用了多进程的设计模式,每个进程负责不同的功能,我们在使用LVS的机器上通常可以看到三个Keepalived进程:
111 keepalived    < 父进程,负责内存管理、监控子进程等
112 \_ keepalived < VRRP子进程
113 \_ keepalived < healthchecker子进程
 

(2) 控制面板
        这里所谓的控制面板就是对配置文件的编译和解析。Keepalived的配置文件解析比较另类,并不是一次解析所有配置,而是只在用到某模块时才解析相应的配置。在源文件里面可以看到类似XXX_parser.c的文件,就是做这个用的。
 

(3) 看门狗
        WatchDog框架提供了对VRRP和healthchecker子进程的监控。
 

(4)IPVS封装
        Keepalived里面所有对LVS的相关操作并不直接使用ipvsadm客户端程序,而是使用IPVS提供的函数进行操作,这些代码都在check/ipwrapper.c中。

【2】环境与架构准备

【2.1】实验基本配置情况

操作系统:CentOS7.5

mysql:5.7.24

Mysql master DB3: 192.168.135.173

Mysql slave   DB4: 192.168.135.174

keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从,这里略

【2.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
sysctl -p

#(2)配置iptables,添加VRRP通讯支持
-A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳
-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

firewalld防火墙
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload

#(3)开启路由转发功能
#临时
echo "1">/proc/sys/net/ipv4/ip_forward

#永久
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

【2.3】下载、安装 keepalived

#(1)下载
官网:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包
mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置
yum install kernel-devel openssl-devel popt-devel -y

#(3)安装
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install

#(4)设置keepalived开机自启
systemctl enable keepalived

------------下面(5)(6)可以忽略------------------------
#(5)如果不设置自定义目录,默认目录如下
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/

#(5)构建keepalived 配置文件目录与文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/


#(6)基本配置文件复制
cp usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
 

【2.4】配置文件解析

参考:https://blog.csdn.net/shmnh/article/details/42000615

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs { #全局定义,
   notification_email {#邮件通知,下面的是收件人邮件地址,需要开启sendmail服务
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc #邮件通知的发件人地址
   smtp_server 192.168.200.1 #发送邮件服务器地址
   smtp_connect_timeout 30 #连接邮件服务器超时时间-秒
   router_id LVS_DEVEL #路由id,随便取名字但同一个连接网络要唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {#配置虚拟实例,这个名字任意取
    state MASTER #角色状态,可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体
    interface eth0 #指定HA检测网络的接口
    virtual_router_id 51 #路由id
    priority 100 #优先级
    advert_int 1 #广播频率,单位是秒
   #nopreempt #默认抢占模式,这个参数设置非抢占模式,需要主从state 都为BACKUP 才生效
authentication {#身份验证 auth_type PASS #验证类型 PASS为密码验证 auth_pass 1111 #验证密码,主从一样就好了 } virtual_ipaddress {#虚拟IP,我们启动后虚拟IP是多少 192.168.200.16 #192.168.1.210/24 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 {#虚拟服务器,IP+端口,以空格分隔 delay_loop 6 #运行情况检查,IP+端口是否可用,单位是秒 lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法 lb_kind NAT #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选 persistence_timeout 50 #会话保持单位时间,单位是秒 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 192.168.201.100 443 {#虚拟服务器对应的实际服务器、端口 weight 1 #配置服务节点的权值,权值数字越大,权值越高 SSL_GET {#获取ssl连接信息 url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd }
       #notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容
       #notify_master /home/mysql/master.sh #如果这个server down掉之后,新主服务器执行这个脚本 connect_timeout
3 #tcp检测参数,表示3秒无响应超时 retry 3 #表示最大重试次数 delay_before_retry 3 #表示重试间隔秒数
       #connect_port 3306 #表示连接检测的端口为3306
} } }
#后面一样的就不赘述了。

【2.5】最佳实践配置文件

参考代码:

global_defs {#全局定义
   router_id MySQL-HA #全局路由ID,主从需要相同
}

vrrp_script check_run {#VRRP自定义脚本,check_run自定义名称
  script "/etc/keepalived/mysql_check.sh" #调用的脚本文件URL
  interval 60 #运行间隔,单位为秒
}

vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称
group {#组内成员
  VI_1
  }
}

vrrp_instance VI_1 {#vrrp虚拟实例
    state BACKUP #从
    interface ens34 #针对监听的网络接口
    virtual_router_id 51 #唯一路由ID,主从要一致
    priority 90 #权限
    advert_int 1 #广播频率,单位是秒
    nopreempt #非抢占模式
    authentication {#同一组keepalived的验证方式
        auth_type PASS
        auth_pass 1234
    }
    track_script {#定义跟踪使用脚本
      check_run #这里就是我们上面自己定义的脚本

}
notify_master /etc/keepalived/master.sh #当本机换为Master状态时,会呼叫执行 notify_master
notify_stop
/etc/keepalived/stop.sh #当本机终止keepalived 时,会呼叫执行 notify_stop
notify_backup /etc/keepalived/backup.sh #当本机进入Backup状态时,会呼叫执行 notify_backup
notify_fault /etc/keepalived/fault.sh #当本机发现异常情况进入Fault状态时,会呼叫执行 notify_fault

virtual_ipaddress { #设置虚拟IP
  192.168.1.210
  }
}

单播参考:

    unicast_src_ip 192.168.1.14  # 配置单播的本机地址
    unicast_peer { 
        192.168.1.15       #配置单播的目标地址
    }    #keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,可以将组播的模式改为单拨。也有可能组播被上级禁用。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。

 

 

 

我的实际代码:

#主
global_defs {
   router_id MySQL-HA
}

vrrp_script check_run {
script "/etc/keepalived/mysql_check.sh"
interval 60
}

vrrp_sync_group VG1 {
group {
VI_1
}
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    track_script {
check_run } notify_master
/etc/keepalived/master.sh notify_stop /etc/keepalived/stop.sh virtual_ipaddress { 192.168.135.180 } } #从 global_defs { router_id MySQL-HA } vrrp_script check_run { script "/etc/keepalived/mysql_check.sh" interval 60 } vrrp_sync_group VG1 { group { VI_1 } } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1234 } track_script {
check_run } notify_master
/etc/keepalived/master.sh notify_stop /etc/keepalived/stop.sh virtual_ipaddress { 192.168.135.180 } }
/etc/keepalived/mysql_check.sh的作用是为了没分钟判断一次mysql服务是否存活
#!/bin/bash
source /etc/profile
count=1 while true do
mysql
-uroot -p123456 -S /tmp/mysql_3306.sock -e "show status;" > /dev/null 2>&1 i=$? ps aux | grep mysqld | grep -v grep > /dev/null 2>&1 j=$? if [ $i = 0 ] && [ $j = 0 ] then exit 0 else if [ $i = 1 ] && [ $j = 0 ] then exit 0 else if [ $count -gt 5 ] then break fi count=$((${count}+1)) continue fi fi done systemctl stop keepalived

other

 

#!/bin/bash
count=1

while true
do

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1
j=$?
if  [ $j = 0 ]
then
   exit 0
else
   sleep 1
   if [ $count -gt 5 ]
        then
              break
        fi
   count=$((${count}+1))
   continue
fi

done
systemctl stop keepalived

 

/etc/keepalived/master.sh 的作用是状态改为master以后执行的脚本

首先判断复制是否有延迟,如果有延迟,等1分钟后,不论是否有延迟,都并停止复制,并且记录binlog和pos点。文件内容如下。

#!/bin/bash
source /etc/profile Master_Log_File
=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}') Relay_Master_Log_File=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}') Read_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}') Exec_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}') i=1 while true do if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ] then echo "ok" break else sleep 1 if [ $i -gt 60 ] then break fi let i++ fi done mysql -uroot -S /tmp/mysql_3306.sock -e "stop slave;" mysql -uroot -S /tmp/mysql_3306.sock -e "reset slave all;" mysql -uroot -S /tmp/mysql_3306.sock -e "reset master;"
mysql -uroot -S /tmp/mysql_3306.sock -e "set global read_only=0;"   

/etc/keepalived/stop.sh  主库 keepalived 停止以后需要执行的脚本。检查是否还有复制写入操作,最后无论是否执行完毕都退出。文件内容如下。

#!/bin/bash
source /etc/profile
M_File1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')
sleep 1
M_File2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/File/{print $2}')
M_Position2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}')

i=1

while true
do

if [ $M_File1 = $M_File1 ] && [ $M_Position1 -eq $M_Position2 ]
then
   echo "ok"
   break
else
   sleep 1

   if [ $i -gt 60 ]
   then
      break
   fi
   continue
   let i++
fi
done

 

 简单版notify.sh

#!/bin/bash
contact='yuxingfu@aikosolar.com'

notify(){
mailsubject="$(hostname) to be $1, vip转移"
mailbody="(`date +%F%T`):vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact

}

case $1 in

master)
notify master
;;

backup)
notify backup
;;

fault)
notify fault
;;

stop)
notify fault
;;

*)

echo "Usage: $(basename $o) {master|backup|fault|stop}"
exit 1

;;

esac

 

 

【2.6】修改默认日志文件位置


#默认错误日志位置:/var/log/messages
#(1)修改文件
vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边
KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf         -d Dump the configuration data.
# --log-detail        -D Detailed log messages.
# --log-facility      -S 0-7 Set local syslog facility (default=LOG_DAEMON)

#(2)修改日志级别参数文件
vi /etc/rsyslog.conf

#在最后一行加上
local0.* /var/log/keepalived.log

#(3)重启日志服务
systemctl restart rsyslog

 

【2.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务
systemctl start keepalived #启动服务
systemctl enable keepalived #设置服务开机自启
systemctl status keepalived #查看服务状态,有没有报错最快可以看这里
ps -ef|grep keepalived|grep -v "grep" #查看服务进程

   

 

   

 

 

   查看VIP所在。

     

 

 

 

【2.8】基于mysql连接的核验

 

 用mysql连接虚拟IP地址,查看是哪个机器。

   

果然是DB3。

【2.9】故障转移测试

(1)查看当前运行情况,确保keepalived和mysql都在运行

  

 

   

 

 (2)查看当前谁是 keepalived 的 master

    

 

     

 

   很明显,现在173是 master

(3)关闭 mysql 服务模拟故障转移

    

 

   由上图可以看到,我们关闭了 173(keepalived master) 机器的 mysql服务后,keepalived也跟着关闭了。

(4)故障转移查看

  《1》IP地址查看

    

 

   并且,我们的 master.sh 脚本 还生成了一个txt文件,它记录该机器所在 mysql 实例的 binlog 信息

    

 

   《2》连接查看,我还特地搞了个 其他机器来连接 VIP,结果成功。

    

 

【3】MHA配置keepalived

【3.1】实验基本配置情况

操作系统:CentOS7.5

mysql:5.7.24

Mysql master DB1: 192.168.1.201  

Mysql slave   DB2: 192.168.1.202

keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从,这里略

【3.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持
echo "net.ipv3.ip_nonlocal_bind=1" >> /etc/sysctl.conf
sysctl -p

#(2)配置iptables,添加VRRP通讯支持
-A INPUT -d 223.0.0.18 -j ACCEPT #允许组播地址访问本机
-A INPUT -s 192.168.1.0/24 -d 223.0.0.18 -j ACCEPT #允许组播地址通信
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能
echo "1">/proc/sys/net/ipv4/ip_forward

【3.3】下载、安装 keepalived

#(1)下载
官网:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包
mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置
yum install kernel-devel openssl-devel popt-devel -y

#(3)安装
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install

#(4)设置keepalived开机自启
systemctl enable keepalived

#(5)如果不设置自定义目录,默认目录如下
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/

#(5)构建keepalived 配置文件目录与文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  

【3.4】配置文件解析

参考:https://blog.csdn.net/shmnh/article/details/42000615

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs { #全局定义,
   notification_email {#邮件通知,下面的是收件人邮件地址,需要开启sendmail服务
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc #邮件通知的发件人地址
   smtp_server 192.168.200.1 #发送邮件服务器地址
   smtp_connect_timeout 30 #连接邮件服务器超时时间-秒
   router_id LVS_DEVEL #路由id,随便取名字但同一个连接网络要唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {#配置虚拟实例,这个名字任意取
    state MASTER #角色状态,可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体
    interface eth0 #指定HA检测网络的接口
    virtual_router_id 51 #路由id
    priority 100 #优先级
    advert_int 1
   #nopreempt #默认抢占模式,这个参数设置非抢占模式,需要主从state 都为BACKUP 才生效 authentication {#身份验证 auth_type PASS #验证类型 PASS为密码验证 auth_pass 1111 #验证密码,主从一样就好了 } virtual_ipaddress {#虚拟IP,我们启动后虚拟IP是多少 192.168.200.16 #192.168.1.210/24 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 {#虚拟服务器,IP+端口,以空格分隔 delay_loop 6 #运行情况检查,IP+端口是否可用,单位是秒 lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法 lb_kind NAT #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选 persistence_timeout 50 #会话保持单位时间,单位是秒 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 192.168.201.100 443 {#虚拟服务器对应的实际服务器、端口 weight 1 #配置服务节点的权值,权值数字越大,权值越高 SSL_GET {#获取ssl连接信息 url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd }
       #notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容
       #notify_master /home/mysql/master.sh #如果这个server down掉之后,新主服务器执行这个脚本 connect_timeout 3 #tcp检测参数,表示3秒无响应超时 retry 3 #表示最大重试次数 delay_before_retry 3 #表示重试间隔秒数
       #connect_port 3306 #表示连接检测的端口为3306 } } }
#后面一样的就不赘述了。 virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } }

【3.5】最佳实践配置文件

参考:

global_defs {
   notification_email {
     xxxxxx@sina.com   #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。
   }
   notification_email_from keepalived@localhost  #设置邮件的发送地址
   smtp_server 127.0.0.1                         #设置SMTP Server地址
   smtp_connect_timeout 30                       #设置SMTP Server的超时时间
   router_id LVS_DEVEL          #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息
}
vrrp_instance VI_1 {            #vrrp 实例定义部分
    state MASTER                #指定Keepalived的角色,MASTER表示些主机是主服务器。BACKUP表示此主机是备用服务器 
    interface eth1              #指定HA监测网络的接口
    virtual_router_id 51        #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下MASTER与BACKUP必须是一致的
    priority 50                 #定义优先级,数字越大,优先级越高
    authentication {
        auth_type PASS          #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    virtual_ipaddress {        #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
       192.168.100.250
    }
}
virtual_server 192.168.100.250 80 {   #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 6                 #设置运行情况检查时间,单位为秒
    lb_algo rr                #设置负载调度算法,这里设置rr,即轮询算法
    lb_kind DR               #设置LVS实现负载均衡机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 60    #会话保持单位时间,单位是秒
    protocol TCP              #指定转发协议类型,有TCP和UDP两种
    real_server 192.168.100.60 80 {  #配置服务节点1,需要指定real server的真实IP地址和端口
        weight 1                     #配置服务节点的权值,权值数字越大,权值越高
        TCP_CHECK {                  #relserve的状态检测设置部分,单位是秒
                  connect_timeout 10 #表示10秒无响应超时
                  retry 3     #表示重试次数
           delay_before_retry 3  #表示重试间隔
 }
    }
    real_server 192.168.100.80 80 {
        weight 1
        TCP_CHECK {
                 connect_timeout 10  #表示10秒无响应超时
                 retry 3     #表示重试次数
          delay_before_retry 3  #表示重试间隔
 }
    }
}

我的配置文件

#master
global_defs {
   router_id mysql_ha
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens34
    virtual_router_id 51
    priority 100
    authentication {
 auth_type PASS
 auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.210
    }
}
virtual_server 192.168.1.201 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 192.168.1.201 3306 {
    weight 1
    notify_down /etc/keepalived/keepalived_stop.sh
    TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
        connect_port 3306
        }
    }
}

#slave
global_defs {
   router_id mysql_ha
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens34
    virtual_router_id 51
    priority 100
    authentication {
 auth_type PASS
 auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.210
    }
}
virtual_server 192.168.1.202 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 192.168.1.202 3306 {
    weight 1
    notify_down /etc/keepalived/keepalived_stop.sh
    TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
        connect_port 3306
        }
    }
}

 

杀死keepalived的脚本,防止脑裂
/etc/keepalived/keepalived_stop.sh
echo '#!/bin/bash' >/etc/keepalived/keepalived_stop.sh
echo "pkill keepalived" >>/etc/keepalived/keepalived_stop.sh
chmod u+x /etc/keepalived/keepalived_stop.sh

【3.6】修改默认日志文件位置


#默认错误日志位置:/var/log/messages
#(1)修改文件  yum的话 为 /etc/sysconfig/keepalived
vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边
KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf         -d Dump the configuration data.
# --log-detail        -D Detailed log messages.
# --log-facility      -S 0-7 Set local syslog facility (default=LOG_DAEMON)

#(2)修改日志级别参数文件
vi /etc/rsyslog.conf

#在最后一行加上
local0.* /var/log/keepalived.log

#(3)重启日志服务
systemctl restart rsyslog

【3.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务
systemctl start keepalived #启动服务
systemctl enable keepalived #设置服务开机自启
systemctl status keepalived #查看服务状态,有没有报错最快可以看这里
ps -ef|grep keepalived|grep -v "grep" #查看服务进程

   

 

   

 

【3.8】基于mysql连接的核验

先看看机器信息

  

 

 用mysql连接虚拟IP地址,查看是哪个机器。

 mysql -uroot -p123456 -h192.168.1.210

 

果然是DB1。

【3.9】故障转移测试

因为我们设置的是通过3306端口去做连接访问操作,所以只要mysql挂掉,3306端口也就不可访问了,就可以故障转移了。

我们实践一下,如下图,先关闭DB1的mysql

  systemctl stop mysql

  

 

 (1)查看IP地址,是否有虚拟IP

   

 

  由上图可知,很明显已经飘到DB2机器上来了。

(2)用连接虚拟IP mysql

   mysql -uroot -p123456 -h192.168.1.210

  

 

  结果是DB2,证明连上的确实是我们想要的结果。

【keepalived故障处理】

(1)vrrp_script 定义的脚本不执行

(1)WARNING - script '/etc/keepalived/bin/check.sh' is not executable for uid:gid 0:0 - disabling.

需要加权限 chmod +x  脚本名

(2)vip无法ping通,无法访问端口

#vrrp_strict

  keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭;

  原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。

(3)如何抓包查看

tcpdump -i ens160 vrrp

tcpdump -i eth0 -n 'host 224.0.0.18'

(4)2个节点均有VIP

1、VRRP异常,主备都有VIP,备机收不到主节点的vrrp报文

  原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。

2、组播被禁用,使用单播解决

    unicast_src_ip 192.168.1.14  # 配置单播的本机地址
    unicast_peer { 
        192.168.1.15       #配置单播的目标地址
    }    #keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,可以将组播的模式改为单拨。也有可能组播被上级禁用。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。

 3、防火墙没有关闭,导致A和B之间不能通信,都判断自己为master绑定vip

4、keepalived的vrid与别人的相同,并且密码还都是一样的导致,keepalived报错

(5)Unsafe permissions found for script '/etc/keepalived/bin/recover.sh'.

脚本权限不能777.

(6)keepalived报错 invalid user/group for notify script(SELINUX问题)

(7)两边都有VIP,应该是开了 firewalld 防火墙 VRRP协议没开通。

(8)WARNING - default user 'keepalived_script' for script execution does not exist - please create.

script_user root
enable_script_security

(9)Script user '/etc/keepalived/notify.sh fault' does not exist

注意 notify_stop "url stop",这里 notify_stop 和后面的参数只能又一个空格

 

 

参考文档

使用Keepalived实现MySQL主从高可用:https://blog.csdn.net/wzy0623/article/details/80916567

keepalived.conf详细参考:https://blog.csdn.net/shmnh/article/details/42000615

我的文章相关参考:mysql keepalived双主ha

 

posted @ 2020-02-18 21:34  郭大侠1  阅读(598)  评论(0编辑  收藏  举报