搜索​​​​

清除过滤器
文章
Nicky Zhu · 十一月 2, 2021

IRIS 2021 技术文档 First Look 32 -- InterSystems 云管理器(Cloud Manager)

目录 技术概要:InterSystems 云管理器(Cloud Manager) 1 ICM 能为您做什么? 1 ICM 是如何工作的? 1 试一试!使用 ICM 在云中部署 InterSystems IRIS 2 安装 Docker 3 下载 ICM 映像 3 启动 ICM 3 获取云供应商帐户和证书 3 生成安全密钥 4 自定义示例配置文件 4 配置基础设施 9 部署 InterSystems IRIS 10 尝试 ICM 管理命令 11 取消配置基础设施 12 ICM 能做的远不止这些! 13 了解有关 ICM 的更多信息 13 插图目录 图 1: ICM 让一切变得简单 2 图 2: 云供应商的 ICM 默认文件示例 8 图 3: 交互式 ICM 命令 11 技术概要:InterSystems 云管理器(Cloud Manager) 本文向您介绍了 InterSystems 云管理器(InterSystems Cloud Manager,ICM),这是基于 InterSystems IRIS®数据平台的应用程序的端到端云配置和部署解决方案。 作为本指南的一部分,您将使用 ICM 在公共云中配置基础设施,并在该基础设施上部署 InterSystems IRIS。 要浏览所有的技术概要(First Looks),包括那些可以在免费的云实例或 web 实例上执行的技术概要(First Looks),请参见 InterSystems First Looks(《InterSystems 技术概要》)。 ICM 能为您做什么? 欢迎来到云时代(Cloud Age)! 您是否对它的机会虎视眈眈,但又对它的挑战保持警惕?具体来说, 您是否渴望利用云,但又犹豫是否要投入资源进行复杂的迁移? 您是否已经在云中,但还在努力寻找一种方法,以便在各种软件环境中管理部署和版本化您的应用程序? 您是否希望将持续集成和交付引入您的软件工厂,并将 DevOps 方法引入您的部署过程?也就是说,您想把自己从传统实践、库依赖、系统漂移、手动升级和其他开销的限制和风险中解放出来吗? ICM 可以提供帮助! ICM 为您提供了一种简单、直观的方法来配置云基础设施并在其上部署服务,帮助您现在就进入云,而无需进行重大开发或重组。基础设施即代码 (infrastructure as code,IaC) 和容器化部署的优势使得在 Google、Amazon 和 Azure 等公共云平台或私有 VMware vSphere 云上部署基于 InterSystems IRIS 的应用程序变得容易。定义您想要的内容,发布一些命令,剩下的工作由 ICM 来完成。 即使您已经在使用云基础设施、容器,或者同时使用两者,ICM 也可以通过自动化大量手动步骤,极大地减少配置和部署应用程序所需的时间和精力。 ICM 是如何工作的? 在您输入的纯文本配置文件的指导下,ICM 使用 Hashicorp 流行的 Terraform IaC 工具配置您的基础设施,并根据需要配置的主机节点。在下一阶段,ICM 将 InterSystems IRIS 和您的应用程序部署在 Docker 容器中,如果需要,还可以部署其他服务。您想要的部署所需的所有 InterSystems IRIS 配置都是自动执行的。ICM 还可以在现有的虚拟和物理集群上部署容器化服务。 ICM 本身带有一个容器映像,其中包含您所需要的一切。从 InterSystems 的 ICM 映像下载并运行容器,打开命令行,您就可以开始了。ICM 通过组合这些元素,使一切变得简单: 可以用作模板以快速定义所需部署的示例配置文件。 可以向其中添加应用程序的 InterSystems IRIS 映像。 试一试! 使用 ICM 在云中部署 InterSystems IRIS 每个任务的用户友好命令。 管理已配置节点和部署在其上的服务并与之交互的多种方法。 图 1: ICM 让一切变得简单 试一试!使用 ICM 在云中部署 InterSystems IRIS ICM 为您执行许多任务,并为您提供许多选项,以帮助您准确地部署您所需要的内容,所以在生产中使用它需要一定的计划和准备(尽管比手动方法要少得多!)。但配置和部署过程很简单,ICM 可以为您做出许多决定。这一探索旨在让您亲眼看到 ICM 是如何工作的,以及使用 ICM 在亚马逊网络服务(Amazon Web Services,AWS)上部署 InterSystems IRIS 配置是多么容易。虽然这不是一时的工作,但这种探索不应该占用您太多的时间,您可以在机会出现时分阶段进行。 为了让您体验 ICM 而又不至于在细节上陷入困境,我们保持了简单的探索;例如,我们让您尽可能多地使用默认设置。但是,当您把 ICM 引入您的生产系统时,您需要做很多不同的事情,特别是(但不限于)安全方面。所以请确保不要把这种对 ICM 的探索与真实的情况相混淆! 本文档末尾提供的参考资料将使您对在生产中使用 ICM 的情况有一个很好的了解。ICM Guide(《ICM 指南》)提供了使用 ICM 的完整信息和程序,并在适当的地方提供了链接。 这些说明假定您具备以下条件: 特定于容器的 InterSystems IRIS 分片(sharding)许可证并可以访问 InterSystems 软件下载。 亚马逊网络服务(Amazon Web Services,AWS)、谷歌云平台(Google Cloud Platform,GCP)、微软云(Azure)或腾讯云(Tencent)上的帐户。 在配置文件中指定的许多属性在这些云平台上是通用的,但其他属性是特定于平台的。有关这些差异的详细信息可在 ICM Guide(《ICM 指南》)的"ICM Reference(《ICM 参考资料》)"一章中的"Provider-Specific Parameters(特定于供应商的参数)"部分找到。 试一试! 使用 ICM 在云中部署 InterSystems IRIS 安装 Docker ICM 是作为容器映像提供的,它包含您需要的所有内容。因此,对启动 ICM 的 Linux、macOS 或 Microsoft Windows 系统的唯一要求是安装 Docker,并运行 Docker 守护进程,以及系统连接到 Internet。有关在您的平台上安装 Docker 的信息,请参见 Docker 文档中的 Install Docker(《安装 Docker》)。 重要提示: Docker 企业版(Enterprise Edition)和社区版(Community Edition)18.09 及更高版本支持 ICM;企业版(Enterprise Edition)仅支持生产环境。 下载 ICM 映像(Image) 要使用 ICM,您需要将 ICM 映像下载到您正在工作的系统中;这要求您识别将从其中下载它的注册表和访问所需的凭证。同样,对于 ICM 部署 InterSystems IRIS 和其他 InterSystems 组件,它需要相关映像的此信息。ICM 下载映像的注册表必须能被您使用的云供应商访问(也就是说,不能在防火墙后面),而且为了安全起见,必须要求 ICM 使用您提供给它的凭证进行身份验证。有关识别所涉及的注册表和下载 ICM 映像的详细信息,请参见 InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)中的 Downloading the ICM Image(下载 ICM 映像)。 注意: 启动 ICM 的映像的主要版本和部署的 InterSystems 映像必须匹配。例如,您不能使用 2019.3 版本的 ICM 部署 2019.4 版本的 InterSystems IRIS。 有关在容器中使用 InterSystems IRIS 的简要介绍,包括实际操作经验, 请参见 First Look: InterSystems Products in Containers(《技术概要:容器中的 InterSystems 产品》);有关使用 ICM 以外的方法在容器中部署 InterSystems IRIS 和基于 InterSystems IRIS 的应用程序的详细信息,请参见 Running InterSystems IRIS in Containers(《在容器中运行 InterSystems IRIS》)。 启动 ICM 要在命令行上启动 ICM,使用下面的 docker run 命令,从注册表中拉出(下载)ICM 映像,从中创建一个容器,并启动该容器,例如: docker run --name icm -it --cap-add SYS_TIME containers.intersystems.com/intersystems/icm:2021.1.0.205.0 ICM 容器中的 /Samples 目录,每个供应商都有一个(/AWS,/GCP,等等),旨在使您能够轻松地使用开箱即用的 ICM 进行配置和部署;您可以使用这些目录之一中的示例配置文件 ,也可以从该目录进行配置和部署。然而,由于这些目录在 ICM 容器内,当容器被删除时,其中的数据就会丢失,包括您的配置文件和 ICM 创建并用于管理配置的基础设施的状态目录。在生产中,最好的做法是在启动 ICM 时通过挂载外部卷使用容器外的位置来存储这些数据(请参见 Docker 文档中的 Manage data in Docker(在 Docker 中管理数据))。 获取云供应商帐户和证书 ICM 可以在四个公共云平台上进行配置和部署:亚马逊网络服务(Amazon Web Services,AWS)、谷歌云平台(Google Cloud Platform,GCP)、微软云(Azure)和腾讯云(Tencent)。 登录您的 AWS、GCP、Azure 或 Tencent 帐户。如果您和您的雇主都还没有帐户,您可以进入AWS、GCP、Azure或Tencent 门户页面,快速创建一个免费帐户。 有关获取 ICM 需要向每个云供应商进行身份验证的帐户凭证的信息,请参见 ICM Guide(《ICM 指南》)的 "ICM Reference(《ICM 参考资料》) "一章中的 Security- Related Parameters(安全相关的参数)。 试一试! 使用 ICM 在云中部署 InterSystems IRIS 生成安全密钥 ICM 与配置基础设施的云供应商、配置的节点上的 Docker 以及容器部署后的若干 InterSystems IRIS 服务进行安全的通信。您已经下载或识别了您的云证书;您还需要其他文件来启用安全的 SSH 和 TLS 通信。 您可以使用 ICM 提供的两个脚本来创建您需要的文件,keygenSSH.sh 脚本创建所需的 SSH 文件并将它们放在 ICM 容器的 /Samples/ssh 目录中。keygenTLS.sh 脚本创建所需的 TLS 文件,并将它们放在 /Samples/tls 中。 要在 ICM 命令行上运行这些脚本,请输入以下内容: # keygenSSH.sh Generating keys for SSH authentication. ... # keygenTLS.sh Generating keys for TLS authentication. ... 有关这些脚本生成的文件的更多信息,请参见 ICM Guide(《ICM指南》)中的 Obtain Security-Related Files(获取安全相关的文件)、ICM Security(ICM 安全)和 Security-Related Parameters(安全相关的参数)。 重要提示: 这些生成的密钥是为了方便您在本文体验和其他测试中使用;在生产中,您应该根据您公司的安全策略来生成或获取所需的密钥。这些脚本生成的密钥以及您的云供应商凭证必须完全安全,因为它们提供了对使用它们的任何 ICM 部署的完全访问权限。 自定义示例配置文件 要定义您希望 ICM 部署的配置,您在两个 JSON 格式的配置文件中包含所需的设置:默认文件和定义文件。前者(defaults.json)包含应用于整个部署的设置 --- 例如,您对云供应商的选择 ------而后者(definitions.json)定义了您想要的节点类型以及每种节点的数量,从而决定了您是部署一个分片集群、一个独立的 IRIS 实例,还是其他配置。 ICM 容器中的 /Samples 目录为所有四个云供应商提供示例配置文件。例如,AWS 的示例配置文件位于 /Samples/AWS 目录中。要自定义这些文件,请选择您要使用的供应商,然后按照下面的表格描述,为该供应商修改示例默认值和定义文件。要做到这一点,您可以使用 vi 等编辑器直接在容器内编辑它们,或者在本地命令行上使用 docker cp 命令将它们从容器复制到本地文件系统,然后在您编辑它们后再次返回,例如: docker cp icm:/Samples/AWS/defaults.json . docker cp icm:/Samples/AWS/definitions.json . ... docker cp defaults.json icm:/Samples/AWS docker cp definitions.json icm:/Samples/AWS 重要提示: 字段名和值都是区分大小写的;例如,要选择 AWS 作为云供应商,您必须在默认文件中包含 "Provider":"AWS" ,而不是 "provider": "AWS"、"Provider": "aws"等等。 自定义 defaults.json 下表详细说明了 /Samples 文件中提供的默认文件所需的最小自定义,以及对可选更改的建议。这里没有涉及到的任何设置都可以在示例文件中保持原样。 试一试! 使用 ICM 在云中部署 InterSystems IRIS 每个设置都连接到 ICM Guide(《ICM 指南》)的 "ICM Reference(《ICM 参考资料》)"一章中的 ICM Configuration Parameters(ICM 配置参数)部分中的相关表格,在那里您可以找到更详细的说明;在那里,搜索您想要的参数。最右边的列显示了在示例默认文件中出现的每个参数或参数集。 要查看所有供应商通用的所有设置,请参见该部分的 General Parameters(常规参数) ;要查看特定于特定供应商的所有设置,请参见 Provider-Specific Parameters(特定于供应商的参数)。 下图显示了 AWS、GCP、Azure 和 Tencent 的示例 defaults.json 文件的内容: 设置 说明 示例 defaults.json 文件中的条目 Provider 识别云基础设施供应商;保留示例 defaults.json 中的值。 “Provider”:[”AWS”|"GCP"|"Azure"|"Tencent"], Label 配置节点的命名方案中的字段, Label-Role-Tag-NNNN (请参见下面的 Role);更新以识别部署的所有者和目的, 例如,使用您的公司名称和“TEST”来创建节点名称,如 Acme-DATA-TEST-0001。 "Label": "Sample", Tag (请参见上面的 Label ) "Tag": "TEST", DataVolumeSize 为每个节点配置的持久化数据卷的大小,这可以在 definitions.json 文件中的各个节点定义中被覆盖;接受示例 defaults.json 中的值,除非您在 Tencent 上配置,在这种情况下,将其改为 60。 "DataVolumeSize": "10", SSHUser 在配置节点上具有 sudo 访问权限的非根帐户,用于 ICM 访问; 您可以保留示例 defaults.json 中的默认值, 但如果您在 AWS 或 Tencent 上更改了机器映像(如下),则可能需要更新此条目。 "SSHUser": "ubuntu",(AWS & Tencent) "SSHUser": "sample",(GCP & Azure) SSHPublicKey SSH 公钥的位置。如果您使用了 Generate Security Keys(生成安全密钥)中讨论的密钥生成脚本, 则密钥位于示例文件指定的目录中,因此无需更改;如果您提供了自己的密钥, 请使用 docker cp 将它们从本地文件系统复制到这些位置。 "SSHPublicKey": "/Samples/ssh/insecure-ssh2.pub", SSHPrivateKey SSH 私钥的位置;请参见上面的 SSHPublicKey。 "SSHPrivateKey": "/Samples/ssh/insecure", TLSKeyDir TILS 文件的位置;请参见上面的 SSHPublicKey 。 "TLSKeyDir": "/Samples/tls/", 设置 说明 示例 defaults.json 文件中的条目 DockerVersion 要安装在已配置节点上的 Docker 版本;保持默认值。 "DockerVersion": "5:19.03.8~3-0~ubuntu-bionic", DockerImage 要部署在已配置节点上的映像;更新以反映您在 Identify Docker Repository and Credentials(识别 Docker 存储库和凭证)中识别的存储库和映像信息。 "DockerImage": "containers.intersystems.con/intersystems/iris:2021.1.0.205.0", DockerUser- name Docker- Password 如果在私有存储库中,则下载 DockerImage 指定的映像所需的凭证;请更新以反映您在 Identify Docker Repository and Credentials(识别 Docker 存储库和凭证)中识别的存储库信息和凭证。 "DockerUsername": "xxxxxxxxxxxx", "DockerPassword": "xxxxxxxxxxxx", LicenseDir InterSystems IRIS 许可证的暂存目录;将您的特定于容器的 InterSystems IRIS 分片(sharding)许可证放在这个目录中。 “LicenseDir”: “/Samples/Licenses”, Region, Location (Azure) 供应商用于配置基础设施的计算资源的地理区域;接受示例 defaults.json 中的默认值,或者从供应商那里选择 region 和 zone 的另一个组合(如下)。 "Region": "us-west-1",(AWS) "Region": "us-east1",(GCP) "Location": "Central US",(Azure) "Region": "na-siliconvalley", (Tencent) Zone 所选区域内的可用区(如上);接受示例 defaults.json 中的默认值,或者从供应商那里选择 region 和 zone 的另一个组合。 "Zone": "us-west-1c",(AWS) "Zone": "us-east1-b",(GCP) "Zone": "1",(Azure) "Zone": "na-siliconvalley-1", (Tencent) Machine image (特定于供应商) 配置节点的平台和 OS 模板;接受示例 defaults.json 中的默认值,或者从供应商那里选择 machine image 和 instance type 的不同组合(如下)。 "AMI": "ami-c509eda6",(AWS) "Image": "ubuntu-os-cloud/ubuntu-1804-bionic-v20180617", (GCP) "PublisherName": "Canonical",(Azure) "Offer": "UbuntuServer",(Azure) "Sku": "18.04-LTS",(Azure) "Version": "18.04.201804262",(Azure) "ImageID": "img-pi0ii46r",(Tencent) 设置 说明 示例 defaults.json 文件中的条目 Instance type (特定于供应商) 配置节点的计算资源模板;接受示例 defaults.json 中的值,或者从供应商那里选择 machine image 和 instance type 的不同组合(如上)。 "InstanceType": "m4.large",(AWS) "MachineType": "n1-standard-1",(GCP) "Size": "Standard_DS2_v2",(Azure) "InstanceType": "S2.MEDIUM4",(Tencent) Credentials and account settings (特定于供应商) ICM 向供应商进行身份验证所需的文件或 ID,因供应商而异;更新以指定您的帐户所需的文件位置或 ID(有关说明,请点击供应商链接)。 “Credentials”:”/Samples/AWS/credentials”, (AWS) "Credentials": "/Samples/GCP/sample.credentials",(GCP) "Project": "dp-icmdevelopment",(GCP) "SubscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",(Azure) "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",(Azure) "ClientSecret": "xxxxxxxxxxxx/xxxxxxxxxxxxxxx/xxxxxxxxxxxxxx=", (Azure) "TenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",(Azure) "SecretID": "xxxxxxxxxxxx",(Tencent) "SecretKey": "xxxxxxxxxxxx",(Tencent) ISCPassword 已部署的 InterSystems IRIS 映像中预定义帐户的密码;要在部署阶段以交互方式提供带有屏蔽输入的密码(为安全起见建议这样做),请删除此字段,否则更改为您的首选密码。 "ISCPassword": "", Mirror 确定部署在 DATA、DM 和 DS 节点上的 InterSystems IRIS 实例是否被配置为镜像;保留默认值。 “Mirror”: “false” 设置 说明 示例 defaults.json 文件中的条目 UserCPF 指定用于覆盖已部署实例的初始 CPF 设置的配置合并文件。(如果您不熟悉配置合并功能或 CPF,请删除此条目;有关配置合并的信息,请参见 ICM Guide(《ICM**指南》)的 "ICM Reference(《ICM 参考资料》)"一章中的 Deploying with Customized InterSystems IRIS Configurations(使用自定义的 InterSystems IRIS 配置进行部署)。) "UserCPF": "/Samples/cpf/iris.cpf" 下图显示了 AWS、GCP、Azure 和 Tencent 的示例 defaults.json 文件的内容: 图 2: 云供应商的 ICM 默认文件示例 自定义 definitions.json 在 /Samples 目录中的示例 definitions.json 文件(对所有供应商来说都是一样的),定义了一个有两个数据节点和两个计算节点的分片集群,如下所示: 试一试! 使用 ICM 在云中部署 InterSystems IRIS [ { "Role": "DATA", "Count": "2", "LicenseKey": "ubuntu-sharding-iris.key" }, { "Role": "COMPUTE", "Count": "2", "StartCount": "3", "LicenseKey": "ubuntu-sharding-iris.key" } ] Role 字段标识正在配置的节点类型,在这种情况下是 DATA 和 COMPUTE。Count 字段表示要配置多少个该类型的节点;对于 COMPUTE 节点,StartCount 从 0003 开始编号。LicenseKey 字段表示 InterSystems IRIS 许可证文件的名称,该文件位于默认文件中由 LicenseDir 字段指定的目录中。 在这个练习中,删除 COMPUTE 定义,只保留 DATA 定义,如下所示: [ { "Role": "DATA", "Count": "2", "LicenseKey": "ubuntu-sharding-iris.key" } ] 部署分片集群时,所有节点必须有分片(sharding)许可证。使用 docker cp 将分片(sharding)许可证复制到 LicenseDir 指定的容器内的位置,如 /Samples/Licenses,并更新 DATA 节点定义中的 LicenseKey 设置,以指定要使用的许可证密钥。 这些是配置基本分片集群所需的唯一 definitions.json 更改。要配置一个独立的 InterSystems IRIS 实例,请使用此定义: [ { "Role": "DM", "Count": "1", "LicenseKey": "standard-iris.key"" }, ] 配置基础设施 默认情况下,ICM 从当前目录中的配置文件中获取输入,因此您需要做的就是将配置基础设施更改为您选择的供应商的 /Samples 目录,例如 /Samples/AWS,并发出这个命令: icm provision icm provision 命令在您选择的平台上分配和配置主机节点。在配置操作期间,ICM 在状态子目录中创建或更新状态和日志文件,完成后创建 instances.json 文件,作为后续部署和管理命令的输入。 因为 ICM 同时运行多个任务,所以这些步骤(Terraform 计划和应用、复制文件、挂载卷等等)可能不会以相同的顺序在节点上启动和完成。完成后,ICM 提供了一个已经配置好的主机节点的摘要,并输出一个命令行,可以在以后用来删除基础设施,如下所示: Machine IP Address DNS Name Region Zone Acme-DATA-TEST-0001 00.53.183.209 ec2-00-53-183-209.us-west-1.compute.amazonaws.com us-west-1 c Acme-DATA-TEST-0002 00.53.183.185 ec2-00-53-183-185.us-west-1.compute.amazonaws.com us-west-1 c To destroy: icm unprovision [-cleanUp] [-force] 试一试! 使用 ICM 在云中部署 InterSystems IRIS 重要提示: 复制输出中提供的 icm unprovision 命令行,并保存此信息,这样您就可以在取消配置时轻松地复制它。这个输出也出现在 icm.log 文件中。 管理和取消配置您的基础设施所需的文件和目录都在 ICM 容器中,因此当您删除它时就会丢失。因此,在完成基础设施并成功地取消配置之前,您不能删除 ICM 容器。(在生产中,最好的做法是在启动 ICM 时通过挂载外部卷使用容器外的位置来存储这些数据(请参见 Docker 文档中的 Manage data in Docker(在 Docker 中管理数据))。 在配置和部署阶段发生的错误的详细信息写入状态目录子目录中的 terraform.err 文件;当发生错误时,ICM 会将您指向适当的文件,该文件可以帮助您识别问题的原因。 如果 icm provision 由于超时和供应商方面的内部错误,或者配置文件中的错误而没有成功完成,您可以根据需要再次发出该命令,直到 ICM 为所有指定的节点完成所有需要的任务而没有错误。更多信息,请参见 ICM Guide(《ICM 指南》)的 "Using ICM(《使用 ICM》) "一章中的 "Reprovisioning the Infrastructure(重新配置基础设施)"。 有关 icm provision 的更多信息,请参见 ICM Guide(《ICM 指南》)中的 The icm provision Command (icm 配置命令)。 部署 InterSystems IRIS 除了在提供的主机节点上下载映像(Image)并将它们作为容器运行外,ICM 还执行特定于 InterSystems IRIS 的配置和其他任务。要在您已配置的节点上部署 InterSystems IRIS,请留在 /Samples 目录,您在其中自定义了配置文件并配置了基础设施,然后发出以下命令: icm run 默认情况下,icm run 下载并运行配置文件中 DockerImage 字段指定的映像,在这种情况下,是来自 InterSystems 存储库的 InterSystems IRIS 映像;每个容器都被命名为 iris。在实践中,在定义文件中的节点定义中使用不同的 DockerImage 字段(而不是对默认文件中的所有节点使用一次,如此处),可以让您在不同的节点类型上运行不同的映像,除此之外,您还可以使用某些选项多次执行 icm run 命令,以便在每个配置的节点上或只在指定节点上部署具有唯一名称的多个容器。 InterSystems IRIS 在每个节点上启动后,ICM 会执行实例所需的任何配置 --- 例如,重置密码、配置分片(sharding)等。因为 ICM 同时运行多个任务,因此部署过程中的步骤可能不会以相同的顺序在节点上启动和完成。 完成后,ICM 输出一个链接到相应的 InterSystems IRIS 实例的管理门户(Management Portal): $ icm run -definitions definitions_cluster.json Executing command 'docker login' on ACME-DATA-TEST-0001... ...output in /Samples/AWS/state/ACME-DATA-TEST/ACME-DATA-TEST-0001/docker.out ... Pulling image intersystems/iris:2021.1.0.205.0 on ACME-DATA-TEST-0001... ...pulled ACME-DATA-TEST-0001 image intersystems/iris:2021.1.0.205.0 ... Creating container iris on ACME-DATA-TEST-0002... ... Management Portal available at: http://ec2-00-53-183-209.us-west-1.compute.amazonaws.com:52773/csp/sys/UtilHome.csp 在这种情况下,所提供的链接用于数据节点 1,或者用于独立的实例(如果这是您选择的配置)。在浏览器中打开链接,并使用管理门户(Management Portal)探索 InterSystems IRIS。 与 icm provision 一样,如果 icm run 由于超时和供应商方面的内部错误而没有成功完成,您可以再次发出命令;在大多数情况下,反复尝试,部署就会成功。但是,如果错误仍然存在,并且需要手动干预 --- 例如,如果它是由某个配置文件中的错误引起的 --- 在修复问题后,您可能需要删除受影响的一个或多个节点上的持久化 %SYS 数据, 试一试! 使用 ICM 在云中部署 InterSystems IRIS 在重新发布 icm run 命令之前,如 ICM Guide(《ICM 指南》)的 "Using ICM(《使用 ICM》)"一章中的 Redeploying Services(重新部署服务)所述。在出现错误的情况下,请参见 ICM 指向您访问的日志文件,以获得有助于您确定问题原因的信息。 有关 icm run 命令及其选项的更多信息,请参见 ICM Guide(《ICM 指南》)中的 The icm run Command(icm run 命令)。 尝试 ICM 管理命令 ICM 提供了一系列的命令用于 管理配置的基础设施。 管理部署的容器。 与运行在部署的容器中的服务交互,包括 InterSystems IRIS。 这些命令在 ICM Guide(《ICM 指南》)的 Infrastructure Management Commands(基础设施管理命令)、Container Management Commands(容器管理命令)和 Service Management Commands(服务管理命令)小节中有详细的讨论,并在 ICM Commands and Options(ICM 命令和选项)中全面列出。这里提供了一些示例,供您在部署时试用。特别要注意的是,有三个命令(icm ssh、icm exec 和 icm session)可以让您在多个层次上与您部署的节点交互 --- 与节点本身、与部署在它上面的容器以及与容器内运行的 InterSystems IRIS 实例,如下所示: 图 3: 交互式 ICM 命令 在您新部署的 InterSystems IRIS 配置上试试这些命令吧! 列出配置的主机节点: 试一试! 使用 ICM 在云中部署 InterSystems IRIS icm inventory 在每个主机节点上运行 shell 命令: icm ssh -command "df -k" 当一个命令在多个节点上执行时,输出被写入文件,并提供一个输出文件的列表。例如,在这种情况下,如果您部署了分片集群,三个节点各有一个输出文件。 在特定的主机节点上打开交互式 shell: icm ssh -role DATA -interactive 要做到交互,命令必须使用 -interactive 选项并指定单个节点。例如,虽然 icm ssh 可以在多个节点上执行命令,如前面的示例所示,但它只能使用 -interactive 选项在一个节点上打开交互式 shell,如本例所示。代替 -role DM 选项将命令限制在该类型的节点上(在您的部署中只有一个节点),您也可以使用-machine 选项来指定一个特定节点的名称,例如: icm ssh -machine Acme-DATA-TEST-0001 -interactive 显示部署的 InterSystems IRIS 容器的状态: icm ps 当在节点上部署了多个容器时,这个命令会将它们全部列出。 将本地文件复制到 InterSystems IRIS 容器或其中一个容器: icm cp -localPath /Samples/ssh/ssh_notes -remotePath /home/sshuser icm cp -localPath /Samples/ssh/ssh_notes -remotePath /home/sshuser -role DM 在每个 InterSystems IRIS 容器中运行 shell 命令: icm exec -command "ls /irissys/" 在特定的 InterSystems IRIS 容器中打开一个交互式 shell(或运行任何 shell 命令): icm exec -command "bash" -role DATA -interactive 为 InterSystems IRIS 实例打开一个终端(Terminal)窗口(对于单个实例,总是交互式的): icm session -machine Acme-DATA-TEST-0001 针对 InterSystems IRIS 的每个实例,或针对特定的实例,运行 SQL 命令: icm sql -command "SELECT Name FROM Security.Users" icm sql -command "SELECT Name FROM Security.Users" -machine Acme-DATA-TEST-0002 取消配置基础设施 因为 AWS 和其他公共云平台实例会不断产生费用,所以在完成这一体验后,立即取消配置基础设施是很重要的。 要做到这一点,把您从 icm provision 的输出中保存的 icm unprovision 命令复制到 ICM 命令行,例如: $ icm unprovision -cleanUp ICM 能做的远不止这些! 如果您没有从配置输出中保存命令,您可以在工作目录的 icm.log 文件中找到它(例如,/Samples/AWS/icm.log)。-cleanUp 选项在取消配置后会删除状态目录;如果没有这个选项,状态目录会被保留下来。 ICM 能做的远不止这些! 尽管您刚刚完成的 ICM 探索是刻意简化的,但它仍包含了现实世界的基础设施配置和服务部署。添加到您刚刚完成的只是在配置文件中扩展您的部署定义并利用大量命令行选项的问题。例如,您可以 通过定义 AM 节点和 DM 节点,部署应用服务器和数据服务器的分布式缓存集群,或通过仅定义 DM 节点部署独立的 InterSystems IRIS 实例。 部署镜像(mirror) DATA 节点或镜像 DM 节点,只需在默认文件中包含"Mirror":"True",并在定义文件中定义偶数个 DATA 节点或两个 DM 节点和一个 AR(仲裁器)节点。 部署一个包含 COMPUTE 节点的分片集群,以分离查询和数据摄取工作量,同时保持并行处理和分布式缓存的优势,提高两者的性能。 在定义文件中添加 web 服务器(WS)和负载均衡器(LB 或自动)。 通过在定义文件中为不同的节点指定不同的 DockerImage 值,并多次执行 icm run 命令,在不同的节点上部署不同的服务。 通过多次执行 icm run ,同时在命令行中使用 -container 和 -image 选项指定不同的容器名称和映像(包括自定义和第三方映像),在一些或所有节点上部署多个服务。 通过使用第三方工具和内部脚本扩展 ICM 的功能,进一步提高自动化程度,减少工作量。 在已有的虚拟和物理集群上部署服务。 在不部署服务的情况下配置基础设施,只需使用 ICM provision 命令停止。 所有这些可能性以及更多的可能性都在 ICM Guide(《ICM 指南》)中有所涉及。 了解有关 ICM 的更多信息 要了解有关 ICM 和在容器中使用 InterSystems IRIS 的更多信息,请参见 InterSystems Cloud Manager Introduction(《InterSystems 云管理器简介》) (视频) The Benefits of InterSystems Cloud Manager(《InterSystems 云管理器的优势》) (视频) Experience InterSystems IRIS in the Cloud(在云中体验 InterSystems IRIS) (在线体验) InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》) First Look:InterSystems Products in Containers(《技术概要:容器中的 InterSystems 产品》) Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)
文章
Nicky Zhu · 九月 9, 2021

