背景
我有一个MySQL主从复制,想要通过HAProxy代理,做读写分离。
写流量给到主节点,读流量给到奴隶节点。
首先我应该由一个HAProxy的配置,我想应该这样写(伪配置):
<代码>听mysql 结合*:3316 tcp方式 … 服务器192.168.1.111 192.168.1.111:3306检查 服务器192.168.1.112 192.168.1.112:3306检查 服务器192.168.1.113 192.168.1.113:3306检查代码>
很明显,这么写仅仅只实现了流量的分发,但并不能实现我的需求:把写流量给主人,读流量给奴隶节点。
那么问题来了,首先我要能够识别主从节点,才能有接下来的流量分离。
HAProxy有个配置项叫做mysql-check。但是这里并不能用它去做主从的检测,因为这个选项只提供存活检测。
只要能够连上,就代表这个mysql后端是健康的。
这还是不符合我的需求。
MySQL如果能够通过tcp-check检测是主人还是奴隶就好了。
既然这样,写一个TCP-check包装不就可以了?
TCP-Check-Wrapper
这个包装应该监听在TCP端口上,并以守护进程的方式运行。
当HAproxy连接至其监听的端口时,会执行相应的脚本,并将脚本执行结果通过TCP连接发送至HAproxy。
代码如下:
-
<李> TCP-Check-Wrapper李>
<李> mysqlchk李>
放置好mysqlchk脚本,然后在每个MySQL节点上把tcp-check-wrapper服务跑起来。
在主节点上测试一下脚本
<代码> root@control-01 ~ # mysqlchk.mysql HTTP/1.1 200 OK 内容类型:text/html 内容长度:43 & lt; html> & lt; body> MySQL主运行灵活;/body> & lt;/html> 代码>
在奴隶节点上测试一下
<代码> root@control-02 ~ # mysqlchk.mysql HTTP/1.1 200 OK 内容类型:text/html 内容长度:43 & lt; html> & lt; body> MySQL奴隶正在运行。(奴隶滞后:0)& lt;/body> & lt;/html> 代码>
好的,通过mysql检查脚本已经可以帮助我们区分主还是奴隶了。
然后配置好tcp-check-wrapper。
<代码类=" language-ini "> #/etc/haproxy-tcp-check-wrapper 主机=" 0.0.0.0 " 端口=9090 脚本="/usr/bin/mysqlchk.mysql " 代码>
在每个MySQL节点上,运行tcp-check-wrapper。
<代码> haproxy_tcp_check, 代码>
HAProxy的配置
基于我们前面所做的,现在可以写出HAProxy的配置文件了。
<代码> mysql_write听 结合*:3316 tcp方式 客户机超时10800年代 超时服务器10800年代 平衡leastconn 选择tcp-check tcp-check期望字符串MySQL \主\ \运行。 选择allbackups 默认的服务器端口9090国米2 s downinter 5 s升3降2 slowstart 60 maxconn 64 maxqueue 128体重100 服务器192.168.1.111 192.168.1.111:3306检查 服务器192.168.1.112 192.168.1.112:3306检查 服务器192.168.1.113 192.168.1.113:3306检查 听mysql_read 结合*:3317 tcp方式 客户机超时10800年代 超时服务器10800年代 平衡leastconn 选择tcp-check tcp-check期望字符串MySQL \奴隶\ \运行。 选择allbackups 默认的服务器端口9090国米2 s downinter 5 s升3降2 slowstart 60 maxconn 64 maxqueue 128体重100 服务器192.168.1.111 192.168.1.111:3306检查 服务器192.168.1.112 192.168.1.112:3306检查 服务器192.168.1.113 192.168.1.113:3306检查代码>
总结
至此,我们已经通过HAProxy,借助了“TCP-Check-Wrapper"+“mysqlchk",实现了MySQL主从复制的读写分离,
TCP-Check-Wrapper帮助我们对一些不能使用tcp-check选项的应用执行检查。
mysqlchk提供了具体检测的方法。
其实再多想一点,可以再进一步利用尼古拉斯+ HAPRoxy,可以实现MySQL主从复制高可用。
即:在主发生故障时,尼古拉斯可以将其中一台MySQL奴隶提升为大师,并且配置其他的奴隶指向新的主人。