keepalived + HAProxy + mysql高可用

MySQL 高可用

简介

本次搭建目的是使用 haproxy + keepalived + mysql(双主复制) 搭建 mysql 高可用集群,使用 keepalived 监控 haproxy 和 mysql 状态,如果 haproxy 服务异常则将 VIP 漂移到另外的机器上。

在这里插入图片描述

1. 环境准备

本次试验机器性能有限,所以只用了两台虚拟机,在上面安装 mysql 、haproxy 、keepalived

IP主机名软件版本
192.168.169.100mysql01系统版本:CentOS Linux release 7.9.2009
mysql 版本:mysql-5.7.38
haproxy 版本:haproxy-2.4.17
keepalived 版本:Keepalived v1.3.5
192.168.169.101mysql02系统版本:CentOS Linux release 7.9.2009
mysql 版本:mysql-5.7.38
haproxy 版本:haproxy-2.4.17
keepalived 版本:Keepalived v1.3.5

2. 搭建 mysql 双主复制

参考:MySQL 双主复制

3. 安装 HAProxy

参考:

HAProxy 安装

HAProxy 学习

下面是本次试验使用的配置文件信息

global
  #日志
  log 127.0.0.1 local0 info
  #最大连接数
  maxconn 10240
  daemon
  pidfile /usr/local/haproxy/logs/haproxy.pid
 
defaults
  #应用全局的日志配置
  log global
  mode http
  #超时配置
  timeout connect 5000
  timeout client 5000
  timeout server 5000
  timeout check 2000

frontend mysql-front
    bind *:3307			# 这里绑定的端口就是后面使用 VIP 访问 mysql 时使用的端口
    mode tcp
    default_backend mysql-backup
 
backend mysql-backup
    mode tcp
    balance roundrobin
    server db1 192.168.169.100:3306 weight 1 check inter 2000 rise 2 fall 3
    server db2 192.168.169.101:3306 weight 1 check inter 2000 rise 2 fall 3
 
listen http_front #haproxy的客户页面
  bind 192.168.169.101:8888         #HAProxy自己的IP地址
  mode http
  option httplog
  stats uri /haproxy
  stats auth admin:123456          #控制面板账号密码 账号:admin 
  stats refresh 5s
  stats enable

4. 安装 keepalived

这里直接使用 yum 安装

yum -y install keepalived

4.1 修改配置文件

主备基本差不多,主要注意 router_id 、state 、priority 这三个参数

# 修改 Keepalived 配置文件,将原本的 keepalived.conf 文件备份,新建 keepalived.conf 文件加入如下内容
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf

# 注意:这个是 master(主机) 的配置文件
! Configuration File for keepalived		# 这一行为注释
global_defs { 
	router_id server01	# router_id 机器标识,通常使用 hostname,相对具有唯一性,和备机区分开,不能使用同一个标识
}


vrrp_script chk_server {		# 定义一个检测脚本,在global_defs之外配置
  script "/etc/keepalived/check_server.sh"	# 自己写的监测脚本
  interval 2	# 每2s监测一次
  weight -10	# 该参数用于指定当监测失效时,该设备的优先级会减少的值,该值为负表示减少
  fall 2        # 尝试两次都成功才成功
  rise 2        # 尝试两次都失败才失败
}


vrrp_instance VI_1 {		# 定义一个vrrp_install实例,名称为VI_1
	state MASTER			# 表示该实例的角色状态,有MASTER和BACKUP两种主备状态
	interface ens33			# 对外提供服务的网络接口,注意修改为自己的网卡名称,如 ens33,eth0,eth1
	virtual_router_id 51	# 虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致
	priority 150			# priority表示实例优先级,数字越大,优先级越高。master 的优先级必须大于 backup
	advert_int 1			# 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,默认是秒
	
	authentication {		# 权限认证配置
		auth_type PASS		# 主要有 PASS 和 AH 两种
		auth_pass 1111		# 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
	}
	
	virtual_ipaddress {
		192.168.169.99		# 虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中访问 zabbix server 需要和域名绑定的ip
	}
	
	
	track_script {		# 调用自定义的脚本
        chk_server
    }
		
}