IRIS 2021 技术文档 First Look 22 -- 技术概要:部署 InterSystems 分片集群

本文档将您介绍InterSystems IRIS®数据平台的分片(sharding)功能,以及它在分片集群中的使用,以水平扩展 InterSystems IRIS 的数据量。 作为本指南的一部分,您将使用 ICM 在公共云中提供的分片集群,并了解分片表(sharding a table)如何在集群中的分片之间分布其行。 分片(Sharding)如何帮助您? 您感受到大数据(Big Data)的热度了吗? 无论是否准备好了,我们都在管理比以往任何时候都多的数据,并被要求用这些数据做更多的事情——所需的响应时间也越来越短。无论您是照顾一千万名患者、每天处理数十亿的金融订单,追踪一个星系的恒星,还是监控一千个工厂的引擎,数据平台不仅要支持您目前的数据工作量,而且还必须在保持性能的同时进行扩展(Scale),以满足不断增长的需求,避免业务中断。每个特定业务的工作量对其运行的数据平台提出了不同的挑战 — 而随着工作量的增加,这些挑战将变得更加严峻。 InterSystems IRIS 包含一套全面的功能来扩展(Scale)您的应用程序,这些功能可以单独或组合应用,这取决于您的工作量的性质和它所面临的特定性能挑战。其中之一是分片(sharding),它在多个服务器上对数据及其相关缓存进行分区,为查询和数据摄取提供灵活、价优的性能扩展,同时通过高效的资源利用使基础设施价值最大化。InterSystems IRIS 分片集群(sharded cluster) 可以为各种应用程序提供显著的性能优势,特别是对于那些工作量包括以下一项或多项的应用程序: 高容量或高速数据摄入,或组合。 相对较大的数据集,返回大量数据的查询,或两者兼有。 执行大量数据处理的复杂查询,例如扫描磁盘上的大量数据或涉及大量计算工作的查询。 这些因素各自都会影响分片(sharding)的潜在收益,但如果将它们结合起来,收益可能会得到增强。例如,所有这三个因素的组合——快速摄入的大量数据、大型数据集以及检索和处理大量数据的复杂查询——使得如今的许多分析工作量非常适合进行分片(sharding)。 请注意,这些特征都与数据有关;InterSystems IRIS 分片(sharding)的主要功能是扩展数据量(sharded cluster)。但是,当涉及部分或所有这些数据相关因素的工作量也经历了来自大量用户的非常高的查询量时,分片集群也可以包括扩展用户量(scale for user volume)功能。分片(sharding)也可以与垂直扩展相结合。通过 InterSystems IRIS,您可以为工作量的性能挑战创建恰到好处的整体扩展解决方案。 分片(Sharding)是如何工作的? 分片架构的核心是跨多个系统对数据及其相关缓存进行分区。分片集群将大型数据库表水平(即按行)划分为多个 InterSystems IRIS 实例,称为数据节点(data node),同时允许应用程序通过这些实例中的任何一个访问这些表。每个数据节点在集群分片数据中的份额被称为分片(shard)。这种架构有三个优势: 并行处理(Parallel processing) 查询在数据节点上并行运行,合并查询结果,并作为完整的查询结果返回给应用程序,在许多情况下显著提高了执行速度。 分区缓存(Partitioned caching) 每个数据节点都有自己的专用缓存,而不是由单个实例的缓存为整个数据集服务,这大大降低了缓存溢出和强制降低性能的磁盘读取的风险。 并行加载(Parallel loading) 数据可以并行加载到数据节点上,从而减少摄取工作量和查询工作量之间的缓存和磁盘争夺,提高两者的性能。 一个被称为分片管理器(sharding manager)的联合软件组件会跟踪哪些数据位于哪些数据节点上,并相应地指导查询。非分片数据存储在配置的第一个数据节点上,称为数据节点 1 (它也存储代码和元数据)。从应用程序 SQL 的角度来看,分片表(sharded table)和非分片表(nonsharded table)之间的区别是完全透明的。 图 1: 一个基本的分片集群 试一试!部署和演示 InterSystems IRIS 分片集群 在这次探索中,您将 使用 InterSystems 云管理器(InterSystems Cloud Manager,ICM)在公共云中部署基本的分片集群。 ICM 是一个自动化的命令行工具,可以轻松地在云中配置基础设施,并在提供的节点上部署 InterSystems IRIS 和其他服务。ICM 负责所有需要的 InterSystems IRIS 配置,所以如果您指定了一个分片集群,该集群在部署完成后就可以使用了。 使用不同的分片键(shard key)从相同的数据中创建三个分片表(sharded table),并观察数据节点上跨分片的行的不同分布。 分片键是用来确定分片表的哪些行存储在哪些分片上的一个或多个字段。默认情况下,RowID 被用作分片键,这种分布对于大多数分片表来说是最有效的方法,因为它提供了数据均匀分布的最佳保证,并允许最有效的并行数据加载。然而,在一种情况下,用户定义的键可能是有益的。当您对在字段或用于连接它们的字段上的查询中经常连接的两个大表进行分片时,要连接的行被存储在相同的分片上,并且连接可以在每个分片上本地执行,而不是跨分片执行(across the shard),从而提供显著的性能提升。这被称为 cosharded 连接(cosharded join)。 在所有三个分片表上运行相同的查询,以证明跨分片的行分布对查询是完全透明。 为了向您介绍分片(sharding),而又不至于让您在细节上陷入困境,我们保持了简单的探索。生产中的分片集群需要计划和许多决策,所以确保不要把对分片(sharding)的探索和真实情况相混淆!例如,在设计一个生产集群时,您将检查您的架构和表,以决定哪些表将被分片,然后根据分片数据的预期工作集和服务器上数据库缓存的可用内存量,决定部署多少个数据节点(通常为 4 到 16 个)。然而,在本次探索中,您将部署一个由两个数据节点组成的基本集群。本文档末尾列出的参考资料将使您对生产中使用分片(sharding )的情况有一个很好的了解。Scalability Guide(《可扩展性指南》)中的 "Horizontally Scaling for Data Volume Sharding(《水平扩展数据卷分片[Sharding]》)"一章提供了有关分片(sharding)和分片集群的详细信息。 这些说明假定您有 InterSystems IRIS 分片(sharding)许可证并可以访问 InterSystems 软件下载。 使用 ICM 部署集群 您可以在 First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》)中找到使用 ICM 在亚马逊网络服务(Amazon Web Services)公共云平台上部署分片集群的程序;特别是在 Try It!Deploy InterSystems IRIS in the Cloud with ICM(试一试!使用 ICM 在云中部署 InterSystems IRIS)部分。您可以使用此处显示的整个程序。当您进入自定义定义.json(Customize definitions.json)时,验证每个 LicenseKey 字段的值是否是 defaults.json 文件中 LicenseDir 字段指定的暂存位置中的 InterSystems IRIS 分片(sharding)许可证的文件名。当您完成了部署阶段(部署 InterSystems IRIS[Deploy InterSystems IRIS])后,留在 ICM 容器中。 注意: 正如 Scalability Guide(《可扩展性指南》)中的 Deploying the Sharded Cluster(部署分片集群) 所描述的那样,您也可以在现有的物理、虚拟或云机器上安装 InterSystems IRIS 实例,并使用分片 API(Sharding API) 或管理门户(Management Portal)部署分片集群,或使用多种方法之一自动化部署分片集群。 使用不同的分片键以不同的方式分布行,然后查询分片表 为了了解分片集群如何根据您使用的分片键(shard key)在数据节点上的分片上对分片表(sharded table)进行分区,您将连接到集群并执行以下步骤: 创建并填充一个小型的非分片表。 使用三个不同的分片键,创建三个与非分片表具有相同字段的分片表 。 从非分片表中填充分片表。 从分片表中选择行,以查看在每种情况下,行在分片(数据节点)上的分布情况。 当一个表被分片时,RowID 值被从每个分片的不同范围分配,从相隔甚远的范围开始;相同范围的行在同一个分片上。当处理一个小表时,就像本例一样,分片的 RowID 很容易区分,清楚地告诉您哪些行在一个分片上,哪些在另一个分片上(尽管您无法分辨哪个分片是哪个)。在 RowID 上分片的表的行的分布方式与行中的数据没有关系,如果您清空并重新加载一个表,可能会有所不同。另一方面,用户定义的分片键,根据键中一个或多个字段的值来分配行,因此当您清空并重新加载表(假设值和分片数没有改变)时将是相同的。 查询所有三个表以获得其中一个字段的最大长度,来显示跨分片(across shards)的行的分布对查询是透明的。 对于这部分探索,请使用以下程序: 为任意一个数据节点实例打开终端(Terminal)窗口。 在 ICM 命令行上, 发出命令 icm session 命令,使用 -machine 选项指定一个数据节点的名称,使用 - namespace 选项指定集群命名空间 IRISCLUSTER (或者使用默认文件中的 Namespace 字段指定的命名空间,如果不同的话)。 如果您不确定节点的名称,可以使用 icm inventory 命令来显示节点名称: $ icm inventory Machine IP Address DNS Name Region Zone Acme-DATA-TEST-0001 00.53.183.209 ec2-00-53-183-209.us-west-1.compute.amazonaws.com us-west-1 c Acme-DATA-TEST-0002 00.53.183.185 ec2-00-53-183-185.us-west-1.compute.amazonaws.com us-west-1 c 选择一个节点(哪个节点并不重要)并发出命令: icm session -machine Acme-DATA-TEST-0002 -namespace IRISCLUSTER icm session 命令为指定节点上的 InterSystems IRIS 实例打开一个终端(Terminal)窗口。 如果您使用 %SYSTEM.Cluster.Sharding API 手动部署您的集群,使用 InterSystems IRIS Basics:Connecting an IDE(《技术概要:连接一个 IDE》)中的procedure described for your instance(为您的实例描述的程序),在任一实例上打开一个终端(Terminal)窗口,然后切换到 IRISCLUSTER 命名空间 (或者初始化集群时指定的命名空间,如果不同的话)。 Node: Acme-DATA-TEST-0002, Instance: IRIS USER>set $namespace="IRISCLUSTER" IRISCLUSTER> 打开终端(Terminal)SQL shell:IRISCLUSTER>do $SYSTEM.SQL.Shell() [SQL]IRISCLUSTER>> 使用以下 SQL 语句,创建并填充非分片表 test.nonsharded。 CREATE TABLE test.nonsharded (field1 CHAR(5), field2 CHAR(5)) INSERT INTO test.nonsharded (field1,field2) VALUES ('one','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('one','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('one','three') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('two','three') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','one') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','two') INSERT INTO test.nonsharded (field1,field2) VALUES ('three','three') 使用 SELECT 来查看表的内容: SELECT * FROM test.nonsharded field1 field2 one one one two one three two one two two two three three one three two three three 使用 test.nonsharded 中的相同字段创建三个分片表,在第一个表中使用默认的分片键(RowID),在第二个表中使用 field1 字段,在第三个表中使用 field2 字段,并使用从 test.nonsharded 中选择的 INSERT INTO 语句填充每一个: CREATE TABLE test.rowid (field1 CHAR(5), field2 CHAR(5), SHARD) INSERT INTO test.rowid (field1,field2) SELECT field1,field2 FROM test.nonsharded CREATE TABLE test.field1 (field1 CHAR(5), field2 CHAR(5), SHARD KEY (field1)) INSERT INTO test.field1 (field1,field2) SELECT field1,field2 FROM test.nonsharded CREATE TABLE test.field2 (field1 CHAR(5), field2 CHAR(5), SHARD KEY (field2)) INSERT INTO test.field2 (field1,field2) SELECT field1,field2 FROM test.nonsharded 使用 SELECT *,%ID 来显示每个分片表的内容和它在分片上的 RowID。 SELECT *,%ID FROM test.rowid ORDER BY %ID field1 field2 ID one one 1 one two 2 two one 3 two two 4 three three 5 one three 256000 two three 256001 three one 256002 three two 256003 这个分布并不反映 field1 或 field2 的值(具有各自全部三个值的行位于两个分片上)。如果您删除、重新创建并重新加载 test.rowid,分布可能会有所不同。 SELECT *,%ID FROM test.field1 ORDER BY %ID field1 one one one field2 one 1 two 2 three 3 ID two one 256000 two two 256001 two three 256002 three one 256003 three two 256004 three three 256005 在 field1 字段上分片(sharding)会分布行,使那些具有相同 field1 值的行被放在同一个分片上。在这种情况下,值为 1 的行在一个分片上,值为 2 和 3 的行在另一个分片上,但是哪个数值最终在哪个分片上取决于有多少个分片和多少个数值。 SELECT *,%ID FROM test.field2 ORDER BY %ID field1 field2 ID one one 1 two one 2 three one 3 one two 256000 one three 256001 two two 256002 two three 256003 three two 256004 three three 256005 这里,分布是由 field2 字段的值决定的。 最后,作为分片如何将工作分配到数据节点的示例,对所有三个分片表使用以下 SELECT 语句: SELECT MAX(LENGTH(field2)) FROM <table> 在每种情况下,结果都是 5,即最长值的长度是 3,因为跨分片的行分布对查询来说是完全透明的。 MAX(LENGTH(field2)) 表达式在每个分片上独立计算,分片管理器选择它们返回结果的 MAX()。例如,当查询在 test.field2 表上运行时,一个分片返回 3,因为它在 field2 字段中只有值 1 ,而另一个分片返回 5;然后分片管理器选择 5 作为两个结果中较大的那个。 如果您愿意,可以使用 EXPLAIN 来显示查询计划,明确指出如何将工作发送到分片上: EXPLAIN SELECT MAX(LENGTH(field2)) FROM <table> 更多分片集群选项 分片集群的其他选项包括如下内容: 您可以随时添加数据节点,并跨扩展的数据节点集重新平衡现有的分片数据。重新平衡(Rebal ancing)不能与查询和更新同时进行,因此只有在分片集群离线并且没有其他分片操作的情况下才能进行。( Scalability Guide[《可扩展性指南》]中的 Add Nodes and Rebalance Data[添加节点和重新平衡数据] ) 要为集群上的数据添加高可用性,您可以将数据节点部署为镜像故障转移对。( Scalability Guide[《可扩展性指南》]中的 Mirror for High Availability[高可用性镜像])。 对于需要极低查询延迟的高级用例(可能与不断涌入的数据相冲突),可以添加计算节点 ,为查询服务提供一个透明的缓存层。当集群包含计算节点时,只读的查询会自动在计算节点上并行执行,而不是在数据节点上执行;所有写入操作(插入、更新、删除和 DDL 操作)继续在数据节点上执行。这种分工将查询和数据摄取工作量分开,同时保持并行处理和分布式缓存的优势,提高两者的性能。(Scalability Guide[《可扩展性指南》]中的 Deploy Compute Nodes[部署计算节点]) 了解有关分片(Sharding)的更多信息 要了解有关分片的更多信息,请参见 Data Platform Scalability Technology Overview(《数据平台可扩展性技术概要》) (视频) Introduction to Sharding(《分片简介》) (在线课程) Sharding Basics(《分片基础》) (在线课程) Experience InterSystems IRIS in the Cloud(在云中体验 InterSystems IRIS) (在线体验) Scalability Guide(《可扩展性指南》) First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》)
文章
Jingwei Wang · 十月 28, 2021

IRIS 2021 技术文档 First Look 31:InterSystems IRIS 和 UIMA

html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; } .mac-os-11 { --title-bar-height: 28px; } html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; } body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit; background-repeat: inherit; } iframe { margin: auto; } a.url { word-break: break-all; } a:active, a:hover { outline: 0px; } .in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); } #write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; } #write.first-line-indent p { text-indent: 2em; } #write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; } #write.first-line-indent li { margin-left: 2em; } .for-image #write { padding-left: 8px; padding-right: 8px; } body.typora-export { padding-left: 30px; padding-right: 30px; } .typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; } .typora-export .task-list-item input { pointer-events: none; } @media screen and (max-width: 500px) { body.typora-export { padding-left: 0px; padding-right: 0px; } #write { padding-left: 20px; padding-right: 20px; } .CodeMirror-sizer { margin-left: 0px !important; } .CodeMirror-gutters { display: none !important; } } #write li > figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max-width: 100%; vertical-align: middle; image-orientation: from-image; } button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; } input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; } *, ::after, ::before { box-sizing: border-box; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; } p { line-height: inherit; } h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; } p { orphans: 4; } h1 { font-size: 2rem; } h2 { font-size: 1.8rem; } h3 { font-size: 1.6rem; } h4 { font-size: 1.4rem; } h5 { font-size: 1.2rem; } h6 { font-size: 1rem; } .md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; } .hidden { display: none; } .md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; } a { cursor: pointer; } sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; } sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; } #write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; } figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; } figure > table { margin: 0px; } tr { break-inside: avoid; break-after: auto; } thead { display: table-header-group; } table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; } table.md-table td { min-width: 32px; } .CodeMirror-gutters { border-right-width: 0px; background-color: inherit; } .CodeMirror-linenumber { } .CodeMirror { text-align: left; } .CodeMirror-placeholder { opacity: 0.3; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-lines { padding: 0px; } div.hr:focus { cursor: none; } #write pre { white-space: pre-wrap; } #write.fences-no-line-wrapping pre { white-space: pre; } #write pre.ty-contain-cm { white-space: normal; } .CodeMirror-gutters { margin-right: 4px; } .md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit; background-repeat: inherit; } .md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; } #write .md-fences.mock-cm { white-space: pre-wrap; } .md-fences.md-fences-with-lineno { padding-left: 0px; } #write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; } .md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; } .CodeMirror-line, twitterwidget { break-inside: avoid; } .footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; } .footnotes + .footnotes { margin-top: 0px; } .md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; } li div { padding-top: 0px; } blockquote { margin: 1rem 0px; } li .mathjax-block, li p { margin: 0.5rem 0px; } li blockquote { margin: 1rem 0px; } li { margin: 0px; position: relative; } blockquote > :last-child { margin-bottom: 0px; } blockquote > :first-child, li > :first-child { margin-top: 0px; } .footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; } #write .footnote-line { white-space: pre-wrap; } @media print { body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; } #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; } .typora-export * { -webkit-print-color-adjust: exact; } .typora-export #write { break-after: avoid; } .typora-export #write::after { height: 0px; } .is-mac table { break-inside: avoid; } .typora-export-show-outline .typora-export-sidebar { display: none; } } .footnote-line { margin-top: 0.714em; font-size: 0.7em; } a img, img a { cursor: pointer; } pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; } p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; } #write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; } p > .md-image:only-child { display: inline-block; width: 100%; } #write .MathJax_Display { margin: 0.8em 0px 0px; } .md-math-block { width: 100%; } .md-math-block:not(:empty)::after { display: none; } .MathJax_ref { fill: currentcolor; } [contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; } .md-task-list-item { position: relative; list-style-type: none; } .task-list-item.md-task-list-item { padding-left: 0px; } .md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; } .math { font-size: 1rem; } .md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; } .md-toc-content { position: relative; margin-left: 0px; } .md-toc-content::after, .md-toc::after { display: none; } .md-toc-item { display: block; color: rgb(65, 131, 196); } .md-toc-item a { text-decoration: none; } .md-toc-inner:hover { text-decoration: underline; } .md-toc-inner { display: inline-block; cursor: pointer; } .md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; } .md-toc-h2 .md-toc-inner { margin-left: 2em; } .md-toc-h3 .md-toc-inner { margin-left: 4em; } .md-toc-h4 .md-toc-inner { margin-left: 6em; } .md-toc-h5 .md-toc-inner { margin-left: 8em; } .md-toc-h6 .md-toc-inner { margin-left: 10em; } @media screen and (max-width: 48em) { .md-toc-h3 .md-toc-inner { margin-left: 3.5em; } .md-toc-h4 .md-toc-inner { margin-left: 5em; } .md-toc-h5 .md-toc-inner { margin-left: 6.5em; } .md-toc-h6 .md-toc-inner { margin-left: 8em; } } a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } .footnote-line a:not(.reversefootnote) { color: inherit; } .md-attr { display: none; } .md-fn-count::after { content: "."; } code, pre, samp, tt { font-family: var(--monospace); } kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; } .md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); } code { text-align: left; } a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; } .md-inline-math .MathJax_SVG .noError { display: none !important; } .html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; } .md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; } .MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; } .MathJax_SVG .MJX-monospace { font-family: var(--monospace); } .MathJax_SVG .MJX-sans-serif { font-family: sans-serif; } .MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; zoom: 90%; } #math-inline-preview-content { zoom: 1.1; } .MathJax_SVG * { transition: none; } .MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; } .os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; } .md-diagram-panel > svg { max-width: 100%; } [lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; } [lang="mermaid"] .node text { font-size: 1rem; } table tr th { border-bottom-width: 0px; } video { max-width: 100%; display: block; margin: 0px auto; } iframe { max-width: 100%; width: 100%; border: none; } .highlight td, .highlight tr { border: 0px; } mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); } .md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; } .md-expand mark .md-meta { opacity: 0.3 !important; } mark .md-meta { color: rgb(0, 0, 0); } @media print { .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; } } .md-diagram-panel .messageText { stroke: none !important; } .md-diagram-panel .start-state { fill: var(--node-fill); } .md-diagram-panel .edgeLabel rect { opacity: 1 !important; } .md-require-zoom-fix foreignObject { font-size: var(--mermaid-font-zoom); } .md-fences.md-fences-math { font-size: 1em; } .md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; } .md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; } .md-fences-advanced:not(.md-focus) { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; } .typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; } .typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; } .typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; } @media screen and (max-width: 1024px) { .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; } } @media screen and (max-width: 800px) { .typora-export-sidebar { display: none; } } .outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; } .outline-content ul { margin-top: 0px; margin-bottom: 0px; } .outline-content strong { font-weight: 400; } .outline-expander { width: 1rem; height: 1.428571429rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; } .outline-expander::before { content: ''; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; } .outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; } .outline-expander:hover::before { content: ''; } .outline-h1 > .outline-item { padding-left: 0px; } .outline-h2 > .outline-item { padding-left: 1em; } .outline-h3 > .outline-item { padding-left: 2em; } .outline-h4 > .outline-item { padding-left: 3em; } .outline-h5 > .outline-item { padding-left: 4em; } .outline-h6 > .outline-item { padding-left: 5em; } .outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; } .outline-label:hover { text-decoration: underline; } .outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); } .outline-item:hover { margin-left: -28px; margin-right: -28px; border-left-width: 28px; border-left-style: solid; border-left-color: transparent; border-right-width: 28px; border-right-style: solid; border-right-color: transparent; } .outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; } .outline-item-open > .outline-item > .outline-expander::before { content: ''; } .outline-children { display: none; } .info-panel-tab-wrapper { display: none; } .outline-item-open > .outline-children { display: block; } .typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; } .typora-export .outline-item:hover { margin-right: -8px; border-right-width: 8px; border-right-style: solid; border-right-color: transparent; } .typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; } .typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: '−'; } .typora-export-collapse-outline .outline-children { display: none; } .typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; } .typora-export-no-collapse-outline .outline-expander::before { content: "" !important; } .typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; } .CodeMirror { height: auto; } .CodeMirror.cm-s-inner { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-scroll { overflow: auto hidden; z-index: 3; } .CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); } .CodeMirror-gutters { border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; white-space: nowrap; background-position: inherit; background-repeat: inherit; } .CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); } .cm-s-inner .cm-keyword { color: rgb(119, 0, 136); } .cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); } .cm-s-inner .cm-number { color: rgb(17, 102, 68); } .cm-s-inner .cm-def { color: rgb(0, 0, 255); } .cm-s-inner .cm-variable { color: rgb(0, 0, 0); } .cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); } .cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); } .cm-s-inner .cm-string { color: rgb(170, 17, 17); } .cm-s-inner .cm-property { color: rgb(0, 0, 0); } .cm-s-inner .cm-operator { color: rgb(152, 26, 26); } .cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); } .cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); } .cm-s-inner .cm-meta { color: rgb(85, 85, 85); } .cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); } .cm-s-inner .cm-builtin { color: rgb(51, 0, 170); } .cm-s-inner .cm-bracket { color: rgb(153, 153, 119); } .cm-s-inner .cm-tag { color: rgb(17, 119, 0); } .cm-s-inner .cm-attribute { color: rgb(0, 0, 204); } .cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); } .cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); } .cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); } .cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); } .cm-negative { color: rgb(221, 68, 68); } .cm-positive { color: rgb(34, 153, 34); } .cm-header, .cm-strong { font-weight: 700; } .cm-del { text-decoration: line-through; } .cm-em { font-style: italic; } .cm-link { text-decoration: underline; } .cm-error { color: red; } .cm-invalidchar { color: red; } .cm-constant { color: rgb(38, 139, 210); } .cm-defined { color: rgb(181, 137, 0); } div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); } div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); } .cm-s-inner .CodeMirror-activeline-background { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror { position: relative; overflow: hidden; } .CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .CodeMirror-sizer { position: relative; } .CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; } .CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; } .CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; } .CodeMirror-gutter-filler { left: 0px; bottom: 0px; } .CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; border: none !important; background-position: 0px 0px !important; } .CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-lines { cursor: text; } .CodeMirror pre { border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; border-width: 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; word-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; background-position: 0px 0px; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-code pre { border-right-width: 30px; border-right-style: solid; border-right-color: transparent; width: fit-content; } .CodeMirror-wrap .CodeMirror-code pre { border-right-style: none; width: auto; } .CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right-style: none; width: 0px; } .CodeMirror div.CodeMirror-cursor { visibility: hidden; } .CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; } .cm-searching { background-color: rgba(255, 255, 0, 0.4); } span.cm-underlined { text-decoration: underline; } span.cm-strikethrough { text-decoration: line-through; } .cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); } .cm-tw-deleted { text-decoration: line-through; } .cm-tw-header5 { font-weight: 700; } .cm-tw-listitem:first-child { padding-left: 10px; } .cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; } .cm-tw-underline { text-decoration: underline; } @media print { .CodeMirror div.CodeMirror-cursor { visibility: hidden; } } :root { --side-bar-bg-color: #fafafa; --control-text-color: #777; } @include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext); /* open-sans-regular - latin-ext_latin */ /* open-sans-italic - latin-ext_latin */ /* open-sans-700 - latin-ext_latin */ /* open-sans-700italic - latin-ext_latin */ html { font-size: 16px; } body { font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 1.6; } #write { max-width: 860px; margin: 0 auto; padding: 30px; padding-bottom: 100px; } @media only screen and (min-width: 1400px) { #write { max-width: 1024px; } } @media only screen and (min-width: 1800px) { #write { max-width: 1200px; } } #write > ul:first-child, #write > ol:first-child{ margin-top: 30px; } a { color: #4183C4; } h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; } h1 tt, h1 code { font-size: inherit; } h2 tt, h2 code { font-size: inherit; } h3 tt, h3 code { font-size: inherit; } h4 tt, h4 code { font-size: inherit; } h5 tt, h5 code { font-size: inherit; } h6 tt, h6 code { font-size: inherit; } h1 { font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee; } h2 { font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee; } /*@media print { .typora-export h1, .typora-export h2 { border-bottom: none; padding-bottom: initial; } .typora-export h1::after, .typora-export h2::after { content: ""; display: block; height: 100px; margin-top: -96px; border-top: 1px solid #eee; } }*/ h3 { font-size: 1.5em; line-height: 1.43; } h4 { font-size: 1.25em; } h5 { font-size: 1em; } h6 { font-size: 1em; color: #777; } p, blockquote, ul, ol, dl, table{ margin: 0.8em 0; } li>ol, li>ul { margin: 0 0; } hr { height: 2px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none; overflow: hidden; box-sizing: content-box; } li p.first { display: inline-block; } ul, ol { padding-left: 30px; } ul:first-child, ol:first-child { margin-top: 0; } ul:last-child, ol:last-child { margin-bottom: 0; } blockquote { border-left: 4px solid #dfe2e5; padding: 0 15px; color: #777777; } blockquote blockquote { padding-right: 0; } table { padding: 0; word-break: initial; } table tr { border: 1px solid #dfe2e5; margin: 0; padding: 0; } table tr:nth-child(2n), thead { background-color: #f8f8f8; } table th { font-weight: bold; border: 1px solid #dfe2e5; border-bottom: 0; margin: 0; padding: 6px 13px; } table td { border: 1px solid #dfe2e5; margin: 0; padding: 6px 13px; } table th:first-child, table td:first-child { margin-top: 0; } table th:last-child, table td:last-child { margin-bottom: 0; } .CodeMirror-lines { padding-left: 4px; } .code-tooltip { box-shadow: 0 1px 1px 0 rgba(0,28,36,.3); border-top: 1px solid #eef2f2; } .md-fences, code, tt { border: 1px solid #e7eaed; background-color: #f8f8f8; border-radius: 3px; padding: 0; padding: 2px 4px 0px 4px; font-size: 0.9em; } code { background-color: #f3f4f4; padding: 0 2px 0 2px; } .md-fences { margin-bottom: 15px; margin-top: 15px; padding-top: 8px; padding-bottom: 6px; } .md-task-list-item > input { margin-left: -1.3em; } @media print { html { font-size: 13px; } table, pre { page-break-inside: avoid; } pre { word-wrap: break-word; } } .md-fences { background-color: #f8f8f8; } #write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border: 0; border-radius: 3px; color: #777777; margin-top: 0 !important; } .mathjax-block>.code-tooltip { bottom: .375rem; } .md-mathjax-midline { background: #fafafa; } #write>h3.md-focus:before{ left: -1.5625rem; top: .375rem; } #write>h4.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h5.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h6.md-focus:before{ left: -1.5625rem; top: .285714286rem; } .md-image>.md-meta { /*border: 1px solid #ddd;*/ border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; } .md-tag { color: #a7a7a7; opacity: 1; } .md-toc { margin-top:20px; padding-bottom:20px; } .sidebar-tabs { border-bottom: none; } #typora-quick-open { border: 1px solid #ddd; background-color: #f8f8f8; } #typora-quick-open-item { background-color: #FAFAFA; border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee; border-style: solid; border-width: 1px; } /** focus mode */ .on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); } header, .context-menu, .megamenu-content, footer{ font-family: "Segoe UI", "Arial", sans-serif; } .file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state{ visibility: visible; } .mac-seamless-mode #typora-sidebar { background-color: #fafafa; background-color: var(--side-bar-bg-color); } .md-lang { color: #b4654d; } /*.html-for-mac { --item-hover-bg-color: #E6F0FE; }*/ #md-notification .btn { border: 0; } .dropdown-menu .divider { border-color: #e5e5e5; opacity: 0.4; } .ty-preferences .window-content { background-color: #fafafa; } .ty-preferences .nav-group-item.active { color: white; background: #999; } .menu-item-container a.menu-style-btn { background-color: #f5f8fa; background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); } :root {--mermaid-font-zoom:1em ;} @media print { @page {margin: 0 0 0 0;} body.typora-export {padding-left: 0; padding-right: 0;} #write {padding:0;}} 目录 技术概要:InterSystems IRIS 和 UIMA关于 UIMAInterSystems IRIS 如何补充 UIMA Annotation Store(注释存储) InterSystems IRIS NLP在 InterSystems IRIS 中体验 UIMA 用前须知 创建新的命名空间 运行Java Gateway(Java 网关) 体验 UIMA 分析管道 浏览 Annotation Store(注释存储) 通过分析管道发送新文本 向 Aviation.Event 表添加记录 查看Annotation Store(注释存储)中的新条目了解更多关于 UIMA的资料 技术概要:InterSystems IRIS 和 UIMA 本技术概要(First Look)快速介绍了 InterSystems IRIS® 数据平台如何实施和补充非结构化信息管理架构 (UIMA)。在简要概述 UIMA 以及 InterSystems IRIS 如何对其进行补充之后,您将有机会通过基本的动手练习来在实际应用中了解 InterSystems IRIS。 要浏览技术概要(First Look)的所有内容,包括可以在InterSystems IRIS的免费评估实例上执行的内容,请参阅InterSystems 技术概要。 关于 UIMA UIMA 是管理分析非结构化信息(如文本和视频)的标准。对于非结构化信息,计算机通常需要几个步骤才能将信息转化为可操作的结构化数据。例如,扫描的文档将文本转变为机器可读版本之前需要OCR,即使这样,在应用额外的 NLP 策略之前,计算机也不能很好地处理自然语言文本。由于像这样的流程包括本质上非常不同的步骤,因此单个工具不太可能处理所有这些步骤。更可能的情况是,这个流程包括单独模块,这些模块由使用不同技术的不同主体执行,且需要协同工作。在 UIMA 中,这些模块被称为analysis engines(分析引擎)。 因为符合 UIMA 标准的分析引擎都遵循相同的标准,所以它们可以组合成一系列分析器(a UIMA analysis pipeline [UIMA 分析管道]),每个部分做自己最擅长的事情。源非结构化数据在通过此 UIMA 分析管道时不会发生改变,而是沿途生成annotations(注释)。UIMA 标准确保来自一个分析引擎的注释不会干扰来自不同分析引擎的注释。对于文本,这些注释基于文本中的字符位置。UIMA 的互操作性允许您将来自不同供应商和技术的分析引擎组合到一个管道中,而无需编写任何自定义代码,并且由于分析引擎引用原始源数据中的字符位置,因此它们的注释可以组合、比较和推理。UIMA 标准包括运行这些分析引擎中所执行的框架。 除了提供互操作性之外,UIMA 还提供了用于扩展和部署这些分析引擎的框架。这使供应商可以专注于开发分析引擎,而不必担心扩展和部署他们的解决方案。[]{#2_How_InterSystems_IRIS_Complements_UIMA .anchor}UIMA 标准还提供了在分布式架构中调用这些分析引擎的框架。 每个符合 UIMA 的分析引擎都必须附带一个 XML 描述符文件,该文件包含基本识别信息,例如分析引擎的名称和供应商。它还定义了对分析引擎生成的注释进行分类的注释类型。 InterSystems IRIS 如何补充 UIMA InterSystems IRIS 在三个方面补充了 UIMA: 引入功能索引以创建 UIMA 分析管道(analysis pipeline),并在 InterSystems IRIS 表中插入或更新记录时自动为该分析管道提供新文本。 将 UIMA 分析管道生成的注释存储在 InterSystems IRIS 中清晰、可通过 SQL 访问的Annotation Store(注释存储)中。 在 InterSystems IRIS 中体验 UIMA 确保 InterSystems IRIS Natural Language Processing(InterSystems IRIS 自然语言处理, NLP )符合 UIMA 标准,并可用作 UIMA 分析管道中的分析引擎。 创建和调用 UIMA 分析管道 InterSystems IRIS 使用functional index(功能索引)以创建 UIMA 分析管道,该管道使用 InterSystems IRIS 概念,而无需担心实现 Java 接口。功能索引是 InterSystems IRIS 数据库的一项功能,它允许在表中插入或更新记录时执行功能。在这种情况下,功能索引是定义在表的列上,该列包含您希望由 UIMA 分析管道分析的非结构化数据。设置该管道就像将分析引擎描述文件的位置添加到功能索引定义一样简单。 一旦定义了功能索引,只要在索引表列中插入或更新最新数据,InterSystems IRIS 就会自动将非结构化数据输入 UIMA 分析管道。例如,如果在包含报表的列上定义了功能索引,那么将新报表添加到表中后立即对其进行分析。没有[]{#2.2_Annotation_Store .anchor} InterSystems IRIS 中的这一特殊功能,每次您想要分析数据时,都需要在 Java 中以编程方式通过管道发送非结构化数据。 Annotation Store(注释存储) 默认情况下,UIMA 分析管道的结果被存储在冗长繁琐的 XML 文件中。由于 UIMA 标准没有提供更复杂的注释存储方法,InterSystems IRIS 通过使用灵活的、基于 SQL 的存储,将注释放在统一、持久的表中以便后续检索,从而扩展了 UIMA 分析管道。这种存储系统称为Annotation Store(注释存储)。 在您第一次编译包含为创建 UIMA 分析管道定义的功能索引的类时,会自动创建此Annotation Store(注释存储)。它直接链接到包含非结构化数据的原始表的列。 在架构上,Annotation Store(注释存储) 是通过添加一个特殊的分析引擎作为 UIMA 分析管道的最后一个组件来生成的。当您将 UIMA 功能索引添加到 InterSystems IRIS 类时,将会自动生成Annotation Store(注释存储)。在 InterSystems IRIS 之外开发的 UIMA 分析管道也可以将此特殊分析引擎添加到管道末端,以创建Annotation Store(注释存储)。这种实现方式超出了本技术概要(First Look)的讨论范围。 []{#2.3_InterSystems_IRIS_NLP .anchor}您还可以使用XData block在包含功能索引的类中自定义Annotation Store(注释存储)。例如,您可以为每个表定义额外的列和索引。您还可以筛选注释类型,以将它们排除在Annotation Store(注释存储)之外。 InterSystems IRIS NLP InterSystems IRIS Natural Language Processing(InterSystems IRIS 自然语言处理, NLP )被内置到 InterSystems IRIS® 数据平台中,可以在预先不了解这些非结构化文本主题的情况下,对这些文本进行文本分析。它通过应用识别语义实体的特定语言规则来实现这项功能。由于这些规则是专门针对语言而非内容,因此 InterSystems IRIS NLP可以在不使用字典或本体的情况下提供对文本内容的深入分析 您可以使用 InterSystems IRIS NLP 作为 UIMA 分析引擎,为 NLP 概念和上下文生成 UIMA 注释。这些注释与其他 UIMA 分析引擎提供的 UIMA 注释完全兼容。 在 InterSystems IRIS 中体验 UIMA 现在您已经了解了有关 UIMA 的一些基本信息,可以动手体验以了解它在 InterSystems IRIS 中的工作原理。在体验之前,您需要设置环境。 在 InterSystems IRIS 中体验 UIMA 用前须知 首先,请执行以下初步设置任务: 安装 Java Runtime Environment(Java 运行时环境)。 安装 InterSystems IRIS。 创建一个新的 InterSystems IRIS 命名空间。 启动 Java Gateway(Java 网关)。 安装 Java Runtime Environment(Java 运行环境) InterSystems IRIS 进行 UIMA 分析管道分析需要安装Java Runtime Environment(Java 运行时环境,JRE)。还需要一个指向 JRE 安装位置的环境变量。 如果您的机器上尚未安装 JRE,请从 Oracle® 下载并安装最新版本。 创建一个名为JAVA_HOME的环境变量,该变量指向 JRE 安装的位置。例如,在 Windows® 上,使用 Control Panel(控制面板)创建JAVA_HOME环境变量,并定义该变量到 JRE 安装位置的路径。 安装 InterSystems IRIS 要运行 UIMA 分析管道的演示,您需要一个运行中的 InterSystems IRIS 已授权的实例。 有关如何安装和授权 InterSystems IRIS 开发实例的说明,请参阅InterSystems IRIS Basics: Installation (《InterSystems IRIS 基础知识:安装》)。 创建新的命名空间 作为技术概要(First Look)体验的一部分,您将向 InterSystems IRIS 中的命名空间添加一个新类文件。为了使此示例数据与预定义的命名空间分开,请创建一个名为 SAMPLES 的新命名空间来保存与此技术概要(First Look)关联的代码和数据。创建一个新的命名空间: 在浏览器中打开 Management Portal (管理门户),使用 InterSystems IRIS Basics: Connecting an IDE(《INTERSYSTEMS IRIS 基础:连接一个IDE 》)的实例适用的URL。 选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间)。 在 Namespaces(命名空间)页面,选择 Create New Namespace(新建命名空间)。 在 New Namespace(新建命名空间)页面,输入SAMPLES作为新命名空间的名称。 点击 Create New Database(新建数据库),将显示 Database Wizard(数据库向导)。 在 Database Wizard(数据库向导)的第一页,在 Enter the name of your database(输入您的数据库名称)字段,输入您正在创建的数据库的名称,例如 Samplesdb。 输入数据库的目录,例如 C:\InterSystems\IRIS\mgr\Samplesdb 。 点击 Next(下一步)。 点击 Finish(完成)。 回到New Namespace(新命名空间)页面,在Select an existing database for Routines(为 Routine 选择一个现有数据库)下拉菜单,选择您刚刚创建的数据库Samplesdb。 点击靠近页面顶部的 Save(保存),然后在结果日志的末尾单击 Close(关闭)。 UIMA 分析管道 运行Java Gateway(Java 网关) Java Gateway(Java 网关)可以实例化外部 Java object(Java 对象),就好像它是 InterSystems IRIS 中的本机对象一样,可以对其进行操作。InterSystems IRIS 的 UIMA 策略使用Java Gateway(Java 网关),可以从command line (命令行)启动Java Gateway(Java 网关)。例如,在 Windows 上: 打开 Run(运行)对话框。 输入以下命令: %JAVA_HOME%\bin\java -classpath "C:\InterSystems\IRIS\dev\java\lib\JDK18\*;C:\InterSystems\IRIS\dev\java\lib\jackson\*;C:\InterSystems\IRIS \dev\java\lib\uima\*" com.intersystems.gateway.JavaGateway 5555 其中: JAVA_HOME 是指向Java Runtime Environment(Java 运行环境,JRE)安装目录位置的环境变量。 C:\InterSystems\IRIS 是您安装的 InterSystems IRIS 的目录。 JDK18 对应您的 JRE 版本。 如果在UNIX®上运行 ,请记住 -classpath 的句法使用冒号作为分隔符。 体验 UIMA 分析管道 现在您已经完成了准备工作,并已准备好在实际应用中查看 UIMA 分析管道的运行情况。在这次体验中,您将: 添加包含 UIMA 功能索引的类文件 编译包含功能索引的类。 查看 Annotation Store (注释存储)的表。 将非结构化数据添加到示例数据库。 浏览 Annotation Store(注释存储) 以获取分析管道生成的新数据。 添加带有 UIMA 功能索引的类文件 您可以通过为包含非结构化文本的表定义功能索引,向 UIMA 分析管道添加分析引擎。在本次体验中,您将向该分析管道添加 InterSystems IRIS NLP 分析引擎。 在体验的这一部分中,您将创建一个新的类文件。可以在您喜欢的文本编辑器或 IDE(例如 InterSystems Studio 或带有 ObjectScript 扩展名的 Visual Studio Code)中创建类文件。 在 IDE 或文本编辑器中创建一个新文件。 将以下内容复制并粘贴到类文件中: xxxxxxxxxx Class Sample.MyData Extends %Persistent ​ { ​ Property MyText As %String; ​ Index MyIndex On (MyText) As %UIMA.Index(AEDESCRIPTOR = \"classpath:/com/intersystems/uima/annotator/iKnowEngine.xml\"); ​ } 体验 UIMA 分析管道 其中: MyText 是包含非结构化文本的 Sample.MyData 表中的列。 MyIndex 是 UIMA 功能索引。 iKnowEngine.xml是 InterSystems IRIS NLP 分析引擎的描述符文件。 将文件另存为sample.cls。 编译表类 要自动生成 Annotation Store (注释存储),您只需使用InterSystems Terminal(InterSystems 终端)或 IDE 提供的工具编译包含功能索引的类。 建议: 使用 InterSystems Terminal(InterSystems 终端)时,您可以使用 Shift+Insert 命令将剪贴板的内容粘贴到终端命令提示符中。从本指南复制命令并将它们粘贴到终端中以减少错误,这种方式很有用。 加载和编译类: 打开 InterSystems Terminal(InterSystems 终端)。有关为您的实例打开Terminal (终端)的信息,请参阅InterSystems IRIS Basics: Connecting an IDE(《INTERSYSTEMS IRIS 基础:连接一个IDE 》)中的InterSystems IRIS Connection Information (《InterSystems IRIS 连接信息》)。 切换到您为此演示创建的命名空间。例如: set $namespace="samples" 输入以下命令,将类文件加载到命名空间中: do $system.OBJ.Load("<sample-dir>\sample.cls") 其中 <sample-dir> 是您保存 samples.cls 类文件的位置。 输入以下命令,编译您粘贴到sample.cls 的Sample.MyData 类: do $system.OBJ.Compile("Sample.MyData") 浏览 Annotation Store(注释存储) 既然您已经使用 Annotation Store UIMA 功能索引编译了类,可以浏览为保留 InterSystems IRIS NLP 生成的注释而创建的(Annotation Store )注释存储。 在浏览器中使用 URL 为实例打开 Management Portal (管理门户),如InterSystems IRIS Basics: Connecting an IDE(《INTERSYSTEMS IRIS 基础:连接一个IDE 》)的InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)所述。 使用标题中的链接切换到 Samples 命名空间。 参观 UIMA 分析管道 进入 System Explorer(系统资源管理器)> SQL 。 展开左侧窗格中的 Tables(表) 列表。 可以看到 Annotation Store (注释存储) 的三个表。这些表的命名规则对应包含所分析的非结构化文本的表 (Sample.MyData)。 Sample_MyData.Type------包含此存储中使用的Annotation Types (注释类型)的概述。 Sample_MyData.Sofa------包含 sofas,这是 UIMA 分析引擎分析的文本对象。 Sample_MyData.Annotation------包含该分析引擎生成的注释。 您可以修改功能索引定义以创建多个注释表,然后根据注释类型将结果输出到正确的表中。 通过分析管道发送新文本 InterSystems IRIS 中 UIMA 分析管道的强大之处在于,新的非结构化文本会自动通过管道发送以进行分析,并将结果添加到 Annotation Store (注释存储)中。由于您已经创建了 Annotation Store(注释存储),可以看到新纪录如何被添加到 Sample.MyData 表,并生成添加到 Annotation Store的新条目。 向 Aviation.Event 表添加记录 在本步骤中,您将使用 SQL 向示例数据库中的 Sample.MyData 表添加一些非结构化文本。请记住,该表包含MyText 列,您已在该列上定义功能索引。正如您将看到的,当进行此插入操作时,会自动生成注释。 在System Explorer (系统资源管理器 )> SQL页,展开左侧窗格中的 Tables(表) 列表。 选择 Sample.MyData,这是包含通过分析管道发送的非结构化文本的表。 在右侧窗格中,单击 Execute Query(执行查询)标签。 要将新条目插入示例数据库,请在文本框中输入以下查询 xxxxxxxxxx INSERT INTO Sample.MyData (MyText) VALUES (\'First Look unstructured text\') 点击 Execute (执行)。 这会将短语"First Look unstructured text"放入 Sample.MyData 表的 MyText 列中。 了解更多关于 UIMA的资料 查看Annotation Store(注释存储)中的新条目 现在您已将新的非结构化文本添加到示例数据库中,可以查看 Annotation Store 以了解这些文本是如何通过分析管道自动发送的。您可以看到新的非结构化文本和来自 InterSystems IRIS NLP 的注释都添加到了Annotation Store(注释存储)中。 在 System Explorer (系统资源管理器 )> SQL页,展开左侧窗格中的 Tables(表) 列表。 选择 Sample_MyData.Sofa 表。 在右侧窗格中,单击 Open Table(打开表)。 您可以看到添加到 Annotation Store 的新记录。sofaString是由分析管道处理的一段非结构化文本。 点击 Close Window(关闭窗口)。 在左侧窗格中,选择 Sample_MyData.Annotation 表。 点击 Open Table(打开表)。 在coveredText列,您可以看到由 InterSystems IRIS NLP 分析引擎生成的注释。 了解更多关于 UIMA的资料 要了解有关 InterSystems IRIS 如何实施和补充 UIMA 的更多信息,请参阅 Using InterSystems UIMA(《使用 InterSystems UIMA》)。 有关 UIMA 标准的框架、基础设施和组件的详细概述,请参阅 Apache UIMA home page
文章
jieliang liu · 十月 26, 2021

IRIS 2021 技术文档 First Look 24 技术概要:容器中的 InterSystems 产品

本技术概要(First Look)通过重点概述和基本的实践示例,向您介绍在 InterSystems IRIS®数据平台上使用容器(Container)的基本原理。您将了解容器的目的、重要性和好处,以及 InterSystems 如何实现它们的具体细节。 有关 Docker 容器和 InterSystems IRIS 的完整文档,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》),以及 InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)的 ICM Overview(ICM 概述)章节。Learn More About InterSystems IRIS in Containers(了解容器中的 InterSystems IRIS 的更多信息)部分提供了到其他参考资料的链接。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 为什么是容器(Container)? 容器(Container)将应用程序打包成独立于平台、完全可移植的运行时解决方案(runtime solution),满足所有需求,但却隔离于任何依赖项(dependency)。具体来说,Docker 容器无处不在。因为所有主要的公共云基础设施即服务(Infrastructure as a Service,IaaS)供应商都支持 Docker,企业可以通过使用容器并让云供应商处理基础设施来降低成本和复杂性。 容器带来了以下所有的好处: 容器干净地划分代码和数据,提供完全分离的关注点,应用程序可轻松部署和升级。 容器是非常高效的;容器中的应用程序只包含运行它所需的元素(element),并使其能够访问所需的连接、服务和接口,而且容器作为单个进程运行,所占用的内存并不比任何其他可执行文件多。 容器支持应用程序在不同环境之间的清洁移动(clean movement)——例如,从开发到测试,再到生产——从而减少具有不同目标的部门之间的典型过程和管理冲突。开发人员可以专注于最新的代码和库(library),质量开发人员(quality developers)专注于测试和缺陷描述,运营工程师专注于整体解决方案的基础设施,包括网络、高可用性、数据持久性(data durability)等等。 容器提供了企业对业务和技术进行变革所需的敏捷性、灵活性和可重复性。容器将应用供应过程(包括构建阶段)与运行过程明确分开,企业可以采用统一的应用程序交付方法,包括更敏捷的交付方法(DevOps)和架构(微服务)。 这些优势使容器成为应用程序的天然构件块,推动应用程序交付和部署方法变得更简单、更快速、更可重复、更强大。 容器中的 InterSystems IRIS 因为容器只打包运行容器化应用程序所需的元素,并在本地执行应用程序,所以它提供标准的、易于理解的应用程序配置、行为和访问。如果您对在 Linux 上运行的 InterSystems IRIS 有经验,那么基于 Linux 的 InterSystems IRIS 容器在什么物理、虚拟或云系统和操作系统平台上运行并不重要;您以相同的方式与它们进行交互,就像在 Linux 系统上运行传统的 InterSystems IRIS 实例一样。 下面介绍 InterSystems IRIS 在如何使用容器方面的不同。 InterSystems 提供的映像(InterSystems-provided images)——容器映像(container image)是可执行包,而容器是映像(image)的运行时实例 (runtime instance)——即映像(image)在执行时在内存中变成的实例。InterSystems 提供包含完整安装的 InterSystems IRIS 实例的映像(image),以及其他相关映像(image)。有关 InterSystems 映像(image)的更多信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 Using InterSystems IRIS Images(使用 InterSystems IRIS 映像)。 在本文档的实践体验中,您将从 InterSystems 提供的 InterSystems IRIS 映像(image)中创建并启动一个容器。 Iris-main 程序(iris-main program)——iris-main 程序使 InterSystems IRIS 和其他产品能够满足在 Docker 容器中运行的应用程序的要求。入口点应用程序(entrypoint application),即容器启动时启动的主进程,需要阻塞(block)——即等待(wait),直到其工作完成,但启动 InterSystems IRIS 的命令并不作为一个阻塞进程(blocking process)运行。iris-main 程序通过启动 InterSystems IRIS 来解决这个问题,然后继续作为阻塞入口点应用程序(blocking entrypoint application)运行。有关 iris-main 的更多信息,请参见在 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 The iris-main Program(iris-main 程序)。 该程序还提供了许多选项,以帮助调整 InterSystems IRIS 在容器中的行为;您将在本文档的实践体验中使用一些 iris-main 选项。 持久化 %SYS 功能(durable %SYS feature)——因为容器化的应用程序与主机环境隔离,所以它不会写入持久化数据(persist data);当容器被移除并被新的容器取代时,它在容器内写入的任何内容都会丢失。因此,容器化应用部署的一个重要方面是安排数据存储在容器之外,并提供给其他和未来的容器使用。 当 InterSystems IRIS 在容器中运行时,持久化 %SYS 功能(The durable %SYS feature)能够持久地存储特定于实例的数据——如用户定义、审计记录以及日志、日记和 WIJ 文件——允许一个实例跨越多个容器。例如,如果您使用持久化 %SYS 运行 InterSystems IRIS 容器,您可以通过停止原始容器(the original container)并运行使用旧容器创建的特定于实例的数据(instance-specific data)的新容器来升级实例。 您将在本文档的实践体验中探索持久化 %SYS (durable %SYS)功能。有关持久化 %SYS(durable %SYS) 的详细信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 Durable %SYS for Persistent Instance Data(持久化 %SYS 的持久化实例数据)。 重要提示: InterSystems 的容器映像符合开放容器标准(Open Container Initiative,OCI)规范,并在 Docker 企业版(Enterprise Edition)引擎上使用广泛流行的容器 Ubuntu 操作系统构建,该引擎完全支持 OCI 标准,并允许映像在 Docker Hub 注册表中认证和展示。因此,InterSystems 映像在任何基于 Linux 操作系统的符合 OCI 标准的运行时引擎上都得到支持,无论是在自有云还是在公共云中。 InterSystems 云管理器(InterSystems Cloud Manager,ICM)在其提供的云基础设施以及现有的虚拟和物理基础设施上提供 InterSystems IRIS 容器和其他容器的自动部署。有关使用 ICM 部署容器化的 InterSystems IRIS 实例的更多信息,请参见 First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》) 和 InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)。 3. 下载 InterSystems IRIS 映像(Image) 要使来自 InterSystemsInterSystems IRIS 映像(image)可用于本实践,您必须将映像(image)下载到您正在使用的系统中。以下替代方案描述了您可以或可能可以使用的 InterSystems IRIS 映像(image)。 您可以使用来自 InterSystems 容器注册表(InterSystems Container Registry,ICR)的 InterSystems IRIS 社区版(Community Edition)映像(image),该映像(image)包含可从 InterSystems 获得的所有映像(image)的存储库,如 Using the InterSystems Container Registry(《使用 InterSystems 容器注册表》)中所述。您也可以从 Docker Store 的 InterSystems IRIS 数据平台页面下载社区版(Community Edition)映像(image)。 InterSystems IRIS 社区版(Community Edition)有一个免费的内置 13个月的许可证(和一些功能限制);如果您在这次实践中使用社区版(Community Edition),您就不需要提供下一步(Add the License Key to the External Storage Location(添加许可证密钥到外部存储位置))中所述的许可证密钥。更多信息,请参见 Deploy and Explore InterSystems IRIS(《部署和探索 InterSystems IRIS》)中的 Deploy InterSystems IRIS Community Edition on Your Own System(在您自己的系统上部署 InterSystems IRIS 社区版)。 注意: 另一个选择是在 GCP、AWS 或 Azure 上提供一个承载运行中的 InterSystems IRIS 社区版(Community Edition)容器的云节点;更多信息,请参见 Deploy and Explore InterSystems IRIS(《部署和探索 InterSystems IRIS》)中的 Deploy InterSystems IRIS Community Edition on a Cloud Node(在云节点上部署 InterSystems IRIS 社区版)。如果您在这个练习中使用社区版(Community Edition)的云节点,您可以跳过接下来的两个步骤,并跳转到 Change the Instance and Commit the Container as a New Image(更改实例并将容器作为新映像提交)。 如果您是 InterSystems 客户,您可以使用 InterSystems 容器注册表(InterSystems Container Registry,ICR)发布的 InterSystems IRIS 映像(image)。Using the InterSystems Container Registry(使用 InterSystems 容器注册表)列出了 IRC 提供的 InterSystems IRIS 映像(image),并解释了如何使用您的 WRC 凭证对注册表进行身份验证,以便您下载。 您的企业可能有一个私有映像(image)注册表,其中包括一个或多个 InterSystems IRIS 映像(image)。如果是这样,请获取您需要的映像(image)的注册表、存储库和标签的位置,以及访问所需的凭证。 当您确定了要下载的注册表和需要的凭证(如果有)后,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品 》)中的 Downloadingthe InterSystems IRIS Image(下载 InterSystems IRIS 映像),了解下载 InterSystems IRIS 映像(image)的说明。 为了简单起见,这些说明假定您正在使用的映像(image)是 intersystems/iris:2021.1.0.205.0。 4. 添加许可证密钥到外部存储位置 与任何 InterSystems IRIS 实例一样,在容器中运行的实例需要一个许可证密钥(通常称为 iris.key)。 从 Docker Store 获得的 InterSystems IRIS 社区版(Community Edition)映像(在上一节中进行了描述)带有一个免费的内置临时许可证。然而,一般来说,许可证密钥没有也不能包含在 InterSystems IRIS 容器映像(container image)中,而是必须在容器启动后复制到容器中,以便激活运行在其中的 InterSystems IRIS 实例。iris-main 程序为此提供了一个选项,但它要求您把许可证密钥放在一个作为外部 volume 挂载的存储位置;下一节提供了使用说明。要了解有关 InterSystems IRIS 容器的许可证密钥的更多信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 License Keys for InterSystems IRIS Containers(InterSystems IRIS 容器的许可证密钥)。 将您的 InterSystems IRIS 许可证密钥文件 iris.key 复制到外部存储位置。 5. 从 InterSystems IRIS 映像(Image)运行容器 一旦您在本地机器上使 InterSystems IRIS 映像(image)可用,确定了外部存储位置并在其上放置了许可证密钥,您就可以使用 docker run 命令来创建和启动容器了。Docker run 命令实际上结合了三个独立的命令,如下所示: docker pull — 如果本地不存在映像(image),则下载一个。 docker create — 从映像(image)中创建一个容器。 docker start — 启动容器。 这些命令中的每一个都是单独有用的,在不同的背景下有不同的用途。更多信息,请参见 Docker 文档中的Docker run reference(Docker 运行参考资料) 。 下面是一个 docker run 命令的示例;所附文本对所有选项都作了解释。请注意,docker run 命令的选项出现在命令行中映像(image)规范之前,而 InterSystems iris-main 程序的选项(请参见 InterSystems IRIS in Containers(《容器中的 InterSystems IRIS》))出现在之后。在这种情况下,作为 docker run 一部分的 pull 命令不需要运行,因为您已经下载了您想使用的 iris 映像(image)。 docker run --name iris --detach --publish 52773:52773 --volume /nethome/pmartinez/iris_external:/external intersystems/iris:2021.1.0.205.0 --key /external/iris.key --name 容器名称(container name) 指定容器的名称,您可以在其他 Docker 命令中用它来引用该容器,例如,当您想停止该容器时,使用 docker stop container name 。 --detach 在后台运行容器(并显示容器的唯一 ID)。 --Publish 主机端口:容器端口(host_port:container_port) 将容器内的端口发布到主机上的端口,这样容器外(在主机上或其他机器上)的实体就可以与容器内的程序联系。例如,InterSystems IRIS 实例的管理门户(Management Portal)是通过实例的 Web 服务器端口(默认为 52773)访问的。如果容器内的这个端口发布到主机上的端口,那么可以使用主机的端口将实例的管理门户(Management Portal)加载到浏览器中。 --volume 外部存储路径:内部 volume(external_storage_path:internal_volume) 挂载容器可访问的外部存储位置作为容器内部的存储 volume。有关哪些存储位置可以以这种方式挂载以及可能需要的 Docker 配置的信息,请参见 Docker 文档中的 Use Volumes(使用 Volumes ) 。 重要提示: InterSystems 不支持在 InterSystems IRIS 容器中把 NFS 位置作为外部 volume 挂载。 存储库/映像:标签(repository/image:tag) 指定要提取并用于创建容器的映像(请参见 Download the InterSystems IRIS Image(下载 InterSystems IRIS 映像))。使用 docker images 命令来列出可用的映像(image),并确保您指定的是正确的映像(image)。 --Key 许可证密钥路径(license_key_path) iris-main 选项,它标识了要安装在容器实例中的 InterSystems IRIS 许可证密钥;这个位置必须是在一个挂载的 volume 上。 使用前面的示例和说明来构建您自己的 docker run 命令,并在命令行上执行。当命令完成后,使用 docker ps 命令可以在列表中看到您的容器,状态为 Up。 试一试! 创建您自己的基于 InterSystems IRIS 的容器 $ docker run --name iris --detach --publish 52773:52773 --volume /nethome/pmartinez/iris_external:/external intersystems/iris:2021.1.0.205.0 --key /external/iris.key 426d4a511d6746d89ec2a24cf93b29aa546ea696b479a52210d37da4c6d04883 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS 426d4a511d67 intersystems/iris:2021.1.0.205.0 "/iris-main --key ..." 5 seconds ago Up 3 seconds PORTS NAMES 0.0.0.0:52773->52773/tcp iris 注意: InterSystems IRIS 社区版(Community Edition)映像(请参见 Download the InterSystems IRIS Image(下载 InterSystems IRIS 映像))不需要--key 选项 ,该映像附带一个免费的内置许可证。 如果映像尚未在本地存在,但在您组织的存储库中——请参见 Download the InterSystems IRIS Image(下载 InterSystems IRIS 映像),Docker 会在创建和启动容器之前拉取(下载)该映像(image)。 如示例所示,创建容器后,Docker 输出 UUID 长标识符(long identifier); 前 12 个字符组成 UUID 短标识符(short identifier),用于标识其他输出中的容器,例如来自 docker ps 命令的容器。 6.更改实例并将容器作为新映像(Image)提交 当您更改容器内运行的程序时,您可以使用 docker commit 命令从容器中创建一个新映像(image)。这个新映像(image)与您创建容器的原始映像(image)相同,但包括您对容器所作的更改。要了解其工作原理,请遵循以下步骤: 打开容器中 InterSystems IRIS 实例的管理门户(Management Portal)。实例的管理门户(Management Portal)的 URL 包含了实例的主机标识符和 web 服务器端口号 。 主机标识符是运行容器的系统的主机名或 IP 地址;如果您的浏览器与容器运行在同一个系统上,则可以使用 localhost。 Web 服务器端口号是您在使用 docker run 启动容器时发布的实例的 web 服务器端口号,即 52773 的主机端口号。假设您包含了--publish 52773:52773,正如上一节末尾的示例命令中提供的那样,web 服务器端口号是 52773。 例如,在容器主机上,Web 服务器端口为 52773,管理门户(Management Portal)的 URL 将是 http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen。 使用预定义用户帐户之一登录,例如 _SYSTEM,其默认密码是 SYS(请参见 Predefined User Accounts(预定义用户账户))。出于安全考虑,在第一次登录(使用管理门户(Management Portal)或 iris terminal 命令)到容器化的 InterSystems IRIS 实例上的任何预定义账户时,系统会立即提示您更改密码。 注意: 有关更改预定义帐户(强烈建议在生产中这样做)的默认密码(包括在脚本和自动部署中)的更多信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 Authentication and Passwords (身份验证和密码)。 从主页上,选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间) 来显示 Namespaces(名称空间) 页面,然后点击 Create New Namespace(创建新的命名空间) 按钮来显示 New Namespace(新的命名空间) 页面。 创建名为 USER2 的命名空间,方法是在 Name of the namespace box(命名空间框的名称)中输入 USER2,从 Copy from 下拉菜单中选择 USER,清除 Enable namespace for interoperability productions(为互操作性产品启用命名空间) 复选框并确认,点击 Save(保存) 按钮,最后确认您想要复制所有属性和映射。 然后点击 Copy Namespace Mappings(复制命名空间映射) 页面上的 Close(关闭) ,返回到 Namespaces(命名空间) 页面,在该页面上列出了 USER2 命名空间。 您现在已经改变了容器中的实例。 接下来,停止该容器并将其作为名为 iris2 的新映像(image)提交,然后列出可用的映像。 $ docker stop iris $ docker commit iris acme/iris2:test sha256:7b4adb9f7abf1490a39086665ccd3d255c05163c25cb9a3de8e9421f6ca16b40 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE acme/iris2 test 421f6ca16b40 8 seconds ago 1.40GB intersystems/iris 2020.3.0.221.0 15627fb5cb76 1 hour ago 1.39GB centos 7.3.1611 262f7381844c 2 weeks ago 192MB hello-world latest 05a3bd381fc2 7 months ag 1.84kB 最后,删除从原始 iris 映像创建的容器。 $ docker rm iris iris 7.运行和调查第二个基于 InterSystems IRIS 的容器 为了总结这一体验,您将使用 docker run 命令从您刚刚提交的基于 InterSystems-IRIS 的映像中创建并启动一个容器,包括用于持久化特定于实例的数据的持久化 %SYS 功能(durable %SYS feature)。持久化 %SYS (durable %SYS)是保存特定于实例的数据以及您对它所做的任何更改的一种更有用的方法。因为这些数据被保存在容器之外,它可以成为新的 InterSystems IRIS 容器的数据,允许您通过运行后面的映像(image)的容器来升级 IRIS 实例,同时保留以前的容器的数据;当内部容器更改提交到新映像时,这是不可能的。有关持久化 %SYS (durable %SYS)的详细信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 Durable %SYS for Persistent Instance Data(持久化实例数据的持久化 %SYS )。当您启动新容器后,将执行以下操作: 确认在作为一个新映像(image)提交的容器中创建的命名空间(请参见 Change the Instance and Commit the Container as a New Image(更改实例并将容器作为新映像提交))存在于新容器中的 InterSystems IRIS 实例中。 在容器中更改 InterSystems IRIS 实例的设置,并查看它反映在容器外持久化 %SYS (durable %SYS)数据中。 确认您添加的演示文件在容器内存在。 要做到这一点,请遵循以下步骤: 为这个容器确定一个外部存储位置。您可以使用在 Add the License Key to the External Storage Location(添加许可证密钥到外部存储位置)中为前一个容器选择的许可证密钥,也可以选择一个新的。许可证密钥应该仍然在以前的位置。(如果您使用一个新的位置,请确保许可证密钥已经到位)。 创建一个 docker run 命令,类似您在 Run a Container from the InterSystems IRIS Image(从 InterSystems IRIS 映像运行容器)中执行的命令, 基于那里的指令,但有两个更改。 添加选项 --env ISC_DATA_DIRECTORY=pathname 标识持久化 %SYS(durable %SYS) 目录,即写入 InterSystems IRIS 实例的持久化数据(persistent data)的位置。持久化 %SYS目录(durable %SYS directory)必须在一个挂载的 volume 上(请参见--volume 选项和 Add the License Key to the External Storage Location(添加许可证密钥到外部存储位置))。 注意: InterSystems 建议指定挂载 volume 的子目录为持久化 %SYS 的位置。下面的 docker ps 示例显示了这一点。 使用映像:标签(image:tag) 指定新映像 之前,您从 intersystems/iris:2021.1.0.205.0 (即 InterSystems 提供的映像)创建了容器;这次,您使用的是 acme/iris2:test,这是您通过提交更改过的 iris 容器创建的。 调用容器 iris2。当 docker run 命令完成后,使用 docker ps 命令来列出容器并查看其状态。例如: $ docker run --name iris2 --detach --publish 52773:52773--volume /nethome/pmartinez/iris_external:/external --env ISC_DATA_DIRECTORY=/external/durable acme/iris2:test --key /external/iris.key bdfe214ef76a34290a8308cddce92162aae14df1ba1bc244e692af3c8d911a3e $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS af3c8d911a3e acme/iris2:test "/iris-main --key ..." 5 seconds ago Up 3 seconds PORTS NAMES 0.0.0.0:52773->52773/tcp iris2 注意: InterSystems IRIS 社区版(Community Edition)映像(请参见 Download the InterSystems IRIS Image(下载 InterSystems IRIS 映像))不需要--key 选项,该映像附带一个免费的内置许可证。 Docker Compose 是一个用于定义和运行多容器应用程序的工具,为 Docker 命令行交互提供了替代方案。要使用 Compose,您需要创建 docker-compose.yml ,其中包含您想要创建、启动和管理的容器的规范,然后使用 docker-compose 命令。更多信息,请参见 Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》)中的 Running an InterSystems IRIS Container:Docker Compose Example(运行 InterSystems IRIS 容器:Docker Compose 示例),和 Docker 文档中的 Overview of Docker Compose(Docker Compose 概述)。 确认从已更改的 InterSystems 容器提交的更改 在 Change the Instance and Commit the Container as a New Image(更改实例并将容器作为新映像提交)中,您在从 InterSystems 提供的映像 intersystems/iris:2021.1.0.205.0 创建的容器中为 InterSystems IRIS 实例添加了一个命名空间,然后将该容器作为一个新映像 acme/iris2:test 提交。因此,您添加的命名空间应该存在于运行在 iris2 容器内的 InterSystems IRIS 实例中,该容器是从 acme/iris2:test 创建的。 要确认这一点,请执行以下操作: 打开管理门户(Management Portal)并登录,如 Change the Instance and Commit the Container as a New Image(更改实例并将容器作为新映像提交)中所述。 从主页上,选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间),来显示命名空间(Namespaces)页面;在 iris 容器中创建的 USER2 命名空间被列出。 探索和更改持久化 %SYS 目录 要探索 InterSystems IRIS 容器的持久化 %SYS 功能,请执行以下操作: 要查看 InterSystems IRIS 在容器外写入的特定于实例的数据,因为您在 docker run 命令中包含了持久化 %SYS 环境变量,显示您在该变量中指定的目录的内容,该目录在您使用--volume 选项指定的存储位置,作为要挂载的外部 volume。例如,如果该目录被指定为 /nethome/pmartinez/iris_external/durable,如示例 docker run 中所示,您会做如下操作 $ cd /nethome/pmartinez/iris_external $ ls durable iris.key $ ls durable csp dist httpd iris.cpf iris.cpf_20180417 _LastGood_.cpf mgr $ ls durable/mgr alerts.log irisaudit iris.ids irislocaldata iristemp IRIS.WIJ journal.log startup.last SystemMonitor.log user ilock IRIS.DAT iris.lck iris.shid iris.use journal messages.log stream Temp 返回容器中 InterSystems IRIS 实例的管理门户(Management Portal),选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Journal Settings(日志设置) 以显示日志设置(Journal Settings)页面。 Secondary journal directory(二级日志目录)设置从 /external/durable/mgr/journal/ 更改为 /external/durable/mgr/journal2/,并点击 Save(保存)。 返回到命令行,再次列出持久化 %SYS 目录的 mgr 子目录: $ ls /nethome/pmartinez/iris_external/durable/mgr alerts.log irisaudit iris.ids iris.lck iris.shid iris.use journal journal.log messages.log stream Temp ilock IRIS.DAT iris.key irislocaldata iristemp IRIS.WIJ journal2 licmanager.port startup.last SystemMonitor.log user 由于您对容器内的 InterSystems IRIS 实例进行了更改,所以 journal2 子目录被添加到容器外 。 这个示例显示了持久化 %SYS (durable %SYS)如何使您通过从新映像(image)创建容器来升级容器化的 InterSystems IRIS 实例。您对实例所做的所有持久化更改都存储在容器外的持久化 %SYS 目录(durable %SYS directory);如果您使用所需的选项从任何 InterSystems IRIS 映像(image)创建并启动一个新容器 — 即--volume 选项为持久化 %SYS (durable %SYS)挂载外部存储位置,以及--env ISC_DATA_DIRECTORY 选项指定该挂载 volume 上持久化 %SYS(durable %SYS) 位置,该位置必须存在,并且包含一个 /mgr 子目录 — 这些更改由实例继承,因为它使用与前一个容器中的实例相同的数据。 4.了解有关容器中的 InterSystems IRIS 的更多信息 此时,您已经准备好继续探索容器和 InterSystems IRIS 必须提供的东西。使用下面的文档和参考资料来深入了解容器和 InterSystems IRIS。 Docker Containers and InterSystems IRIS(《Docker 容器和 InterSystems IRIS》) (视频) Running InterSystems Products in Containers(《在容器中运行 InterSystems 产品》) 来自 InterSystems 开发者社区(Developer Community)的文章: What is a Container?(《什么是容器?》) What is a Container Image?(《什么是容器映像?》) Using InterSystems IRIS Containers with Docker for Windows(《使用 InterSystems IRIS 容器与 Docker for Windows》) Docker Documentation(《Docker 文档》) InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)——使用 InterSystems 云管理器(InterSystems Cloud Manager,ICM)可以轻松直观地配置基础设施,并以各种方式在上面部署容器。ICM 为 InterSystems IRIS 带来了基础设施即代码(Infrastructure as Code,IaC)和容器化部署的好处,而不需要在新技术、培训、配置和管理方面进行重大投资。本指南包含有关 ICM 和使用 InterSystems IRIS 与 Docker 容器的文档。 First Look:InterSystems Cloud Manager(《技术概要:InterSystems 云管理器》)
公告
jieliang liu · 六月 15, 2021

InterSystems IRIS、IRIS for Health和HealthShare Health Connect 2021.1现已正式发布。

InterSystems非常高兴地宣布,InterSystems IRIS数据平台、InterSystems IRIS for Health和HealthShare Health Connect的2021.1版本现已向我们的客户和合作伙伴全面开放。 这个版本的为开发者提供了更大的自由度,使他们可以用自己选择的编程语言在服务器端和客户端建立快速和强大的应用程序。这个版本还使用户能够通过新的和更快的分析能力更有效地消费大量的信息。 我们期望许多客户和合作伙伴将他们的Caché和Ensemble部署升级到InterSystems的IRIS版本,并尽一切努力使之成为一个平稳和值得的过渡。大多数应用程序在IRIS上运行后会立即看到性能上的好处,甚至在他们探索IRIS带来的许多强大功能之前。 我们诚挚地邀请您参加我们的网络研讨会,介绍新版本的亮点,时间是美国东部时间6月17日上午11点。网络研讨会将被记录下来,并在会后进行 重播。 Release Highlights 在InterSystems IRIS 2021.1,客户可以部署 InterSystems IRIS Adaptive Analytics,Adaptive Analytics是一个附加产品,它扩展了InterSystems IRIS,为商业用户提供了卓越的易用性和自助分析能力,使他们能够对大量数据进行可视化、分析和查询,以获得他们所需的信息,从而做出及时和准确的商业决策,而无需是数据设计或数据管理方面的专家。Adaptive Analytics通过在后台自主构建和维护临时数据结构,透明地加速了针对InterSystems IRIS运行的分析查询工作负载。 该版本中的其他新亮点功能包括。 改进了我们的外部语言服务器的可管理性,现在也包括R和Python。这种网关技术使您能够以您选择的语言稳健和可扩展地利用服务器端代码。 InterSystems Kubernetes Operator(IKO)为您的环境提供声明式配置和自动化,现在还支持部署InterSystems System Alerting & Monitoring(SAM)。 InterSystems API Manager v2.3,包括改进的用户体验、Kafka支持和混合模式。 IntegratedML的主流可用性,使SQL开发人员能够直接在一个纯粹的基于SQL的环境中构建和部署机器学习模型。 支持分片表上的流字段,使您在InterSystems IRIS水平可扩展架构上获得完全的SQL模式灵活性。 一个iris-lockeddown容器镜像,实现了许多安全最佳实践,如禁用管理门户的网络访问和适当的操作系统级权限。 支持用于Oauth 2.0的代码交换的证明密钥(PKCE)。 InterSystems IRIS for Health 2021.1包括InterSystems IRIS的所有改进功能。此外,该版本通过用于解析和评估FHIRPath表达式的API,进一步扩展了该平台对FHIR®标准的全面支持。这是对2020.1以来发布的重要的FHIR相关功能的补充,包括对FHIR Profiles、FHIR R4 Transforms和FHIR客户端API的支持。 该版本还包括HealthShare Health Connect,这是我们基于IRIS for Health的集成引擎,提供大批量的交易支持、流程管理和监控,以支持关键任务应用。有关其功能集与InterSystems IRIS for Health的比较的详细概述,请参见这里。 关于所有这些功能的更多细节可以在产品文档中找到,该文档最近通过方便的目录侧边栏变得更加容易浏览。 InterSystems IRIS 2021.1 文档和发布说明 InterSystems IRIS for Health 2021.1 文档和发布说明 HealthShare Health Connect 2021.1 文档和发布说明 如果您从早期版本升级并使用TLS 1.3,请参见这些升级注意事项。 如何获得软件 InterSystems IRIS 2021.1是一个扩展维护(EM)版本,并附带有适用于所有支持平台的经典安装包,以及OCI(Open Container Initiative)又称Docker格式的容器镜像。 每个产品的完整安装包都可以从WRC的产品下载网站获得。使用 "自定义 "安装选项使用户能够选择他们需要的选项,如InterSystems Studio和IntegratedML,以合理地缩小其安装规模。 InterSystems IRIS和IRIS for Health的企业版容器映像以及所有相应的组件可通过InterSystems容器注册中心使用以下命令获得: docker pull containers.intersystems.com/intersystems/iris:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/iris-ml:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/irishealth:2021.1.0.215.0 docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.1.0.215.0 有关可用图像的完整列表,请参考ICR文件。 社区版的容器图像也可以使用以下命令从Docker商店中提取。 docker pull store/intersystems/iris-community:2021.1.0.215.0 docker pull store/intersystems/iris-ml-community:2021.1.0.215.0 docker pull store/intersystems/irishealth-community:2021.1.0.215.0 docker pull store/intersystems/irishealth-ml-community:2021.1.0.215.0 另外,所有容器镜像的tarball版本可以通过WRC的产品下载网站获得。 InterSystems IRIS Studio 2021.1是一个独立的IDE,用于Microsoft Windows,可以通过WRC的产品下载网站下载。它适用于InterSystems IRIS和IRIS for Health 2021.1及以下版本。InterSystems还支持VSCode ObjectScript插件,用于用Visual Studio Code为InterSystems IRIS开发应用程序,该插件可用于Microsoft Windows、Linux和MacOS。 其他独立的InterSystems IRIS 2021.1组件,如ODBC驱动程序和Web网关,可从同一页面获得。 分享您的经验 我们每年只能宣布一个EM版本,所以我们很高兴看到这个版本现在达到了GA的里程碑,并渴望听到你对新软件的体验。请不要犹豫,通过您的客户团队或在开发人员社区上与您联系,对该技术或您使用该技术解决的使用案例提出任何意见。 对于选定的新功能和产品,我们已经建立了早期访问计划,允许我们的用户在软件发布之前进行评估。通过这些有针对性的举措,我们可以向目标受众学习,并确保新产品在发布时能够满足他们的需求。如果您有兴趣参与其中任何一项,请通过您的客户团队或观看开发人员社区进行联系。
公告
Nicky Zhu · 三月 30, 2021

