【帆软FR】nginx实现报表读写分离

回帖奖励 240 个F豆      回复本帖可获得 20 个F豆奖励! 每人限 1 次
楼主
分享常见解决方案,仅供个人参考使用!
一、背景
  • 经常出现导入大数量时一个单节点CPU升高,导致整个系统查询慢;
  • 进行大数据量填报时,填报涉及二次计算的时CPU也会升高,这个时候再做其他的操作就会出现卡的现象。对此,使用nginx读写分离的方式,将填报提交走一个节点,预览查询走另外一个节点来避免出现一台节点压力过大的情况,根据实际情况可以调整节点的权重。
二、实现思路
将报表填报和预览分别在不同节点上面实现,实现读写分离的效果;nginx里面使用$request_method = "POST"判断是否是post请求,如果是post请求设置请求的节点,如果不是post走另外一个节点;

upstream 里面配置正常请求的节点,与post请求节点分开使用。
  1. <span data-offset-key="8t0fo-0-0"><span data-text="true"> if ($request_method = "POST"){
  2.                   proxy_pass http:</span></span><span data-offset-key="8t0fo-0-1" style="font-style: italic;"><span data-text="true">//122.9.83.61:8080;</span></span><span data-offset-key="8t0fo-0-2"><span data-text="true">
  3.              }</span></span>
复制代码

三、操作步骤
3.1 搭建好集群之后单独对nginx进行如下配置:nginx具体配置如下:
  1. <span data-offset-key="ebo2v-0-0"><span data-text="true">#用户或者用户组 默认为nobody
  2. #user  root;
  3. worker_processes  auto;
  4. error_log  logs/error.log;

  5. events {
  6.     #每个worker_processes的最大连接数,Windows服务器无论这里设置多大实际都只有1024
  7.     #并发数是 worker_processes 和 worker_connections 的乘积
  8.     worker_connections  1024;
  9. }
  10. http {
  11.     #设定mime类型,类型由mime.type文件定义
  12.     include       mime.types;
  13.     #默认文件类型,默认为text/plain
  14.     default_type  application/octet-stream;
  15.     #日志格式
  16.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  17. '$status $body_bytes_sent "$http_referer" '
  18. '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr';
  19.     #access_log确定了Nginx是否保存访问日志,将这个设置为关闭可以降低磁盘IO而提升速度
  20.     access_log  off;
  21.     #access_log  logs/access.log  main;
  22.     #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
  23.     #对于普通应用,必须设为 on,
  24.     #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
  25.     #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  26.     sendfile        on;
  27.     #tcp_nopush     on;
  28.     #http长连接(client <-> nginx)超时时间,请求完成之后连接保持的时间
  29.     keepalive_timeout  65s;
  30.     #types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升
  31.     types_hash_max_size 2048;
  32.     #开启gzip压缩
  33.     #gzip  on;
  34.     #gzip_disable "MSIE [1-6].";
  35.     #设定请求缓冲
  36.     client_header_buffer_size    512k;
  37.     large_client_header_buffers  4 512k;
  38.     #允许用户最大上传数据大小,根据业务需求调整上传文件大小限制
  39.     client_max_body_size 100M;

  40.     upstream FR.com {     
  41.         server 122.9.83.61:8081 max_fails=15 fail_timeout=300s;
  42.         #server 122.9.83.61:8080 max_fails=15 fail_timeout=300s;
  43.         keepalive 300;
  44.         #其它server参数说明:
  45.         #down 标记服务器挂掉
  46.         #backup 备份服务器,当主服务器(例如上面的95和96)不可用时才加入服务器;
  47.         #weight=number 权重,默认为1
  48.         #内置负载均衡策略有ip hash、轮询、加权轮询(设置server的weight值)
  49.         #ip_hash;
  50.                #↓====================主动健康检查模块配置====================↓#
  51.         ## interval:向后端发送的健康检查包的间隔,单位ms。
  52.         ## fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down
  53.         ## rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
  54.         ## timeout: 后端健康请求的超时时间,单位ms。
  55.         ## type:健康检查包的类型,现在支持tcp、udp、http类型
  56.         #check interval=2000 rise=5 fall=10 timeout=10000 type=http;
  57.         # 检查请求, 7-16之前的persist版本,只能使用 /webroot/decision/system/info HTTP;
  58.         #check_http_send "GET /webroot/decision/system/health HTTP/1.0\r\n\r\n"; # 检查请求
  59.         #check_http_expect_alive http_2xx http_3xx; #该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。
  60.         #↑====================主动健康检查模块配置====================↑#
  61.     }
  62.     upstream WBS.com {
  63.         server 122.9.83.61:38888 max_fails=15 fail_timeout=300s;
  64.         server 122.9.83.61:38888 max_fails=15 fail_timeout=300s;
  65.         #这里必须使用ip_hash
  66.     ip_hash;
  67.     }

  68.     server {
  69.         listen       80;
  70.         server_name  122.9.83.61;
  71.         #nginx默认不转发带下划线的header,比如请求的header中有_device_这个header,转发到负载服务器时默认会丢弃
  72.         #可以在http或者http -> server这两个上下文中加入一条属性
  73.         underscores_in_headers on;

  74.         location / {
  75.             #对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空(如下proxy_set_header Connection "")
  76.             proxy_http_version 1.1;
  77.             #定义转发到的服务器(组)
  78.             proxy_pass http:</span></span><span data-offset-key="ebo2v-0-1" style="font-style: italic;"><span data-text="true">//FR.com;</span></span><span data-offset-key="ebo2v-0-2"><span data-text="true">
  79.             #设置nginx转发时转发到下一个服务器的条件,此处设置将未成功请求(proxy_next_upstream定义的40x, 50x等)传递到下一步进行处理
  80.             # 失败尝试说明:50x和429在此配置会被当作fail,error,timeout并 invalid_header无论配置与否都被认为fail,http_403 and http_404配置与否都不是fail。
  81.             # error:与后端服务器建立连接、传递请求、读取请求头发生的错误
  82.             # timeout:与后端服务器建立连接、传递请求、读取请求头超时,设置在proxy_next_upstream_timeout和proxy_next_upstream_tries(默认值都是0)
  83.             # invalid_header:服务器返回非法或者为空
  84.             proxy_next_upstream http_500 http_502 http_503 http_504 http_403 http_404 http_429 error timeout invalid_header non_idempotent;
  85.             proxy_redirect off;
  86.             #请求头的一些设置,语法proxy_set_header [field] [value];
  87.             #$host为请求的主机名称(即nginx代理服务器), $server_port为主机端口(即nginx端口),如果有外网映射,这里应改写 外网地址:外网端口 形式(不要带协议)
  88.             proxy_set_header Host $host:$server_port;
  89.             #这里$remote_addr客户端ip地址
  90.             proxy_set_header X-Real-IP $remote_addr;
  91.             #这里$proxy_add_x_forwarded_for是代理层级,如果由多层代理,这里就写client,proxy1,proxy2,这里应该是client即客户端ip
  92.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  93.             #与后端服务器的连接不需要保持
  94.         proxy_set_header Connection "";
  95.             #NGINX会缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。
  96.             proxy_connect_timeout    75;
  97.             #读取超时,默认60s,如果在超时时间内服务器未返回任何数据,视为超时。如果没有大数据量计算或导出的模板,则建议配置不超过100s,如果有大数据量计算或导出的模板,则根据最长耗时的模板时间进行配置。
  98.             proxy_read_timeout       400;
  99.             #写入超时,默认60s,如果在超时时间内服务器未收到数据表示超时,视为超时。如果没有大数据量计算或导出的模板,则建议配置不超过100s,如果有大数据量计算或导出的模板,则根据最长耗时的模板时间进行配置。
  100.             proxy_send_timeout       400;
  101.             add_header backendIP $upstream_addr;
  102.             add_header backendCode $upstream_status;
  103. if ($request_method = "POST"){
  104.                         proxy_pass http:</span></span><span data-offset-key="ebo2v-0-3" style="font-style: italic;"><span data-text="true">//122.9.83.61:8080;</span></span><span data-offset-key="ebo2v-0-4"><span data-text="true">
  105.              }

  106.         }
  107.         #定义404页面
  108.         #error_page  404              /404.html;
  109.         # redirect server error pages to the static page /50x.html
  110.         #定义50x页面
  111.         error_page   500 502 503 504  /50x.html;
  112.         location = /50x.html {
  113.             root   html;
  114.         }
  115.     }
  116.     server {  
  117.         #此处为websocket端口,如果是集群部署,FineReport工程为38889,FineBI工程为48889
  118.         listen 38889;              
  119.     server_name localhost;
  120.         location / {
  121.              proxy_http_version 1.1;
  122.              proxy_pass http:</span></span><span data-offset-key="ebo2v-0-5" style="font-style: italic;"><span data-text="true">//WBS.com;</span></span><span data-offset-key="ebo2v-0-6"><span data-text="true">
  123.              proxy_connect_timeout 75;
  124.              proxy_read_timeout 400;
  125.              proxy_send_timeout 400;

  126.              #升级目标为$http_upgrade 值实际为websocket
  127.      proxy_set_header Upgrade $http_upgrade;
  128.              #Connection设置升级
  129.      proxy_set_header Connection "upgrade";
  130.              }
  131.         }
  132. }</span></span>
