mysql负载均衡集群

一、haproxy介绍与配置

1、haproxy 介绍
HAProxy 是一个使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP
HTTP 的应用程序代理。
 
  • HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。
  • HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
  • HAProxy 实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间 (User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU 时间片 Cycle 做更多的工作。
  • 相较与 NginxHAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。
  • 包括 GitHubBitbucketStack OverflowRedditTumblrTwitter Tuenti 在内的知名网站,及亚马逊网络服务系统都使用了 HAProxy
2、Haproxy 的特性:
 
  • 可靠性与稳定性都非常出色,可与硬件级设备媲美。
  •  支持连接拒绝,可以用于防止 DDoS 攻击
  • 支持长连接、短连接和日志功能,可根据需要灵活配置
  •  路由 HTTP 请求到后端服务器,基于 cookie 作会话绑定;同时支持通过获取指定的 url 来检测后端服务器的状态
  • HAProxy 还拥有功能强大的 ACL 支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便
  • 可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能
  • 拥有功能强大的后端服务器的状态监控 web 页面,可以实时了解设备的运行状态 ,还可实现设备上下线等简单操作。
  • 支持多种负载均衡调度算法,并且也支持 session 保持。
  • Haproxy 七层负载均衡模式下,负载均衡与客户端及后端的服务器会分别建立一次 TCP连接,而在四层负载均衡模式下(DR),仅建立一次 TCP 连接;七层负载均衡对负载均衡设备的要求更高,处理能力 也低于四层负载均衡
3、haproxy 的配置文件由两部分组成:
  • 全局设定(global settings
  • 对代理的设定(proxies

共分为五段:global,defaults,frontend,backend,listen。

全局设定

global settings :主要用于定义 haproxy 进程管理安全及性能相关的参数
 
代理设定
 
proxies 共分为 4 段: defaults frontend backend listen
 
proxies :代理相关的配置可以有如下几个配置端组成
 
defaults :为除了 global 以外的其它配置段提供默认参数,默认配置参数可由下一个 “defaults”重新设定。
 
frontend :定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
 
backend :定义 后端 服务器,前端代理服务器将会把客户端的请求调度至这些服务器。
 
listen :定义监听的套接字和后端的服务器。类似于将 frontend backend 段放在一起所有代理的名称只能使用大写字母、小写字母、数字、-( 中线 ) _( 下划线 ) .( 点号 ) :( 冒号 ) 。此外,ACL 名称会区分字母大小写。
 
配置文件详细介绍
global

    log     127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可定义2个,格式:log <address> <facility> [max level [min level]]
           
    chroot   /var/lib/haproxy # 修改 haproxy 的工作目录至指定的目录并在放弃权限之前执行,保证haproxy的安全,使用配置文件默认值即可

    pidfile   /var/run/haproxy.pid

    maxconn  10000 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;

    user   haproxy # 以指定的 user 运行haproxy,建议使用专用于运行 haproxy 的 user, 以免因权限问题带来风险;

    group  haproxy # 以指定的 group 运行haproxy,建议使用专用于运行 haproxy 的 group, 以免因权限问题带来风险;
          
    daemon       # 让haproxy以守护进程的方式工作于后台,其等同于 “-D” 选项的功能,当然,也可以在命令行中以 “-db” 选项将其禁用; 

    ulimit-n 100000 # 设定每进程所能够打开的最 大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件 数为1024个 

    stats socket  /var/lib/haproxy/stats level admin process 1 # 开启一个 socket 管理接口 

    nbproc 12 # 指定启动的 haproxy 进程个数,只能用于守护进程模式的 haproxy;默认只启动一个进程,
    cpu-map 1 0 # 绑定 cpu,和 nbproc 数量相 对。进程号从1开始,cpu 核数从0开始; 


defaults 

    log global option tcplog # 启用日志记录;tcplog 请 求;

    option dontlognull # 日志中将不会记录空连接; 

    retries 3 # 定义连接后端服务器的失败 重连次数

    timeout connect 2s # 定义 haproxy 将客户端请求 转发至后端服务器所等待的超时时长

    timeout client 3600s # 客户端非活动状态的超时时 长 

    timeout server 3600s # 客户端与服务器端建立连接 后,等待服务器端的超时时长 

    maxconn 10000 # 默认和前段的最大连接数, 但不能超过 global 中的 maxconn 限制数 


listen admin_stats # 开启一个统计报告服务

    bind *:1080 # 监听1080端口 
        
    mode http # 基于http协议 

    maxconn 10 stats refresh 10s # 统计页面自动刷新时间间隔 

    stats uri /haproxy # url 地址 

    stats realm Haproxy # 统计页面密码框上提示文本 
    
    stats auth admin:admin # 账号:密码

    stats hide-version # 隐藏统计报告版本信息

    stats admin if TRUE # 在制定条件下开启admin 功能


frontend haproxy # 前端应用

    bind *:40000 # 端口 

    mode tcp # tcp 模式 

    default_backend tidb # 此前端对应的后端应用 


backend tidb # 后端应用 

    balance leastconn # balance 基于最少连接数 
    
    mode tcp # tcp 模式
 
    # acl  internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1 定义一条 ACL,ACL是根据数据包的指定属性以指定表达式计算出的true/false值。

    # tcp-request content reject if ! internal_networks 

    # option mysql-check user haproxy post-41 

    server tidb1 10.0.1.4:4000 check # 后端应用地址,代理将会将 对应客户端的请求转发至这些服务器。 

    server tidb2 10.0.1.10:4000 check

二、haproxy安装与环境配置

1、环境搭建准备:

服务器名称IP操作系统安装服务
Mysql-Master192.168.29.131CentOS7.1
mysql,elasticsearch
Mysql-Slave1192.168.29.175CentOS7.1
mysql,Mycat haproxy Keepalived
Mysql-Slave2192.168.29.172CentOS7.1
mysql haproxy Keepalived

2、haproxy安装与环境配置

192.168.199.175 192.168.199.172( 负载均衡服务器 ) 中安装与配置如下:
 
2.1安装 haproxy 负载均衡器
 
yum install haproxy -y

2.2 配置haproxy配置文件,目录:/etc/haproxy/haproxy.cfg

global
    log 127.0.0.1 local2
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 4000
    user haproxy
    group haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode tcp
    log global
    option tcplog
    option dontlognull
    option http-server-close
    option redispatch
    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 
frontend mysql 
    bind 0.0.0.0:3307 
    mode tcp 
    log global 
    default_backend mysql_server 
backend mysql_server 
    balance roundrobin 
    server mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3 
    server mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3 
listen stats 
    mode http 
    bind 0.0.0.0:1080 
    stats enable 
    stats hide-version 
    stats uri /haproxyadmin?stats 
    stats realm Haproxy\ Statistics 
    stats auth admin:admin 
    stats admin if TRUE
2.3 启动 haproxy 负载均衡
 
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
三、 keeplived 介绍与配置
 
1、Keepalived 介绍
 
Keepalived 的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障, Keepalived 将检测到,
并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后
Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是
修复故障的服务器。
 
2、Keepalived 安装
1. 安装 Keepalived 需要的扩展
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2. 解压Keepalived并安装

[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz
[root@localhost home]# cd keepalived-1.2.18
[root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.2.18]# make && make install

2. keepalived 安装成 Linux 系统服务

因为没有使用 keepalived 的默认路径安装(默认是 /usr/local , 安装完成之后,需要做一些工作 复制默认
配置文件到默认路径
[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp
/usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived
/etc/init.d/

[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived
/etc/sysconfig/

[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived/usr/sbin/

设置 keepalived 服务开机启动

[root@localhost keepalived-1.2.18]# chkconfig keepalived on

3. mysql高可用搭建

3.1 Keepalived 配置
keepalived 主机配置
! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
    }
    track_script {
        chk_haproxy
    }
}
# 写VIP virtual_server,只配置本地机器
virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3 # 健康检查时间间隔,3秒
    lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启
    protocol TCP # 转发协议protocol,一般有tcp和udp两种
    real_server 192.168.29.106 3307 {
        weight 1 # 权重越大负载分越大,0表示失效
    TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 3306
    }
  }
}
Keepalived 从机配置
! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 79
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 写VIP virtual_server,只配置本地机器
virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3 # 健康检查时间间隔,3秒
    lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启
    protocol TCP # 转发协议protocol,一般有tcp和udp两种
    real_server 192.168.29.107 3307 {
        weight 1 # 权重越大负载分越大,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

haproxy状态检测脚本

#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy启动命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件
HAPS=`ps -C haproxy --no-header |wc -l` # 检测haproxy的状态,0代表未启动,1已经启动
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日志文件当中记录检测时间
echo "check haproxy status" >> $LOG_FILE # 记录haproxy的状态
if [ $HAPS -eq 0 ];then #执行haproxy判断
    echo $START_HAPROXY >> $LOG_FILE #记录启动命令
    /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #启动haproxy
    sleep 3
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        echo "start haproxy failed, killall keepalived" >> $LOG_FILE
        killall keepalived
        service keepalived stop
    fi
fi

haproxy状态检测脚本不执行问题,如果是使用的service keeplived start 或者haproxy状态检测脚本不执行问题,如果是使用的service keeplived start 或者是 systemctl 方式启动,脚本可 能会不执行,可以使用 Keepalived -f /etc/keepalived/keepalived.conf方式启动Keepalived

keepalived 配置注意点 - 配置完成但是 ip 不生效;
 
1. 查看虚拟机 / 机器系统时间是否一致
2. virtual_router_id 路由 id 不对,不能冲突。可以通过 /var/log/messages 查看此错误
 
3.2 测试
 
1. 在本地通过 192.168.199.101 去连接 mysql ,查询 sever_id, 端口使用 haproxy 定义的 3307可以看到同样的连接方式,但是查询到的server_id 确是不同机器的 server_id.
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值