Mycat部署文档之Haproxy

Haproxy

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

安装依赖包

依赖gcc和make安装包

sudo apt-get build-dep gcc

安装完了可以执行如下的命令来查看版本,

gcc –version

安装make安装包

sudo apt install ubuntu-make

下载

1
2
3
[root@haproxy-server-master ~]# cd /home/dxy/temp/
[root@haproxy-server-master src]# wget http://pkgs.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.7.9.tar.gz/sha512/d1ed791bc9607dbeabcfc6a1853cf258e28b3a079923b63d3bf97504dd59e64a5f5f44f9da968c23c12b4279e8d45ff3bd39418942ca6f00d9d548c9a0ccfd73/haproxy-1.7.9.tar.gz
[root@haproxy-server-master src]# tar -xvf haproxy-1.7.9.tar.gz

安装

1
2
3
4
5
[root@haproxy-server-master src]# cd haproxy-1.7.9
[root@haproxy-server-master haproxy-1.7.9]# uname -r
3.10.0-514.el7.x86_64
[root@haproxy-server-master haproxy-1.7.9]# make TARGET=linux2628 ARCH=x86_64 PREFIX=/home/dxy/haproxy
[root@haproxy-server-master haproxy-1.7.9]# make install PREFIX=/home/dxy/haproxy

参数说明:

  • TARGET=linux310,内核版本,使用uname -r查看内核,如:3.10.0-514.el7,此时该参数就为linux310;kernel 大于2.6.28的可以用:TARGET=linux2628;
  • ARCH=x86_64,系统位数;
  • PREFIX=/home/dxy/haproxy #/home/dxy/haproxy,为haprpxy安装路径。

配置文件

1.79及以后的版本解压后文件内就没有haproxy.cfg文件,所以需要我们自己找个模板写一下。

由于没有配置其他的服务器,这里就简单的添加一个可以让Haproxy启动的配置。

haproxy 配置中分成五部分内容,分别如下:

  • global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改;
  • defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
  • frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
  • backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
  • Listen Fronted和backend的组合体。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
[root@haproxy-server-master haproxy]# mkdir conf
[root@haproxy-server-master haproxy]# ls
conf doc sbin share
[root@haproxy-server-master haproxy]# cd conf/
[root@haproxy-server-master conf]# vim haproxy.cfg

global # 全局参数的设置
log 127.0.0.1 local0 info
# log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
user haproxy
group haproxy
# 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之
daemon
# 以守护进程的方式运行
nbproc 16
# 设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。这里我设置为16
maxconn 4096
# 定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
#ulimit -n 65536
# 设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置
pidfile /var/run/haproxy.pid
# 定义haproxy的pid
defaults # 默认部分的定义
mode http
# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
log 127.0.0.1 local3 err
# 使用127.0.0.1上的syslog服务的local3设备记录错误信息
retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
option httplog
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
option abortonclose
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option httpclose
# 这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
contimeout 5000
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容
clitimeout 3000
# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容
srvtimeout 3000
# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容

listen status # 定义一个名为status的部分
bind 0.0.0.0:1080
# 定义监听的套接字
mode http
# 定义为HTTP模式
log global
# 继承global中log的定义
stats refresh 30s
# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
stats uri /admin?stats
# 设置统计页面的uri为/admin?stats
stats realm Private lands
# 设置统计页面认证时的提示内容
stats auth admin:password
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
# 隐藏统计页面上的haproxy版本信息
## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用

listen mycat_servers
bind :3306 ## 绑定端口
mode tcp
option tcplog ## 记录TCP请求日志
option tcpka ##是否允许向server和client发送keepalive
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 后端服务状态检测
### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求
### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用.
### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。
balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式
server mycat_01 192.168.1.203:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
server mycat_02 192.168.1.204:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
## 格式:server
### serser 在后端声明一个server,只能用于listen和backend区段
###为此服务器指定的内部名称,其将会出现在日志及警告信息中
###此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址
### [:[port]]指定将客户端连接请求发往此服务器时的目标端口,此为可选项
### [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:
#### weight:权重,默认为1,最大值为256,0表示不参与负载均衡
#### backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server
#### check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定
#### inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000,
##### 也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟
#### rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2)
#### fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3)
#### cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,
##### 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久连接的功能
#### maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,
#####其将被放置于请求队列,以等待其他连接被释放

Mycat状态监测

安装xinetd组件,用于开放监听端口

sudo apt-get install xinetd

在Mycat server1 Mycat server2上都需要添加检测端口48700的脚本,为此需要用到xinetd
首先在xinetd目录下面增加脚本与端口的映射配置文件

vim /etc/xinetd.d/mycat_status

1
2
3
4
5
6
7
8
9
10
11
service mycat_status
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = nobody
server = /home/dxy/mycat/bin/mycat_status.sh
log_on_failure += USERID
disable = no
}

注意:mycat_status检测脚本已经平台已经打包在安装包里面了的,由于里面用到了source,ubuntu请参考http://www.linuxdiyf.com/linux/22530.html解决。

增加service端口映射

1
2
3
vim /etc/services
# Local services
mycat_status 48700/tcp

重启xinetd

1
service xinetd restart

启动haproxy

1
[root@haproxy-server-master conf]# /home/dxy/haproxy/sbin/haproxy -f /home/dxy/haproxy/conf/haproxy.cfg

验证一下是否启动成功:

1
2
3
[root@haproxy-server-master conf]# lsof -i :1080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy 2221 root 3u IPv4 20285 0t0 TCP *:socks (LISTEN)

haproxy管理平台

地址:http://127.0.0.1:1080/admin?stats

  • haproxy记录日志(可选)

    默认 haproxy 是不记录日志的,为了记录日志需要配置 syslog 模块,在 linux 下是 rsyslogd 服务。
  1. 先安装 rsyslog(系统应该都安装了,先查看一下)
    1
    sudo apt install rsyslog
  2. 添加haproxy的日志配置

    vim /etc/rsyslog.d/haproxy.conf

    1
    2
    3
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /home/dxy/haproxy/logs/haproxy.log
    日志的level: local0~local7 16~23保留为本地使用
  • 0 debug 有调式信息的,日志信息最多
  • 1 info 一般信息的日志,最常用
  • 2 notice 最具有重要性的普通条件的信息
  • 3 warning 警告级别
  • 4 err 错误级别,阻止某个功能或者模块不能正常工作的信息
  • 5 crit 严重级别,阻止整个系统或者整个软件不能正常工作的信息
  • 6 alert 需要立刻修改的信息
  • 7 emerg 内核崩溃等严重信息
  1. 修改 /etc/rsyslog.conf 文件

    在#### RULES ####上面一行的地方加入以下内容(文件里应该默认有这个配置,可以看一下):

    1
    2
    3
    4
    [root@haproxy-server-master /]# vim /etc/rsyslog.conf

    # Include all config files in /etc/rsyslog.d/
    $IncludeConfig /etc/rsyslog.d/*.conf
  2. 修改 /etc/sysconfig/rsyslog 文件
    1
    2
    3
    [root@haproxy-server-master /]# vim /etc/default/rsyslog

    SYSLOGD_OPTIONS="-r -m 0 -c 2"
    相关解释说明:
  • -r:打开接受外来日志消息的功能,其监控514 UDP端口;
  • -x:关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦;
  • -m:修改syslog的内部mark消息写入间隔时间(0为关闭),例如240为每隔240分钟写入一次”–MARK–”信息;
  • -h:默认情况下,syslog不会发送从远端接受过来的消息到其他主机,而使用该选项,则把该开关打开,所有 接受到的信息都可根据syslog.conf中定义的@主机转发过去。
保存,重启 rsyslog 服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@haproxy-server-master /]# systemctl restart rsyslog.service
[root@haproxy-server-master /]# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2017-11-27 10:51:26 CST; 11s ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 3855 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─3855 /usr/sbin/rsyslogd -n

11月 27 10:51:26 haproxy-server-master systemd[1]: Starting System Logging Service...
11月 27 10:51:26 haproxy-server-master rsyslogd[3855]: [origin software="rsyslogd" swVersion="8.24.0" x-pid="38...tart
11月 27 10:51:26 haproxy-server-master systemd[1]: Started System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.

现在你就可以看到日志(/home/dxy/haproxy/logs/haproxy.log)了(如果没有,重启一下Haproxy)。