[toc]
## 集群架构图
![](https://img.kancloud.cn/ce/31/ce314467a39b76e988d9e99b9434317c_781x871.png)
参考: [MySQL高可用读写分离集群 ](https://www.roncoo.com/view/4)
HAProxy负责将请求分发到MyCat上,起到负载均衡的作用,同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。如果一台MyCat服务器宕机,HAPorxy转发请求时不会转发到宕机的MyCat上,所以MyCat依然可用。
## 安装HAProxy
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
~~~
wget https://github.com/haproxy/haproxy/archive/v2.0.0.tar.gz
tar -zxvf v2.0.0.tar.gz
cd haproxy-2.0.0/
# 安装编译所需的依赖包
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
make TARGET=linux-glibc ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy
mkdir /usr/local/haproxy
make install PREFIX=/usr/local/haproxy
# 创建配置文件目录
mkdir -p /usr/local/haproxy/conf
mkdir -p /etc/haproxy/
cp /usr/local/src/haproxy-2.0.0/examples/option-http_proxy.cfg /usr/local/haproxy/conf/http_proxy.cfg
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
# 错误页面配置
cp -r /usr/local/src/haproxy-2.0.0/examples/errorfiles /usr/local/haproxy/
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
# 启动文件,设置开机启动
cp /usr/local/src/haproxy-2.0.0/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
chkconfig --add haproxy
chkconfig haproxy on
~~~
**docker容器化**
# 挂载主要是看原镜像的dockerfile
docker run --name haproxy -e LANG=en_US.UTF-8 -v /showcase/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg --restart=always --net host -d haproxy:latest
如果你挂载haproxy配置并且修改了你的haproxy.cfg文件,可以使用如下命令优雅的重载配置:
docker kill -s HUP my-running-haproxy
## 安装xinetd配置MyCat状态检查服务
MyCat服务主机(mycat-01、mycat-02)上需要增加mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对MyCat的服务状态进行检测判断。可以使用xinetd来实现,通过xinetd,HAProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp\_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)
~~~
yum -y install xinetd
# 检查/etc/xinetd.conf的末尾是否有 includedir /etc/xinetd.d ,没有就加上
vim /etc/xinetd.conf
~~~
![](https://img.kancloud.cn/7a/5c/7a5ce2626491341ccedd9a9d255b6e56_837x510.png)
~~~
# 检查 /etc/xinetd.d 目录是否存在,不存在刚创建
ll /etc/xinetd.d/
mkdir /etc/xinetd.d/
# 增加MyCat存活状态检测服务配置
touch /etc/xinetd.d/mycat_status
vi /etc/xinetd.d/mycat_status
service mycat_status
{
flags = REUSE
## 使用该标记的 socket_type 为 stream,需要设置 wait 为 no
socket_type = stream ## 封包处理方式,Stream 为 TCP 数据包
port = 48700 ## 服务监听端口
wait = no ## 表示不需等待,即服务将以多线程的方式运行
user = root ## 执行此服务进程的用户
server =/usr/local/bin/mycat_status ## 需要启动的服务脚本
log_on_failure += USERID ## 登录失败记录的内容
disable = no ## 要启动服务,将此参数设置为 no
}
~~~
~~~
# 添加 /usr/local/bin/mycat_status 服务脚本
touch /usr/local/bin/mycat_status
vi /usr/local/bin/mycat_status
#!/bin/bash
#/usr/local/bin/mycat_status.sh
# This script checks if a mycat server is healthy running on localhost.
# It will return:
# "HTTP/1.x 200 OK\r" (if mycat is running smoothly)
# "HTTP/1.x 503 Internal Server Error\r" (else)
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ "$mycat" = "0" ]; then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi
# 给新增脚本赋予可执行权限
chmod a+x /usr/local/bin/mycat_status
~~~
~~~
# 在 /etc/services 中加入 mycat_status 服务
vi /etc/services
# 在末尾加入:
mycat_status 48700/tcp # mycat_status
# 保存后,重启 xinetd 服务
service xinetd restart
# 验证是否成功
netstat -antup|grep 48700
~~~
## HAProxy配置MyCat负载均衡集群
HAProxy支持TCP(第四层)和HTTP(第七层)应用的代理,本节课程我们使用HAProxy来做MyCat的负载均衡代理使用的是TCP模式。在4层模式下HAProxy仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。
具体参数说明可参考官方配置文档: http://cbonte.github.io/haproxy-dconv/2.0/configuration.html
# todo
1. 理解haproxy的配置项和使用原理
2. 制作xinetd版的mycat镜像
主要参考:https://www.cnblogs.com/happy1983/p/9265358.html
https://www.cnblogs.com/Richardzhu/p/3344676.html
- 【mysql的编程专题①】流程控制与其他语法
- 【mysql的编程专题②】触发器
- 【mysql的编程专题③】内置函数
- 【mysql的编程专题④】存储过程
- 【mysql的编程专题⑤】自定义函数
- 【mysql的编程专题⑥】视图
- 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典
- 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式
- 【mysql的设计与优化专题(3)】字段类型与合理的选择字段类型
- 【mysql的设计与优化专题(4)】表的垂直拆分和水平拆分
- 【mysql的设计与优化专题(5)】慢查询详解
- 【mysql的设计与优化专题(6)】mysql索引攻略
- 【Mysql问题集锦(1)】mysql不能使用innodb存储引擎
- 【Mysql进阶技巧(2)】利用mysql生成唯一序号
- 【Mysql进阶技巧(1)】MySQL的多表关联与自连接
- 【Mysql高可用架构(1)】基于日志点的主从复制
- 【Mysql高可用架构(2)】主从管理的系统视图
- 【Mysql高可用架构(3)】基于GTID的主从复制
- 【Mysql高可用架构(4)】在线变更复制类型
- 【Mysql高可用架构(5)】多源复制(多主一从)
- 【Mysql高可用架构(6)】多线程复制
- 【Mysql高可用架构(7)】在线设置复制过滤
- 【Mysql高可用架构(8)】解决主从不一致
- 【Mysql高可用架构(9)】初识mycat以及制作mycat镜像
- 【Mysql高可用架构(10)】mycat配置mysql读写分离
- MyCat 集群部署(HAProxy + MyCat)
- 常用复杂sql语句整理