云顶娱乐平台 31

云顶娱乐平台:haproxy详解(上)

利用HAProxy代理SQL Server的AlwaysOn辅助副本

公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群

机房内有三套程序需要读取数据库

第一套:主程序,读写数据库,连接主副本

第二套:报表程序,读报表,连接辅助副本

第三套:历史库程序,读历史库,连接辅助副本

 

软件环境

云顶娱乐平台 1

机器环境

云顶娱乐平台 2

 

架构图

云顶娱乐平台 3

为什麽需要使用HAProxy?

之前机房里面有2000个终端,这些终端是一个很小的嵌入式设备,第二套报表程序原来是使用直连数据库IP(10.11.10.36)来连接数据库

但这样有一个弊端,当36这台辅助副本宕机,那么报表程序就瘫痪了,因为2000个终端要更改数据库连接需要烧写程序到终端里面非常耗费时间

可能要几天时间

 

最后决定使用HAProxy做负载均衡和TCP连接重定向

云顶娱乐平台:haproxy详解(上)。使用HAProxy有几个好处

1、前端不需要后端数据库的实际IP,当需要升级后端数据库,比如打补丁的时候特别方便

2、HAProxy能够自动检测后端数据库服务,探测1433端口是否存活,如果1433端口出问题,能够自动重定向连接到37这台辅助副本

3、减轻单台读库压力,使用RR轮询算法,请求均衡分发到36和37这两台辅助副本,减轻36这台机器的压力

云顶娱乐平台 4

 

 


HAProxy相关配置步骤

 

#yum安装,版本是1.5.4

yum install -y haproxy.x86_64

 

 

#编辑rsyslog 文件,修改为-c 2 -r -x -m

vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -m 0 -r -x"

 

 

#编辑rsyslog.conf 文件添加两行local3.*  和local0.*

vi /etc/rsyslog.conf
local7.*                                                /var/log/boot.log
local3.*                                                /var/log/haproxy.log
local0.*                                               /var/log/haproxy.log

 

 

 

#重启rsyslog服务

service rsyslog restart

 

 

# 编辑haproxy配置文件 下面以mssql从库负载均衡为例

vi /etc/haproxy/haproxy.cfg

global
log 127.0.0.1 local2 
chroot /var/lib/haproxy 
pidfile /var/run/haproxy.pid 
maxconn 6000 
user haproxy 
group haproxy 
daemon 
#stats socket /var/lib/haproxy/stats     
stats socket /var/run/haproxy.sock mode 666 level admin
stats timeout 2m


defaults 
mode http 
log                 127.0.0.1:514       local3                     
option                  dontlognull
#option http-server-close
#option forwardfor       except 127.0.0.0/8
option redispatch
retries 3 
timeout http-request 10s 
timeout connect 10s 
timeout client 1m 
timeout server 1m 
timeout http-keep-alive 10s
timeout check 10s
maxconn 6000





listen stats 
mode http
bind *:2080
stats enable
stats refresh 30s
stats uri /haproxyadminstats
stats realm HAProxy Statistics
stats auth admin:admin
stats admin if TRUE


listen mssql :1433
mode tcp
balance roundrobin
server mssqldb1 10.11.10.36:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2
server mssqldb2 10.11.10.37:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2

 

 

#检查配置文件是否有语法错误

haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid

 

#启动haproxy

/etc/init.d/haproxy start

 

 

#检查haproxy是否在监听

netstat -lntp

 

注意:Centos机器只需要使用一个网口,不需要额外增加网口

云顶娱乐平台 5

#打开后台管理界面

 

HAProxy提供了一个后台管理界面

云顶娱乐平台 6

 

查看haproxy的日志

cat /var/log/haproxy.log

云顶娱乐平台 7


测试验证

使用SSMS2016来连接HAProxy的IP

10.11.10.39

云顶娱乐平台 8

现在是连接到GZC-SQL03这台机

 

现在把 GZC-SQL03这台机的SQL服务停了

云顶娱乐平台 9

HAProxy已经探测到 GZC-SQL03这台机的SQL服务停了

云顶娱乐平台 10

 再次点击一下执行按钮,可以发现已经重定向到 GZC-SQL02这台机

云顶娱乐平台 11

 

 

云顶娱乐平台,虽然经过HAProxy这一层,但是性能方面也不算太差

云顶娱乐平台 12


 

HAProxy的通信方式

通信方式类似于LVS的NAT模式

