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.11192.168.95.12 主主复制)
因此主主复制中必须要解决的事情就是自增主键的问题如果 mysql1 主键 id 增加到 12 了, 此时二进制数据还没到达 mysql2, 那么 mysql2 恰好要插入数据, 那么新数据主键 id 也是 12, 那不就是乱套了么! 解决这一问题我们可以直接更改 MySQL 中的配置文件即可
1) 更改配置文件
- --192.168.95.11:MySQL
- server-id=11 #任意自然数 n, 只要保证两台 MySQL 主机不重复就可以了
- log-bin=mysql-bin #开启二进制日志
- auto_increment_increment=2 #步进值 auto_imcrement 一般有 n 台主 MySQL 就填 n
- auto_increment_offset=1 #起始值一般填第 n 台主 MySQL 此时为第一台主 MySQL
- binlog-ignore=mysql #忽略 mysql 库我一般都不写
- binlog-ignore=information_schema #忽略 information_schema 库我一般都不写
- replicate-do-db=aa #要同步的数据库, 默认所有库
- --192.168.95.12:MySQL
- server-id=12
- log-bin=mysql-bin
- auto_increment_increment=2
- auto_increment_offset=2
- replicate-do-db=aa
配置好后重启 MySQL
2) 配置 192.168.95.11 主从复制
1 在 192.168.95.12 中创建一个 192.168.95.11 主机中可以登录的 MySQL 用户
用户: mysql11
密码: mysql11
- mysql > GRANT REPLICATION SLAVE ON * . * TOmysql11@192.168.95.11IDENTIFIED BYmysql11;
- mysql > FLUSH PRIVILEGES;
2 查看 192.168.95.12 二进制日志
mysql > show master status;
3 告知二进制文件名与位置
- mysql> change master to
- -> master_host=192.168.95.11,
- -> master_user=mysql11,
- ->master_password=mysql11,
- ->master_log_file=mysql-bin.000097,
- -> master_log_pos=107;
4 查看结果
- mysql > slave start;
- mysql > show slave status\G
配置主从复制成功
3) 配置 192.168.95.12 主从复制
同上
配置主从复制成功
回到顶部
4 中间件简述
回到顶部
4.1Haproxy 介绍
Haproxy 是一个开源的高性能的反向代理或者说是负载均衡服务软件之一, 它支持双机热备虚拟主机基于 TCP 和 HTTP 应用代理等功能其配置简单, 而且拥有很好的对服务器节点的健康检查功能 (相当于 keepalived 健康检查), 当其代理的后端服务器出现故障时, Haproxy 会自动的将该故障服务器摘除, 当服务器的故障恢复后 Haproxy 还会自动将 RS 服务器
HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理 HAProxy 运行在当前的硬件上, 完全可以支持数以万计的并发连接并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上
Haproxy 软件引入了 frontend,backend 的功能, frontend(acl 规则匹配) 可以根据任意 HTTP 请求头做规则匹配, 然后把请求定向到相关的 backend(server pools 等待前端把请求转过来的服务器组) 通过 frontend 和 backup, 我们可以很容易的实现 haproxy 的 7 层代理功能, haproxy 是一款不可多得的优秀代理服务软件
回到顶部
4.2keepalived 介绍
keepalived 是以 VRRP 协议为实现基础的, VRRP 全称 Virtual Router Redundancy Protocol, 即虚拟路由冗余协议
虚拟路由冗余协议, 可以认为是实现路由器高可用的协议, 即将 N 台提供相同功能的路由器组成一个路由器组, 这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip(该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播, 当 backup 收不到 vrrp 包时就认为 master 宕掉了, 这时就需要根据 VRRP 的优先级来选举一个 backup 当 master 这样的话就可以保证路由器的高可用了
keepalived 主要有三个模块, 分别是 corecheck 和 vrrpcore 模块为 keepalived 的核心, 负责主进程的启动维护以及全局配置文件的加载和解析 check 负责健康检查, 包括常见的各种检查方式 vrrp 模块是来实现 VRRP 协议的
回到顶部
5 中间件的安装与配置 (haproxykeepalived)
百度云下载: http://pan.baidu.com/s/1qYoCjDE 密码: 7cef
回到顶部
5.1 安装 haproxy
在 192.168.95.13192.168.95.14 安装 haproxy(一模一样安装)
回到顶部
1) 编译安装 haproxy
- # tar -zxvf haproxy-1.5.14.tar.gz
- # cd haproxy-1.5.14
- # make TARGET=linux26 ARCH=x86_64
- # make install SBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/
注意:
1 为什么不用 configure, 请看下图 haproxy-1.5.14 已经存在 Makefile 文件了
2make 的时候, target 以及 arch 需要根据自己的 linux 主机设置
3make install 的时候我增加了一些额外选项这可加可不加由自己配置, 不加的话将会按默认路径安装, 请看下图
回到顶部
2) 提供启动脚本
将 haproxy 这个启动脚本放在 / etc/init.d / 文件夹下, 以便我们可以直接 service 启动它
注意: 此启动脚本仅仅适合我以上的安装路径假若安装路径不同, 则需要进行相应的修改方可使用
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.13192.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) 创建脚本文件
创建上面配置文件所需的脚本文件 (1314 一样)
(检测 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 用户, 此用户可以允许 1314linux 主机登陆:
用户: jack
密码: 321
- host:192.168.95.%
- mysql > GRANT ALL ON * . * TOjack@192.168.95. % IDENTIFIED BY321;
- mysql > FLUSH PRIVILEGES;
回到顶部
6.1 流程简述
大概讲述一下整体的运作流程:
首先两个 11,12 的 mysql 以及 1314 的 haproxykeepalived 都启动;
keepalived 在 keepalived 群组中获取虚拟 IP, 以及检测 haproxy 是否被 kill;
haproxy 负责将进来的数据转发到 11 或者 12 的 mysql 中
下图是我画的简单理解图:(相对来说比较简洁哈, 凑合凑合哈)
接下来我们将一个个功能的进行测试验证
回到顶部
6.2 测试 haproxy 监听前端端口 3306
1frontend 监听端口 3306 时, 将 mysqlhaproxykeepalived 全部开启
2 使用任意一个 mysql 客户端登陆用户 jack
登陆成功 (windowns 上登陆 mysql)
3 更改 frontend 监听端口为 3307, 继续操作登陆测试
登陆失败
结果: 说明了 frontend 监听端口的用处, 有助于我们理解 haproxy 用法
回到顶部
6.3 测试高可用 + keepalived 不抢占 vip
可以通过 haproxy 监控页面获知谁获取了 vip
1 依次启动 1314 的 keepalivedhaproxy(启动 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 分别在 1112 中开启抓包
- # 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 向 1112 都有发送数据, 此时证明负载均衡
我们设置的 haproxy 中 balance 方式是最少连接方式, 假若采用 roundrobin 方式测试结果将会更加明显
注意:
当某一台 mysql 挂了以后, haproxy 会将其踢出 mysql 服务器群组
当有命令传来时会将其转发到正常的服务器上
当出问题的 mysql 恢复后, haproxy 又会自动地将它放回 mysql 服务器群组中, 并且自动同步没有同步的数据
测试:
1 全部正常启动
mysql1mysql2 都正常
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
来源: http://www.bubuko.com/infodetail-2496116.html