第一步:环境介绍
1、服务器列表
IP | VIP | 说明 |
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.csdn.net/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.csdn.net/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集群。