LVS的NAT模式(调度器将请求的目标ip即vip地址改为Real server的ip,
返回的数据包也经过调度器,调度器再把源地址修改为vip)

云顶娱乐平台 13

云顶娱乐平台 14

 

 


总结

线上环境使用HAProxy已经差不多1个月,到现在没有出现过问题,比较稳定

对于HAProxy原理上的东西这里就不叙述了,网上有很多资料

 

参考文章:

 

如果是每个业务使用不同端口,可以使用下面的配置文件

比如报表使用1433端口,BI抽取数据使用2433端口

vi /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2 
    chroot      /var/lib/haproxy       
    pidfile     /var/run/haproxy.pid     
    maxconn     6000                               
    user        haproxy           
    group       haproxy           
    daemon
    #stats socket /var/lib/haproxy/stats 
    stats socket /var/run/haproxy.sock mode 666 level admin
    stats timeout 2m




defaults         
    mode                    http               
    log                     global                         
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3                 
    timeout http-request    10s        
    timeout connect         10s               
    timeout client          1m                 
    timeout server          1m                 
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 6000               





listen stats     
    mode http
    bind *:2080
    stats enable
    stats refresh 30s
    stats uri   /haproxyadminstats
    stats realm  HAProxy Statistics
    stats auth   admin:admin
    stats admin if TRUE


listen mssql :1433
    mode tcp
    balance roundrobin
    server mssqldb1 10.11.10.36:1433  weight 1 maxconn 6000 check port 1433 inter 2000  rise 2 fall 2
    server mssqldb2 10.11.10.37:1433  weight 1 maxconn 6000 check port 1433 inter 2000  rise 2 fall 2


listen mssql2 :2433
    mode tcp
    balance leastconn
    server mssqldb3 10.11.10.37:1433   maxconn 6000 check port 1433 inter 2000  rise 2 fall 2

 

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

本文版权归作者所有,未经作者同意不得转载。

LVS DR模式

云顶娱乐平台 15

  • 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
  • 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
  • rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己

listen:frontend和backend的组合体

LVS介绍

  • LVS是由国人章文嵩开发
  • 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高
  • LVS最新版本基于Linux内核2.6,有好多年不更新了
  • LVS有三种常见的模式:NAT、DR、IP Tunnel
  • LVS架构中有一个核心角色叫做分发器(Load
    balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real
    Server,简称rs)

6backend backend_www

LVS NAT模式搭建

准备工作

  • 三台机器
  • 分发器,也叫调度器(简写为dir)
  • 内网:133.130,外网:142.147(vmware仅主机模式)
  • rs1
  • 内网:133.132,设置网关为133.130
  • rs2
  • 内网:133.133,设置网关为133.130
  • 三台机器上都执行执行
  • systemctl stop firewalld; systemc disable firewalld
  • systemctl start iptables-services; iptables -F; service iptables
    save

NAT模式搭建

  • 在dir上安装ipvsadm
  • yum install -y ipvsdam
  • 在dir上编写脚本,vim /usr/local/sbin/lvs_nat.sh//内容如下

#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,阿铭的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.133.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.147.144:80 -s wlc -p 3
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.132:80 -m -w 1
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.133:80 -m -w 1

NAT模式效果测试

  • 两台rs上都安装nginx
  • 设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果
  • 浏览器里访问192.168.142.147,多访问几次看结果差异

准备三台机器,一台作为分发器(内网:133.130,外网:142.147),另外两台是real
server,分别为rs1(内网:133.132,网关为133.130)和rs2(内网:133.133,网关为133.130)

分发器增加一块网卡,查看网卡网段,所以设置IP192.168.142.147

云顶娱乐平台 16

云顶娱乐平台 17

云顶娱乐平台 18

然后查看是否ping通

云顶娱乐平台 19

三台机器配置好了之后,全部需要关闭防火墙

云顶娱乐平台 20

然后在rs1,rs2上安装iptables-services包,启动iptables服务

云顶娱乐平台 21

 systemctl start iptables
 systemctl enable iptables

然后调用新规则,以免默认规则影响实验效果;最后关闭selinux,最好修改下配置文件

云顶娱乐平台 22

云顶娱乐平台 23

云顶娱乐平台 24

安装ipvsadm工具

云顶娱乐平台 25

然后编写脚本,vim
/usr/local/sbin/lvs_nat.sh,保存退出;然后执行该脚本sh
/usr/local/sbin/lvs_nat.sh,脚本无输出表示无错误

云顶娱乐平台 26

$IPVSADM -A -t 192.168.147.144:80 -s rr -p 3
#-A:=add,添加规则;-t:=tcp;-s 指定算法; -p:指定超时时间

在rs1和rs2上安装nginx,并分别修改主页内容

云顶娱乐平台 27

云顶娱乐平台 28

然后可以做测试,如下表示测试成功

云顶娱乐平台 29

server www1 192.168.1.198:80 check inter2000 rise 30 fall 15

扩展

lvs 三种模式详解

lvs几种算法

关于arp_ignore和
arp_announce

lvs原理相关的

option forwardfor

负载均衡集群介绍

  • 主流开源软件LVS、keepalived、haproxy、nginx等
  • 其中LVS属于4层(网络OSI
    7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用
  • keepalived的负载均衡功能其实就是lvs
  • lvs这种4层的负载均衡是可以分发TCP协议,web服务是80端口,除了分发80端口,还有其他的端口通信的,比如MySQL的负载均衡,就可以用LVS实现,而nginx仅仅支持http,https,mail,haproxy;haproxy也支持MySQL这种TCP负载均衡的
  • 相比较来说,LVS这种4层的更稳定,能承受更多的请求,承载的并发量更高,而nginx这种7层的更加灵活,能实现更多的个性化需求

⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

LVS IP Tunnel模式

云顶娱乐平台 30

  • 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
  • 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
  • rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己

balancesource

LVS调度算法

  • 轮询 Round-Robin rr
  • 加权轮询 Weight Round-Robin wrr
  • 最小连接 Least-Connection lc
  • 加权最小连接 Weight Least-Connection wlc
  • 基于局部性的最小连接 Locality-Based Least Connections lblc
  • 带复制的基于局部性最小连接 Locality-Based Least Connections with
    Replication lblcr
  • 目标地址散列调度 Destination Hashing dh
  • 源地址散列调度 Source Hashing sh

常用的算法是前四种

server www2 192.168.1.52:80check inter 2000 rise 30 fall 15

LVS NAT模式

云顶娱乐平台 31

  • 借助iptables的nat表来实现
  • 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
  • rs需要设定网关为分发器的内网ip
  • 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
  • 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源

#-r 开启远程日志

server www2 192.168.1.52:80 cookie www2 checkinter 2000 rise 30 fall 15

option     redispatch#当后端rs挂了,可立即切换,不会出现503错误

haproxy中的session保持实现

frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理

defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用

option forwardfor

现在用HAProxy主要在于它有以下优点,这里我总结下:

6、能对请求的url和header中的信息做匹配,有比lvs有更好的7层实现

4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。

⑤ri,表示根据请求的URI;

③leastconn,表示最少连接者先处理,建议关注;

8backend backend_www

②static-rr,表示根据权重,建议关注;

#-c 2 使用兼容模式,默认是 -c 5

①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;

重启 haproxy和rsyslog 

vim  /etc/rsyslog.conf  

参考文件

balance roundrobin

HAProxy配置中分五大部分:

global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置

3.配置rsyslog的主配置文件,开启远程日志

# vim /etc/sysconfig/rsyslog

1.在haproxy中global

1、HAProxy是支持虚拟主机的,通过frontend指令来实现

⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

server www1 192.168.1.198:80 cookie www1check inter 2000 rise 30 fall 15

local3.*/var/log/haproxy.log#如果不加下面的的配置则除了在/var/log/haproxy.log中写入日志外

2.balance source根据原ip,经过hash计算后,指定后端固定的rs

④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法

backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块

7、HAProxy的负载均衡算法现在也越来越多了,具体有如下8种:

#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能

5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL
slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。

SYSLOGD_OPTIONS=”-c2-r-m0″

cookie SERVERID insert indirect nocache#插入session信息

option httpchk HEAD / HTTP/1.0

2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作

1.在client增加cookie

2.编辑系统日志配置 

option httpchk HEAD / HTTP/1.0

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:”tcp”也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式
下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者***请求
(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。(新版本引入了frontend,backend指令;frontend根据任意
HTTP请求头内容做规则匹配,然后把请求定向到相关的backend.)

log127.0.0.1local3         #local3是设备,对应于
/etc/rsyslog.conf中的配置,默认回收info的日志级别

haproxy在默认情况不会记录日志,除了在haproxy.conf中的global段指定日志的输出外,还需要配置系统日志的配置文件

⑥rl_param,表示根据请求的URl参数’balance url_param’ requires an URL
parameter name;

3、支持url检测后端的服务器出问题的检测会有很好的帮助。