haproxy实现mysql多slave读负载均衡

前言 :HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。而mysql一主多从是比较通用的架构,我们可以利用haproxy在tcp层对数据库的读请求进行代理,从而实现多个从库读的负载均衡。

目前公司的业务都是一主多从,想要把查询分到多个从库上,都是通过开发维护多个从库的配置来实现,这样比较麻烦,通过haproxy开发只需要一个配置项,开发不用理会后端有多少从库,而且可以把多个从库都利用起来,同时后台db有故障haproxy可以自动摘除,不需要像原先那样需要开发改数据库配置。

一 环境说明:

我这里都是debian系统
haproxy +mysql_master  192.168.6.123
mysql_slave1  192.168.4.21
mysql_slave2  192.168.9.53

二 haprox安装
下载,解压,下载连接 http://down.51cto.com/data/2458810

 make TARGET=linux26 ARCH=x86_64 PREFIX=/home/yx/server/haproxy  # 编译

make install PREFIX=/home/yx/server/haproxy # 安装

二 配置文件默认没有,需要手动创建

global
        log 127.0.0.1 local2
       # chroot /var/lib/haproxy
        pidfile /home/yx/server/haproxy/haproxy.pid
        maxconn 4000
        #user haproxy
        #group haproxy
        daemon
defaults
        mode tcp
        log global
        option httplog
        option dontlognull
        retries 3
        timeout http-request 10s
        timeout queue 1m
        timeout connect 10s
        timeout client 1m
        timeout server 1m
        timeout http-keep-alive 10s
        timeout check 10s
        maxconn 3000
## 定义一个监控页面,监听在1080端口,并启用了验证机制
listen stats
        mode http
        bind 192.168.6.123:1080
        stats enable
        stats hide-version
        stats uri /haproxyadmin?stats
        stats realm Haproxy\ Statistics
        stats auth admin:admin
        stats admin if TRUE
frontend mysql
        bind *:3306
        mode tcp
        #log global
        option tcplog
        default_backend mysqlservers
backend mysqlservers
        balance leastconn
        server zook-3 192.168.4.21:3306 check port 3306 rise 1 fall 2 maxconn 300
        server zook-2 192.168.9.53:3306 check port 3306 rise 1 fall 2 maxconn 300

配置文件参数介绍

backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:

inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;

rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;

fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;

cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;

maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;

三 启动

yx@es-2:~/server/haproxy$ sudo ./sbin/haproxy -f etc/haproxy.cfg -c  #检测配置文件是否正确
 出现 Configuration file is valid  是正常

    sudo ./sbin/haproxy -f etc/haproxy.cfg  启动服务
    sudo /etc/init.d/haproxy start  # 用脚本启动

  用ps aux | grep haprox查看

启动脚本实例

#!/bin/bash
    #
    # haproxy
    #
    # chkconfig: 35 85 15
    # description: HAProxy is a free, very fast and reliable solution     # offering high availability, load balancing, and     # proxying for TCP and HTTP-based applications
    # processname: haproxy
    # config: /etc/haproxy.cfg
    # pidfile: /var/run/haproxy.pid
    # Source function library.
#    . /etc/rc.d/init.d/functions
. /lib/lsb/init-functions
   # Source networking configuration.
