写点什么

不只是负载均衡,活字格智能集群的架构与搭建方案

  • 2022-11-10
    陕西
  • 本文字数:6332 字

    阅读完需:约 21 分钟

不只是负载均衡,活字格智能集群的架构与搭建方案

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


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


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


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


  • 提升系统可用性,避免因单台服务器宕机导致系统服务中断

  • 在做好各项性能优化(参考系列教程)的前提下,需要进一步提升性能,以满足大并发量请求的响应速度


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


集群能力

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


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

  • 负载均衡

  • 可用性监控


特别提示:活字格智能集群不兼容内建 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 个云监控服务。


步骤 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-hzgGlusterFS 的服务器端配置完成了。

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

发布于: 刚刚阅读数: 4
用户头像

赋能开发者 2020-05-09 加入

西安葡萄城信息技术有限公司是全球领先的软件开发技术和 低代码 平台提供商,以“ 赋能开发者”为使命,致力于通过各类软件开发工具和服务,创新开发模式,提升开发效率,推动软件产业发展,为“数字中国”建设提速

评论

发布
暂无评论
不只是负载均衡,活字格智能集群的架构与搭建方案_葡萄城技术团队_InfoQ写作社区