willning 发表于 2022-8-19 17:42:06

集群部署:一、更智能,负载均衡集群的架构与搭建方案(推荐)

本帖最后由 willning 于 2023-2-27 17:48 编辑

为了帮助大家具备企业级应用的部署能力,轻松应对核心业务系统的部署要求,我们准备了《活字格智能集群的架构与搭建方案》高级教程。学完本教程,你掌握的能力为“基于nginx配置服务器集群”,在活字格核心开发技能清单中属于通用能力L4级别。
推荐学员:
[*]有较强IT背景的活字格用户

前序课程:
[*]帮助文档:本地运行与调试
[*]帮助文档:安装活字格服务端到Linux系统

应用场景
如果你需要解决如下的问题,可以考虑搭建一套活字格智能集群:

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

集群能力活字格智能集群是我们官方提供的一套负载均衡解决方案,在传统的负载均衡集群提供的高可用性、高性能等优势的基础上,通过应用和配置的智能自动分发机制,进一步降低了集群的运维工作量。本方案提供的主要能力如下:
[*]负载均衡
[*]可用性监控
[*]较高可用性(包含应用服务器的故障转出和故障迁回)

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

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

角色一览
[*]反向代理服务(10.2.0.1):nginx,实现负载均衡等分发策略,示例版本:1.18
[*]应用服务器(10.2.0.2和10.2.0.3):活字格服务器管理器,运行活字格应用,示例版本:V8.0.103.0
[*]缓存和分发数据库(10.2.0.4):redis,存放Session会话数据,提供应用和配置同步所需的消息,示例版本:5.0
[*]用户信息数据库和业务数据库(10.2.0.5):推荐MySQL,存放用户、角色、权限等基础数据,示例版本:8.0
[*]文件服务(主节点10.2.0.6):nfs,存放活字格应用、用户上传文件等集群所需的文件,需要在多个应用服务器间共享,示例版本:v4
[*]监控服务:可选阿里云的云监控服务,确保第一时间能够发现服务器的故障

网络拓扑简图
生产环境中,活字格智能集群通常需要用到最少4台服务器:2个应用服务器,2个支持服务器(基于负载将角色分配到不同的服务器,如支持服务器A包含nginx和nfs;支持服务器B包含mysql和redis主节点)。此外,还需要1个云监控服务。



步骤0:更新RHEL
活字格支持的CentOS 7版本发布至今已有较长时间,原生组件比较老旧,需要使用EPEL对其进行更新和扩充。
# RHEL(含Redhat、CentOS、Alinos、银河麒麟、统信UOS高级服务器等)
sudo yum install epel-release -y
sudo yum update

步骤1:部署应用服务器
1.1 安装
在官网上获取活字格的安装脚本,分别在2台应用服务器(10.2.0.2和10.2.0.3)上执行:
# RHEL
sudo yum install wget -y
sudo rm -f huozige-installer-linux.tar && sudo wget https://downloads.grapecity.com.cn/HuoZiGe/Linux/huozige-installer-linux.tar && sudo tar -xvf huozige-installer-linux.tar && sudo chmod +x installForguncy_cn.sh && sudo ./installForguncy_cn.sh

# Ubuntu(含Ubuntu、Deepin、统信UOS桌面等)
sudo rm -f huozige-installer-linux.tar && sudo wget https://downloads.grapecity.com.cn/HuoZiGe/Linux/huozige-installer-linux.tar && sudo tar -xvf huozige-installer-linux.tar && sudo chmod +x installForguncy_cn.sh && sudo ./installForguncy_cn.sh

因为示例不涉及服务端的PDF和Excel导出,所以没有安装中文字体。安装方法参加:帮助文档

1.2 导入License
安装完成后,您需要登录管理控制台,导入License(负载均衡支持两种授权模式:按用户数授权和无限制授权)