这里有一个问题,keepalived 能不能配置两个 vrrp_script 和两个 track_script ,我配置两个第二个脚本不执行

4.2 编写脚本

上面配置中有一个检查脚本,它会检查服务运行状态,如果服务宕机了,则选择将 VIP 漂移到另外一台机器上

因为我这个是所有的服务都装在了一台机器上,然后我这里就可以在脚本中检测很多东西。

这里主要是检查 mysql 运行状态,如果 mysql 宕机了,那么就重启 mysql ,如果重启失败,则关闭 keepalived 让 VIP 漂移到另外的机器上继续提供服务。HAProxy 也是同样的道理,不过 HAProxy 宕机之后这里直接关闭 keepalived 切换服务器提供服务了。然后下面写了一点 ssh 远程执行的命令,意思就是 VIP 漂移完成之后在重启之前机器关闭的服务和 keepalived,当然这里也可以通过其他更好的方式去实现。

两台机器脚本基本一样,只是需要注意修改对应 IP 即可

vim check_server.sh
#!/bin/bash
MYSQLNUM=`ps -ef | grep -i mysqld | grep -vc grep`
if [ $MYSQLNUM -eq 0 ]; then
    service mysql restart
    if [ $? -eq 0 ]; then
        echo "mysql restart success"
    else
        systemctl stop keepalived.service
    fi
fi

HAPROXYNUM=`ps -ef | grep -i haproxy | grep -vc grep`
if [ $HAPROXYNUM -eq 0 ]; then
    systemctl stop keepalived.service
fi

#sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.101 "sh /etc/keepalived/restart_haproxy.sh"


MASTE_RHAPROXY=`sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "ps -ef | grep -i haproxy | grep -vc grep"`

if [ $MASTE_RHAPROXY -eq 0 ]; then
	sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "systemctl start haproxy"
fi

MASTE_KEEPALIVED=`sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "ps -ef | grep -i keepalived | grep -vc grep"`

if [ $MASTE_KEEPALIVED -eq 0 ]; then
	sshpass -p 0 ssh -o StrictHostKeyChecking=no root@192.168.169.100 "systemctl start keepalived"
fi

这里注意一个问题,就是如果这里在脚本中远程启动关闭机器的服务及 keepalived 那么可能会出现在 master 机器服务异常 VIP 漂移之后,master 机器很快又恢复了,这个时候 VIP 又会自动回到原来的机器上,因为 master 配置的权重是比 back 要高的,所以这里有个问题就是如果 masterkeepalived 服务启动好了,但是 haproxy 服务是异常的,这里就有问题。不过本次试验暂未考虑这些。

5. 测试

5.1 确认所有服务的启动状态

[root@mysql01 ~]# ps -ef | grep -E 'mysql|keepalived|haproxy' | grep -v grep
root       1121      1  0 18:43 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql01.pid
mysql      1446   1121  0 18:43 ?        00:00:39 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql01.err --pid-file=/usr/local/mysql/data/mysql01.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306
root       1916      1  0 20:58 ?        00:00:00 /opt/soft/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg
root       1924      1  0 20:59 ?        00:00:00 /usr/sbin/keepalived -D
root       1925   1924  0 20:59 ?        00:00:00 /usr/sbin/keepalived -D
root       1926   1924  0 20:59 ?        00:00:00 /usr/sbin/keepalived -D

5.2 连接访问测试

这里使用 Navicat 连接数据库测试

这里的连接地址就是 VIP 加上在 haproxy 中配置的“端口”

在这里插入图片描述

在这里插入图片描述

  • 关闭 HAProxy 测试连接

现在 VIP 是在 mysql01 这个机器上

在这里插入图片描述

关闭 haproxy ,此时 VIP 已经不在 mysql01 这个机器上了

在这里插入图片描述

查看 mysql02 机器,此时 VIP 到了 mysql02 机器上,如果 mysql01 机器后面又立刻恢复正常,那么 VIP 则会回到原来的 mysql01 机器上

在这里插入图片描述

5.3 测试结论

在 VIP 转移过程中,数据库连接访问依然是正常的

在这里插入图片描述

 
 
 
 
 

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值