准备环境
准备两台虚拟机, CentOS7.
节点 DB1:192.168.11.31.
节点 DB2:192.168.11.32.
假设我们已经把 MySQL 安装好, 并已实现了主主同步功能, 详见本站文章: MySQL/MariaDB 主主数据同步配置 https://www.helloweba.net/server/543.html .
接下来我们要做的是, 安装 Keepalived, 并配置实现 MySQL 高可用. 就是要实现功能: 两个节点中有一个发生故障会自动切换到另一个节点上.
安装 Keepalived
安装依赖:
- yum -y install libnl libnl-devel
- yum -y install libnfnetlink-devel
编译安装:
- tar -zxvf keepalived-1.3.4.tar.gz
- cd keepalived-1.3.4
- ./configure --prefix=/usr/local/keepalived
- make && make install
安装完成后做成服务模式, 方便开启和关闭:
- cp /usr/local/keepalived/sbin/keepalived /usr/sbin
- cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
- cp /usr/local/keepalived/sbin/keepalived /etc/init.d/
设置开机自动启动:
systemctl enable keepalived.service
两台机器都要安装 Keepalived.
配置 Keepalived
keepalive 通过组播, 单播等方式 (自定义), 实现 keepalive 主备推选. 工作模式分为抢占和非抢占 (通过参数 nopreempt 来控制).
抢占模式: 当优先级高的主节点发生故障时, 由被节点接管服务, 但是当优先级高的主节点故障恢复时, 立马抢占回 VIP 资源, 继续提供主节点服务. 配置时, 看节点中谁的 priority 优先级高,(一般而言, state 为 MASTER 的优先级要高于 BACKUP). 根据 priority 优先级来决定谁抢占 vip 资源.
非抢占模式: 不分主备节点, 当其中一节点发生故障时, 另一节点立马接管 VIP 服务, 即使优先级高的那一节点故障恢复后也不会主动抢回 vip, 只能等到对方发生故障, 才会将 vip 切回来. 非抢占模式中 state 状态都设置成 backup, 配置 nopreempt 参数, 那么就不会去考虑 priority 优先级了, 是非抢占模式!
本实验我们采用 非抢占模式 , 分别配置两个节点的配置文件.
- mkdir /etc/keepalived
- cd /etc/keepalived/
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- 123456@qq.com
- }
- notification_email_from xxxx@163.com
- smtp_server smtp.163.com
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- }
- # 检测 mysql 是否正常运行
- vrrp_script check_mysql {
- script "/etc/keepalived/check_mysql.sh"
- interval 5
- }
- vrrp_instance VI_1 {
- state BACKUP # BACKUP MASTER 两台都配置为 backup, 非抢占模式
- interface eno16777736 #绑定虚拟 IP 的网卡接口
- #VRRP 组名, 两个节点设置一样, 以指明各个节点同属一 VRRP 组
- virtual_router_id 61
- priority 100 #优先级, 另一台设为 90
- advert_int 1 ## 组播信息发送间隔, 两个节点需一致
- nopreempt #不抢占, 只在优先级高的机器上设置, 优先级低的不设置
- #设置密码验证信息, 两个节点需一致
- authentication {
- auth_type PASS
- auth_pass helloweba
- }
- #指定虚拟 IP, 两个节点需设置一样
- virtual_ipaddress {
- 192.168.11.30
- }
- #检测 mysql 状态
- track_script {
- check_mysql
- }
- }
这里注意, 我们设置为非抢占模式, 节点 1 中的优先级最高, 并设置 nopreempt 意为不抢占, 那么在节点 2 上就不要设置这个参数了, 并且把优先级设为 90 即可.
此外我们使用 Keepalived 设置一个虚拟 IP, 即 VIP, 统一以 VIP 对外, 就是说, 外部访问连接通过 VIP:192.168.11.30 连接即可. 注意 VIP 一定不能被其他机器占用.
配置好后, 我们还需要设置 keepalived 主备通信, 添加防火墙 vrrp 协议, eno16777736- 网卡名.
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
如果不执行以上命令的话, 会导致两个节点都有 VIP 的情况. 当然你也可以关闭防火墙.
MySQL 状态脚本检测
我们使用脚本检测 Mysql 的运行状态, 脚本路径:/etc/keepalived/check_mysql.sh.
- #!/bin/bash
- counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
- if [ "${counter}" -eq 0 ]; then
- systemctl stop keepalived
- fi
我们监听 3306 端口, 如果 3306 端口挂掉了, 说明 Mysql 发生故障, 这个时候停止本机 Keepalived 服务, 另一节点就会接管 VIP 服务.
当然这个检测脚本有点暴力, 有可能其他原因导致 MySQL 故障, 而 3306 端口又是正常运行的情况, 所以我们写了个比较平滑的检测代码:
- #!/bin/bash
- MYSQL=/usr/local/mariadb/bin/mysql
- MYSQL_HOST=localhost
- MYSQL_USER=root
- MYSQL_PASSWORD=grandhonor.net12358
- CHECK_TIME=3
- #mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
- MYSQL_OK=1
- function check_mysql_helth (){
- $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;">/dev/null 2>&1
- if [ $? = 0 ] ;then
- MYSQL_OK=1
- else
- MYSQL_OK=0
- fi
- return $MYSQL_OK
- }
- while [ $CHECK_TIME -ne 0 ]
- do
- let "CHECK_TIME -= 1"
- check_mysql_helth
- if [ $MYSQL_OK = 1 ] ; then
- CHECK_TIME=0
- exit 0
- fi
- if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
- then
- pkill keepalived
- exit 1
- fi
- sleep 1
- done
保存好脚本文件后, 记得给执行权限:
chmod +x /etc/keepalived/check_mysql.sh
最后两台机器上都开启 Keepalived 服务:
systemctl start keepalived
高可用测试
1. 我们先使用命令 ip a 查看两台节点的 VIP 情况, 发现节点 1:192.168.11.31 目前接手了 VIP:192.168.11.30, 而节点 2 并没有 VIP.
2. 关闭或者重启节点 1 或者重启节点 1 上的 Keepalived 服务, 查看节点 2 是否接手 VIP.
如图所示, 如果在节点 2 上能看到 VIP 了说明 VIP 已经变更到节点 2 上了.
3. 我们接着在两个节点机上的 Mysql 建立新的用户, 允许任意机器连接 (实际可以指定具体 IP).
grant all privileges on myhelloweba.* to keep@'%' identified by '123456';
4. 关闭接手 VIP 服务节点的 mysql 服务, 检验是否能从其他机器上通过终端连接 192.168.11.30 上的数据库. 如果可以在测试往数据库中添加数据, 再检测数据是否正常.
来源: http://www.tuicool.com/articles/MjM7R36