6、集群的负载均衡

编辑
文档创建者:youdunhou (管理员 )     浏览次数:1565次     编辑次数:7次     最近更新:youdunhou 于 2017-07-06     

目录:

1、描述编辑

在FineBI集群中,负载均衡是必不可少的。负载均衡实现了并发数的分流从而有效的实现减少单机服务器的压力,使高并发的情况下集群整体依然能够拥有较好的性能。同时负载均衡后的集群具有一定的容错率,当某一单机服务器down掉后,负载均衡使用分发机制将其分配到其他正在运行的服务器上,继续操作。下文详述FineBI的负载均衡。

2、FineBI的负载均衡编辑

FineBI本身是运行在服务器上的web工程,是一款数据分析平台,是在线的可操作的分析平台,存在非常多的交互操作,同时FineBI也是管理平台,存在着不同的用户和权限控制。因此负载均衡首先要考虑很重要的问题是session沾滞的问题。
2.1、session简介
首先谈一下session的问题。session是怎么来的呢?因为http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总比如FineBI的登录后,要建立数据链节,要添加数据、添加分析模板,不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来。session可以理为用户访问的一个过程。当用户访问服务器端的时候,服务器建立了一个访问过程(我们通常叫会话),并用一个ID来标识,在这个会话中,用户访问服务器的用户信息会被记录起来,可能是记在内存中,也可以是文件,同时服务器会发放给用户一个key,来标识与这个会话是一一对应,每一次访问,用户带着key进入服务器,服务器就能识别你来过,并通过key与ID的对应来识别用户信息,你的操作就可以一直继续,不需要再进行重新登录,而这里的key即是我们常提到的cookie,ID即是sessionID。
2.2、集群中的session沾滞
在集群中,以服务器A与服务器B为例,用户访问服务器由负载转发到服务器A上,登录上,点击某一些操作,向台再次发送访问请求,负载转发到服务器B上,用户拿着服务器A发给他的cookie去找对应的sessionID,当然就找不到,这个时候,用户还是再次需要去登录。因此session是完全失效。那么这个时候要使session依然有效,那么就要解决sessionID的问题。这就是session沾滞的基本问题。因此无论什么样的负载均衡都要考虑到处理这个问题。

2、FineBI负载均衡示例--nginx编辑

nginx是一款轻量级的反向代理服务器;其轻量级,同样的web 服务,可以占用更少的内存及资源 ;nginx 处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低消耗高性能。可以说是这些年负载均衡的新宠,本文以nginx为示例作为FineBI集群的负载均衡。
2.1nginx安装
*以Centos6.5为示例
此处安装以源码编绎安装。
首先判断有没有gcc编译器;再判断有没有以下三种库:
1.gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )
2.rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )
3.ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )
注:使用编译安装linux里一定要有gcc编译器。
使用命令:whereis ***来判断。
如果没有则需要安装。
安装内容如下:
(1)安装pcre库
cd /usr/local/ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz tar -zxvf pcre-8.21.tar.gz cd pcre-8.21 ./configure make make install


222
如果出现如上报错,则需要安装gcc-c++。yum install -y gcc gcc-c++
(2)安装zlib库
cd /usr/local/ wget http://zlib.net/zlib-1.2.8.tar.gz tar -zxvf zlib-1.2.8.tar.gz cd zlib-1.2.8 ./configure make make install

(3)安装openssl库

cd /usr/local/ wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz tar -zxvf openssl-1.0.1c.tar.gz cd openssl-1.0.1 ./config make make install
(4)安装nignx
Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:
cd /usr/local/ tar -zxvf nginx-1.11.10.tar.gz cd nginx-1.11.10 ./configure --prefix=/usr/local/nginx make make install
安装完毕后,进入/usr/local/nginx下可以看到以下四个文件:
222
conf    nginx默认配置文件存放目录
html  nginx 默认的网站根目录
logs  nginx默认日志文件目录
sbin   nginx默认可执行文件目录
2.2nginx测试

nginx的启动文件在sbin文件下。此处切换目录到sbin下。

# cd /usr/local/nginx/sbin

执行启动命令:./nginx即可。

启动后是没有反馈信息输出。可以查看nginx进程:

# ps -ef|grep nginx


222
此处说明,启动正确。

如果出现nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied),则是说明nginx的默认80端口被占用,此时可以通过修改配置文件,修改端口,再次启动。配置文件在/usr/local/nginx/conf下的nginx.conf。

# vim nginx.conf

查找到如图所示位置,修改端口号:
222

修改完成后,重启nignx即可。重启命令:

# /usr/local/nginx/sbin/nginx -s reload 

2.3nginx的配置
1、配置代理服务器文件 proxy.conf

在Nginx应用中我们要使用其作为反向代理服务器,相关的一些参数要先设置好,在Nginx文件下的conf文件夹里面,新建proxy.conf文件:

# vim proxy.conf

添加以下内容:

proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_body_buffer_size 90; proxy_connect_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;

下面是在nginx.conf配置文件中添加负载均衡的内容和规则。此处使用ip_hash算法进行转法。

ip_hash是nginx中的轮询算法。它执行的是将每个访问的ip赋一个hash值,相同的hash值会发到同一个服务器,以确保同一个Ip访问的是同一个服务器。在nginx.conf文件的http{}里写upstreem编辑以下内容:

upstream lb {#这里是负载均衡的配置 server 192.168.189.128:37799 fail_timeout=20s; #服务器1的地址 server 192.168.189.129:37799 fail_timeout=20s; #服务器2的地址 hash $remote_addr consistent; #当前负载方式是,同一个session转发到同一台机器 } server {#nginx的配置 listen 80; #监听端口 server_name 192.168.189.128 #nginx的地址 index index.html index.htm index.php; location / { #"/"的意思是转发全部链接 proxy_pass http://lb; #转发到上面配置的负载均衡lb上, proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; include proxy.conf; #这里加载上面配置的proxy文件 } } 
3、ip_hash的注意点

1) nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。  

2)nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。

4、登录方式

通过这种nginx负载,我们就通过nginx的地址及端口访问即可。如上案例则是通过192.168.189.128:80/WebReport/ReportServer?op=fs访问。

附件列表


主题: 部署集成
标签: 暂无标签 编辑/添加标签
如果您认为本文档还有待完善,请编辑

文档内容仅供参考,如果你需要获取更多帮助,请咨询帆软技术支持
关于技术问题,您还可以通过帆软论坛获取帮助,论坛上有非常多的大神,有些水平比帆软工程师还要高哦。
若您还有其他非技术类问题,可以联系帆软传说哥(微信ID:frbiaoge)

本文档是否有用?
谢谢! 我们非常感谢您的反馈。
提交反馈: