利用HAProxy代理hadoop集群对外服务并做负载均衡

需求

在企业级hadoop集群使用过程中有时需要外部网络来访问hadoop内部网络,比如外部网络访问hdfs中文件,但是根据hdfs文件访问流程知道客户端并不直接从namenode获取数据,而是通过namenode查询到数据位置后,返回给客户端一个datanode地址供客户端与datanode建立通信,这时问题就来了,namenode返回的地址为hadoop内部地址,外部网络无法访问,此时客户端怎么获取到数据呢?

因此我们在hadoop集群内部构建一台接口机,使其能被外部网络和内部网络访问,在此接口上部署httpfs服务(部署方式这里略去),用haproxy代理httpfs服务地址,这样就能使外部网络访问hdfs,同样的道理我们可以代理hiveserver,hbase rest api,以及impala服务等等,haproxy作为了连通内部与外部网络的桥梁.不光如此,在企业级集群中hiveserver可能几十上百个,Impala Daemon也可能几十上百个甚至更多,为了保证每个机子能够均匀的处理业务,我们需要对他们做负载均衡,而这些HAProxy也能做到.

HAProxy安装

源码编译安装

安装GCC组件

sudo yum -y install gcc*

安装ssl

sudo yum -y install openssl-devel pcre-devel

下载HAProxy

解压到指定目录

1
2
3
tar -zxvf haproxy-1.6.6.tar.gz
cd haproxy-1.6.6

编译HAProxy

1
2
3
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1
make install

./haproxy -vv 查看是否安装成功

rpm包安装

haproxy rpm资源地址:http://www.rpmfind.net/linux/rpm2html/search.php?query=haproxy
下载后按照rpm方式安装
配置文件会默认安装在/etc/haproxy/haproxy.cfg,按照下面的流程修改配置文件(这种方式不需要在haproxy主目录下新建配置文件)
查看是否安装成功:haproxy -vv
启动方式:service haproxy start

配置HAProxy

配置参数说明

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
####################全局配置信息########################
#######参数是进程级的,通常和操作系统(OS)相关#########
global
maxconn 20480 #默认最大连接数
log 127.0.0.1 local3 #[err warning info debug]
chroot /var/haproxy #chroot运行的路径
uid 99 #所属运行的用户uid
gid 99 #所属运行的用户组
daemon #以后台形式运行haproxy
nbproc 1 #进程数量(可以设置多个进程提高性能)
pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
ulimit-n 65535 #ulimit的数量限制
#####################默认的全局设置######################
##这些参数可以被利用配置到frontend,backend,listen组件##
defaults
log global
mode http #所处理的类别 (#7层 http;4层tcp )
maxconn 20480 #最大连接数
option httplog #日志类别http日志格式
option httpclose #每次请求完毕后主动关闭http通道
option dontlognull #不记录健康检查的日志信息
option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
stats refresh 30 #统计页面刷新间隔
retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置
balance roundrobin #默认的负载均衡的方式,轮询方式
#balance source #默认的负载均衡的方式,类似nginx的ip_hash
#balance leastconn #默认的负载均衡的方式,最小连接
contimeout 5000 #连接超时
clitimeout 50000 #客户端超时
srvtimeout 50000 #服务器超时
timeout check 2000 #心跳检测超时
####################监控页面的设置#######################
listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:65532 #监听端口
mode http #http的7层模式
log 127.0.0.1 local3 err #错误日志记录
stats refresh 5s #每隔5秒自动刷新监控页面
stats uri /admin?stats #监控页面的url
stats realm itnihao\ itnihao #监控页面的提示信息
stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名
stats auth admin1:admin1 #监控页面的用户和密码admin1
stats hide-version #隐藏统计页面上的HAproxy版本信息
stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http
#################HAProxy的日志记录内容设置###################
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
#######################网站监测listen配置#####################
###########此用法主要是监控haproxy后端服务器的监控状态############
listen site_status
bind 0.0.0.0:1081 #监听端口
mode http #http的7层模式
log 127.0.0.1 local3 err #[err warning info debug]
monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
acl site_dead nbsrv(server_blog) lt 2
acl site_dead nbsrv(server_bbs) lt 2
monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503
monitor-net 192.168.16.2/32 #来自192.168.16.2的日志信息不会被记录和转发
monitor-net 192.168.16.3/32
########frontend配置############
#####注意,frontend配置里面可以定义多个acl进行匹配操作########
frontend http_80_in
bind 0.0.0.0:80 #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
mode http #http的7层模式
log global #应用全局的日志配置
option httplog #启用http的log
option httpclose #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP
########acl策略配置#############
acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$
#如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写
acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
#如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写
#acl itnihao hdr(host) -i itnihao.cn
#如果请求的域名满足itnihao.cn返回true -i是忽略大小写
#acl file_req url_sub -i killall=
#在请求url中包含killall=,则此控制策略返回true,否则为false
#acl dir_req url_dir -i allow
#在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false
#acl missing_cl hdr_cnt(Content-length) eq 0
#当请求的header中Content-length等于0时返回true
########acl策略匹配相应#############
#block if missing_cl
#当请求中header中Content-length等于0阻止请求返回403
#block if !file_req || dir_req
#block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求
use_backend server_web if itnihao_web
#当满足itnihao_web的策略时使用server_web的backend
use_backend server_blog if itnihao_blog
#当满足itnihao_blog的策略时使用server_blog的backend
#redirect prefix http://blog.itniaho.cn code 301 if itnihao
#当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3
default_backend server_bbs
#以上都不满足的时候使用默认server_bbs的backend
##########backend的设置##############
#下面我将设置三组服务器 server_web,server_blog,server_bbs
##################backend server_web####################
backend server_web
mode http #http的7层模式
balance roundrobin #负载均衡的方式,roundrobin平均方式
cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义
option httpchk GET /index.html #心跳检测的文件
server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1
#服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,
#fall 33次失败认为服务器不可用,weight代表权重
server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
#服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,
#fall 33次失败认为服务器不可用,weight代表权重
###################backend server_blog######################
backend server_blog
mode http #http的7层模式
balance roundrobin #负载均衡的方式,roundrobin平均方式
cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义
option httpchk GET /index.html #心跳检测的文件
server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1
#服务器定义,cookie 1表示serverid为blog1,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,fall 33次失败认为服务器不可用,weight代表权重
server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2
#服务器定义,cookie 1表示serverid为blog2,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,fall 33次失败认为服务器不可用,weight代表权重
##################backend server_bbs########################
backend server_bbs
mode http #http的7层模式
balance roundrobin #负载均衡的方式,roundrobin平均方式
cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义
option httpchk GET /index.html #心跳检测的文件
server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1
#服务器定义,cookie 1表示serverid为bbs1,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,fall 33次失败认为服务器不可用,weight代表权重
server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
#服务器定义,cookie 1表示serverid为bbs2,check inter 1500是检测心跳频率rise 33次正确认为服务器可用,fall 33次失败认为服务器不可用,weight代表权重