Caché、Ensemble和InterSystems IRIS的维护版本发布

现已推出三套新的维护版本: Caché 2018.1.5, Ensemble 2018.1.5, and HSAP 2018.1.5 InterSystems IRIS 2019.1.2, IRIS for Health 2019.1.2, and HealthShare Health Connect 2019.1.2 InterSystems IRIS 2020.1.1, IRIS for Health 2020.1.1, and HealthShare Health Connect 2020.1.1 安装包和容器版本可从以下网站下载 WRC Software Distribution site。 这些都是维护版本,在广泛的领域内有许多更新。 有关这些版本中的修正信息,请参考该版本的文档,其中包括发行说明和升级检查表、发行变更列表,以及类参考资料和全套指南、参考资料、教程和文章。所有的文档都可以通过以下方式获得 docs.intersystems.com 。 在这些版本中也加入了新的平台支持。 特别是,Ubuntu 20.04 LTS的支持已经添加到所有版本中,IBM AIX 7.1和7.2对System p-64的支持已经添加到2019.1.2中(并且已经在2020.1中),而对Linux的ARM64支持已经添加到2020.1.1中。 详情请参见各版本的支持平台文档。 这些版本的构建号如下表所示: 版本 产品 构建号 2018.1.5 Caché and Ensemble 2018.1.5.659.0 2018.1.5 Caché Evaluation 2018.1.5.659.0su 2018.1.5 HealthShare Health Connect (HSAP) 2018.1.5HS.9056.0 2019.1.2 InterSystems IRIS 2019.1.2.718.0 2019.1.2 IRIS for Health 2019.1.2.718.0 2019.1.2 HealthShare Health Connect 2019.1.2.718.0 2020.1.1 InterSystems IRIS 2020.1.1.408.0 2020.1.1 IRIS for Health 2020.1.1.408.0 2020.1.1 HealthShare Health Connect 2020.1.1.408.0 2020.1.1 InterSystems IRIS Community 2020.1.1.408.0 2020.1.1 IRIS for Health Community 2020.1.1.408.0 2020.1.1 IRIS Studio 2020.1.1.408.0
文章
Jingwei Wang · 十二月 22, 2021

使用内置REST API监控InterSystems IRIS

IRIS 2019.4 预览版中发布了/api/monitor服务,以Prometheus格式展示IRIS指标,但没有正式公布。对于任何想要使用IRIS指标作为其监控和警报解决方案的一部分的人来说,这是一个大新闻。该API是新的IRIS 系统警报和监控(SAM)解决方案的一个组成部分,将在IRIS的一个即将到来的版本中发布。 然而,你不必等待SAM开始规划和试用这个API来监控你的IRIS实例。在未来的文章中,我将深入挖掘可用的指标和它们的含义,并提供交互式仪表盘的例子。但首先,让我从一些背景和一些问题和答案开始。 IRIS(和Caché)总是在收集关于它自己和它所运行的平台的几十个指标。一直以来都有多种收集这些指标的方法来监控Caché和IRIS。我发现,很少有安装使用IRIS和Caché内置的解决方案。例如,History Monitor仪表盘作为性能和系统使用指标的历史数据库已经存在很长时间了。然而,没有明显的方法来展现这些指标,并实时监测系统。 IRIS平台的解决方案正在从运行在几个企业内部的实例上的单体应用程序,转向分布式解决方案部署在 "任何地方"。对于许多用例,现有的IRIS监控选项并不适合这些新的模式。InterSystems没有使用陈旧的方法,而是寻找当前流行的、经过验证的开源解决方案进行监控和警报。 普罗米修斯? 普罗米修斯是一个著名的、广泛部署的、技术成熟的开源监控系统。它有各种各样的插件,且能在云环境中很好地工作,对本地部署也同样有用。其插件包括操作系统、网络服务器(如Apache)和许多其他应用程序。普罗米修斯通常与可视化工具一起使用,例如,Grafana。 Grafana? Grafana也是开源的。随着这一系列文章的进行,我将提供常见场景的监控仪表盘的样本模板。你可以把这些样本作为基础,为你所关心的事情设计仪表盘。当你把IRIS的指标与你整个解决方案堆栈的指标结合起来时,真正的力量就来了。从平台组件、操作系统、IRIS,特别是当你从你的应用程序中添加仪器时。 以前没有使用过吗? 用Prometheus和Grafana监控IRIS和Caché并不新鲜。几年来,我一直在使用这些应用程序来监控我的开发和测试系统。如果你在开发者社区搜索 "Prometheus",你会发现其他的帖子(例如,Mikhail Khomenko的一些优秀帖子),显示如何暴露Caché指标供Prometheus使用。 现在版本的区别是,/api/monitor API被包括在版本内,并且默认启用。不需要编码你自己的类来暴露度量。 普罗米修斯入门 这里是对Prometheus和一些术语的快速介绍。我希望你能看到高层次的东西,帮你考虑如何可视化或使用metrics打下一些基础。 普罗米修斯的工作方式是刮取或拉取从HTTP端点(API,如IRIS /api/monitor)的应用程序中暴露的时序数据。Exporters和客户端库存在于许多语言、框架和开源应用程序,例如,网络服务器Apache、操作系统、docker、Kubernetes、数据库以及现在的IRIS。 Exporters被用来检测应用程序和服务,并在一个端点上展示相关的指标,以便进行数据拉取。核心exporters支持网络服务器、数据库等标准组件。许多其他开源exporters可从Prometheus社区获得。 普罗米修斯术语 有几个关键术语是需要了解。 Targets是服务所在的目标,如主机或应用程序或Apache或IRIS等服务或你自己的应用程序。 普罗米修斯通过HTTP对目标进行抓取,收集时间序列数据的指标。 时间序列数据是由应用程序暴露的,例如IRIS或通过exporters。 Exporters可用于你无法控制的东西,如Linux内核指标。 由此产生的时间序列数据被储存在Prometheus服务器的本地数据库中。 时间序列数据库可以使用优化的查询语言(PromQL)进行查询。例如,创建警报或由客户应用程序(如Grafana)在仪表板上显示指标。 然而,对Prometheus数据库的访问--在IRIS上--是透明的,Grafana等应用程序不知道也不关心。 Spoiler Alert:出于安全、扩展、高可用性和其他一些运行效率的考虑,对于新的SAM解决方案,用于Prometheus时间序列数据的数据库是IRIS!这也是为什么我们要把Prometheus数据库的访问权放在IRIS上。然而,对Prometheus数据库的访问在IRIS上是透明的,Grafana等应用程序不知道也不关心。 普罗米修斯数据模型 由API返回的metrics是Prometheus格式的。普罗米修斯使用一种简单的基于文本的指标格式,每行有一个指标,格式是。 <identifier> [ (time n, value n), ....] 衡量标准使用标签(键,值)对。标签是一种强大的作为维度的方式来过滤度量。例如,检测IRIS /api/monitor返回的单一指标:日志的可用空间。 iris_jrn_free_space{id="WIJ",dir=”/fast/wij/"} 401562.83 标识符告诉你该指标是什么。 iris_jrn_free_space 多个标签可以用来修饰指标,用来过滤和查询。在这个例子中,可以看到 WIJ 和存储 WIJ 的目录。 id="WIJ",dir="/fast/wij/" 和值: 401562.83 (MB). What IRIS metrics are available? The preview documentation has a list of metrics. However, be aware there may be changes. You can also simply query the /api/monitor/metrics endpoint and see the list. I use Postman which I will demonstrate in the next community post. 可以用哪些IRIS指标? 预览文档有一个metrics的列表。请注意可能会有变化。你也可以简单地查询/api/monitor/metrics端点并查看该列表。我将在下一篇社区文章中演示使用Postman调用这个端点。 应该监控什么? 当你考虑如何监控你的系统和应用程序时,请牢记这些要点。 对影响用户的关键指标进行检测。 用户并不关心你的一台机器的CPU是否不足。 用户关心的是服务是否缓慢或有错误。 对于你的主要仪表盘来说,重点是直接影响用户的高级指标。 对于你的仪表盘来说,要避免一整面墙的图表。 人类无法同时处理太多的数据。 例如,每个服务拥有一个仪表板。 考虑服务,而不是机器。 一旦你把问题隔离到一个服务上,那么你就可以深入研究,看看是否是一台机器的问题。 参考资料 文档下载:Prometheus 和 Grafana 我在InterSystems 2019年全球峰会上介绍了SAM(包括Prometheus和Grafana)的预发布概述,你可以找到InterSystems学习服务网站的链接。如果链接不起作用,请进入InterSystems学习服务网站并搜索。"系统警报和监控变得简单" 在社区中搜索 "Prometheus "和 "Grafana"。查看原帖 由 @Murray Oldfield 撰写
公告
Tingting Jiang · 六月 21, 2022

InterSystems热招职位(3):Technical Specialist(Product Support)

InterSystems正在招聘Technical Specialist(Product Support),欢迎您的自荐、推荐。 请将简历投递至Belinda.Glasson@intersystems.com,愿您的加入给我们带来新的活力,我们也将为您提供广阔的发展空间!(由于岗位职能要求,职位说明以英文形式发布。) Location:Beijing Job Title:Technical Specialist Department:Product Support Reporting to:China Support Supervisor What We Do Matters Why are we here? To ensure that our customers have reliable access to the right information at the right time—information they can share and use to draw insights, leading to better decisions. Job Summary The Technical Specialist will be required to perform custom development tasks and provide support for InterSystems TrakCare and related products. The Technical Specialist will be responsible for site specific software support and development activities and to ensure that the software satisfies project specifications and is delivered and deployed in line with project requirements. The Technical Specialist must be available to visit client sites (e.g. hospitals/laboratories) and implementation partners for technical support and/or to provide technical training. Some travel may be required. Key Responsibilities of the Role Provide immediate response to customer inquiries in accordance with service standards. Provide technical support for interfaces, reports, extracts, data migration scripts and conversions. Provide advice and best practices for technical areas such as networks, configurations, architectures etc. Provide technical support for troubleshooting and performance analysis for reports, stored procedures, interfaces, conversions, data migration scripts and user defined functions. Escalate Open (unresolved) problems in accordance with current policies and procedures. Production of training materials for technical courses such as system custom development or reporting. Production of technical documentation such as reference materials, installation instructions, user guides, knowledge-base articles. Continuously improve customer satisfaction by soliciting customer suggestions for product and service improvements and then escalating such suggestions to management. Improve response time to customer inquiries by continuously improving communication, analytical, and learning skills. Participate in on-site technical training if required. Participate in on-site technical implementations if required. Participate in the on call 24 hour roster service. Assistance in researching new development or report writing 3rd party products such as JReports. Experience and Qualifications BS or MS in Computer Science or equivalent. Knowledge of web oriented languages, including HTML, and Java script, SQL, data analysis and database methodologies. Knowledge of Linux is strongly desired, VMWare is a plus. Knowledge of programming languages – ideally Java or C++. Personal Specifications Information Technology or Science Degree
文章
Michael Lei · 八月 9, 2022

社区文章汇总--跟着社区学习InterSystems 技术

在这篇文章中,你可以访问InterSystems开发者社区中与学习InterSystems IRIS最相关主题的文章库。找到按机器学习、嵌入式Python、JSON、API和REST应用、管理和配置InterSystems环境、Docker和云、VSCode、SQL、分析/BI、全局、安全、DevOps、互操作性、Native API排列的顶级发表的文章。快来享受学习的乐趣吧! 机器学习 机器学习是建立先进的数据分析和自动化人工活动的一种必要的技术,具有很好的效率。它可以创建认知模型,从现有的数据中学习,并根据其自我调整的算法进行预测、概率计算、分类、识别和 "非创造性 "的人类活动的自动化。 在所有情况下,InterSystems IRIS作为一个数据平台和环境来创建、执行、提供和使用这些机器学习模型。IRIS能够从SQL命令(IntegratedML)中使用ML,使用嵌入式Python和PMML(预测模型标记语言)来执行ML。你可以在以下文章中查看它的功能: 标题 描述 地址URL 一体化机器学习动手实验 一体化机器学习概览ML https://cn.community.intersystems.com/node/517656 AI Robotization with InterSystems IRIS Data Platform(英文) AI on IRIS productions https://community.intersystems.com/post/ai-robotization-intersystems-iris-data-platform 利用IRIS 一体化机器学习IntegratedML来预测糖尿病的Web 应用 一体化机器学习示例 https://cn.community.intersystems.com/node/519381 Predict Maternal Health Risks(英文) 一体化机器学习示例 https://community.intersystems.com/post/predict-maternal-health-risks Using Machine Learning to Organize the Community – 1(英文) Using Python ML libraries https://community.intersystems.com/post/using-machine-learning-organize-community-1 ObjectScript 语言 ObjectScript是InterSystems的官方编程语言。它简单、灵活,在创建后台、集成和分析应用程序方面非常强大。请查阅以下文章以了解更多信息: 标题 描述 地址URL InterSystems ObjectScript 101++ (英文) Video series to learn ObjectScript https://community.intersystems.com/post/intersystems-objectscript-101-en On $Sequence function(英文) Create sequences of numbers https://community.intersystems.com/post/sequence-function Writing better-performing loops in Caché ObjectScript(英文) Do loops https://community.intersystems.com/post/writing-better-performing-loops-cach%C3%A9-objectscript 数据匿名化 IRIS-Disguise 工具介绍 学习如何定制化 ObjectScript 持久化类和属性 https://cn.community.intersystems.com/node/509271 ObjectScript 错误处理片段 异常处理 https://cn.community.intersystems.com/node/523756 Traditional Debugging in ObjectScript(英文) Debug技巧 https://community.intersystems.com/post/traditional-debugging-objectscript 在Caché中使用正则表达式 使用正则表达式 https://cn.community.intersystems.com/node/487941 Robust Error Handling and Cleanup in ObjectScript(英文) 高质量代码 https://community.intersystems.com/post/robust-error-handling-and-cleanup-objectscript SPOOL - the forgotten device(英文) 使用 Spool https://community.intersystems.com/post/spool-forgotten-device How we learned to stop worrying and love InterSystems Ensemble(英文) Processing JSON on Productions https://community.intersystems.com/post/how-we-learned-stop-worrying-and-love-intersystems-ensemble 一个更有用的 Object Dump 对象Dumping https://cn.community.intersystems.com/node/523761 Logging using macros in InterSystems IRIS(英文) Logging using macros https://community.intersystems.com/post/logging-using-macros-intersystems-iris SYSLOG - what it really is and what it means(英文) Debug information on Syslog https://community.intersystems.com/post/syslog-what-it-really-and-what-it-means Tips for debugging with %Status(英文) Debug using %Status https://community.intersystems.com/post/tips-debugging-status 发挥 $Query 的最大作用 使用 $Query 查找数据 https://cn.community.intersystems.com/node/519806 Multidimensional Property Persistence - Part 1 (Classic) (英文) Multidimensional persistent properties https://community.intersystems.com/post/multidimensional-property-persistence-part-1-classic The adopted Bitmap(英文) Bitmap indexes https://community.intersystems.com/post/adopted-bitmap 如何成为时间领主 - 诞生 日期和时间API https://cn.community.intersystems.com/node/513356 Importance and Collection of Exact Version Information ($zv / $zversion)(英文) Get IRIS version https://community.intersystems.com/post/importance-and-collection-exact-version-information-zv-zversion Date before Dec.1840 ? Negative $H(orolog) ?(英文) 日期为负 https://community.intersystems.com/post/date-dec1840-negative-horolog Creating a Custom Index Type in Caché (英文) 创建定制索引 https://community.intersystems.com/post/creating-custom-index-type-cach%C3%A9 $LIST string format and %DynamicArray and %DynamicObject classes(英文) Using $LIST, Dynamic Object, and Dynamic Arrays https://community.intersystems.com/post/list-string-format-and-dynamicarray-and-dynamicobject-classes SQL for ^ERROR Global(英文) Use SQL to see Error content https://community.intersystems.com/post/sql-error-global Add a default setting value by code (英文) 设置默认值 https://community.intersystems.com/post/add-default-setting-value-code Iterate over dynamic object(英文) Use Iterate https://community.intersystems.com/post/iterate-over-dynamic-object 列出类的所有属性 (我喜欢 ObjectScript 的原因) ObjectScript 属性详解 https://cn.community.intersystems.com/node/512981 Try catch block I usually use in InterSystems ObjectScript(英文) Try Catch 处理 https://community.intersystems.com/post/try-catch-block-i-usually-use-intersystems-objectscript 在ObjectScript中运行shell命令 Run shell commands https://cn.community.intersystems.com/node/523766 嵌入式 Python Python是世界上最流行和最常用的编程语言之一(https://www.tiobe.com/tiobe-index/)。InterSystems IRIS是一个对所有主要编程语言开放的数据平台。然而,说到Python,这种神奇的语言和它的库在IRIS中到处都可以使用:在类、SQL和集成/制作中。对于那些不知道或不想知道ObjectScript(InterSystems编程语言)的人来说,这是一个不错的选择。请看下面的文章,了解如何做到这一点: 标题 描述 URL地址 Let's fight against the machines(英文) Build a tic tac toe game using Embedded Python https://community.intersystems.com/post/lets-fight-against-machines InterSystems IRIS 2021.2+ Python 代码样例 (Embedded嵌入式Python, Native 原生APIs 和 Notebooks) 使用 Python notebook 和 IRIS https://cn.community.intersystems.com/node/508691 WebSocket Client with embedded Python(英文) Custom Socket sample https://community.intersystems.com/post/websocket-client-embedded-python IRIS Python Native API in AWS Lambda (英文) Python on AWS https://community.intersystems.com/post/iris-python-native-api-aws-lambda How I added ObjectScript to Jupyter Notebooks(英文) IRIS on notebooks https://community.intersystems.com/post/how-i-added-objectscript-jupyter-notebooks Welcome Django(英文) Create Python Django apps with IRIS as a database https://community.intersystems.com/post/welcome-django Geocoding with IRIS and Google Maps API (英文) Using Geocoding python library https://community.intersystems.com/post/geocoding-iris-and-google-maps-api 使用IRIS 和Python gTTS 实现文本转化声音的REST服务 使用 gTTS 的Python 案例 https://cn.community.intersystems.com/node/517551 使用 Python Flask Web 框架构建 IRIS 响应式仪表板 基于IRIS 的Flask web 应用 https://cn.community.intersystems.com/node/513086 JSON JSON 是市场上最广泛使用的发送和接收数据的互操作性格式之一。InterSystems IRIS以多种方式支持这种格式。可以让你的本地数据库使用JSON(DocDB),序列化和反序列化对象,用JSON处理请求和响应,特别是来自REST服务的请求和响应。回顾以下文章: 标题 描述 URL地址 Introducing new JSON capabilities in Caché 2016.1 (英文) Presenting ObjectScript JSON API https://community.intersystems.com/post/introducing-new-json-capabilities-cach%C3%A9-20161 JSON Enhancements(英文) JSON Adaptor API https://community.intersystems.com/post/json-enhancements API 和 REST 应用Applications 后台应用程序目前是以REST(Representational State Transfer)范式开发的,并以Web API的形式暴露。下面的文章将帮助你了解它是如何工作的: 标题 描述 URL地址 GraphQL for InterSystems Data Platforms (英文) Create REST API with GraphQL style https://community.intersystems.com/post/graphql-intersystems-data-platforms Introducing InterSystems API Manager (英文) API Management overview https://community.intersystems.com/post/introducing-intersystems-api-manager Advanced URL mapping for REST Mapping routes to your APIs https://community.intersystems.com/post/advanced-url-mapping-rest AppS.REST - a new REST framework for InterSystems IRIS Create REST apps easily https://community.intersystems.com/post/appsrest-new-rest-framework-intersystems-iris RESTForms - REST API for your classes Create REST API for CRUD applications https://community.intersystems.com/post/restforms-rest-api-your-classes 使用规范优先的方式开发REST API 以合同优先的方式开发API https://cn.community.intersystems.com/node/484341 ObjectScript REST API Cookbook(英文) REST API development tips https://community.intersystems.com/post/objectscript-rest-api-cookbook 从持久类和序列类生成 Swagger 规范 Contract First Approach to develop APIs https://cn.community.intersystems.com/node/484311 InterSystems IRIS REST Application Patterns Create API REST using IRIS https://community.intersystems.com/post/intersystems-iris-rest-application-patterns Let's create an FHIR profile using SUSHI Part 1(英文) Create custom FHIR profiles https://community.intersystems.com/post/lets-create-fhir-profile-using-sushi-part-1 IAM (InterSystems API Manager), Zero to Hero(英文) Manage your APIs with IAM https://community.intersystems.com/post/iam-intersystems-api-manager-zero-hero Using InterSystems API Management to Load Balance an API (英文) Use APIM to do API load balance https://community.intersystems.com/post/using-intersystems-api-management-load-balance-api IAM实践指南——OAuth 2.0下的API保卫战(第一部分) Secure your API using APIM https://cn.community.intersystems.com/node/487141 Getting an Angular UI for your InterSystems IRIS application in 5 minutes (英文) Full Stack app with IRIS and Angular https://community.intersystems.com/post/getting-angular-ui-your-intersystems-iris-application-5-minutes Upload into an InterSystems IRIS REST API (英文) Save files using REST API https://community.intersystems.com/post/upload-intersystems-iris-rest-api 管理和配置InterSystems环境 IRIS环境的良好管理和配置对用户使用的应用程序的性能、安全性、可用性和可靠性至关重要。这些文章可以给你很好的提示,告诉你如何做到这一点: 标题 描述 URL地址 InterSystems 数据平台的容量规划和性能系列文章 容量和性能规划提升 https://cn.community.intersystems.com/node/483921 Deploying Applications in InterSystems Cache with %Installer(英文) Using %Installer to create namespaces, databases, and applications configuration https://community.intersystems.com/post/deploying-applications-intersystems-cache-installer Horizontal Scalability with InterSystems IRIS(英文) Set IRIS instances for horizontal scalability https://community.intersystems.com/post/horizontal-scalability-intersystems-iris The InterSystems Iris Fhirserver running on a Raspberry Pi Raspberry running as a FHIRserver(英文) Run IRIS inside Raspberry PI https://community.intersystems.com/post/intersystems-iris-fhirserver-running-raspberry-pi-raspberry-running-fhirserver Database Mirroring without a Virtual IP Address(英文) Set mirrors using VIP https://community.intersystems.com/post/database-mirroring-without-virtual-ip-address Apache Web Gateway with Docker(英文) Configure SSL and Web Gateway for web applications https://community.intersystems.com/post/apache-web-gateway-docker Work with SAML in IRIS(英文) SAML to Web services https://community.intersystems.com/post/work-saml-iris 掌握 %SYSTEM.Encryption 加密类 Encrypt and decrypt using IRIS https://cn.community.intersystems.com/node/518191 Docker 和 Cloud 新的应用架构在容器Docker和云中工作,旨在实现弹性扩展,快速安装、配置和提供服务,并降低基础设施的复杂性和成本。学习这些文章,了解如何将IRIS带入云中: 题目 描述 URL地址 Highly available IRIS deployment on Kubernetes without mirroring(英文) IRIS on cloud clusters with Kubernetes https://community.intersystems.com/post/highly-available-iris-deployment-kubernetes-without-mirroring 面向 Amazon Web Services (AWS) 的 InterSystems IRIS 示例参考架构 基于AWS的IRIS https://cn.community.intersystems.com/node/484351 面向 Microsoft Azure Resource Manager (ARM) 的 InterSystems 示例参考架构 基于Azure 资源管理器(ARM)架构的IRIS https://cn.community.intersystems.com/node/484361 Dockerfile 和它的朋友们或者如何在 InterSystems IRIS 上运行和合作 ObjectScript 项目 Docker项目里的重要文件管理 https://cn.community.intersystems.com/node/484326 InterSystems IRIS Deployment Guide for AWS using CloudFormation template(英文) IRIS on AWS using CloudFormation https://community.intersystems.com/post/intersystems-iris-deployment%C2%A0guide-aws%C2%A0using-cloudformation-template 面向 Google Cloud Platform (GCP) 的 InterSystems IRIS 示例参考架构 IRIS on Google Cloud https://cn.community.intersystems.com/node/484056 Using AWS Glue with InterSystems IRIS(英文) Using IRIS and AWS Glue (AWS ETL tool) https://community.intersystems.com/post/using-aws-glue-intersystems-iris Amazon EKS, IRIS 高可用与备份 基于AWS的IRIS高可用 https://cn.community.intersystems.com/node/517536 Running InterSystems Reports in containers(英文) IRIS reports on Docker https://community.intersystems.com/post/running-intersystems-reports-containers Running InterSystems IRIS in a FaaS mode with Kubeless(英文) IRIS on Kubernetes https://community.intersystems.com/post/running-intersystems-iris-faas-mode-kubeless InterSystems Kubernetes Operator Deep Dive: Introduction to Kubernetes Operators(英文) IRIS on Kubernetes https://community.intersystems.com/post/intersystems-kubernetes-operator-deep-dive-introduction-kubernetes-operators Scaling Cloud Hosts and Reconfiguring InterSystems IRIS(英文) Scaling IRIS on AWS, Azure, or GCP https://community.intersystems.com/post/scaling-cloud-hosts-and-reconfiguring-intersystems-iris Deploying a Simple IRIS-Based Web Application Using Amazon EKS(英文) IRIS on AWS https://community.intersystems.com/post/deploying-simple-iris-based-web-application-using-amazon-eks VSCode VSCode是世界上最常用的开发IDE之一。IRIS完全支持这个IDE。请看以下文章: 标题 描述 URL地址 GitHub上的VSCode-ObjectScript 在网页版 Github VSCode上开发IRIS 应用 https://community.intersystems.com/post/vscode-objectscript-github GitHub Codespaces with IRIS(英文) Develop IRIS apps into Web Github https://community.intersystems.com/post/github-codespaces-iris VSCode Tips & Tricks - SOAP Wizard(英文) Create shortcut option on VSCode https://community.intersystems.com/post/vscode-tips-tricks-soap-wizard Adding your own snippets to VS Code(英文) Create snippets https://community.intersystems.com/post/adding-your-own-snippets-vs-code SQL SQL是处理关系型数据库的最常用语言之一。这些文章展示了如何进行查询和数据持久性: 标题 描述 URL地址 Free Text Search: The Way To Search Your Text Fields That SQL Developers Are Hiding From You!*(英文) Using Indexes to promote advanced search https://community.intersystems.com/post/free-text-search-way-search-your-text-fields-sql-developers-are-hiding-you 改善日期范围查询的SQL性能 使用日期进行SQL查询 https://cn.community.intersystems.com/node/523636 Static WHERE Conditions(英文) Where on Persistent Classes https://community.intersystems.com/post/static-where-conditions 2021.2 SQL Feature Spotlight - Run Time Plan Choice(英文) Select Runtime SQL Execution Plan https://community.intersystems.com/post/20212-sql-feature-spotlight-run-time-plan-choice New in 2020.1: the Universal Query Cache(英文) SQL Cache https://community.intersystems.com/post/new-20201-universal-query-cache Materialized Views(英文) Create views inside persistent classes https://community.intersystems.com/post/materialized-views SQL Debug 小技巧 Debug SQL commands https://cn.community.intersystems.com/node/518701 Using ClassQueries() as Tables(英文) Creating views https://community.intersystems.com/post/using-classqueries-tables M:N Relationship(英文) Mapping N to N relationships https://community.intersystems.com/post/mn-relationship Reading AWS S3 data on COVID as SQL table in IRIS (英文) Get CSV data from AWS S3 to IRIS table https://community.intersystems.com/post/reading-aws-s3-data-covid-sql-table-iris The One Query Performance Trick You NEED to Know? Tune Table! (英文) SQL tunning https://community.intersystems.com/post/one-query-performance-trick-you-need-know-tune-table Data Storage - Information You Must Know to Make Good Decisions When Developing (英文) Configure the data storage section on a persistent class to get more performance https://community.intersystems.com/post/data-storage-information-you-must-know-make-good-decisions-when-developing Improve SQL Performance for Date Queries, AGAIN! (英文) Tunning SQL queries for dates https://community.intersystems.com/post/improve-sql-performance-date-queries-again Scrollable ResultSet Pagination Sample(英文) Paginate SQL results (see comments too) https://community.intersystems.com/post/scrollable-resultset-pagination-sample 第 1 天:使用 InterSystems Object 和 SQL 进行开发 Concepts about SQL into InterSystems IRIS https://cn.community.intersystems.com/node/490806 DB Migration using SQLgateway(英文) Migrate from PostgreSQL, MySQL, and other databases to IRIS https://community.intersystems.com/post/db-migration-using-sqlgateway Importing CSV into the Existing Table in InterSystems IRIS(英文) Import CSV to SQL Table https://community.intersystems.com/post/importing-csv-existing-table-intersystems-iris 访问IRIS数据平台的四种API方式 SQL API https://cn.community.intersystems.com/node/493276 Indexing of non-atomic attributes(英文) Create advanced index options https://community.intersystems.com/post/indexing-non-atomic-attributes Know Your Indices(英文) Index creation fundamentals https://community.intersystems.com/post/know-your-indices Dynamic SQL to Dynamic Object(英文) Use DynamicSQL https://community.intersystems.com/post/dynamic-sql-dynamic-object 数据迁移工具 - 第一部分: 从 Postgres 到 IRIS 如何从其他数据库迁移到 IRIS 的系列文章 https://cn.community.intersystems.com/node/510831 BI与分析 BI和分析可以根据图形、仪表盘、摘要和详细表格中的数据分析,并根据分析员用户的导航和数据探索来做出决策。以下是如何使用IRIS建立分析应用的方法: 标题 描述 URL地址 InterSystems IRIS 上的 COVID-19 分析 分析全球疫情的仪表盘 https://community.intersystems.com/post/covid-19-analytics-intersystems-iris DeepSee Troubleshooting Guide(英文) Fix problems https://community.intersystems.com/post/deepsee-troubleshooting-guide AnalyzeThis – Quick start into InterSystems BI (英文) Quick start into IRIS BI https://community.intersystems.com/post/analyzethis-%E2%80%93-quick-start-intersystems-bi Power BI Connector for InterSystems IRIS. Part I(英文) Using IRIS data inside Power BI https://community.intersystems.com/post/power-bi-connector-intersystems-iris-part-i Creating Portlets in DeepSee(英文) Analytics Portlets with IRIS BI https://community.intersystems.com/post/creating-portlets-deepsee Game Of Throne Analytics or How long is Arya's Stark List(英文) Analytics sample https://community.intersystems.com/post/game-throne-analytics-or-how-long-aryas-stark-list DeepSee Web: InterSystems Analytics Visualization with AngularJS. Part 1(英文) Web dashboards using Angular https://community.intersystems.com/post/deepsee-web-intersystems-analytics-visualization-angularjs-part-1 Building Analytics Solution with IRIS(英文) Present main options to do analytics with IRIS https://community.intersystems.com/post/building-analytics-solution-iris Globals Globals 是IRIS中灵活存储和检索数据的关键机制,无论是SQL、类、JSON文档、BI立方体,还是其他自定义格式。在下面的文章中可以看到如何做到这一点: 题目 描述 URL地址 The Art of Mapping Globals to Classes 1 of 3(英文) Mapping globals to SQL tables and Objects https://community.intersystems.com/post/art-mapping-globals-classes-1-3 Globals 是管理数据的魔剑 : 第一部分 Globals 基础 https://cn.community.intersystems.com/node/520821 GlobalToJSON-embeddedPython-pure(英文) Export globals to JSON https://community.intersystems.com/post/globaltojson-embeddedpython-pure Transactions in Global InterSystems IRIS(英文) Manage transactions on Globals persistence https://community.intersystems.com/post/transactions-global-intersystems-iris Store Mindmaps using Globals(英文) Using globals to persist mindmap data https://community.intersystems.com/post/store-mindmaps-using-globals 安全 确保任何应用程序的安全是至关重要的。安全性与访问和授权管理有关,跟踪和审计交易,对存储和传输的内容进行加密,以及设置正确的配置参数以确保合理资源的保护。阅读这些文章,了解更多关于如何建立安全的信息: 标题 Description URL InterSystems IRIS 开放授权框架 (OAuth 2.0) 实现 – 第 1 部分 使用 OAuth https://cn.community.intersystems.com/node/484366 Debugging Web(英文) Debugging CSP and REST apps https://community.intersystems.com/post/debugging-web Class Queries in InterSystems IRIS(英文) Defining SQL Queries inside Persistent classes https://community.intersystems.com/post/class-queries-intersystems-iris 在TLS/SSL中使用操作系统的证书库 利用 OS 证书实现 SSL https://cn.community.intersystems.com/node/518186 一致性检查_ 加速还是减速 保证一致性 https://cn.community.intersystems.com/node/485041 跟踪数据更改 - 审计日志 - 上篇 保存审计数据 https://cn.community.intersystems.com/node/486831 Running the Management Portal (Private Web Server) Over TLS/SSL/HTTPS(英文) Configure SSL to IRIS Web Server https://community.intersystems.com/post/running-management-portal-private-web-server-over-tlssslhttps OAuth Authorization and InterSystems IRIS: Taming Trust Protocols(英文) Using OAuth https://community.intersystems.com/post/oauth-authorization-and-intersystems-iris-taming-trust-protocols Using Oauth2 with SOAP (Web)Services(英文) Oauth setting for SOAP services https://community.intersystems.com/post/using-oauth2-soap-webservices DeepSee: Setting up security - Part 1 of 5(英文) Security on IRIS BI https://community.intersystems.com/post/deepsee-setting-security-part-1-5 Changes to the security level of the system(英文) Security by default https://community.intersystems.com/post/changes-security-level-system DevOps DevOps是一种采用实践和工具的方式,使源代码从开发(Dev)到生产运行(Ops)的快速和高质量的过渡成为可能。请看如何在IRIS中做到这一点。 题目 描述 URL地址 Continuous Delivery of your InterSystems solution using GitLab - Part I: Git(英文) Continuous delivery with GitLab https://community.intersystems.com/post/continuous-delivery-your-intersystems-solution-using-gitlab-part-i-git Introducing InterSystems ObjectScript Package Manager(英文) Use ZPM to configure and install third-party packages inside your application https://community.intersystems.com/post/introducing-intersystems-objectscript-package-manager ZPMshow - a helper for tired fingers(英文) How to use ZPM – IRIS Package Manager https://community.intersystems.com/post/zpmshow-helper-tired-fingers 如何以自动化方式/编程方式创建一个镜像环境 自动化创建镜像 https://cn.community.intersystems.com/node/512986 ObjectScript包管理器中的单元测试和测试覆盖率 为ObjectScript 代码质量创建单元测试 https://cn.community.intersystems.com/node/486826 使用Doker和配置文件模版来部署Sharded 集群 使用 CPF文件自动化配置 https://cn.community.intersystems.com/node/518356 Caché ObjectScript 快速参考 ObjectScript reference pdf document https://cn.community.intersystems.com/node/523791 The Anatomy of ZPM Module: Packaging Your InterSystems Solution(英文) Use ZPM to automate deployment https://community.intersystems.com/post/anatomy-zpm-module-packaging-your-intersystems-solution 在IRIS容器里添加VSCode 在容器中嵌入 VSCode https://cn.community.intersystems.com/node/516431 如何以编程/自动化方式为InterSystems IRIS创建新的数据库、命名空间和Web应用程序 自动化创建数据库和命名空间 https://cn.community.intersystems.com/node/523796 Unit Tests: Quality of your ObjectScript Code(英文) Quality Assurance with Unit Tests https://community.intersystems.com/post/unit-tests-quality-your-objectscript-code 一些有用的 InterSystems 开发者社区 Docker Images镜像 Docker社区镜像 https://cn.community.intersystems.com/node/515076 互操作性 IRIS有一个强大的数据和应用互操作性总线。通过以下文章了解如何使用它. 题目 描述 URL Sending Alerts from Ensemble via Telegram(英文) Production to send data to telegram https://community.intersystems.com/post/sending-alerts-ensemble-telegram [首次使用InterSystems IRIS]-让我们来使用互操作性! 创建BS, BO, BP和productions https://cn.community.intersystems.com/node/513971 使用嵌入式Python实现InterSystems IRIS 互操作性 使用Python创建BS, BO, BP和production https://cn.community.intersystems.com/node/512176 Ensemble / Interoperability Training Course(英文) Great sample to learn how to create productions https://community.intersystems.com/post/ensemble-interoperability-training-course 几个程序化实现互操作性的示例 使用 Python 或 ObjectScript 程序化Productions https://cn.community.intersystems.com/node/516221 Listing files in folder(英文) List files in a folder https://community.intersystems.com/post/listing-files-folder Containerising .Net/Java Gateways (or Kafka Integration Demo)(英文) Kafka support using Java or .Net Native API https://community.intersystems.com/post/containerising-netjava-gateways-or-kafka-integration-demo Implementing IRIS Integrations with .NET or Java using PEX(英文) Using PEX to create productions using Java or .Net https://community.intersystems.com/post/implementing-iris-integrations-net-or-java-using-pex Migrate from Java Business Host to PEX(英文) Using PEX https://community.intersystems.com/post/migrate-java-business-host-pex Using Tesseract OCR and Java Gateway(英文) Using Java PEX https://community.intersystems.com/post/using-tesseract-ocr-and-java-gateway Creating a PEX Business Operation(英文) Create Java PEX Business Operation https://community.intersystems.com/post/creating-pex-business-operation 在IRIS中联合运用OCR与NLP技术 Java PEX 样例 https://cn.community.intersystems.com/node/494206 Creating a custom interoperability business service using an HTTP Adapter(英文) Creating Business Services https://community.intersystems.com/post/creating-custom-interoperability-business-service-using-http-adapter 原生 API IRIS对市场上最常用的一些编程语言(Java、Javascript/NodeJS、.Net、C++和Python)的工作持开放态度。为了做到这一点,我们为这些语言中的每一种使用了本地API。请看这些文章: 题目 描述 URL地址 WebSocket Client JS with IRIS Native API as Docker Micro Server(英文) Using IRIS and NodeJS to do a WebSocket https://community.intersystems.com/post/websocket-client-js-iris-native-api-docker-micro-server IRIS Native API for ObjectScript(英文) Using Native APIs https://community.intersystems.com/post/iris-native-api-objectscript Using ZPM for Node.js(英文) Using ZPM on Node.js projects https://community.intersystems.com/post/using-zpm-nodejs Creating a PDF from a Text file(英文) Java Native API for generating PDF https://community.intersystems.com/post/creating-pdf-text-file How to Start Development with InterSystems IRIS in Less Than a Minute(英文) Start to develop using IRIS https://community.intersystems.com/post/how-start-development-intersystems-iris-less-minute Making a blog using Python + IRIS Globals(英文) A blog on using Python native API https://community.intersystems.com/post/making-blog-using-python-iris-globals 希望我们翻译哪片文章,欢迎给我们留言!
公告
Claire Zheng · 四月 19, 2023

报名启动:欢迎参加InterSystems 中国技术培训认证

为支持医疗信息行业人才发展,InterSystems 为中国市场量身定制了贴近需求、灵活、实操性强的技术认证培训计划,由 InterSystems 资深技术专家亲自授课,帮助用户快速掌握 InterSystems 技术,确保用户从快速发展的 InterSystems 技术中获益,以更好地服务于医院信息化建设。点击此处查看课程详情:InterSystems中国技术培训认证 您的最佳学习路径 为什么要参加 InterSystems 技术认证培训? InterSystems 数据平台技术已成为国内医疗信息化领域的主流技术之一,支持全国数百家大型公立医院核心系统长期稳定运行 20 余年; 专为中国技术用户量身定制,具有贴近需求、灵活、实操性强等特点; InterSystems 资深技术专家亲自授课,帮助用户快速掌握 InterSystems 技术及最佳实践; InterSystems 官方技术认证培训具备更高权威性,可以助力用户更好地运用 InterSystems 技术,并从快速发展的 InterSystems 技术中获益,保持技术先进性。 哪些用户可以参加认证培训? 凡使用 InterSystems 技术或对 InterSystems 技术感兴趣的IT从业人员或机构均可参加。 您可以从技术认证培训中获得哪些技能和成长? 与时俱进的课程更新,理论与实践相结合的学习方式,可以帮助您持续提升对 InterSystems 技术的掌握; 参与 InterSystems 的分级培训计划,考核通过即可获得认证证书; 通过线下课程与活动,拓展技术人脉。 InterSystems 中国的认证培训讲师团成员是哪些? InterSystems 中国资深工程师团队授课。 报名方式及开课时间是如何安排的? 报名人数满 5 人即开班,每季度一次,培训方式为线下培训,考试内容含书面测试与上机实践。课程收费请咨询您的 InterSystems 客户经理。医院及医疗信息化企业推荐以机构方式参与培训。 如需报名或咨询更多详情,请联系您的 InterSystems 客户经理,或通过以下方式与 InterSystems 中国团队联系: 电话:400-601-9890 邮件:GCDPsales@InterSystems.com
文章
Jingwei Wang · 九月 16, 2022

Java 连接到InterSystems IRIS数据库 - 使用 JDBC

连接前准备: Java 开发环境 InterSystems JDBC 驱动 Connection String 步骤: 配置 Classpath :指向InterSystems JDBC 驱动 - intersystems-jdbc-3.0.0.0.jar Connection String,其中import com.intersystems.jdbc*;用来导入驱动,User是命名空间名称。 import com.intersystems.jdbc*; import java.sql.Connection; public class JDBCConnection{ public static void main (String[] args) throws Exception { String dbUrl = "jdbc:IRIS://127.0.0.1:1972/User"; //replace String user = "SQLAdmin"; String pass = "deployment-password"; IRISDataSource ds = new IRISDataSource(); ds.setURL(dbUrl); ds.setUser(user); ds.setPassword(pass); Connection dbconnection = ds.getConnection(); System.out.println("Connected to InterSystems IRIS via JDBC."); } }
文章
Michael Lei · 九月 12, 2022

分析InterSystems开发者社区的的开放应用

针对InterSystems开发者社区的分析。使用InterSystems IRIS BI (DeepSee)、Power BI和Logi Report Designer制作的项目,可视化并分析InterSystems 开发者社区上的成员、文章、问题、答案、观点和其他内容和活动。 你可以看到自己的活动、文章和问题。跟踪你的贡献如何改变开发者社区。 使用IRIS BI、Adaptive Analytics、InterSystems Reports、Tableau和Power BI分析关于你和你朋友的统计数据。 该项目包含预配置的IRIS和Atscale在Docker容器中的部署以及BI系统的项目文件。 更多细节信息请见相应应用的README。 这个项目也支持在线部署,你可以在这里查看。
公告
Claire Zheng · 九月 19, 2022

轻而易举!来InterSystems Ideas为你的想法分类吧!

开发者社区的同学们,大家好! 在 之前的公告 中,我们向大家介绍了InterSystems官方反馈门户 InterSystems Ideas! 今天想给大家介绍更多,尤其是涉及到的主题。 你可以按以下主题类别提交你的想法: 💡 InterSystems Products(InterSystems产品) 在这里,您可以在这里发布与我们产品发展相关的创意和想法: InterSystems IRIS数据平台 InterSystems IRIS for Health(医疗版)数据平台 InterSystems HealthShare InterSystems TrakCare 💡 InterSystems Services(InterSystems服务) 您可以在这里发表如何使我们的服务变得更好的想法: Developer Community (开发者社区) Open Exchange app gallery(Open Exchange应用库) Global Masters gamification platform(Global Masters游戏平台) Partner Directory(供应商目录) Documentation(文档) Certification(认证) Learning (学习) 以及InterSystems Ideas Portal 还有一个主题类别是 "Other(其他)" ,如果您的创意和想法与上述两类不直接相关,可以放在这个类别下。 选择好类别(Category)后,您也可以自由添加合适的关键字/标签: 如果您认为还有哪些类别和关键字值得被添加到这里,欢迎随时与我们分享! 点击一下,来 InterSystems Ideas portal 提出你的意见和建议吧✌️
公告
Claire Zheng · 七月 30, 2021

Online Meetup:InterSystems 开发者竞赛(人工智能与机器学习)

亲爱的社区开发者们,大家好! 我们真诚邀请您参加 Online Meetup:InterSystems 开发者竞赛(人工智能与机器学习)! 时间: 2021年7月30日(周五) 11:00 AM (美东时间)23:00 (北京时间) 在这场在线Meetup,您将了解到: 此次优胜者的个人履历; 获奖Application的简短Demo; 有关应用技术的开放探讨、问答,以及下次竞赛的一些计划。 我们的发言人名单: @José.Pereira, BI开发者,Shift Consultoria e Sistemas Ltda @Henrique.GonçalvesDias, 系统管理专员/数据库管理员, Sao Paulo Federal Court @Oleh.Dontsov, 全栈开发工程,Tax Sketches SRO @Aleksandr.Kalinin6636, 工程师, LLC "Escape" @Renato.Banzai, 机器学习工程师,Itaú Unibanco @Evgeny.Shvarov, InterSystems 开发者生态经理(Developer Ecosystem Manager) @Thomas.Dyar, InterSystems 产品专家(机器学习) @Raj.Singh5479, InterSystems 产品经理( 开发者体验) @Robert.Kuszewski, InterSystems 产品经理( 开发者体验) 欢迎您在这个特别的会议上与我们的开发人员沟通、交流! ➡️ 注册参会!
公告
Michael Lei · 十二月 30, 2021

第三方合作伙伴产品展示:InterSystems IRIS的“新”监控工具

亲爱的女士们和先生们,在上个月,我改进了我的工具Caché监视器......但首先:名字 选择Caché Monitor这个名字是为了反映该工具与Caché数据库的紧密结合。我想,在可预见的未来,Intersystems Caché这个既定名称很可能会被InterSystems IRIS数据平台完全取代。因此,重塑品牌的步骤成为必要。为了在未来不那么紧密地与一个产品名称联系在一起,我们选择了一个更加中立的新名字: SQL Data Lens 不管叫什么名字,实现与Intersystems产品最紧密的整合仍然是我们的目标。持续的发展也反映在版本号的延续上。上一个版本是Caché Monitor 2.96,下一个版本是SQL Data Lens 3.0。 但这不仅仅是重新命名,而且还集成了许多新的功能,例如 一个很大的进步是,SQL Data Lens现在是基于Java Runtime Environment 11的,有了它,就可以改善对HiDPI的支持。在操作系统层面上配置了系统规模因素,支持每台显示器的DPI! 但也集成了一个新的现代的Flat 外观和Feel 集成,在亮Light和暗Dark两种模式下。 SQL DataLens带有一个最小化的私有JRE(基于JetBrains JDK 11)。 ...等等 请随时从以下网站下载并测试SQL Data Lens,无需任何注册: https://sqldatalens.com/ 我期待着你的经验,建议和想法,这些都非常欢迎。 谢谢您的关注! Andreas https://sqldatalens.com/从链接进去下载不了 我刚试了一下是可以的,而且不用翻墙,看看是否本地浏览器或者其他问题?谢谢! https://sqldatalens.com/download/ 点击download之后,会跳到https://sqldatalens.com/sqldl_files/latest/SQLDataLens_308_20220508.zip这个链接,提示“ Server Error 403 Forbidden ” 那可能得麻烦您到英文社区下面问下,这是我们德国合作伙伴做的:https://community.intersystems.com/post/new-tool-intersystems-iris, 谢谢!