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

第一步:环境介绍

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.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集群。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值