6

不只是负载均衡,活字格智能集群的架构与搭建方案 - 葡萄城技术团队

 2 years ago
source link: https://www.cnblogs.com/powertoolsteam/p/16877551.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

还在单机服务器,时刻面临宕机风险吗?

优化程度不够,响应速度缓慢,系统工作响应像老汉拉车吗?

为了帮助大家具备企业级应用的部署能力,轻松应对核心业务系统的部署要求,我们准备了《活字格智能集群的架构与搭建方案》高级教程。

作为一款优秀的企业级低代码开发平台,活字格除了本身开发集成的强大功能之外,负载均衡的能力依旧手到擒来。如果你需要解决如下的问题,可以考虑搭建一套活字格智能集群:

  • 提升系统可用性,避免因单台服务器宕机导致系统服务中断
  • 在做好各项性能优化(参考系列教程)的前提下,需要进一步提升性能,以满足大并发量请求的响应速度

完美解决以上问题,看这一篇就够啦。

139239-20221110162841214-233021127.png

集群能力

活字格智能集群是我们官方提供的一套负载均衡解决方案,在传统的负载均衡集群提供的高可用性、高性能等优势的基础上,通过应用和配置的智能自动分发机制,进一步降低了集群的运维工作量,本方案提供的主要能力如下:

  • 较高可用性(包含应用服务器的故障转出和故障迁回)
  • 可用性监控

特别提示:活字格智能集群不兼容内建SQLite数据库,您需要在外联数据库上构建数据表和业务。

搭建方案

我们都知道活字格的功能有多强大,搭建活字格智能集群需要用到Linux、nginx、Redis、GlusterFS、MySQL/MariaDB/MSSQL(您可以在PostgreSQL、Oracle等数据库上开发业务功能,但仍需要使用这几款数据库来存储用户信息,支持的具体版本可参考活字格的环境要求,本教程以mysql为例)。在监控服务方面,局域网项目可采用Zabbix,互联网项目则推荐采用云服务商提供的监控服务(本教程以阿里云的云监控为例)。对上述技术的了解程度,很大程度上决定了您搭建出的集群的安全性、性能和可用性。

角色一览

  • 应用服务器:运行活字格应用,推荐安装在Linux(示例版本:Ubuntu 18.04,下同)上的活字格服务器管理器(示例版本:V8.0.4.0)
  • 反向代理服务:实现负载均衡等分发策略,安装在Linux上的nginx(示例版本:1.14)

l 文件服务:存放活字格应用、用户上传文件等集群所需的文件,需要在多个应用服务器间共享,推荐安装在Linux上的GlusterFS(示例版本:3.13,2个节点)

  • 用户信息数据库:存放用户、角色、权限等基础数据,推荐安装在Linux上的MySQL(示例版本:5.7)
  • 业务数据库:存放活字格应用所使用的业务数据,推荐安装在Linux上的MySQL(示例版本:5.7)
  • 缓存和分发数据库:存放Session会话数据,提供应用和配置同步所需的消息,推荐安装在Linux上的redis(示例版本:4.9)
  • 监控服务:确保第一时间能够发现服务器的故障,推荐阿里云的云监控服务

网络拓扑简图

活字格智能集群需要用到最少2台应用服务器,至少1台支持服务器(推荐视情况,将支持服务器中不同角色部署到不同的服务器上,包含nginx、redis、mysql、glusterfs,共4个角色)、1台备用文件服务器和1个云监控服务。

139239-20221110162935798-1547693964.png

步骤1:部署应用服务器

在官网上获取活字格的安装脚本,分别在2台应用服务器上执行:

sudo rm -f huozige-installer-linux.tar && wget https://downloads.grapecity.com.cn/HuoZiGe/Linux/huozige-installer-linux.tar && tar -xvf huozige-installer-linux.tar && chmod +x installForguncy\_cn.sh && ./installForguncy\_cn.sh

因为示例不涉及服务端的PDF和Excel导出,所以没有安装中文字体。