1.3 允许端口访问
在防火墙(如firewalld)上允许22345(活字格内部使用)和8000-9000(推荐应用使用的端口号)端口;如果应用服务器基于云主机构建,需要开通对应的入站/上行端口。
# RHEL
sudo firewall-cmd --zone=public --add-port=22345/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8000-9000/tcp --permanent
sudo firewall-cmd --reload

步骤2:部署和配置NFS
2.1:安装
首先,在文件服务器(10.2.0.6)上,安装nfs的server端,并设置为自启动。
# RHEL
sudo yum install nfs-utils -y

# Ubuntu
sudo apt-get update
sudo apt-get install nfs-kernel-server

创建文件目录、配置并重启服务
# RHEL & Ubuntu
sudo mkdir -p /nfs_data
sudo chmod 777 /nfs_data
sudo vi /etc/exports
sudo systemctl enable nfs-server
sudo systemctl start nfs-server

在配置文件/etc/exports中添加
/nfs_data 10.2.0.2(rw,sync,no_root_squash)
/nfs_data 10.2.0.3(rw,sync,no_root_squash)

禁用selinux,然后在防火墙(如firewalld)上允许nfs使用到的端口(111、2049、 /etc/sysconfig/nfs中设置的其他端口)也可以直接为nfs服务添加访问许可,如果部署在云服务器(如阿里云ECS),也需要在云主机配置上开发对应的端口。
# RHEL
sudo setenforce 0
sudo vi/etc/selinux/config

将SELINUX=enforcing修改为SELINUX=disabled


sudo firewall-cmd --add-service=nfs --zone=public --permanent
sudo firewall-cmd --reload

2.2:应用服务器
接下来在两台应用服务器上(10.2.0.2和10.2.0.3),分别安装nfs客户端。
# RHEL
sudo yum install nfs-utils -y

# Ubuntu
sudo apt-get update
sudo apt-get install nfs-common

将服务器上的文件夹挂在到本地之前,需要先创建“挂载点”,即本地的文件夹;然后修改/etc/fstab文件,让系统在开机时自动挂载文件服务器提供的卷;最后手动挂载,完成后续配置。
# RHEL & Ubuntu
sudo mkdir /share
sudo chmod 777 /share
sudo vi /etc/fstab
sudo mount -a

修改 /etc/fstab 时,在文件尾部追加:
10.2.0.6:/nfs_data      /share   nfs       defaults,_netdev 0 0

如果挂载过程中发生错误,请再次检查2.1中的防火墙设置。

步骤3:部署MySQL
3.1 安装
活字格支持的MySQL版本为5.6、5.7和8.0。需要提示的是,MySQL存放的数据包含用户、组、权限等重要数据,需严格按照您公司的IT管理规定做好安全防护和备份工作。本教程中不涉及相关内容。
# RHEL
sudo yum install wget -y
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-7.noarch.rpm
sudo yum install mysql-community-server -y
sudo systemctl enable mysqld
sudo systemctl start mysqld

# Ubuntu
sudo apt-get install mysql-server
sudo systemctl enable mysql
sudo systemctl start mysql

3.2 设置密码、创建用户
新版的MySQL在安装时会自动生成root的密码,您需要使用这个密码才能登录root用户,以执行后续操作。密码存放在mysql的日志中
# RHEL & Ubuntu
sudo cat /var/log/mysqld.log

在文件中找到这一样行,root@localhost: 后面就是root的密码
A temporary password is generated for root@localhost: +l%7r=bSeIu1

使用内置的客户端登录到数据库服务器
# RHEL & Ubuntu
sudo mysql -uroot -p

首先执行下面的语句,将root的密码设置为你的使用习惯(MySQL8提升了密码强度要求,需包含大小写和特殊字符),确保在本地mysql客户端中登录的用户也拥有执行权限:
alter user root@"localhost" identified by "xA123456!";
use mysql;
update user set host='%' where user='root';
flush privileges;
grant all privileges on *.* to 'root'@'%' ;

然后设置活字格使用的账号。您可以直接使用root作为外网访问账号,在测试和学习阶段,推荐直接为root开放外网访问,便于使用设计器、mysql workbrench等可视化工具对数据进行查询和操作;生产环境则推荐创建专门的用户,并控制可访问的IP地址(仅允许应用服务器,可以用%指定内网的IP网段),以策安全。
CREATE USER 'hzg'@'10.2.0.%' IDENTIFIED BY 'xA123456!';
GRANT ALL ON *.* TO 'hzg'@'10.2.0.%';
flush privileges;

创建用户信息数据库。
CREATE DATABASE userservicedb;

输入 exit 退出mysql客户端。

3.3 启用网络访问
MySQL默认仅监听本地端口,需要修改配置文件才能提供给其他机器访问。MySQL的配置文件很多,推荐修改/etc/my.cnf文件。
# RHEL & Ubuntu
sudo vi /etc/my.cnf

在文件的最后,追加以下内容:
bind-address=0.0.0.0

3.4 允许端口访问
在防火墙(如firewalld)上允许3306端口,如果MySQL基于云主机构建,需要开通对应的入站/上行端口。
# RHEL
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

3.6 测试连接
MySQL的配置相对复杂,在执行下一步之前,建议在每一台应用服务器(10.2.0.2和10.2.0.3)上安装MySQL客户端,对MySQL服务器进行连接。

# RHEL
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-7.noarch.rpm
sudo yum install mysql-community-client -y
sudo mysql -h10.2.0.5 -uhzg -p

# Ubuntu
sudo apt-get install mysql-client
sudo mysql -h10.2.0.5 -uhzg -p

如果mysql提示无法连接,请再次检查3.3和3.4的设置。

步骤4:部署Redis
4.1 安装
在redis节点(10.2.0.4)上执行安装。在RHEL中,Redis在EPEL中。为了简化操作,避免出错,强烈推荐安装最新版的EPEL(具体操作参考本文的步骤0),而不是手动编译redis。
# RHEL
sudo yum install redis -y

# Ubuntu
sudo apt-get update
sudo apt-get install redis

4.2 修改配置
默认情况下,Redis不允许其他机器访问,需要修改配置文件,监听全部端口,并且关闭保护模式。修改配置文件后,需要重启redis服务。
# RHEL
sudo vi /etc/redis.conf
sudo systemctl restart redis

# Ubuntu
sudo vi /etc/redis/redis.conf
sudo systemctl restart redis-server
找到bind 127.0.0.1 ::1,在前面加上#,注释掉这一行。找到protected-mode,把yes修改为no
4.3 允许端口访问
在防火墙(如firewalld)上允许6379端口,如果Redis基于云主机构建,需要开通对应的入站/上行端口。
# RHEL
sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent
sudo firewall-cmd --reload

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

[*]开启:勾选,启用负载均衡配置
[*]数据库类型:用户信息数据库的类型,示例中采用MySQL
[*]数据库链接字符串:用户信息数据库的链接字符串,即刚才搭建的支持服务器的MySQL的userservicedb数据库,参考:Server=10.2.0.5;User Id=hzg;password=xA123456;database=userservicedb;allowPublicKeyRetrieval=true; (MySQL8默认安全设置较高,需要在连接字符串上声明允许获取公钥)
[*]Redis服务地址:缓存服务器的IP和端口号(默认端口为6379),即刚才搭建的支持服务器的Redis
[*]共享存储路径:用户存储应用和用户上传文件的共享目录,即刚才挂载GlusterFS服务器的本地目录



5.2 发布验证用工程
使用活字格设计器打开附件中的示例工程,将其发布到一台应用服务器(10.2.0.2)的外网地址,设置应用名为cluster_test,端口为8001。然后通过另一台应用服务器(10.2.0.3)的外网地址访问,确认集群的同步功能已成功运行。



