在《冰河,能讲讲Mycat如何实现MySQL的读写分离吗?》一文中,咱们实现了使用Mycat实现MySQL的读写分离。然而,此时的Mycat只有一个节点,若是Mycat节点宕机了,则整个MySQL集群将不可用,因此,咱们有必要保证Mycat节点的高可用。那如何保证Mycat节点的高可用呢?今天,咱们就一块儿来聊聊这个话题。一块儿搭建一套Mycat的高可用集群。html
目前,我也在业余时间开发和维护Mycat源码,小伙伴们在学习和使用Mycat时,遇到问题也能够加我微信【sun_shine_lyz】共同交流哦!前端
注:文章已经收录到:node
GitHub:https://github.com/sunshinelyz/technology-binghemysql
图解说明:c++
HAProxy负责将请求分发到Mycat上,起到负载均衡的做用,同时HAProxy也能检测到Mycat是否存活,HAProxy只会将请求转发到存活的Mycat上。若是一台Mycat服务器宕机,HAPorxy转发请求时不会转发到宕机的Mycat上,因此Mycat依然可用。git
Mycat主机2(liuyazhuang134,192.168.209.134)请参考《冰河,能讲讲Mycat如何实现MySQL的读写分离吗?》程序员
注意:liuyazhuang133(192.168.209.133)和 liuyazhuang134(192.168.209.134) 中都要加上(或更新)主机名映射配置。github
# vi /etc/hosts 192.168.209.131 liuyazhuang131 192.168.209.132 liuyazhuang132 192.168.209.133 liuyazhuang133 192.168.209.134 liuyazhuang134 192.168.209.135 liuyazhuang135
注意:须要在Mycat节点主机上配置。面试
Mycat服务主机(liuyazhuang13三、liuyazhuang134)上须要增长Mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对Mycat的服务状态进行检测判断。可使用xinetd来实现,经过xinetd,HAProxy能够用httpchk来检测Mycat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。常常用来管理多种轻量级Internet服务。xinetd提供相似于inetd+tcp_wrapper的功能,可是更增强大和安全。xinetd为linux系统的基础服务)
(1)安装xinetd
若是xinetd尚未安装,可以使用以下命令安装:
yum install xinetd
(2)添加 includedir /etc/xinetd.d
检查/etc/xinetd.conf的末尾是否有 includedir /etc/xinetd.d ,没有就加上
vim /etc/xinetd.conf
(3)建立/etc/xinetd.d 目录
检查 /etc/xinetd.d 目录是否存在,不存在则建立
mkdir /etc/xinetd.d/
(4)增长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 }
(5)添加 /usr/local/bin/Mycat_status 服务脚本
touch /usr/local/bin/mycat_status vim /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
(6)给新增脚本赋予可执行权限
chmod a+x /usr/local/bin/mycat_status
(7)在 /etc/services 中加入 mycat_status 服务
vi /etc/services
在末尾加入:
mycat_status 48700/tcp # mycat_status
保存后,重启xinetd服务
service xinetd restart
(8)验证mycat_status服务是否成功启动
netstat -antup|grep 48700
能看到上图这样的信息,说明服务配置成功。
(9)Mycat服务主机的防火墙上打开 48700端口
vi /etc/sysconfig/iptables
增长:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 48700 -j ACCEPT
保存后重启防火墙
service iptables restart
脚本测试:
/usr/local/bin/mycat_status
HAProxy官网:http://www.haproxy.org/
HAProxy各版本的官方文档:http://cbonte.github.io/haproxy-dconv/index.html
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。
HAProxy目前主要有三个版本:1.四、1.五、1.六、1.7,CentOS6.6自带的RPM包为1.5的。
HAProxy1.5版开始,支持SSL、DDoS防御等功能,可看官网说明:
version 1.5 : the most featureful version, supports SSL, IPv6, keep-alive, DDoS protection, etc...
Mycat官方推荐使用HAProxy作MyCat的高可用负载均衡代理。
在192.168.209.135服务器上进行安装。
(1)下载(或上传) haproxy-1.5.19.tar.gz 到 /usr/local/src,解压安装
cd /usr/local/src/ wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.19.tar.gz tar -zxvf haproxy-1.5.19.tar.gz cd haproxy-1.5.19
(2)如需了解安装注意点,可查看HAProxy的软件说明
less README
(3)安装编译所需的依赖包
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
(4)编译
make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy
TARGET是指定内核版本,高于2.6.28的建议设置为linux2628,Linux操做系统内核版本查看命令# uname -r, ARCH指定系统架构,openssl pcre zlib 这三个包须要安装否则不支持
(5)建立安装目录 /usr/local/haproxy
mkdir /usr/local/haproxy
(6)执行安装
make install PREFIX=/usr/local/haproxy install -d "/usr/local/haproxy/sbin" install haproxy "/usr/local/haproxy/sbin" install -d "/usr/local/haproxy/share/man"/man1 install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1 install -d "/usr/local/haproxy/doc/haproxy" for x in configuration architecture haproxy-en haproxy-fr; do \ install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \ done
(7)建立配置文件目录
mkdir -p /usr/local/haproxy/conf mkdir -p /etc/haproxy/
(8)从配置文件模版复制配置文件,并添加配置文件软链接
cp /usr/local/src/haproxy-1.5.19/examples/haproxy.cfg /usr/local/haproxy/conf/ ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
(9)拷贝错误页面,并添加目录软链接(HTTP模式选配)
cp -r /usr/local/src/haproxy-1.5.19/examples/errorfiles /usr/local/haproxy/ ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
(10)拷贝开机启动文件,并赋予可执行权限
cp /usr/local/src/haproxy-1.5.19/examples/haproxy.init /etc/rc.d/init.d/haproxy chmod +x /etc/rc.d/init.d/haproxy
(11)添加haproxy命令脚本软链接
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
(12)设置HAProxy开机启动
chkconfig --add haproxy chkconfig haproxy on
这里,咱们使用HAProxy来搭建Mycat负载均衡集群。HAProxy支持TCP(第四层)和HTTP(第七层)应用的代理,本节课程咱们使用HAProxy来作MyCat的负载均衡代理使用的是TCP模式。在4层模式下HAProxy仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有很是不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。
(1)修改haproxy.cfg 配置文件
具体参数说明可参考官方配置文档 /usr/local/haproxy/doc/haproxy/configuration.txt或GitHub链接:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
vi /usr/local/haproxy/conf/haproxy.cfg
编辑后的文件内容以下所示。
## global配置中的参数为进程级别的参数,一般与其运行的操做系统有关 global log 127.0.0.1 local0 info ## 定义全局的syslog服务器,最多能够定义2个 ### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别 #log 127.0.0.1 local1 info chroot /usr/share/haproxy ## 修改HAProxy的工做目录至指定的目录并在放弃权限以前执行 ### chroot() 操做,能够提高 haproxy 的安全级别 group haproxy ## 同gid,不过这里为指定的用户组名 user haproxy ## 同uid,但这里使用的为用户名 daemon ## 设置haproxy后台守护进程形式运行 nbproc 1 ## 指定启动的haproxy进程个数, ### 只能用于守护进程模式的haproxy;默认为止启动1个进程, ### 通常只在单进程仅能打开少数文件描述符的场中中才使用多进程模式 maxconn 4096 ## 设定每一个haproxy进程所接受的最大并发链接数, ### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的 # pidfile /var/run/haproxy.pid ## 进程文件(默认路径 /var/run/haproxy.pid) node liuyazhuang135 ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时 description liuyazhuang135 ## 当前实例的描述信息 ## defaults:用于为全部其余配置段提供默认参数,这默认配置参数可由下一个"defaults"所从新设定 defaults log global ## 继承global中log的定义 mode http ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK) ### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将创建一个全双工的链接, #### 且不会对7层报文作任何类型的检查,此为默认模式 ### http:实例运行于http模式,客户端请求在转发至后端服务器以前将被深度分析, #### 全部不与RFC模式兼容的请求都会被拒绝 ### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭链接, #### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求 option httplog retries 3 option redispatch ## serverId对应的服务器挂掉后,强制定向到其余健康的服务器 maxconn 2000 ## 前端的最大并发链接数(默认为2000) ### 其不能用于backend区段,对于大型站点来讲,能够尽量提升此值以便让haproxy管理链接队列, ### 从而避免没法应答用户请求。固然,此最大值不能超过“global”段中的定义。 ### 此外,须要留心的是,haproxy会为每一个链接维持两个缓冲,每一个缓存的大小为8KB, ### 再加上其余的数据,每一个链接将大约占用17KB的RAM空间,这意味着通过适当优化后 , ### 有着1GB的可用RAM空间时将维护40000-50000并发链接。 ### 若是指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存, ### 这可能会带来意想不到的结果,所以,将其设定一个可接受值放为明智绝对,其默认为2000 timeout connect 5000ms ## 链接超时(默认是毫秒,单位能够设置us,ms,s,m,h,d) timeout client 50000ms ## 客户端超时 timeout server 50000ms ## 服务器超时 ## HAProxy的状态信息统计页面 listen admin_stats bind :48800 ## 绑定端口 stats uri /admin-status ##统计页面 stats auth admin:admin ## 设置统计页面认证的用户和密码,若是要设置多个,另起一行写入便可 mode http option httplog ## 启用日志记录HTTP请求 ## listen: 用于定义经过关联“前端”和“后端”一个完整的代理,一般只对TCP流量有用 listen mycat_servers bind :3307 ## 绑定端口 mode tcp option tcplog ## 记录TCP请求日志 option tcpka ## 是否容许向server和client发送keepalive option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 后端服务状态检测 ### 向后端服务器的48700端口(端口值在后端服务器上经过xinetd配置)发送 OPTIONS 请求 ### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用. ### 2xx 和 3xx 的响应码表示健康状态,其余响应码或无响应表示服务器故障。 balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式 server mycat_01 192.168.209.133:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 server mycat_02 192.168.209.134:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 ## 格式:server <name> <address>[:[port]] [param*] ### serser 在后端声明一个server,只能用于listen和backend区段。 ### <name>为此服务器指定的内部名称,其将会出如今日志及警告信息中 ### <address>此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时须要解析主机名至响应的IPV4地址 ### [:[port]]指定将客户端链接请求发往此服务器时的目标端口,此为可选项 ### [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个经常使用的参数: #### weight:权重,默认为1,最大值为256,0表示不参与负载均衡 #### backup:设定为备用服务器,仅在负载均衡场景中的其余server均不能够启用此server #### check:启动对此server执行监控状态检查,其能够借助于额外的其余参数完成更精细的设定 #### inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000, ##### 也可使用fastinter和downinter来根据服务器端专题优化此事件延迟 #### rise:设置server从离线状态转换至正常状态须要检查的次数(不设置的状况下,默认值为2) #### fall:设置server从正常状态转换至离线状态须要检查的次数(不设置的状况下,默认值为3) #### cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查, ##### 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久链接的功能 #### maxconn:指定此服务器接受的最大并发链接数,若是发往此服务器的链接数目高于此处指定的值, #####其将被放置于请求队列,以等待其余链接被释放
注意:多节点部署时node 、 description的值要作相应调整。
(2)根据以上HAProxy配置文件要求作如下配置
groupadd haproxy useradd -g haproxy haproxy
mkdir /usr/share/haproxy
vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 48800 -j ACCEPT
重启防火墙
service iptables restart
(3)开启rsyslog的haproxy日志记录功能
默认状况下 haproxy是不记录日志的,若是须要记录日志,还须要配置系统的syslog,在linux系统中是rsyslog服务。syslog服务器能够用做一个网络中的日志监控中心,rsyslog是一个开源工具,被普遍用于Linux系统以经过TCP/UDP协议转发或接收日志消息。安装配置rsyslog服务:
yum install rsyslog ## 没安装的状况下执行安装 vi /etc/rsyslog.conf
把 $ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉
$ModLoad imudp ## 是模块名,支持UDP协议
$UDPServerRun 514
确认 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf没有则增长上此配置,增长后的效果:
cd /etc/rsyslog.d/ ## rsyslog服务会来此目录加载配置 touch haproxy.conf ## 建立haproxy的日志配置文件 vi /etc/rsyslog.d/haproxy.conf
增长如下内容:
local0.* /var/log/haproxy.log &~
service rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ]
等到HAProxy服务启动后,就能在/var/log/haproxy.log中看到日志了
(4)配置系统内核的IP包转发功能
vi /etc/sysctl.conf net.ipv4.ip_forward = 1
使配置生效
sysctl -p
(5)启动HAProxy
service haproxy start ps -ef | grep haproxy haproxy 23921 1 0 23:27 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid root 23924 23179 0 23:27 pts/1 00:00:00 grep haproxy
(6)使用MySQL客户端经过HAProxy链接Mycat
mysql -ulyz -plyz.123 -h192.168.209.135 -P3307 mysql> show databases; mysql> lyz_schema1; mysql> show tables; mysql> select * from lyz_user;
写数据测试
insert into lyz_user (userName, pwd) values ('lyz6'666666');
查询后的结果以下:
(7)登陆HAProxy的状态信息统计页面
http://192.168.209.135:48800/admin-status
用户名和密码都是admin,对应的haproxy.cfg配置片断
## HAProxy的状态信息统计页面 listen admin_stats bind :48800 ## 绑定端口 stats uri /admin-status ##统计页面 stats auth admin:admin ## 设置统计页面认证的用户和密码,若是要设置多个,另起一行写入便可 mode http option httplog ## 启用日志记录HTTP请求
统计页面以下图所示:
好了,今天就到这儿吧,我是冰河,咱们下期见~~
微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,天天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核PDF技术文档,以及我为你们精心准备的多套简历模板(不断更新中),但愿你们都能找到心仪的工做,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。若是你经过努力成功进入到了心仪的公司,必定不要懈怠放松,职场成长和新技术学习同样,不进则退。若是有幸咱们江湖再见!
另外,我开源的各个PDF,后续我都会持续更新和维护,感谢你们长期以来对冰河的支持!!