如果应用服务器基于云主机构建,需要开通以下入站/上行端口:

22345:活字格管理控制台、应用发布使用

8000-9000:推荐使用的活字格Web应用端口(国内云服务厂商需要备案后才能开通80/443/8080端口)

步骤2:部署和配置GlusterFS

GlusterFS可以尽最大可能避免出现因存储设备损坏带来的损失。用户上传文件、应用文件和数据库文件均推荐存储在GlusterFS等分布式存储,而不是NFS、SAMBA等单节点存储。

在示例中,我们将支持服务器作为GlusterFS的主文件服务器,另外搭建一台备用文件服务器,用作实时热备。

2.1主文件服务器和备用文件服务器

首先,在主文件服务器和备用文件服务器上,更新apt-get源:

sudo apt-get update

然后,从apt-get安装glusterfs-server:

sudo apt-get install glusterfs-server

启动gluster服务,并设置为自启动:

sudo systemctl start glusterd

sudo systemctl enable glusterd

如果GlusterFS基于云主机构建,需要开通以下入站/上行端口:

24007-24008:GlusterFS管理端口

49152-49251:Gluster卷访问接口

在主文件服务器和备用文件服务器的磁盘上分别创建用来存储文件的本地文件夹。

sudo mkdir -p /gluster/data

在示例中,我们将支持服务器作为主服务器(172.31.9.34),在主服务器上链接备用文件服务器(172.31.15.58),然后基于两台服务器上的本地文件夹,创建共享的卷:volumn-hzg

sudo gluster peer probe 172.31.15.58

sudo gluster volume create volumn-hzg replica 2 172.31.9.34:/gluster/data 172.31.15.58:/gluster/data force

sudo gluster volume start volumn-hzg
GlusterFS的服务器端配置完成了。

2.2:应用服务器

接下来切换到应用服务器,分别执行以下操作,更新apt-get,并且利用apt-get安装Gluster客户端。

sudo apt-get install glusterfs-client

将服务器上的文件夹挂在到本地之前,需要先创建“挂载点”,即本地的文件夹。这一点与NFS不同,GlusterFS的客户端不会自动创建挂载点。

sudo mkdir /share

修改配置文件,开机自动挂载主服务器提供的卷。在 /etc/fstab 中追加下方一行。

172.31.9.34:/volumn-hzg        /share   glusterfs       defaults 0 0

重新加载fstab文件,即完成文件挂载。

sudo mount -a

步骤3:部署MySQL

在支持服务器上,更新apt-get源

sudo apt-get update

然后,从apt-get安装mysql:

sudo apt-get install mysql-server

安装完成后,启动mysql:

sudo systemctl start mysql

使用内建的mysql客户端登录mysql:

sudo mysql -uroot -p

默认情况下,root没有密码,绑定的是当前服务器的root权限,所以也就无需输入密码。执行SQL语句,设置应用服务器有权访问的账号。您可以直接使用root作为外网访问账号,也可以创建一个新的用户。在测试和学习阶段,推荐直接为root开放外网访问,便于使用设计器、mysql workbrench等可视化工具对数据进行查询和操作;生产环境则推荐创建专门的用户,并控制可访问的IP地址(如仅允许应用服务器),以策安全。

CREATE USER 'root'@'%' IDENTIFIED BY '{新的数据库密码}';GRANT ALL ON \*.\* TO  'root'@'%';flush privileges;

再执行创建用户信息数据库的SQL语句。

CREATE DATABASE userservicedb;

MySQL 5.7默认仅监听本地端口,需要修改配置文件才能提供给其他机器访问。MySQL的配置文件很多,推荐修改/etc/mysql/my.cnf文件。在文件的最后,追加以下内容:

bind-address=0.0.0.0  #全部地址或者指定的ip地址

如果MySQL基于云主机构建,需要开通以下入站/上行端口:

  • 3306:MySQL默认端口