步骤6:部署nginx
在nginx(10.2.0.1)节点上,执行操作。
6.1 安装
# RHEL
sudo yum install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

# Ubuntu
sudo apt-get update
sudo apt-get install nginx

6.2 配置
运行nginx的系统需要禁用selinux,以避免监听端口出错。
# RHEL
sudo setenforce 0
sudo vi/etc/selinux/config

将SELINUX=enforcing修改为SELINUX=disabled

执行完毕后,修改/etc/nginx/nginx.conf,配置反向代理规则。
# RHEL & Ubuntu
sudo vi /etc/nginx/nginx.conf

以下的例子中有两台应用服务器(10.2.0.2和10.2.0.3),应用名为cluster_test,端口是8001。反向代理对外提供的端口统一为8100。搭建活字格智能集群,涉及到/etc/nginx/nginx.conf的http节点下upstream 和 server。除非必要,不建议修改http之外其他节点的默认配置。具体配置方法和示例文件如下:

6.2.1 upstream节点
upstream节点定义了每个活字格应用对应的应用服务器和服务器级别的处理策略。因为活字格内建有WebSocket,需要使用ip_hash策略以确保每个客户端使用的服务器是固定的。

upstream:UserService
首先,您需要配置到UserService的upstream。
upstream us-server{
                ip_hash;
                server 10.2.0.2:22345 max_fails=30 fail_timeout=20s;
                server 10.2.0.3:22345 max_fails=30 fail_timeout=20s;
      }

upstream:APP
因为每个应用的端口不一样,你需要为每一个应用分别配置一个upstream。
upstream cluster-test-server {
                ip_hash;
                server 10.2.0.2:8001 max_fails=30 fail_timeout=20s;
                server 10.2.0.3:8001 max_fails=30 fail_timeout=20s;
      }
6.2.2 server节点
在server节点上,你需要配置监听的端口(对外提供服务的端口,如果是内网穿透模式,需要将这个端口映射到外网),和HTTP HEADER的处理策略。
                listen                  8100;
                server_name             hzg.xxxxx.com;

                proxy_set_header      Upgrade $http_upgrade;
                proxy_set_header      Connection "upgrade";
                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;
重要:请在nginx上配置SSL证书,不要在活字格服务器上配置

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

location:UserService
首选需要配置的是UserService,用于OAuth2认证。
location ^~ /UserService/ {
                        proxy_next_upstream error timeout invalid_header ;
                        proxy_send_timeout 5s;   
                        proxy_read_timeout 5s;   

                        proxy_pass http://us-server/UserService/;
                        proxy_redirect default;
                }
location:APP
然后,需要为每一个应用配置2个location:应用本身和WebSocket服务。
location ^~ /cluster_test/ {
                        proxy_next_upstream error timeout invalid_header;
                        proxy_send_timeout 5s;   
                        proxy_read_timeout 5s;

                        proxy_pass http://cluster-test-server/cluster_test/;
                        proxy_redirect default;
                }

                location /ForguncyHub/SR {
                        proxy_next_upstream error timeout invalid_header;
                        proxy_send_timeout 5s;   
                        proxy_read_timeout 5s;   

                        proxy_pass http://cluster-test-server/SR;
                        proxy_redirect default;
                }
6.3 示例文件与防火墙配置
不带SSL的配置文件,可以参考:
带有SSL的配置文件,可以参考:

配置文件修改后,让nginx重新加载即可。
# REHL & Ubuntu
sudo nginx -s reload

6.4 允许端口访问
需在防火墙(如firewalld)上允许nginx监听端口(示例中是8100),如果nginx基于云主机构建,需要开通对应的入站/上行端口。
# RHEL
sudo firewall-cmd --zone=public --add-port=8100/tcp --permanent
sudo firewall-cmd --reload

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

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

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

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



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

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

3.1 配置APP的域名
在每台应用服务器的管理控制台上,打开【应用管理】进入应用设置界面,分别在【常规设置】中将域名修改为外网访问的地址。以确保发送邮件等内置功能在自动生成时,生成正确的URL。


3.2 配置数据库连接字符串
默认情况下,生产环境的数据库仅允许内网访问。这意味着开发者使用的数据库和生产环境是不同的,前者部署在开发者本机或局域网里。所以,如果您的应用使用了数据库(集群中的应用不支持使用内置数据库),需要在主服务器找到该应用,在【高级设置】中设置“数据库连接字符串”。如:Server=10.2.0.5;User Id=hzg;password=xA123456;database=cluster_test;allowPublicKeyRetrieval=true;


4. 查看审计日志
审计日志和其他所有日志一样,默认存放在NFS上,具体路径在管理控制台里【设置】菜单下【存储路径】页面中“日志存储目录”项目。

常见问题
Q:如果我的应用部署在公有云上,是否可以用云服务商的产品构建集群?
A:当然可以,基于公有云的产品搭建活字格智能集群更简单、维护也更方便。您可以使用云服务商提供的MySQL、Redis和NFS产品,如亚马逊(葡萄城生态合作伙伴)AWS提供的Amazon RDS for MySQL、Amazon MemoryDB for Redis、Amazon EFS。您可以将以下文章发给云服务提供商的技术支持人员,请TA推荐具体的落地方案:活字格@AWS高可用集群

Q:应用运行出了问题,我该如何查看日志?
A:集群中各应用服务器的日志存放在NFS上,比如在上面的例子里,目录为 /share/ForguncyServerLog。您也可以在管理控制台上,打开【设置】菜单下【日志】页面,查询并查看日志。这一点和非集群部署是一样的。

Q:集群中各个节点是否有依赖关系,正确的启动顺序是什么?
A:活字格服务依赖NFS、Redis、MySQL服务,其他没有依赖关系。所以,您需要先启动这三个服务器所在的服务器,通过systemctl status确认状态无误后,再启动活字格服务器。nginx服务器与其他服务器没有依赖关系,可随时启动。

Q:已经配置了集群的服务器是否可以恢复到独立使用的状态?
A:可以的,只需要删除配置文件sudo rm /opt/ForguncySites/ForguncyServer/LoadBalancingConfig.xml 文件后重启服务 sudo systemctl restart ForguncyServerService 。事实上,如果您的集群出现了一些问题,如用户信息数据库或redis等不可用了,希望重新配置,也可以这么操作。

Q:如果应用同步发生错误,可以手动修复吗?
A:在配置的过程中,一旦发生应用同步出错的情况,如不同应用服务器上的应用版本不一致、部分应用服务器上的应用不可用等,请首先检查应用服务器的时间/时区是否一致,NFS加载是否正确(在一台应用服务器上,执行touch /share/ping,然后去另一台应用服务器上看/share下是否有ping文件)。如果问题依然没有解决,请到求助中心发帖,寻求技术支持。

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

Q:每一个应用服务器都需要重复购买产品授权吗?
A:集群的授权比较灵活,请致电400-657-6008,与我们联系。

Q:如果我只想实现故障转移,可以接受像编码开发一样手动部署和同步各应用服务器,是否有更简单的方案?
A:如果你希望放弃活字格智能集群的负载均衡和自动同步能力,手动搭建和维护传统的故障转移集群,可以查看这篇教程。

Q:nginx、nfs、redis或Mysql在服务器本地访问没有问题,活字格应用服务器却无法连接是怎么回事?
A:在安装和配置这些软件的时候,安装程序通常会自动添加防火墙例外,但也有一些情况下,这些例外并没有添加。要想排查这种情况,可以先停止防火墙服务后再试。定位到防火墙问题时,将对应的端口添加到例外列表就行了。

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


页: [1]
查看完整版本: 集群部署:一、更智能,负载均衡集群的架构与搭建方案(推荐)