Mysql高可用方案Haproxy+Keepalive+Percona XtraDB Cluster实现:haproxy+keepalived部署 (四)

本文详细介绍了如何使用HAProxy与Keepalived在CentOS 7系统上构建高可用的数据库集群。首先,文章指导读者关闭防火墙与SElinux,确保环境准备就绪。随后,通过安装与配置HAProxy进行负载均衡,并利用Keepalived实现故障转移,确保服务连续性。测试步骤验证了系统的高可用性和负载均衡效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:环境介绍

1、服务器列表

IPVIP说明
192.168.6.114

192.168.6.116

Haproxy+keepalived(h1)
192.168.6.115

192.168.6.116

Haproxy+keepalived(h2)

2、系统版本

linux系统版本: CentOS 7.3 64位

3、关闭防火墙

#关闭防火墙
systemctl stop firewalld
#查看状态
systemctl status firewalld
#禁止开机启动防火墙
systemctl disable firewalld

永久生效,如果防火墙因其他原因不可关闭,开放3306和4567端口;生产环境下还是开放对应的端口

4、关闭SElinux

命令:getenforce

永久关闭(修改配置文件,即可永久关闭)

vi /etc/selinux/config

把SELINUX=enforcing改为SELINUX=disabled ,改完后记得重启服务器生效,我这里是永久关闭,大家可以根据自己的需求临时关闭

第二步:安装

192.168.6.114、192.168.6.115 分别执行操作 yum install -y haproxy keepalived

yum install -y haproxy keepalived

查看版本

rpm -qa | grep haproxy
rpm -qa | grep keepalived

 

第二步:配置

1、haproxy配置

/etc/haproxy/haproxy.cfg 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。

# 备份之前的配置文件
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup

注意下面的 bind 0.0.0.0:3306 端口不要被占用了 

#默认的defaults模块以上不动,以下部分替换成如下内容,两台haproxy配置一致.
 
listen MysqlDb_proxy
        bind 0.0.0.0:3306
        mode tcp 
	option tcplog
        balance leastconn     #使用最少连接方式调度
        server MysqlDb1 192.168.6.111:3306 check port 3306 maxconn 300
        server MysqlDb2 192.168.6.112:3306 check port 3306 maxconn 300
        server MysqlDb3 192.168.6.113:3306 check port 3306 maxconn 300
 
listen stats     #监控
       mode http
       bind 0.0.0.0:8888                    #web监控登录端口
       stats enable
       stats uri /dbs                        #we监控端登录地址http:ip:8888/dbs
       stats realm haproxy\ statistics
       stats auth admin:admin                #web监控登端录用户和密码

可以通过haproxy -f /etc/haproxy/haproxy.cfg -c查看配置文件是否有问题

haproxy -f /etc/haproxy/haproxy.cfg -c

配置详解:https://blog.youkuaiyun.com/freshair_x/article/details/80542481

修改日志系统

Vim /etc/rsyslog.conf

#在centos6.x系统中,系统日志的配置文件原来的/etc/syslog.conf已经变为/etc/rsyslog.conf
 
###Provides UDP syslog reception               //去掉下面两行注释,开启UDP监听
 
$ModLoad imudp
$UDPServerRun 514
 
local2.* /var/log/haproxy.log           #添加此行

修改/etc/sysconfig/syslog

vim/etc/sysconfig/rsyslog,添加如下内容:

SYSLOGD_OPTIONS="-c 2 -r -m 0"          
 
#注释:-c 2 使用兼容模式,默认是 -c 5,-r开启远程日志,-m 0标记时间戳。单位是分钟,为0时,表示禁用该功能
#重启日志
service rsyslog restart
# 启动haproxy
systemctl start haproxy

如果启动失败可以通过systemctl status haproxy查看原因

systemctl status haproxy

打开网页查看haproxy监控的情况

http://192.168.6.114:8888/dbs 等下面的keepalived配置好后也可以用虚拟路径服务:http://192.168.6.116:8888/dbs

2、keepalived配置

# 备份之前的配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

192.168.6.114配置

! Configuration File for keepalived
#简单的头部,这里主要可以做邮件通知报警等的设置
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_Master
   
}


#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"	#具体脚本路径
    interval 5	#脚本循环运行间隔
    weight -5
}
#VRRP虚拟路由冗余协议配置
vrrp_instance VI_1 {	#VI_1 是自定义的名称;
    state BACKUP	#MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
    nopreempt	#开启不抢占
    interface ens33	#指定VIP需要绑定的物理网卡
    virtual_router_id 51	#VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
    priority 100		#定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台
    advert_int 1	#生存检测时的组播信息发送间隔,组内一致
    authentication {	#设置验证信息,组内一致
        auth_type PASS	#有PASS 和 AH 两种,常用 PASS
        auth_pass 1111	#密码
    }
    track_script {	#使用在这个域中使用预先定义的脚本,上面定义的
        chk_haproxy	
    }
    virtual_ipaddress {
        192.168.6.116	#指定VIP地址,组内一致,可以设置多个IP
    }
    notify_master /etc/keepalived/sendmail.pl
}

 注意上面的interface ens33设置是节点固有IP(非VIP)的网卡,需要先看自己的网卡是什么,命令:ip addr

配置基于perl-Net::SMTP发送邮件通知参考:我用yum的方式安装失败,最后还是用源码编译的方式安装的

https://blog.youkuaiyun.com/lzxlfly/article/details/80154377

https://www.jianshu.com/p/41b052cfd429

需要安装下面这些

 邮件脚本/etc/keepalived/sendmail.pl

#!/usr/bin/perl -w  
use Net::SMTP_auth;  
use strict;  
my $mailhost = 'smtp.163.com';  
my $mailfrom = '发送邮件的邮箱名字@163.com';  
my @mailto   = ('接收邮件的邮箱名字@163.com');  
my $subject  = 'keepalived up on backup';  
my $text = "正文\n 115服务器宕机!";    
my $user   = '发送邮件的邮箱名称.com';  
my $passwd = '发送邮件的邮箱密码';   #注意是要填写163客户端授权的密码
&SendMail();  
##############################  
# Send notice mail  
##############################  
sub SendMail() {  
    my $smtp = Net::SMTP_auth->new( $mailhost, Timeout => 120, Debug => 1 )  
      or die "Error.\n";  
    $smtp->auth( 'LOGIN', $user, $passwd );  
    foreach my $mailto (@mailto) {  
        $smtp->mail($mailfrom);  
        $smtp->to($mailto);  
        $smtp->data();  
        $smtp->datasend("To: $mailto\n");  
        $smtp->datasend("From:$mailfrom\n");  
        $smtp->datasend("Subject: $subject\n");  
        $smtp->datasend("\n");  
        $smtp->datasend("$text\n\n");   
        $smtp->dataend();  
    }  
    $smtp->quit;  
}

编辑vim /etc/keepalived/check_haproxy.sh脚本

#!/bin/bash

A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ]
then
	systemctl restart haproxy
	echo $(date "+%Y-%m-%d %H:%M:%S")" [info] Start haproxy" >> /dev/null	
	sleep 3
	if [ `ps -C haproxy --no-header | wc -l` -eq 0 ]
	then
		systemctl stop keepalived
		echo $(date "+%Y-%m-%d %H:%M:%S")" [info] Stop keepalived" >> /dev/null
	fi
fi

 赋予脚本可执行权限

cd /etc/keepalived
chmod +x ./check_haproxy.sh
# 启动keepalived
systemctl start keepalived
# 查看状态keepalived
systemctl status keepalived

关闭114的haproxy进程,发现haproxy进程关闭后,vip资源还在,说明还在提供服务。

这是因为在keepalived.conf文件里配置了haproxy进程的监控脚本,当haproxy进程关闭后,会自动执行监控脚本,当发现haproxy进程不在后,最多5s就会启动,如若haproxy启动失败,才会强制关闭keeaplived服务,

此时就会转移vip到另一台机器上。所以,一般在keepalived服务启动的情况下,haproxy服务不会关闭,即使关闭了,也会自动重启。

 

192.168.6.115配置

配置文件与上面的几乎一样,仅仅改变priority 100【只需要比上面的小即可】

上面的方式使用了备备,减少keepalived中主备之间的抢断,但将其中一个备机设置成非抢断模式,这样可以防止出现master宕机恢复后的抢断情况,减少VIP的切换时间 

第三步:功能测试

测试之前先在111、112和113的mysql数据库中建立一个mysql用户,此用户可以允许114、115主机登陆,因为我们配置了主主复制所以只需要在任意一个数据节点设置就可以同步了

# 创建用户
GRANT ALL ON *.* TO 'mysql'@'192.168.6.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

1、测试haproxy监听前端端口3306

2、测试高可用

可以通过haproxy监控页面获知谁获取了vip

2.1依次启动114、115的keepalived、haproxy

#启动haproxy
systemctl start haproxy
#查看haproxy状态
systemctl status haproxy
#启动keepalived
systemctl start keepalived
#查看keepalived状态
systemctl status keepalived

2.2、访问http://192.168.6.116:8888/dbs

可以看到114服务器获取了vip

 2.3、停掉114服务器的haproxy

刷新http://192.168.6.116:8888/dbs

115获取了vip,机器正常工作

结果:证明了高可用,挂了一台另一台继续工作

2.4、重新启动114的haproxy以及keepalived

并刷新http://192.168.6.116:8888/dbs

结果:此时vip仍在115手中,证明了keepalived配置了不抢占vip,不必浪费资源去获取vip。

3、监控mariadb服务

停掉113服务器的mariadb数据库  systemctl stop mariadb,可以看到mariadb3遍红了,开启后有变绿了

4、测试负载均衡

 

第四步:总结与建议

搭建成功后,前端只需要通过VIP连接数据库,由Haproxy担任负载均衡、Galera担任数据同步。

服务启动流程

1、 先启 mysql 集群
2、 再启 haproxy (haproxy 会检查 mysql 是否启动)
3、 最后启 keepalived (keepalived 会检查 haproxy 是否存活,如果不存活 kill 自己。并删除虚拟 IP)

在这篇博文中我们不仅仅只关注这一整个mysql高可用负载均衡的实现方式,我们还应该理解haproxy以及keepalived的工作方式。Haproxy和keepalived这两个工具很强大,了解他们的实现方式,那么就可以以此类推与其他服务器组合构建强大健壮的服务集群。例如它可以与apache组合,构成高可用负载均衡的web集群。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值