配置样例

在HAProxy主目录下新建一个config.cfg文件 配置以下:

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
global
daemon
nbproc 1
defaults
mode tcp #mode { tcp|http|health },tcp 表示4层,http表示7层,health仅作为健康检查使用
retries 2 #尝试2次失败则从集群摘除
option redispatch #如果失效则强制转换其他服务器
option abortonclose #连接数过大自动关闭
maxconn 2048 #最大连接数
timeout connect 1d #连接超时时间,重要,hive查询数据能返回结果的保证
timeout client 1d #同上
timeout server 1d #同上
timeout check 2000 #健康检查时间
log 127.0.0.1 local0 err #[err warning info debug]
listen admin_stats #定义管理界面
bind 192.168.1.200:10900 #管理界面访问IP和端口
mode http #管理界面所使用的协议
maxconn 25 #最大连接数
stats refresh 30s #30秒自动刷新
stats uri /hivestate #访问url
stats realm Hive\ Haproxy #验证窗口提示
stats auth admin:123456 #401验证用户名密码
listen hive #hive后端定义
bind 0.0.0.0:10001 #ha作为proxy所绑定的IP和端口
mode tcp #以4层方式代理,重要
balance roundrobin #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分配
maxconn 1024 #最大连接数
server hive_1 192.168.1.200:10000 check inter 180000 rise 1 fall 2
server hive_2 192.168.1.202:10000 check inter 180000 rise 1 fall 2
server hive_3 192.168.1.203:10000 check inter 180000 rise 1 fall 2
server hive_4 192.168.1.204:10000 check inter 180000 rise 1 fall 2
释义:server 主机代名(web页面会显示区分),IP:端口 每180000毫秒检查一次。也就是三分钟.hive每有10000端口的请求就会创建一个log,设置短了,/tmp下面会有无数个log文件,删不完。
listen httpfs
bind 192.168.1.200:14001
mode tcp
balance roundrobin
maxconn 1024
server hdfs_1 192.168.1.200:14000 check inter 180000 rise 1 fall 2

从上面可以得出:
web管理页面地址:192.168.1.200:10900/hivestate,用户名:admin,密码:123456
对外统一hiveserver2接口:192.168.1.200:10001
对外统一httpfs接口:192.168.1.200:14001
上面配置了hiveserver和httpfs的代理,其余服务与这个类似

启动HAProxy

在HAProxy主目录下:
./haproxy -f config.cfg #config.cfg即是刚刚新建的HAProxy配置文件

访问web页面查看监控信息:
如果能正确显示信息则配置正确

监测页面参数项说明

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
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests //最大的队列请求数量
Limit: //队列限制数量
Session rate(每秒的连接回话)列表:
scur: current sessions //每秒的当前回话的限制数量
smax: max sessions //每秒的新的最大的回话量
slim: sessions limit //每秒的新回话的限制数量
Sessions
Total: //总共回话量
Cur: //当前的回话
Max: //最大回话
Limit: //回话限制
Lbtot: total number of times a server was selected //选中一台服务器所用的总时间
Bytes
In: //网络的字节数输入总量
Out: //网络的字节数输出总量
Denied
Req: denied requests//拒绝请求量
Resp:denied responses //拒绝回应
Errors
Req:request errors //错误请求
Conn:connection errors //错误的连接
Resp: response errors (among which srv_abrt) ///错误的回应
Warnings
Retr: retries (warning) //重新尝试
Redis:redispatches (warning) //再次发送
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk: 持续检查后端服务器的时间
Wght: (weight) : 权重
Act: server is active (server), number of active servers (backend) //活动链接数量
Bck: server is backup (server), number of backup servers (backend) //backup:备份的服务器数量
Down: //后端服务器连接后都是down的数量
Downtime: downtime: total downtime (in seconds) //总的downtime 时间
Throttle: warm up status //设备变热状态