复制代码

四、效果查看
  • 如下所示是预览的时候走的get请求,走的是8081节点;
在nginx里面加入如下配置,能够在前端看到请求的地址;
  1. add_header backendIP $upstream_addr;
  2. add_header backendCode $upstream_status;
复制代码






2.如下是post请求走的是8080节点



编辑于 2021-6-15 20:32  
编辑于 2021-6-17 09:11  
分享扩散:

沙发
发表于 2021-6-16 15:02:25

回帖奖励 +5 个F豆


优秀
板凳
发表于 2021-6-17 09:41:21

回帖奖励 +20 个F豆

学习了
地板
发表于 2021-6-19 09:18:26

回帖奖励 +20 个F豆

学习学习
5楼
发表于 2021-6-19 09:25:06

回帖奖励 +20 个F豆

思路清奇!给力,向大佬学习。
6楼
发表于 2021-6-19 16:13:59

回帖奖励 +20 个F豆

思路清奇!给力,向大佬学习。
7楼
发表于 2021-6-21 07:57:41

回帖奖励 +20 个F豆

8楼
发表于 2021-6-21 09:26:13

回帖奖励 +20 个F豆

9楼
发表于 2021-6-22 12:38:23

回帖奖励 +20 个F豆

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

8回帖数 10关注人数 6130浏览人数
最后回复于:2021-6-22 12:38

返回顶部 返回列表