如何利用HAProxy代理MySQL Master-Sl

  

背景

  

我有一个MySQL主从复制,想要通过HAProxy代理,做读写分离。

  

写流量给到主节点,读流量给到奴隶节点。

  

如何利用HAProxy代理MySQL Master-Sl

  

首先我应该由一个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奴隶提升为大师,并且配置其他的奴隶指向新的主人。

如何利用HAProxy代理MySQL Master-Sl