如何利用HAProxy 代理 MySQL Master-Slave Replication

背景

我有一个MySQL Master-Slave Replication, 想要通过HAProxy代理, 做读写分离.

写流量给到Master 节点, 读流量给到Slave 节点.

首先我应该由一个HAProxy的配置, 我想应该这样写(伪配置):

listen  mysql
        bind *:3316
        mode tcp
        ...
        server 192.168.1.111 192.168.1.111:3306 check
        server 192.168.1.112 192.168.1.112:3306 check
        server 192.168.1.113 192.168.1.113:3306 check

很明显, 这么写仅仅只实现了流量的分发, 但并不能实现我的需求: 把写流量给Master, 读流量给Slave 节点.

那么问题来了,首先我要能够识别Master Slave 节点, 才能有接下来的流量分离.

HAProxy有个配置项叫做 mysql-check. 但是这里并不能用它去做Master-Slave的检测,因为这个option只提供存活检测.
只要能够连上,就代表这个mysql后端是Health OK的.

这还是不符合我的需求.

MySQL 如果能够通过tcp-check 检测是Master还是Slave就好了.

既然这样, 写一个TCP-check Wrapper 不就可以了?

TCP-Check-Wrapper

这个Wrapper应该监听在TCP端口上,并以守护进程的方式运行.
当HAproxy连接至其监听的端口时, 会执行相应的脚本, 并将脚本执行结果通过 TCP 连接发送至Haproxy.

代码如下:

放置好mysqlchk 脚本, 然后在每个MySQL节点上把tcp-check-wrapper服务跑起来.

在Master节点上测试一下脚本

[[email protected] ~]# mysqlchk.mysql
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 43

<html><body>MySQL master is running.</body></html>

在Slave节点上测试一下

[[email protected] ~]# mysqlchk.mysql
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 43

<html><body>MySQL slave is running. (Slave lag: 0)</body></html>

OK, 通过 mysql check 脚本已经可以帮助我们区分Master还是Slave了.

然后配置好tcp-check-wrapper.

# /etc/haproxy-tcp-check-wrapper
host = "0.0.0.0"
port = 9090
script = "/usr/bin/mysqlchk.mysql"

在每个MySQL节点上, 运行 tcp-check-wrapper.

haproxy_tcp_check &

HAProxy的配置

基于我们前面所做的, 现在可以写出HAProxy的配置文件了.

listen  mysql_write
        bind *:3316
        mode tcp
        timeout client  10800s
        timeout server  10800s
        balance leastconn
        option tcp-check
        tcp-check expect string MySQL\ master\ is\ running.
        option allbackups
        default-server port 9090 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
        server 192.168.1.111 192.168.1.111:3306 check
        server 192.168.1.112 192.168.1.112:3306 check
        server 192.168.1.113 192.168.1.113:3306 check

listen  mysql_read
        bind *:3317
        mode tcp
        timeout client  10800s
        timeout server  10800s
        balance leastconn
        option tcp-check
        tcp-check expect string MySQL\ slave\ is\ running.
        option allbackups
        default-server port 9090 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
        server 192.168.1.111 192.168.1.111:3306 check
        server 192.168.1.112 192.168.1.112:3306 check
        server 192.168.1.113 192.168.1.113:3306 check

总结

至此, 我们已经通过HAProxy, 借助了 "TCP-Check-Wrapper" + "mysqlchk", 实现了MySQL Master-Slave Replication 的读写分离,

TCP-Check-Wrapper 帮助我们对一些不能使用tcp-check option 的应用执行检查.
mysqlchk 提供了具体检测的方法.

其实再多想一点, 可以再进一步利用MHA + HAPRoxy, 可以实现 MySQL Master-Slave Replication 高可用.
即: 在Master发生故障时, MHA可以将其中一台 MySQL Slave提升为Master, 并且配置其他的Slave指向新的Master.

原文地址:https://blog.51cto.com/14653416/2462258

时间: 2024-11-09 20:37:58

如何利用HAProxy 代理 MySQL Master-Slave Replication的相关文章

使用HAProxy实现MySQL多slave的读负载均衡

HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.而mysql一主多从是比较通用的架构,我们可以利用haproxy在tcp层对数据库的读请求进行代理,从而实现多个从库读的负载均衡. 目前公司的业务都是一主多从,想要把查询分到多个从库上,都是通过开发维护多个从库的配置来实现,这样比较麻烦,通过haproxy开发只需要一个配置项,开发不用理会后端有多少从库,而且可以把多个从库都利用起来,同时后台db有故障haproxy可以自动

haproxy实现mysql多slave读负载均衡

前言 :HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.而mysql一主多从是比较通用的架构,我们可以利用haproxy在tcp层对数据库的读请求进行代理,从而实现多个从库读的负载均衡. 目前公司的业务都是一主多从,想要把查询分到多个从库上,都是通过开发维护多个从库的配置来实现,这样比较麻烦,通过haproxy开发只需要一个配置项,开发不用理会后端有多少从库,而且可以把多个从库都利用起来,同时后台db有故障haproxy

Windows下搭建MySQL Master Slave

转:http://www.cnblogs.com/gaizai/p/3248207.html http://www.cnblogs.com/gaizai/archive/2013/03/15/2961868.html   MySQL表数据迁移自动化 http://www.cnblogs.com/gaizai/archive/2012/10/23/2735556.html  Ubuntu10下MySQL搭建Master Slave 一.背景 服务器上放了很多MySQL数据库,为了安全,现在需要做M

mysql master&amp;slave

这个东西应该有用,所以前段时间就尝试在自己笔记本上实验一下,结果始终没成功. 昨天回来路上想,是该做点儿事情,遂想起了这事. 初步理解就是:master数据库有相应的操作时,会记录到一个binaery_log里,然后slave去读取这个log,然后再在自己的数据库中进行相应的操作,从而达到同步.当然这个同步会有时间延迟. 配置: 在master和slave两端都需要对数据库的配置文件进行修改 master server-id=1 auto-increment-increment=2 auto-i

mysql master slave 1( 2015-11)

注:环境为主库单实例,从库多实例. 主库开logbin,确认server id 和从库不同 [[email protected] backup]# egrep "log-bin|server-id" /etc/my.cnf server-id = 1 log-bin=mysql-bin [[email protected] backup]# egrep "log-bin|server-id" /data/3306/my.cnf #log-bin = /data/33

Mysql Master Slave Config

同一台机器安装两个及以上MySQL服务: 下载mysql安装包,安装完成以后将安装文件夹复制多份在磁盘上面:分别进入my.ini修改port(端口不能冲突),server_id,basedir(optional),datadir(数据文件路径)等参数: # Path to the database root datadir="D:/MySQL/MySQL Server 5.7/data/" # General and Slow logging. log-output=FILE gene

mysql master slave

mysql主从复制配置 配置原理(slave数据库通过二进制日志文件对数据库进行AUDQ) 一.需求: 版本一致 系统启动mysql 二. master的配置: 修改二进制日志,和server-id log-bin=logbin(可跟绝对路径,注意权限) server-id=11(可以为和slave不重复的任意数字,一般是IP的末位) 三. slave的配置: 唯一必须更改的是servier-id log-bin=logbin(不是必须启用或更改的) server-id=12(必须启用的,但不能

mysql master slave搭建

1. 2.配置master 修改/etc/my.cnf增加 [mysqld] log-bin = master-bin log-bin-index = master-bin.index server-id = 1 3.master创建一个复制用户 CREATE USER repl_user; GRANT REPLICATION SLAVE ON *.* TO repl_user IDENTIFIED BY '123456'; 重启master 4.配置slave 修改/etc/my.cnf增加

Haproxy代理Mysql服务

-----client---------haproxy-------mysql1---------mysql2------ 192.168.1.250 192.168.1.1 192.168.1.10 192.168.1.20 一.安装mysql [[email protected] ~]#tar -zxvf bison-2.5.tar.gz [[email protected] ~]#./configure && make&& make install [[email p