#    . /etc/sysconfig/network
#/run/network
   # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0
    config="/home/yx/server/haproxy/etc/haproxy.cfg" # 根据自己安装的路径来写
    exec="/home/yx/server/haproxy/sbin/haproxy" #根据自己安装的路径来写
    prog=$(basename $exec)
    [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
    lockfile=/run/lock/haproxy
    check() {
        $exec -c -V -f $config
    }
    start() {
        $exec -c -q -f $config
        if [ $? -ne 0 ]; then
            echo "Errors in configuration file, check with $prog check."
            return 1
        fi
        echo -n $"Starting $prog: "
        # start it up here, usually something like "daemon $exec"
        start-stop-daemon --quiet --oknodo --start --pidfile /var/run/"$prog.pid"  --exec "$exec" -- -f "$config"  -D -p /var/run/"$prog.pid" || return 2
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        return $retval
    }
    stop() {
        echo -n $"Stopping $prog: "
        # stop it here, often "killproc $prog"
        killproc $prog
        retval=$?
        echo
        [ $retval -eq 0 ] && rm -f $lockfile
        return $retval
    }
    restart() {
        $exec -c -q -f $config
        if [ $? -ne 0 ]; then
            echo "Errors in configuration file, check with $prog check."
            return 1
        fi
        stop
        start
    }
    reload() {
        $exec -c -q -f $config
        if [ $? -ne 0 ]; then
            echo "Errors in configuration file, check with $prog check."
            return 1
        fi
        echo -n $"Reloading $prog: "
        $exec -D -f $config -p /var/run/$prog.pid -sf $(cat /var/run/$prog.pid)
        retval=$?
        echo
        return $retval
    }
    force_reload() {
        restart
    }
    fdr_status() {
        status
    }
    case "$1" in
        start|stop|restart|reload)
            $1
            ;;
        force-reload)
            force_reload
            ;;
        checkconfig)
            check
            ;;
        status)
            fdr_status
            ;;
        condrestart|try-restart)
          [ ! -f $lockfile ] || restart
        ;;
        *)
            echo $"Usage: $0 {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}"
            exit 2
    esac

把上面的脚本放到/etc/init.d/目录下,加上执行权限即可

用脚本启动的时候如果报下面的错误

Proxy ‘admin_stats‘: stats admin will not work correctly in multi-process mode.
[./haproxy.main()] FD limit (16384) too low for maxconn=20000/maxsock=40014. Please raise ‘ulimit-n‘ to 40014 or more to avoid any trouble.

请设置参数ulimit-n 的值等于maxconn的2倍

四 浏览器访问
http://192.168.6.123:1080/haproxyadmin?stats # 后面的路径跟你配置文件里面的要一致

五 开启haproxy日志

创建日志目录   mkdir -p /home/yx/server/haproxy/log

更改 sudo vim /etc/rsyslog.conf  这个配置文件
 $ModLoad imudp # 把前面的#号去掉
$UDPServerRun 514 # 把前面的#号去掉
local2.* /home/yx/server/haproxy/log/haproxy.log  # 手动添加,local2.* 要跟你haproxy配置文件里面的一致

 sudo  etc/init.d/rsyslog  restart  # 重启rsylog服务

六 从数据库设置

在slave1和slave2上分别给haproxy的ip授权:

> grant all privileges on *.* to yx1@192.168.6.123 identified by ‘123456‘;
grant all privileges on *.* to ‘yx1‘@‘192.168.6.123‘ identified by ‘123456‘;
> flush privileges;

在6.123上面及haproxy上面,测试能否用新创建的账户登录slave上面的数据库,如果能正常登录才可以
mysql -uyx1 -p123456 -h192.168.4.21 -P3306
用浏览器查看,两个从数据库也正常了

七 负责均衡测试:
在两个从上面分别在一个数据库里面建立两个不同的表,我这里一个只有一个tb1 ,另一个有两个表分别是tb1,和tb2

#slave1:
create table tb1 (`id` int(4),`name` char(40));
# slave2
create table tb1 (`id` int(4),`name` char(40));
create table tb2 (`id` int(4),`name` char(40));

然后用下面的命令在haproxy上面执行,查询得到的结果

mysql -h192.168.6.123 -P3306 -uyx1 -p123456 -e "use test;show tables;"

如下图所示:

八 failover测试,把其中一个slave服务停掉
查询日志显示

2019-01-10T14:50:10+08:00 localhost haproxy[8445]: Server mysqlservers/zook-3 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue

web界面显示,红色代表故障

查询返回的结果只显示其中一个

原文地址:https://blog.51cto.com/825536458/2353109

时间: 2024-11-08 11:12:07

haproxy实现mysql多slave读负载均衡的相关文章

利用keepalived和haproxy配置mysql的高可用负载均衡

实验系统:CentOS 6.6_x86_64(2.6.32-504.30.3.el6.x86_64) 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:keepalived-1.2.19 haproxy-1.5.14 mariadb-10.0.20 下载地址:http://pan.baidu.com/s/1bnnYiMr 实验拓扑: 一.安装mariadb 1.在两台数据库服务器安装: tar xf mariadb-10.0.20-linux-x86

采用Atlas+Keepalived实现MySQL读写分离、读负载均衡

========================================================================================== 一.基础介绍 ========================================================================================== 1.背景描述 目前我们的高可用DB的代理层采用的是360开源的Atlas,从上线以来,已稳定运行2个多月.无论是从性能上,

采用Atlas+Keepalived实现MySQL读写分离、读负载均衡【转载】

文章 原始出处 :http://sofar.blog.51cto.com/353572/1601552 ========================================================================================== 一.基础介绍 ========================================================================================== 1.背景描述 目前

Atlas+Keepalived实现MySQL读写分离、读负载均衡

参考文章 http://sofar.blog.51cto.com/353572/1601552/ http://www.0550go.com/database/mysql/mysql-atlas.html 360开源的Atlas,无论是从性能上,还是稳定性上,相比其他开源组件(amoeba.cobar.MaxScale.MySQL-Proxy等),还是很出色的. 之所以选择Atlas,主要看中它有以下优点: (1).基于mysql-proxy-0.8.2进行修改,代码完全开源: (2).比较轻量

MaxScale:实现MySQL读写分离与负载均衡的中间件利器

1.MaxScale 是干什么的? 配置好了MySQL的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡. 读写分离和负载均衡是MySQL集群的基础需求,MaxScale 就可以帮着我们方便的实现这些功能. 2.MaxScale 的基础构成 MaxScale 是MySQL的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟.MaxScale 是插件式结构,允许用户开发适合自己的插件. MaxScale 目前提供的插件功能分为5类: 认证插件

分别使用Nginx反向代理和Haproxy调度器实现web服务器负载均衡

1.1 使用nginx实现静态分离得负载均衡集群 1.1.1 Nginx负载均衡基础知识 本实验使用的主机是: 主机 IP地址 角色 centos23.cn 192.168.3.23 Nginx反向代理服务器 centos24.cn 192.168.3.24 web服务器 centos25.cn 192.168.3.25 web服务器 网络拓扑图: Nginx的upstream负载的5种方式,目前最常用得前3种方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同得后端服务器,如果后端服务器d

keepalived + haproxy 实现web的高可用负载均衡

一.Haproxy简介 人们熟知的软件负载均衡如LVS.HAProxy,各方面性能不亚于硬件负载均衡,HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理. HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层

Haproxy+Keepalived搭建Weblogic高可用负载均衡集群

配置环境说明:   KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G  系统盘20G cpu 4核 Haproxykeepalived 2台 192.168.1.10192.168.1.20 Haserver01Haserver02 192.168.30192.168.40 内存6G  系统盘20G cpu 4核 Weblogic 4台 192.168.1.100192.168.1.150 192.168.1.200 192.168.1.250 Clusters01C

基于HAProxy+Varnish实现动静分离、负载均衡的高可用集群

拓扑结构介绍 在实际的生产使用过程中,一个基本的能够应对日均百万PV的网络,一般会具有以下几种结构. 这其中每种结构担负了不同的角色. 代理服务器,负责进行请求调度,实现了负载均衡. KeepAlived配置代理服务器实现了高可用. 缓存服务器,实现了资源的缓存,提高了请求的命中率,加快了访问速度. 动静分离,减轻后端服务器压力,提高资源访问速度. 数据库主从复制,读写分离,降低了数据库的压力 运维监控系统,实时监控系统运行状态. 自动化运维控制系统,批量管理大量服务器. 版本控制系统,在应用的