要求¶
硬件{ #hardware }¶
硬件要求取决于数据库大小,大型数据库需要更多资源。监控系统性能以了解使用情况非常重要。如果您管理自己的基础设施(不是基于云的),请确保您的网络连接稳固,主机之间的网络连接不得低于 1 Gbps。快速固态硬盘至关重要,尤其是对于 PostgreSQL 数据库,因为它们能提供更好的读/写速度和更低的磁盘延迟,从而提高整体性能。
操作系统{ #operating-system }¶
DHIS2 已在 Ubuntu 22.04 和 24.04 主机上进行了广泛测试。建议在最新的 Ubuntu 服务器 LTS 版本上运行。
DHIS2 架构{ #dhis2-architecture }¶
DHIS2 需要服务器才能运行。它有不同的部分:DHIS2 war 文件、PostgreSQL 数据库、监控服务器和代理服务器。您可以将所有这些组件安装在一台服务器上,也可以分布在多台服务器上。虽然架构本身看起来简单明了,但在实际环境(生产)中运行却需要大量的规划。
托管考虑因素
- ** 可靠性:** - 应用程序应努力做到全天候可用,并明确规定计划维护的时间窗口,尽量减少计划外停机的可能性。
- 数据安全: - 如果数据是敏感数据,如个人身份信息(PII),则必须采取强有力的安全措施。
- ** 性能和可扩展性:** - 大型网站可能拥有数万名用户和数百万条记录
- ** 可维护性:** - 系统需要积极维护和更新
- 可扩展性: - 系统是否必须具有可扩展性,以适应未来数据量、用户群或功能的增长。这可能涉及实施水平扩展或使用分布式架构等功能。
这些要求意味着需要合适的硬件(物理基础设施)、强大的安全措施和良好的整体性能。这也意味着维护系统的人员需要具备广泛的技术技能。仅从简单的 dhis2 架构来看,这种复杂性可能并不明显。
因此,尽早规划服务器的实施至关重要。这样,您就可以获得必要的资源(硬件和技术人员)来满足这些需求,并确保应用程序在生产环境中顺利运行。
DHIS2 应用组件{ #dhis2-application-components }¶
DHIS2 应用程序至少需要三个组件才能运行:
- Servlet 容器(必填): 如 tomcat(或 jetty)。运行 java DHIS2 网络应用程序并托管其他应用程序。
- 数据库服务器(必填): DHIS2 的最新版本要求 postgresql 数据库的版本大于 9.6。
- 网络代理前端(可选): 主要功能是终止 SSL 并可能分担负载。通常使用 Nginx 和 apache2。
- 监控(可选): 在实际使用(生产)中,密切关注应用程序和服务器的健康状况至关重要。可以使用 Prometheus(现代工具,很可能直接与 dhis2 系统集成)或 Munin/Zabbix 等工具进行监控。警报可通过电子邮件发送,或与 Telegram 或 Slack 等消息应用程序集成。
在一台机器或虚拟机上设置所有四个组件的做法很常见,这种做法可称为 "boombox",除了用于收集汇总数据的非常基本的设置外,不应再被视为良好做法。将这些组件隔离开来有很多很好的理由:
- 安全性:- 这是一个重要原因,尤其是当你有许多网络应用程序在运行时。如果您的网络应用程序遭到黑客攻击,您需要确保潜在的损失是有限的。
- 监控和性能:- 当所有组件一起运行时,很难确定内存或 CPU 耗尽的根本原因,也很难对每个组件进行适当配置。
- 可扩展性:- 为了能够横向扩展网络应用程序或数据库,需要为副本分配各自的资源。
- ** 更易于维护:**- 当各个组件不再相互交织时,更新或维护就会变得更加简单。
- 提高稳定性:- 隔离组件可防止某一区域出现问题而导致其他区域崩溃。
隔离可以采用不同的粒度:
- ** 独立的物理机:** - 这提供了隔离功能,但有点缺乏灵活性(而且成本高昂)。唯一的例外可能是 postgresql 数据库服务器,在裸机上运行并直接访问磁盘阵列会有一些性能优势,但这是一个昂贵的选择。
- ** 独立虚拟机:** - 这可能是一个非常明智的解决方案,您可以为代理服务器、应用服务器和数据库各专用一个内部虚拟机或云托管 VPS。可能需要考虑到一个安全问题,因为默认情况下,各组件之间的网络流量将是未加密的。如果网络是可信的,这可能没有问题,但在许多情况下,你可能需要在 tomcat 和 postgres 上实施 SSL,以确保在传输过程中进行充分加密。
- ** 独立容器:** - 这是一种优雅、轻量级的解决方案,可提供组件之间的隔离。当你从云提供商那里租用一个 VPS 服务器时,这种方法尤其具有吸引力。有不同的 Linux 容器化解决方案,各有利弊。大多数人会使用 docker 或 lxc 或两者的某种组合。本指南将介绍使用 lxc 的解决方案,但我们也会添加有关 docker 的文档。
无论您如何隔离系统组件(网络服务器、应用程序服务器、数据库等),它们之间的访问权限都应受到限制。下面举几个例子说明这一点:
- 代理服务器(如 Nginx): 只有代理服务器可以通过 HTTP 端口访问 Tomcat 容器。
- 应用服务器(如 Tomcat): 不应允许其他组件通过 SSH 直接访问。
- 数据库服务器(如 PostgreSQL): 不应由代理服务器直接访问。
封锁: 应启用服务器(物理或虚拟)和容器上的防火墙,只允许来自授权来源的连接。这样可以最大限度地降低一个受损组件影响其他组件的风险。
其他重要考虑{ #other-important-considerations }¶
预算:¶
- 备份和存档数据(这需要额外的服务器资源)
- 用于测试、暂存和培训的系统(测试 DHIS2 版本更新和其他对系统风险较低的重大变更)
- 主要操作系统/数据库服务器升级(每 2-3 年一次)
注
各国通常在不同的服务器上运行每个 DHIS2 系统(HMIS、HIV 跟踪系统、TB 跟踪系统、COVID-19),每个服务器都需要配置。应对这些系统进行整体管理并编制预算。使用云/虚拟系统时,测试服务器不需要永久开启,只要有足够的资源,就可以按需启动。
结论¶
关于托管的决定并非最终决定。各国可能一开始就选择一种托管方式,但有过渡到另一种托管方式的长期计划,例如在本地托管,然后计划过渡到云托管,或者反之亦然。许多国家都有建立国家数据中心和培养管理数据中心所需技能的长期雄心。从长远来看,有可能实现这一雄心壮志,同时避免在短期内做出有风险的托管决定(如在必要的技能和基础设施到位之前尝试在本地托管数据)。