keepalived + HAProxy + mysql高可用

文章目录

  • MySQL 高可用
    • 简介
    • 1. 环境准备
    • 2. 搭建 mysql 双主复制
    • 3. 安装 HAProxy
    • 4. 安装 keepalived
      • 4.1 修改配置文件
      • 4.2 编写脚本
    • 5. 测试
      • 5.1 确认所有服务的启动状态
      • 5.2 连接访问测试
      • 5.3 测试结论

MySQL 高可用

简介

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

keepalived + HAProxy + mysql高可用_第1张图片

1. 环境准备

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

IP 主机名 软件版本
192.168.169.100 mysql01 系统版本:CentOS Linux release 7.9.2009
mysql 版本:mysql-5.7.38
haproxy 版本:haproxy-2.4.17
keepalived 版本:Keepalived v1.3.5
192.168.169.101 mysql02 系统版本: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 [email protected] "sh /etc/keepalived/restart_haproxy.sh"


MASTE_RHAPROXY=`sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "ps -ef | grep -i haproxy | grep -vc grep"`

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

MASTE_KEEPALIVED=`sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "ps -ef | grep -i keepalived | grep -vc grep"`

if [ $MASTE_KEEPALIVED -eq 0 ]; then
	sshpass -p 0 ssh -o StrictHostKeyChecking=no [email protected] "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 中配置的“端口”

keepalived + HAProxy + mysql高可用_第2张图片

keepalived + HAProxy + mysql高可用_第3张图片

  • 关闭 HAProxy 测试连接

现在 VIP 是在 mysql01 这个机器上

keepalived + HAProxy + mysql高可用_第4张图片

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

keepalived + HAProxy + mysql高可用_第5张图片

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

keepalived + HAProxy + mysql高可用_第6张图片

5.3 测试结论

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

keepalived + HAProxy + mysql高可用_第7张图片

 
 
 
 
 

你可能感兴趣的:(mysql,mysql,keepalived,haproxy,mysql,高可用)