重要提示:在生产环境中,请把MySQL的文件存储至GlusterFS,而不是本地磁盘。查看教程(来自CSDN)

步骤4:部署Redis

在支持服务器上,更新apt-get源:

sudo apt-get update

然后,从apt-get安装redis:

sudo apt-get install redis

Redis默认不允许其他机器访问,需要修改配置文件:/etc/redis/redis.conf。配置文件比较大,可通过vim的查找功能,定位需要修改的点:

查找bind 127.0.0.1 ::1,在前面加上#,注释掉这一行。2. 查找protected-mode,把yes修改为no

修改配置文件后,重启redis服务。

sudo systemctl restart redis-server

如果Redis基于云主机构建,需要开通以下入站/上行端口:

  • 6379:Redis默认端口

重要提示:在生产环境中,请把redis的持久化路径设置到GlusterFS的卷,而不是本地磁盘。查看教程(来自CSDN)
步骤5:部署nginx

首先,在支持服务器上,更新apt-get源:

sudo apt-get update

然后,从apt-get安装redissudo apt-get install nginx。
安装完毕后,可以通过修改/etc/nginx/nginx.conf,配置反向代理规则。以下的例子中有两台应用服务器,内网地址分别是172.31.12.135和172.31.12.228,两个应用app_a和app_b,端口分别是8101和8102。反向代理对外提供的端口统一为8100。搭建活字格智能集群,涉及到/etc/nginx/nginx.conf的http节点下upstream 和location。具体配置方法和示例文件如下。

upstream节点定义了每个活字格应用对应的应用服务器和服务器级别的处理策略。你需要为UserService和每一个应用分别配置一个upstream。

# app_a:每个APP的后台端口不同,需要设置单独的upstream,下同

upstream  hq-a-server {

# 按客户端分配时,取消下面一行的注释

# 这种方法通常用于兼容现有软件,当软件不是按照无状态进行设置时,可以用这种方法,避免会话中断

# ip\_hash;

server 172.31.12.135:8101 max\_fails=30 fail\_timeout=20s;

server 172.31.12.228:8101 max\_fails=30 fail\_timeout=20s;

}

每个upstream对应了server下面的一个location。location会在发送到server中定义端口的请求中,按照URL的Path部分(不包含协议、主机名和端口,如http://xxx.com:2002/app/xxx?yyy=zzz的Path是/app/xxx?yyy=zzz)过滤出符合要求的请求,分发到upstream中。在活字格智能集群中,可以利用Path的第一段(UserService或应用名)作为查询条件。

# 为每个应用做映射,下同

location ^~ /app_a/ {

故障转移的条件:如果后端的服务器执行超时或发生错误(5xx不能视作不可用,需要转发给浏览器处理),自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。下同。

`proxy\_next\_upstream error timeout invalid\_header ;

proxy\_send\_timeout 5s;     # 代理发送超时时间,下同

proxy\_read\_timeout 5s;    # 代理接收超时时间,下同

proxy\_pass http://hq-a-server/app\_a/;

proxy\_redirect default;

}

此外,在server节点上,你需要配置监听的端口,和HTTP HEADER的处理策略。

listen       8100;  #应用服务和基础服务的页面和WebAPI,对外公开的端口统一成8100。统一端口可以避免浏览器的地址变化,也可以避免出现跨域请求

server_name  hq.commany.con;

转发HTTP的HEADER,这是反向代理中的常见做法,主要是避免因修改过HEADER,带来的兼容性问题

proxy\_set\_header   Upgrade $http\_upgrade;

proxy\_set\_header   Connection keep-alive;

proxy\_set\_header   Host $host;

proxy\_cache\_bypass $http\_upgrade;

proxy\_set\_header   X-Forwarded-For $proxy\_add\_x\_forwarded\_for;

proxy\_set\_header   X-Forwarded-Proto $scheme;
proxy\_set\_header   X-Real-IP $remote\_addr;

完整的配置文件,可以参考:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjI3NTcxfDRjYmFiYjA5fDE2NjcyNzIwMDZ8NjI2NzZ8MTUyNjQw

配置文件修改后,让nginx重新加载即可。

sudo nginx -s reload

如果nginx基于云主机构建,需要开通以下入站/上行端口:

  • 8100:配置的服务端口号

步骤6:配置活字格集群

完成上述环境准备后,我们需要依次登录应用服务的管理控制台站点(http://{应用服务器IP地址}:22345/UserService/ManagementPage/LoginPage),完成集群配置。配置页面在【设置】选项卡的【负载均衡配置】菜单。

  • 开启:勾选,启用负载均衡配置
  • 数据库类型:用户信息数据库的类型,示例中采用MySQL
  • 数据库链接字符串:用户信息数据库的链接字符串,即刚才搭建的支持服务器的MySQL的userservicedb数据库
  • Redis服务地址:缓存服务器的IP和端口号(默认端口为6379),即刚才搭建的支持服务器的Redis
  • 共享存储路径:用户存储应用和用户上传文件的共享目录,即刚才挂载GlusterFS服务器的本地目录

步骤7:配置监控服务

虽然活字格智能集群有自动的故障转移能力,但依然需要我们关注服务器的健康状态,及时发现出现故障的应用服务器,并及时予以处理。通常情况下,您需要针对nginx服务和所有应用服务建立拨测,即通过HTTP请求应用的根目录,通过返回的结果,判断该节点是否出错。示例采用了阿里云的云监控服务。监控地址如下:

  • nginx(总体服务质量):http://{支持服务器nginx的IP}:8100/app_a/
  • 应用服务器1:http://{应用服务器1的IP}:8100/app_a/
  • 应用服务器2:http://{应用服务器2的IP}:8100/app_a/

当nginx服务异常时,需第一时间进行处理,如重启nginx服务等;当应用服务器异常时,因为故障转移机制的存在,你有一定的处理时间,示例为不低于10分钟(30次延时,每次20秒)。如果无法在该时间范围内处理完毕,nginx会将该服务器标记为故障,不在向其转发请求。此时,你需要在将故障排除后,在nginx服务器上执行热加载命令,将该服务器的状态重置为正常,接收请求分发。

sudo nginx -s reload

1. 发布应用

你可以通过设计器将开发好的应用发布到任意一个应用服务器上,活字格智能集群将自动把新发布的应用同步部署到其他应用服务器。同步部署的过程不涉及文件拷贝(应用所需的文件都位于NFS共享文件夹中),耗费时间很短。如果恰好有用户访问,部署过程中的服务器因为返回码为4xx,而被nginx服务器识别为不可用,请求被自动分发到可用的应用服务器上,最终实现“升级部署不停服务”的目标。

2. 管理用户信息

你可以在任何一台应用服务器的管理控制台上,对用户、组、组织结构、第三方授权等数据进行查询和操作,这些操作均会影响到所有应用服务器。

3. 配置

你可以在任何一台应用服务器的管理控制台上,对应用和服务器等配置进行调整,包括但不限于安全提供程序等。这些操作也会影响到所有应用服务器。

常见问题

Q:如果我的应用部署在公有云上,是否可以用云服务商的产品构建集群?

A:当然可以,基于公有云的产品搭建活字格智能集群更简单、维护也更方便。您可以使用云服务商提供的MySQL、Redis和NFS产品,如亚马逊(葡萄城生态合作伙伴)AWS提供的Amazon RDS for MySQL、Amazon MemoryDB for Redis、Amazon EFS。

Q:应用运行出了问题,我该如何查看日志?

A:集群中各应用服务器的日志没有被合并,依然存放在各自的磁盘上,目录为 /var/log/ForguncyServer。管理控制台上的【分析错误】功能,也仅收集当前应用服务器的信息。

Q:如果应用同步发生错误,可以手动修复吗?

A:在配置的过程中,一旦发生应用同步出错的情况,如不同应用服务器上的应用版本不一致、部分应用服务器上的应用不可用等,请首先检查应用服务器的时间/时区是否一致,GlusterFS加载是否正确,Redis是否运行正常。如果问题依然没有解决,请到求助中心发帖,寻求技术支持。

Q:我不会使用Linux,是否可以基于Windows来搭建集群?

A:搭建集群用到的各项服务均有Windows版本,但是我们没有做过测试。你可以参照Linux的做法,在Windows上尝试搭建活字格集群。如果能够运行,欢迎到格友杂谈版块分享成功经验。

Q:每一个应用服务器都需要重复购买产品授权吗?

A:集群的授权比较灵活,请致电400-657-6008,与我们联系。

Q:如果我只想实现故障转移,可以接受像编码开发一样手动部署和同步各应用服务器,是否有更简单的方案?

A:如果你希望放弃活字格智能集群的负载均衡和自动同步能力,手动搭建和维护传统的故障转移集群,可以查看这篇教程。

Q:能否进一步提升集群的可用性,即便网关节点发生故障也能保持系统正常运行?

A:可以的,不过需要依托于硬件或软件负载均衡器。如果你可以接受在云端搭建集群,可以利用云服务商提供的负载均衡器服务,进一步提升可用性。以葡萄城的生态合作伙伴亚马逊AWS为例,您可以按照这篇教程快速完成集群搭建。将AWS提供的服务替换为阿里云、华为云的对标产品,也是没问题的。

拓展阅读

万物皆可集成系列:低代码对接企企云实现数据集成

万物皆可集成系列:低代码如何不成为数据孤岛

万物皆可集成系列:活字格对接泛微e-cology


Recommend

  • 85

    负载均衡集群介绍 实现负载均衡集群的软件有:LVS、keepalived、Nginx、haproxy等。其中LVS属于四层(网络OSI模型);Nginx 属于七层;haproxy既可以认为是四层,也可以当作是七层使用。 keepalived 的负载均衡功能...

  • 44
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    在 Kubernetes 集群中 gRPC 的负载均衡

    很多人觉得,在Kubernetes中不是只要用 Service就可以做负载均衡了吗?SVC确实有负载均衡的作用。它是由Kube-proxy提供,但是由于Grpc的特性没有办法让它很好的处理负载均衡。 SVC负载调度原理 在k8s的文档中阐述了kube-...

  • 9

    在上一篇文章《MQTT Broker 集群详解(一):负载均衡》中,我们简单介绍了 MQTT 负载均衡:负载均衡既可以应用于传输层,也可以用于应用层。在本文中,我们将详细介绍应用层负载均衡,其中最有趣的...

  • 5

    一、Nginx 负载均衡实现原理1、Nginx 实现负载均衡是通过反向代理实现反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同...

  • 7
    • blog.51cto.com 3 years ago
    • Cache

    LVS负载均衡集群--DR模式部署

    一.LVS-DR数据包流向分析​1.为方便进行原理分析,将client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4​

  • 13

    http重定向原理下载网站用的较多,其实也算一种负载均衡,工作在应用层的业务代码中 根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给客户浏览器,由浏览器重新进行访问

  • 11

    LVS四层负载均衡集群(1)集群功能分类 - LB 原创 资本家的鱼 2022-06-13...

  • 4

    LVS四层负载均衡集群(6)LVS工作模式 原创 资本家的鱼 2022-06-13 02:19...

  • 7

    在Kubernetes集群中部署MetalLB实现负载均衡 作者:ikubernetes 2022-08-31 08:30:32 我们通过helm去部署一些服务时,尝尝会依赖于LoadBalancer的资源类型,导致创建的services中type: LoadBalancers会一直处于Pen...

  • 5

    关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)的一些记笔 只要我们足够开心,烦恼就追不上哦 ^_^ 分享一些MySQL(MariaDB)集群主从结构数据读写分离的笔记 如果对于读密集型应用,可以容忍从库异...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK