您的位置:首页 > 运维架构 > 网站架构

搭建MySQL高可用负载均衡集群

2017-12-03 23:40 676 查看
阅读目录

1、简介

2、基本环境

3、配置MySQL主主复制

4、中间件简述

  4.1、Haproxy介绍

  4.2、keepalived介绍

5、中间件的安装与配置(haproxy、keepalived)

  5.1、安装haproxy

  1)、编译安装haproxy

  2)、提供启动脚本

  3)、提供配置文件

  4)、启动日志

  5)、启动haproxy

  6)、测试haproxy

  5.2、安装keepalived

  1)、解决缺少的软件库文件

  2)、编译安装keepalived软件

  3)、创建配置文件

  4)、创建脚本文件

6、功能测试

  6.1、流程简述

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

  6.3、测试高可用+keepalived不抢占vip

  6.4、测试负载均衡

7、总结与建议

回到顶部

1、简介

  使用MySQL时随着时间的增长,用户量以及数据量的逐渐增加,访问量更是剧增,最终将会使MySQL达到某个瓶颈,那么MySQL的性能将会大大降低。这一结果也不利于软件的推广。

  那么如何跨过这个瓶颈,提高MySQL的并发量呢?方法有很多,分布式数据库、读写分离、高可用负载均衡、增加缓存服务器等等。之前的文章里已经介绍了读写分离的方案了,接下来我将讲解MySQL高可用负载均衡这一方法。

  其中实现高可用负载均衡的方法有很多,例如LVS+keepalived组合实现、haproxy+keepalived组合实现等等,这里我们采用haproxy+keepalived组合实现MySQL高可用负载均衡这一技术。

回到顶部

2、基本环境

四台linux虚拟主机

Linux版本CentOS6.6

MySQL 5.5(已安装好)

haproxy-1.5.14

keepalived-1.2.19

IP:192.168.95.11(mysql1)、192.168.95.12(mysql2)、192.168.95.13(haproxy+keepalived)、192.168.95.14(haproxy+keepalived)、192.168.95.55(vip)

回到顶部

3、配置MySQL主主复制

详细配置步骤可以参考这篇文章:

http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7

以下简要介绍一下mysql的主主复制:

何为主主复制?就是两个mysql都能读能写,数据记录通过二进制传达给对方从而保持数据的一致性。

(192.168.95.11主从复制+192.168.95.12主从复制==192.168.95.11、192.168.95.12主主复制)

  因此主主复制中必须要解决的事情就是自增主键的问题。如果mysql1主键id增加到12了,此时二进制数据还没到达mysql2,那么mysql2恰好要插入数据,那么新数据主键id也是12,那不就是乱套了么!解决这一问题我们可以直接更改MySQL中的配置文件即可。

1)、更改配置文件

View Code

#给执行权力
#chmod +x /etc/init.d/haproxy


回到顶部

  3)、提供配置文件

根据上面的启动脚本建立相应的目录以及配置文件

# mkdir /etc/haproxy
# mkdir /var/lib/haproxy
# useradd -r haproxy       #建立脚本启动用户
# vi /etc/haproxy/haproxy.cfg


【配置文件】

#这里的配置文件仅仅只是贴出来进行解析说明。

#如果需要这个配置文件最好将注释解析全部删除掉,因为我在使用的过程中,正是因为存在注释解析而导致出错,删除后就能正常运行。

#可以下载这个配置文件进行使用,与下面贴出来的配置文件一致,只是不存在注释解析

#百度云下载该配置文件(不含注释):链接:http://pan.baidu.com/s/1gfOMtKB 密码:zl9o

global

log         127.0.0.1 local2         //日志定义级别
chroot      /var/lib/haproxy         //当前工作目录
pidfile     /var/run/haproxy.pid     //进程id
maxconn     4000                     //最大连接数
user        haproxy                  //运行改程序的用户
group       haproxy
daemon                               //后台形式运行
stats socket /var/lib/haproxy/stats

defaults
mode                    tcp            //haproxy运行模式(http | tcp | health)
log                     global
option                  dontlognull
option                  redispatch     //serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries                 3              //三次连接失败则服务器不用
timeout http-request    10s
timeout queue           1m
timeout connect         10s            //连接超时
timeout client          1m             //客户端超时
timeout server          1m             //服务器超时
timeout http-keep-alive 10s
timeout check           10s            //心跳检测
maxconn                 600            //最大连接数

listen stats                               //配置haproxy状态页(用来查看的页面)
mode http
bind :8888
stats enable
stats hide-version                    //隐藏haproxy版本号
stats uri     /haproxyadmin?stats     //一会用于打开状态页的uri
stats realm   Haproxy\ Statistics     //输入账户密码时的提示文字
stats auth    admin:admin             //用户名:密码

frontend  main
bind 0.0.0.0:3306                     //使用3306端口。监听前端端口【表示任何ip访问3306端口都会将数据轮番转发到mysql服务器群组中】
default_backend             mysql     //后端服务器组名

backend mysql
balance     leastconn                 //使用最少连接方式调度
server mysql1 192.168.95.11:3306 check port 3306 maxconn 300
server mysql2 192.168.95.12:3306 check port 3306 maxconn 300


回到顶部

  4)、启动日志

# vi /etc/rsyslog.conf




#service rsyslog restart


回到顶部

  5)、启动haproxy

# service haproxy start




回到顶部

  6)、测试haproxy

安照配置文件进行相应的测试



打开浏览器输入192.168.95.13:8888/haproxyadmin?stats



登陆后如下如所示,表明安装haproxy成功。



回到顶部

  5.2、安装keepalived

官网下载:http://www.keepalived.org/download.html

在192.168.95.13、192.168.95.14安装keepalived

回到顶部

  1)、解决缺少的软件库文件

【这一步骤视具体的linux版本而定,有些已经安装openssl了。具体情况可以执行./configure就能够确定缺不缺少软件库文件了】

首先我们先将keepalived-1.2.19.tar.gz解压,然后进入目录./configure查看

# tar -zxvf keepalived-1.2.19.tar.gz
# ./configure --prefix=/usr/local/keepalived  --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/






由上图可见keepalived的安装需要先安装软件OpenSSL

缺少头文件,只需要安装openssl和openssl-devel即可

最简单的方法是:yum -y install openssl openssl-devel

没网的朋友也不用怕,接下来将介绍的是rpm方法安装:

#挂载光盘,在光盘中查找软件。若光盘找不到就直接下载,再传入linux进行安装

# mount /dev/cdrom  /home/suifeng2/rom/
# cd rom/
# cd Packages/
# ls |grep openssl




安装keepalived软件时存在各种依赖,下图是我安装软件后整理的依赖关系图:



既然已经知道各软件依赖,则可按最后面的软件开始安装:

(你也可以从前面开始进行安装,一步一步的查看各个依赖关系)

1、安装openssl

# rpm -ivh openssl-1.0.1e-30.el6.x86_64.rpm




安装openssl成功

2、安装openssl-devel

安装libsepol-devel:

# rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm




安装pkgconfig(libsepol):

# rpm -ivh pkgconfig-0.23-9.1.el6.x86_64.rpm




安装libselinux-devel:

# rpm -ivh libselinux-devel-2.0.94-5.8.el6.x86_64.rpm




安装keyutils-libs-devel:

# rpm -ivh keyutils-libs-devel-1.4-5.el6.x86_64.rpm




安装libcom_err-devel:

# rpm -ivh libcom_err-devel-141.12-21.el6.x86_64.rpm




安装krb5-devel:

# rpm -ivh krb5-devel-1.10.3-33.el6.x86_64.rpm




安装zlib-devel:

# rpm -ivh zlib-devel-1.2.3-29.el6.x86_64.rpm




安装openssl-devel

# rpm -ivh openssl-devel-1.0.1e-30.el6.x86_64.rpm




回到顶部

  2)、编译安装keepalived软件

# cd keepalived-1.2.19
# ./configure --prefix=/usr/local/keepalived  --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/
# make && make install

# chkconfig --add keepalived  #添加开机自启(我暂时没添加)
# chkconfig keepalived on


【注意】:

1、安装时./configure中的—prefix后的几个选择可选可不选,选了就可以采用service直接启动了。建议最好都加上吧

2、--with-kernel-dir这个选项根据自己的linux版本进行填写(在linux中使用命令uname –a可以查到)



回到顶部

  3)、创建配置文件

/etc/keepalived/文件夹已存在keepalived.conf文件,我们将它改名为keepalived.conf.back,再建立一个我们自己keepalived.conf配置文件。



vi /etc/keepalived/keepalived.conf(13与14配置文件路径一致)

【以下是简单的配置文件,使用时最好去掉注释】

配置文件下载(不含注释):

192.168.95.13配置文件:

! Configuration File for keepalived
#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;
global_defs {
notificationd LVS_DEVEL
}
#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_haproxy {
script "/etc/keepalived/chk.sh"  #具体脚本路径
interval 2  #脚本循环运行间隔
}
#VRRP虚拟路由冗余协议配置
vrrp_instance VI_1 {   #VI_1 是自定义的名称;
state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
nopreempt      #开启不抢占
interface eth0   #指定VIP需要绑定的物理网卡
virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台

advert_int 1   #生存检测时的组播信息发送间隔,组内一致
authentication {    #设置验证信息,组内一致
auth_type PASS   #有PASS 和 AH 两种,常用 PASS
auth_pass asd    #密码
}
virtual_ipaddress {
192.168.95.55    #指定VIP地址,组内一致,可以设置多个IP
}
track_script {    #使用在这个域中使用预先定义的脚本,上面定义的
chk_haproxy
}

notify_backup "/etc/init.d/haproxy restart"   #表示当切换到backup状态时,要执行的脚本
notify_fault "/etc/init.d/haproxy stop"     #故障时执行的脚本
}


192.168.95.14配置文件:

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

回到顶部

  4)、创建脚本文件

创建上面配置文件所需的脚本文件(13、14一样)

(检测haproxy有没有发生故障,发生故障则将keepalived停掉,让出vip)

# vi /etc/keepalived/chk.sh#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi


给执行权限
# chmod +x /etc/keepalived/chk.sh




启动keepalived:
# service keepalived start




安装keepalived成功!

回到顶部

6、功能测试

测试之前先在mysql1和mysql2中建立一个mysql用户,此用户可以允许13、14linux主机登陆:

用户:jack

密码:321

host:192.168.95.%

mysql> GRANT ALL ON *.* TO 'jack'@'192.168.95.%' IDENTIFIED BY '321';
mysql> FLUSH PRIVILEGES;


回到顶部

  6.1、流程简述

大概讲述一下整体的运作流程:

首先两个11,12的mysql以及13、14的haproxy、keepalived都启动;

keepalived在keepalived群组中获取虚拟IP,以及检测haproxy是否被kill;

haproxy负责将进来的数据转发到11或者12的mysql中。

下图是我画的简单理解图:(相对来说比较简洁哈,凑合凑合哈)



接下来我们将一个个功能的进行测试验证。

回到顶部

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

1、frontend监听端口3306时,将mysql、haproxy、keepalived全部开启

2、使用任意一个mysql客户端登陆用户jack

登陆成功(windowns上登陆mysql)



3、更改frontend监听端口为3307,继续操作登陆测试

登陆失败



结果:说明了frontend监听端口的用处,有助于我们理解haproxy用法。

回到顶部

  6.3、测试高可用+keepalived不抢占vip

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

1、依次启动13、14的keepalived、haproxy(启动keepalived后将会自动开启haproxy)





2、访问http://192.168.95.55:8888/haproxyadmin?stats

13获取了vip



3、# kill -9 8923

刷新http://192.168.95.55:8888/haproxyadmin?stats



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

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

4、重新启动13的haproxy以及keepalived

并刷新http://192.168.95.55:8888/haproxyadmin?stats





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

回到顶部

  6.4、测试负载均衡

1、全部正常启动,此时vip在14手中

2、分别在11、12中开启抓包

# tcpdump -n -i eth0 host 192.168.95.11 and 192.168.95.14
# tcpdump -n -i eth0 host 192.168.95.12 and 192.168.95.14


3、使用不同客户端登陆jack用户,不断向数据库添加数据





结果:此时14向11、12都有发送数据,此时证明负载均衡

【我们设置的haproxy中balance方式是最少连接方式,假若采用roundrobin方式测试结果将会更加明显】

注意:

当某一台mysql挂了以后,haproxy会将其踢出mysql服务器群组。

当有命令传来时会将其转发到正常的服务器上。

当出问题的mysql恢复后,haproxy又会自动地将它放回mysql服务器群组中,并且自动同步没有同步的数据

测试:

1、全部正常启动

mysql1、mysql2都正常



2、将mysql2关掉



mysql2出问题,将其踢出mysql群组

3、启动mysql2



mysql2恢复后又将其放回mysql群组里

【当mysql2挂掉时,若有数据插入,将会转发给mysql1,当mysql恢复后,又会将这些数据同步到mysql2中】

回到顶部

7、总结与建议

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

  这篇文章中只是简简单单的搭建了一个mysql高可用负载均衡的环境,真正应用到生产环境中,还需要根据具体项目进行相应的修改。

  最后我的小建议就是看完这篇博客可以去了解了解更多的haproxy和keepalived的相应配置,以及学习与haproxy功能差不多的LVS。

(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)

作者:那一叶随风

声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: