清除过滤器
文章
Hao Ma · 十一月 2, 2021
本文档介绍了 InterSystems 公钥基础设施(PKI),它可以在开发组织的安全策略中发挥重要作用。它提供有关公钥加密、证书颁发机构和 PKI 的信息。然后介绍一些与使用 InterSystems PKI 相关的初始任务。完成本指南后,您将有能力创建一个证书颁发机构 (CA),然后向 CA 客户端请求并接收证书。 虽然 InterSystems PKI 不用于生产系统,但您可以用它来熟悉 PKI 工具和安全基础设施。作为设计和探索过程的一部分,这对于创建全面的安全方法特别有帮助。本指南使用 InterSystems IRIS®数据平台的默认设置,这使您能够熟悉 PKI 的基本原理,而不必处理其他在执行实现时很重要的细节问题。有关数据库加密的完整文档,请参见 The InterSystems Public Key Infrastructure(《 InterSystems 公钥基础设施》)。要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。
1 为什么 PKI 很重要 在许多企业中,关于安全漏洞的新闻频繁出现,这表明有必要保护他们的通信安全。企业需要保护从一个站点到另一个站点的数据,或者当需要某种可验证的、具有法律约束力的数字签名时。解决这些和其他需求的强大、有效和普遍的工具是公钥加密(public-key cryptography)和公钥基础设施(PKI)。公钥加密(Public-key cryptography)能够对数据进行加密和解密。这提供了一种执行与保护数据相关的各种操作的方法。这包括保护在不安全的网络(如 Internet)上传输的数据或确定文档的来源。因此,它启用了关键技术,如传输层安全(Transport Layer Security,TLS),这是浏览器保护我们与网站连接的手段。公钥加密(Public-key cryptography)对不同实体控制的数据进行操作,这些实体可以是人、应用程序、组织等。但是,仅公钥加密(Public-key cryptography)并不能为这些实体在活动中的身份提供足够的信心,特别是在它们彼此不认识的情况下。为了达到这种信任水平,需要有一个更大的结构,同时为所涉及的实体提供值得信赖和可验证的标识信息。这样一个结构被称为 PKI(公钥基础设施)。PKI 为实体建立了一种对彼此的身份有信心的方法,即使彼此没有任何直接的个人了解或接触。这要求每个实体信任第三方——证书颁发机构(CA)——为其他实体(也称为其他对等方)的身份提供担保。通过 PKI,实体可以进行有意义的、具有法律约束力的加密操作,其中包括加密、解密、数字签名和签名验证。InterSystems 提供了一个公钥基础设施(PKI),它使用 InterSystems IRIS 的实例作为 CA,允许您创建密钥对,并允许您创建与这些密钥对有关的证书。InterSystems CA 适合在组织内部和非生产环境中使用。不建议将其作为生产或商业 CA 使用;虽然它的证书在加密上是可靠的,但商业 CA 除了技术基础设施外,还需要一定程度的组织和法律基础设施。 为什么 PKI 很重要
使用 PKI 的公钥加密支持许多的安全活动:• 对电子文档进行数字签名• 验证电子文档的签名• 加密各方之间的通信• 加密文档
1.1 公钥加密和证书颁发机构(CA)如何协同工作的基本原理在使用公钥加密时,每个实体都有一个严格保密的私钥(private key),以及一个广泛使用的公钥(public key)。如果您使用其中一个密钥执行一个操作,您可以使用另一个密钥执行互补的操作;例如,如果您用私钥加密数据,那么只有您的公钥可以解密该数据。如果别人用您的公钥对内容进行加密,只有您的私钥——因此也只有您——能够解密。这意味着公钥加密为两个实体之间的安全和私人通信提供了一种方法。为了使公钥加密在互不相识且不能轻易验证对方身份的实体之间发挥作用,需要有一个双方实体都信任的第三方。这个第三方是证书颁发机构(CA)。证书颁发机构创建证书,这些证书是将公钥绑定到公钥持有者的一组标识信息的数字文档。由于公钥和私钥不可分割地相互绑定,证书也将标识信息绑定到私钥上。一些企业有内部的 CA,它们用来支持内部活动;其他 CA 作为独立的组织运作,通常作为商业服务提供证书。商业 CA 通常在不同程度的身份验证基础上提供证书;在充分验证的情况下,证书可以在组织或个人和公私密钥对之间建立起具有法律约束力的联系。CA 的使用使处于不安全环境中的实体有足够的信心以有意义的和具有法律约束力的方式使用公钥加密。互相通信的实体不需要使用相同的 CA。相反,每一个人只需要信任对方的 CA。这种信任 CA 的关系通常是在没有任何用户干预的情况下建立的,例如让浏览器附带一组预先批准的 CA 证书。事实上,一个实体可以信任一个 CA,因为它有第二个 CA 的证书,而这个 CA 已经被信任了;在这种情况下,第一个 CA 被称为中间 CA ——而且可以有多个中间 CA。当一个实体从一个 CA 获得证书时,会发生许多事情——经常对用户不可见。首先,CA 客户端使用算法来生成密钥对;然后 CA 客户端获得必要的信息来描述使用该密钥对的实体,这与实体的位置、组织等有关。总的来说,这个标识信息包括一个专有名称(distinguished name,DN)。该实体以证书签名请求(certificate signing request,CSR)的形式向 CA 提供公钥和 DN 信息;它不提供私钥,因为这是严格保密的。CA 收到 CSR,然后根据其程序进行处理。然后,CA 签署一份文档,将公钥绑定到 DN 信息,从而创建一个证书(具体来说,就是符合 X.509 标准的证书)。最后,CA 客户端从 CA 获得证书,然后可以将它用于各种活动,如建立 TLS 连接。当两个实体需要相互认证时,它们使用它们的证书和 CA 对它们的信任关系。因此,当 Alice 和 Bob 试图通过 TLS 进行通信时,TLS 握手会对他们每个人执行如下身份验证:• Alice 最终得到了 Bob 的证书。Alice 可以信任这个证书,因为 Bob 的 CA 已经对它进行了签名,而且 Bob 的 CA 是受信任的 CA。• 持有 Alice 证书的 Bob 也是如此。 有关 InterSystems PKI
2 有关 InterSystems PKI 总的来说,CA 和公钥加密的活动是所谓的公钥基础设施(public key infrastructure ,PKI)的一部分。因此,PKI 提供了一种创建和管理密钥对和证书的方法,并可以支持加密操作,包括加密、解密、数字签名和签名验证。InterSystems IRIS 包含 PKI。使用 InterSystems PKI,您可以设置一个证书颁发机构(CA),一个 CA 客户端,并开始在用户之间发送安全数据,只需几个步骤。当 InterSystems IRIS 的一个实例充当 CA 时,它被称为 CA 服务器;当实例使用 CA 的服务时,它被称为 CA 客户端。一个实例既可以是 CA 服务器,也可以是 CA 客户端。在将自己建立为 CA 服务器时,InterSystems IRIS 的实例要么创建一个密钥对,然后将公钥嵌入到自签名的 X.509 证书中,要么使用外部 CA 签名的私钥和 X.509 证书。X.509 是一种行业标准证书结构,它将公钥与专有名称(Distinguished Name, DN)关联起来。
3 亲自尝试 InterSystems PKI设置和使用 InterSystems PKI 很容易。在这个示例中,您将使用 InterSystems IRIS 的两个实例。您将使用实例 #1 作为 CA(这里主要称为 CA 服务器)和实例 #2 作为 CA 客户端进行一系列的初始操作。这些步骤是:1. 将实例 #1 配置为 CA 服务器 2. 将实例 #2 配置为 CA 客户端 3. 在 CA 客户端上,向 CA 服务器提交证书签名请求(CSR)4. 在 CA 服务器上,处理 CSR5. 在 CA 客户端上,从 CA 服务器下载它的证书和 CA 服务器证书
重要提示: InterSystems PKI 不用于生产系统。此外,本文档中的示例以不适合使用任何 PKI 的生产系统的方式简化了设置和使用 CA 的过程。例如,它提供一个建议密码,用于加密和解密 CA 服务器的私钥。在生产系统(或除演示系统以外的任何系统)上,永远不要 使用公开的已知密码,因为这可能会危及您的 CA 的私钥的安全,从而危及您的整个 PKI;如果这个密钥被泄露或破解,那么所有 CA 的证书都变得不可信了。类似地,证书颁发机构的证书和私钥文件的目录与您在本文档练习中使用的 InterSystems IRIS 实例在同一台机器上。对于生产系统来说,这个目录应该总是在一个外部设备上(不是本地硬盘驱动器或网络服务器),最好是在一个加密的外部设备上。这是因为该目录持有 CA 的私钥。如果您创建了一个生产系统,请按照 PKI 供应商的说明操作。有关在开发或测试系统中使用 InterSystems PKI 的更多详细信息,请参见 The InterSystems Public Key Infrastructure(《InterSystems 公钥基础设施》)。 亲自尝试 InterSystems PKI3.1 用前须知要使用这个程序,您需要两个正在运行的 InterSystems IRIS 实例。这些实例可以在相同或不同的主机上,但必须相互有网络访问权限。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。3.2 将实例 #1 配置为 CA 服务器要将实例 #1 配置为 CA 服务器:1. 使用 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在您的浏览器中打开实例的管理门户(Management Portal)。2. 进入 Public Key Infrastructure(公钥基础设施)页面(System Administration(系统管理) > Security(安全) > Public Key Infrastructure(公钥基础设施))。3. 在 Public Key Infrastructure(公钥基础设施)页面上,在 Certificate Authority Server(证书颁发机构服务器)下,选择 Configure Local Certificate Authority server(配置本地证书颁发机构服务器)。这将显示两个字段:• File name root for Certificate Authority’s Certificate and Private Key files(证书颁发机构的证书和私钥文件的文件名根) (没有扩展名)——输入 FLCA (技术概要证书颁发机构(First Look Certificate Authority))。此处使用 FLCA 作为私钥文件和证书文件的名称,所以私钥是在 FLCA.key 中,而证书则在 FLCA.cer 中。• Directory for Certificate Authority’s Certificate and Private Key files(证书颁发机构的证书和私钥文件的目录)——输入 flca。这将在 install-dir\mgr\ 下创建 flca 目录(install-dir 是实例的安装目录) ,并将 FLCA CA 证书和私钥文件放在那里。您也可以点击 Browse(浏览) 来选择一个不同的位置; 当你这样做时,目录选择(Directory Selection)对话框会打开到 install-dir\mgr\ 。4. 点击 Next(下一步) 继续。5. 在出现的字段中,输入以下值:• Password to Certificate Authority's Private Key file(证书颁发机构私钥文件的密码)和 Confirm Password(确认密码) — 输入密码以加密和解密 CA 的私钥文件。我们建议您使用 myflcapw,这样您在这里就有一份密码的副本。• 在 Certificate Authority Subject Distinguished Name(证书颁发机构主体专有名称)下,在 Common Name(通用名称)中 — 输入标识此 CA 的 First Look CA。
如果您使用 InterSystems PKI 进行更深入的测试和实验,当您配置 CA 服务器时,您将完成本节的字段,以包括负责签署 CA 请求的用户的电子邮件帐户。对于这个技术概要(First Look),您可以跳过它。6. 点击 Save(保存)。InterSystems IRIS 显示如下信息,表示成功:
Certificate Authority server successfully configured.Created new files: C:\InterSystems\MYIRIS1\mgr\flca\FLCA.cer .key, and .srl. Certificate Authority Certificate SHA-1 fingerprint: E3:FB:30:09:53:90:9A:31:30:D3:F0:07:8F:64:65:CD:11:0A:1A:A2
这表明 InterSystems IRIS 已经执行了以下操作:• 创建一个密钥对。• 将私钥保存到您指定的文件位置,并使用您指定的根名称。• 创建一个包含公钥的自签名 CA 证书。 亲自尝试 InterSystems PKI
• 将证书保存到您指定的文件位置,并使用您指定的根名称。• 创建一个颁发的证书数量的计数器,并将其存储在与证书和私钥相同目录中的 SRL(序列)文件中。(每次 CA 颁发新的证书时,InterSystems IRIS 都会根据这个计数器给证书一个唯一的序列号,然后增加 SRL 文件中的值)。
3.3 将实例 #2 配置为 CA 客户端要将实例 #2 配置为 CA 客户端:1. 使用为您的实例描述的 URL,在您的浏览器中打开实例的管理门户(Management Portal)。2. 进入 Public Key Infrastructure(公钥基础设施)页面(System Administration(系统管理) > Security(安全) > Public Key Infrastructure(公钥基础设施))。3. 在 Certificate Authority Client(证书颁发机构客户端)下,选择 Configure Local Certificate Authority Client(配置本地证书颁发机构客户端),这会在此页面上显示多个字段。4. 填写以下字段,其他字段留空或使用默认值。在上一节中,您使用了实例 #1 的主机标识符和 web 服务器端口,您必须在这里输入。在其管理门户(Management Portal) URL 中。• Certificate Authority server hostname(证书颁发机构服务器主机名)——运行 CA 服务器的主机的 IP 地址或 DNS 名称,即实例 #1 的主机。• Certificate Authority WebServer port number(证书颁发机构网络服务器端口号)——作为 CA 服务器的实例的 web 服务器端口号,也就是实例 #1。• 在 Local technical contact(本地技术联系人) 部分,Name(名称)——任何值。(这个字段是必需的,因为 CA 服务器必须有设置 CA 客户端的人的联系信息。因为您既要配置 CA 客户端,又要配置 CA 服务器,所以您是它们的本地技术联系人。)
注意: 在生产环境中,PKI 可能需要带外联系信息,如在 Local technical contact(本地技术联系人)区域。这些信息是为了身份验证,客户端需要提供联系人信息以开始这一过程。
5. 点击 Save(保存)。
InterSystems IRIS 通过诸如"成功配置证书颁发机构(Certificate Authority,CA)客户端"的信息来确认成功。3.4 在实例 #2 上,向 CA 服务器提交证书签名请求(CSR) 接下来,在实例 #2 上,向 CA 服务器提交一个证书签名请求(CSR):1. 仍然在 Public Key Infrastructure(公钥基础设施)页面(System Administration(系统管理) > Security(安全) > Public Key Infrastructure(公钥基础设施)),在 Certificate Authority Client(证书颁发机构客户端)下,选择 Submit Certificate Signing Request to Certificate Authority Server(向证书颁发机构服务器提交证书签名请求),这将显示几个新的字段。2. 按以下方式填写它们,其他字段留空或使用默认值:• File name root for local Certificate and Private Key files(本地证书和私钥文件的文件名根)(没有扩展名)——输入 FLCAclient (技术概要证书颁发机构客户端(First Look Certificate Authority client))。这使用了 FLCAclient 作为私钥文件和证书文件的名称,因此私钥在 FLCAclient.key 中,而证书将很快出现在 FLCAclient.cer 中。• 在 Subject Distinguished Name(主体专有名称)下,在 Common Name(通用名称)字段中——输入 FL CA client。
3. 按要求完成这些字段,并点击 Save(保存)。如果成功,InterSystems IRIS 将显示如下信息: 亲自尝试 InterSystems PKI
Certificate Signing Request FLCAclient successfully submitted to the Certificate Authority at instance MYIRIS1 on node FLCATEST.COM.SHA-1 Fingerprint: C2:B0:D6:0D:D6:AB:43:DF:7F:B1:22:AE:14:D7:45:FF:CC:0C:20:D0
4. 此时,您已经使用 InterSystems IRIS 创建并提交了 CSR。
3.5 在实例 #1 上,处理 CSR 在实例 #1(CA 服务器)上,处理 CSR,将其转换为证书:1. 在管理门户(Management Portal)中,进入 Public Key Infrastructure(公钥基础设施)页面(System Administration(系统管理) > Security(安全) > Public Key Infrastructure(公钥基础设施))。2. 在 Public Key Infrastructure(公钥基础设施)页面上,在 Certificate Authority Server(证书颁发机构服务器)下,选择 Process pending Certificate Signing Requests(处理待处理的证书签名请求),它显示来自 CA 客户端的待处理 CSR。3. 点击 CSR 右侧的 Process(处理),显示 CSR 的内容,显示 CSR 的处理字段。有关这些字段的几个要点:• 因为您要为可以使用 InterSystems IRIS 中安全功能的 CA 客户端颁发证书,所以在 Certificate Usage(证书使用)下,您可以保留默认的 TLS/SSL,XML encryption and signature verification(TLS/SSL、XML 加密和签名验证)。• 在生产环境中,您需要验证 CA 客户端的身份。因此,本节演示如何执行这一行为;例如,在 Request Content(请求内容)下,显示 CA 客户端的电话号码和电子邮件。这将允许您通过电话或亲自联系他们并验证他们的身份。
4. 点击 Issue Certificate(颁发证书),这将导致页面显示 Password for Certificate Authority's Private Key file(证书颁发机构私钥文件的密码)字段。5. 在 Password for Certificate Authority's Private Key file(证书颁发机构私钥文件的密码)字段中,输入 myflcapw,这是您在配置 CA 服务器时创建的密码。6. 点击 Finish(完成) 来创建证书。 IRIS 显示一条信息,如
Certificate number 2 issued for Certificate Signing Request FLCAclient
InterSystems IRIS 现在已经创建了证书。如果 CA 客户端列出了其技术联系人的电子邮件地址,该地址还会收到证书可供下载的通知。
3.6 在实例 #2 上,从 CA 服务器下载它的证书和 CA 服务器证书下一步也是最后一步是 CA 客户端从 CA 服务器下载 CA 服务器的证书和它自己的证书:1. 在管理门户(Management Portal)中,在实例 #2 上,进入 Public Key Infrastructure(公钥基础设施)页面 (System Administration(系统管理) > Security(安全)> Public Key Infrastructure(公钥基础设施))。2. 在 Public Key Infrastructure(公钥基础设施)页面上,在 Certificate Authority Client(证书颁发机构客户端)下,点击 Get Certificate(s) from Certificate Authority server(从证书颁发机构服务器获取证书)。3. 在显示的字段中,有一个 Get Certificate Authority Certificate(获取证书颁发机构证书) 按钮。 点击它,会下载 CA 服务器的证书,并显示一条信息,如:Certificate Authority Certificate(SHA-1 Fingerprint: 8A:38:C9:06:50:A0:4F:71:86:2B:69:4C:A2:42:E0:43:28:C8:70:EB)saved in file "c:\intersystems\MYIRIS2\mgr\FLCA.cer"
4. 再一次点击 Get Certificate(s) from Certificate Authority server(从证书颁发机构服务器获取证书)。 了解有关 InterSystems PKI 的更多信息
5. 已颁发证书表列出了 CA 客户端的证书。点击行旁边的 Get(获取)按钮。这就下载了 CA 客户端的证书,并显示一条信息,如:Certificate number 2(SHA-1 Fingerprint: 2E:82:27:73:72:38:BC:71:36:70:DC:9E:0D:EF:E6:BC:0D:A9:95:CD)saved in file "c:\intersystems\MYIRIS2\mgr\FLCAclient.cer"
3.7 总结和下一步 您现在有:1. 将 InterSystems IRIS 的一个实例配置为 CA 服务器2. 将 InterSystems IRIS 的另一个实例配置为 CA 客户端3. 从 CA 客户端向 CA 服务器提交证书签名请求(CSR)4. 在 CA 服务器上处理 CSR5. 将 CA 服务器的证书和 CA 客户端自己的 CA 证书从 CA 服务器下载到 CA 客户端
这意味着您现在有一个 InterSystems IRIS 实例是一个正常运行的 CA 服务器,另一个 InterSystems IRIS 实例是一个正常运行的 CA 客户端。如果您在另一个 InterSystems IRIS 实例上设置 CA 客户端,并为每个实例创建 TLS 配置,两个客户端可以交换加密的信息。这为各种安全活动提供了基础。注意: 最后提醒一下:这个示例系统并不能帮助建立一个安全的环境,因为 CA 的私钥已经在本文档中公开发布。妥善保护生产系统中的所有私钥是至关重要的,而保护 CA 的私钥则是最重要的。泄露在生产系统中使用的私钥,会导致安全漏洞、数据泄露、财务损失和法律漏洞。除了让您了解 InterSystems IRIS 功能之外,请不要使用此文档的 CA 服务器私钥进行其他任何操作。
4 了解有关 InterSystems PKI 的更多信息有关 InterSystems PKI 的完整文档,请参见 The InterSystems Public Key Infrastructure(《InterSystems 公钥基础设施》)。
文章
Claire Zheng · 十二月 13, 2021
我在 InterSystems 工作了 35 年,期间见证了许多客户与我们共同成长。我们热忱地帮助客户取得成功——无论他们衡量成功的标准是什么——而成功的基石就是我们提供的技术。我们的名字现在通常与我们的 InterSystems IRIS 数据平台联系在一起,因为它实际上是我们经过验证的下一代数据管理软件。
在InterSystems IRIS 之前,我们以 Caché 和Ensemble 的强大功能而闻名,全球许多最重要的应用都是在它们的帮助下得以面世的。如果您也是我们的Caché 或 Ensemble 客户,这些平台如今无疑是您组织基础设施的重要组成部分,是一些优秀应用的基础。
然而,正如我们不断发展我们的技术,我们也希望帮助您发展现有技术,并使您能够利用最新的数据平台技术——即从人工智能(AI) 到云计算的各种最新技术。我们认为 InterSystems IRIS 的时代已来临,因此,我们将为所有现有的 Caché 和Ensemble 客户提供限时免费迁移到InterSystems IRIS 数据平台的机会。
我们理解,对业已成为您业务重要组成部分的现有解决方案进行任何更改,都将是一项艰巨的任务,但请相信我们,这一切都是值得的。我们的一面之词也许不足为信,但我们现有的许多客户已经做出了这样的转变,其中包括医疗软件公司Epic。
作为一个使用我们技术超过 40 年的忠实客户,Epic 去年决定迁移到InterSystems IRIS。其系统拥有 250 万并发用户,每秒处理大约 18 亿次数据库访问,因此,能够平稳迁移至关重要。通过我们的共同努力,迁移非常顺利。现在Epic 的客户体验到了更高的性能和更佳的可扩展性。
在此列举部分迁移到InterSystems IRIS 可拥有的优势:
更高的性能、可扩展性和资源效率
通过迁移,您将能够以小博大,用更少的资源做更多的事情,并同时管理多种不同类型的工作负载。为了让您更好地理解这一所指,我们通过速度测试(Speed Test)得出,与其他主流数据管理软件相比,InterSystems IRIS 在测试期间多摄取了 620.9% 的记录,在测试结束时多摄取了 717.3% 的记录。
开发人员生产力
InterSystemsIRIS 具有化繁为简的功能。您的开发人员可以在一个平台内构建和测试所有应用,现在使用嵌入式Python,您可以访问更大的开发资源池,以及数十万个可用的Python 库。从而让开发周期更短,控制和管理更简单。
云部署
作为一个“云中立”的平台,InterSystemsIRIS 不会将您与任何云供应商绑定。因此更加经济、高效和敏捷。
机器学习
我们的IntegratedML 功能为创建机器学习 (ML) 模型提供了一种简单的机制,让您更轻松地将 ML 模型实施到您的实时应用中。
Adaptive Analytics自适应分析
利用新的自适应分析 (Adaptive Analytics) 功能,您的组织无需依赖IT,即可更轻松地探索和分析数据。这意味着业务用户将能够获得他们所需的洞察力,从而做出明智的业务决策,并使您的 IT 团队专注于其他工作。
互操作性和 API 管理能力
通过迁移,您可以实时获得所有数据的统一视图。利用我们的数据平台,您可以连接不同的系统、技术和数据,为您的业务用户创建单一虚拟管理界面,或为您的企业应用创建实时连接。
轻松实现迁移
迁移到InterSystems IRIS 的理由,除了上述这些之外,还有很多。
如果您准备迁移到 InterSystems IRIS(已有数百个 Caché和 Ensemble 客户成功迁移),您可以登录www.intersystems.com/migrate了解更多关于如何迁移到 InterSystems IRIS 上的信息。
原文:Unleashing InterSystems IRIS: Why it’s time to migrate your Caché and Ensemble applications
关于作者
John Paladino负责InterSystems的支持、质量保证、内部计算机操作及客户教育工作。自1984年加入InterSystems以来,他帮助开发了自动化支持跟踪系统和针对所有InterSystems软件产品的客户培训项目,制定并实施了旨在改善响应性、提高客户满意度的服务标准,以及多个国内外团队建设计划。在加入InterSystems之前,他曾在New England Pathology担任了三年的系统工程经理,负责获取、实施和管理各类信息技术。Paladino曾在伍斯特理工学院和马萨诸塞大学卢维尔分校攻读电机工程专业。
文章
Jingwei Wang · 七月 28, 2022
InterSystems SQL支持在InterSystems IRIS数据平台数据库中将流数据存储为BLOB(Binary Large Objects 二进制大对象)或CLOB(Character Large Objects字符大对象)的能力。
InterSystems SQL支持两种流字段:
字符流:用于大量的文本。
二进制流:用于图像、音频或视频。
BLOBs和CLOBs可以存储多达4GB的数据(JDBC和ODBC规范规定的限制)。除了在通过ODBC或JDBC客户端访问时如何处理字符编码转换(如Unicode到多字节)外,BLOB和CLOB的操作在各方面都是相同的:BLOB中的数据被视为二进制数据,决不转换为其他编码,而CLOB中的数据被视为字符数据,在必要时进行转换。
如果一个二进制流文件(BLOB)包含单一的非打印字符$CHAR(0),它被认为是一个空的二进制流。它相当于""空二进制流值:它存在(不是空的),但长度为0。
从对象的角度来看,BLOB和CLOBs被表示为流对象。更多信息请参见定义和使用类中的 "与流合作 "一章。
定义流数据字段
InterSystems SQL支持流字段的各种数据类型名称。这些InterSystems的数据类型名称是对应于以下的同义词。
字符流:数据类型LONGVARCHAR,映射到%Stream.GlobalCharacter类和ODBC/JDBC数据类型-1。
字符流:数据类型LONGVARBINARY,映射到%Stream.GlobalBinary类和ODBC/JDBC数据类型-4。
下面的例子定义了一个包含两个流字段的表。
CREATE TABLE Sample.MyTable (
Name VARCHAR(50) NOT NULL,
Notes LONGVARCHAR,
Photo LONGVARBINARY)
流字段的限制:
一个流字段可以被定义为NOT NULL。
一个流字段可以取一个DEFAULT值,一个ON UPDATE值,或者一个COMPUTECODE值。
一个流字段不能被定义为UNIQUE,一个主键字段,或一个IdKey。试图这样做会导致一个SQLCODE -400的致命错误,并带有%msg,如以下。ERROR #5414: 无效的索引属性。Sample.MyTable::MYTABLEUNIQUE2::Notes, Stream属性在唯一/主键/idkey索引中是不允许的 > ERROR #5030: 在编译'Sample.MyTable'类时发生错误。
不能用指定的COLLATE值定义一个流字段。试图这样做会导致一个SQLCODE -400的致命错误,并带有%msg,如以下。ERROR #5480: 属性参数没有声明。Sample.MyTable:Photo:COLLATION > ERROR #5030: 在编译'Sample.MyTable'类时发生错误。
在流数据字段中插入数据
有三种方法可以将数据插入到流字段。
%Stream.GlobalCharacter字段:你可以直接插入字符流数据。例如:
INSERT INTO Sample.MyTable (Name,Notes)
VALUES ('Fred','These are extensive notes about Fred')
%Stream.GlobalCharacter和%Stream.GlobalBinary字段:你可以使用OREF插入流数据。你可以使用Write()方法将一个字符串追加到字符流中,或者使用WriteLine()方法将一个带有行终止符的字符串追加到字符流中。默认情况下,行结束符是$CHAR(13,10)(回车/换行);你可以通过设置LineTerminator属性改变行结束符。 在下面的例子中,第一部分创建了一个由两个字符串和它们的终止符组成的字符流,然后使用嵌入式SQL将其插入到一个流字段中。例子的第二部分返回字符流的长度并显示字符流数据,显示终止符。
ClassMethod CreateAndInsertCharacterStream()
{
Set gcoref = ##class(%Stream.GlobalCharacter).%New()
DO gcoref.WriteLine("First Line")
Do gcoref.WriteLine("Second Line")
&sql(INSERT INTO Sample.MyTable(Name, Notes)
VALUES('Fred',:gcoref))
IF SQLCODE<0 {WRITE "SQLCODE ERROR:"_SQLCODE_" "_%msg QUIT}
ELSE {WRITE "Insert successful",!}
do ..DisplayTheCharacterStream(gcoref)
}
ClassMethod DisplayTheCharacterStream(gcoref As %Stream.GlobalCharacter)
{
KILL ^CacheStream
WRITE gcoref.%Save(),!
ZWRITE ^CacheStream
}
%Stream.GlobalCharacter和%Stream.GlobalBinary字段:你可以通过从文件中读取数据来插入流数据。比如说
ClassMethod InsertDataFromImage()
{
Set myf = "C:\Temps\IMG.png"
OPEN myf:("RF"):10
USE myf:0
READ x(1):10
&sql(INSERT INTO Sample.MyTable (Name,Photo) VALUES ('George',:x(1)))
IF SQLCODE <0 {WRITE "INSERT Failed:"_SQLCODE_" "_%msg QUIT}
CLOSE myf
}
作为DEFAULT值或计算值插入的字符串数据将以适合于流字段的格式存储。
查询流字段数据
二进制流字段返回字符串<binary>。
SELECT Name,Photo,Notes
FROM Sample.MyTable WHERE Photo IS NOT NULL
DISTINCT, GROUP BY, 和 ORDER BY
每个流数据字段的OID值都是唯一的,即使数据本身包含重复的内容。这些SELECT子句对流的OID值进行操作,而不是数据值。因此,当应用于查询中的流字段时。
DISTINCT子句对重复的流数据值没有影响。DISTINCT子句将流字段为NULL的所有记录记录减少到一个NULL记录。DISTINCT对流字段的OID进行操作,而不是它的实际数据。
GROUP BY子句对重复的流数据值没有影响。GROUP BY子句将流字段为NULL的所有记录数减少到一个NULL记录。GROUP BY StreamField的操作对象是一个流字段的OID,而不是它的实际数据。
ORDER BY子句根据流数据值的OID值,而不是数据值来排序。ORDER BY子句在列出有流字段数据值的记录之前,先列出流字段为NULL的记录。
predicate 条件和流
IS [NOT] NULL 可以应用于流字段的数据值,如下面的例子中所示。
SELECT Name,Notes
FROM Sample.MyTable WHERE Notes IS NOT NULL
BETWEEN, EXISTS, IN, %INLIST, LIKE, %MATCHES, 和 %PATTERN谓词可以应用于流对象的OID值,如下面的例子所示。
SELECT Name,Notes
FROM Sample.MyTable WHERE Notes %MATCHES '*1[0-9]*GlobalChar*' 。
试图在一个流字段上使用任何其他的predicate条件会导致SQLCODE -313错误。
聚合函数和流
COUNT聚合函数接收一个流字段,并对包含该字段非空值的记录进行计数,如下面的例子所示:
SELECT COUNT(Photo) AS PicRows,COUNT(Notes) AS NoteRows
FROM Sample.MyTable
然而,COUNT(DISTINCT)不支持流字段。对流字段不支持其他聚合函数。试图用任何其他聚合函数来使用流字段会导致SQLCODE -37错误。
标量函数和流
除了%OBJECT、CHARACTER_LENGTH(或CHAR_LENGTH或DATALENGTH)、SUBSTRING、CONVERT、XMLCONCAT、XMLELEMENT、XMLFOREST和%INTERNAL函数外,InterSystems SQL不能将任何函数应用到流字段。试图使用流字段作为任何其他SQL函数的参数会导致SQLCODE -37错误。
%OBJECT函数打开一个流对象(接受一个OID),并返回oref(对象引用),如以下例子所示:
SELECT Name,Notes,%OBJECT(Notes) AS NotesOref
FROM Sample.MyTable WHERE Notes IS NOT NULL
CHARACTER_LENGTH,CHAR_LENGTH和DATALENGTH函数取一个流字段,并返回实际的数据长度,如下面的例子所示。
SELECT Name,DATALENGTH(Notes) AS NotesNumChars
FROM Sample.MyTable WHERE Notes IS NOT NULL
SUBSTRING函数接收一个流字段,并返回流字段实际数据值的指定子串,如下面的例子所示。
SELECT Name,SUBSTRING(Notes,1,10) AS Notes1st10Chars
FROM Sample.MyTable WHERE Notes IS NOT NULL
当从管理门户的SQL执行界面发出时,SUBSTRING函数最多返回流字段数据的100个字符的子串。如果指定的流数据子串长于100个字符,会在第100个字符后面用省略号(...)表示。
CONVERT函数可以用来将流数据类型转换为VARCHAR,如下面的例子所示。
SELECT Name,CONVERT(VARCHAR(100),Notes) AS NotesTextAsStr
FROM Sample.MyTable WHERE Notes IS NOT NULL
CONVERT(datatype,expression)语法支持流数据转换。如果VARCHAR精度小于实际流数据的长度,它将返回值截断为VARCHAR精度。如果VARCHAR精度大于实际流数据的长度,返回值就有实际流数据的长度。不进行填充。
{fn CONVERT(expression,datatype)}语法不支持流数据转换;它发出SQLCODE -37错误。
%INTERNAL函数可以在流字段上使用,但不执行任何操作。
流字段并发锁定
InterSystems IRIS通过在流数据上加锁来保护流数据值不受另一个进程的并发操作。
InterSystems IRIS在执行写操作之前会拿出一个独占锁。写操作完成后,独占锁会立即释放。
InterSystems IRIS在第一次读操作发生时取出一个共享锁。只有在实际读取流时才会获得共享锁,并且在整个流从磁盘读入内部临时输入缓冲区后立即释放。
在InterSystems IRIS方法中使用流字段
你不能在InterSystems IRIS方法中直接使用嵌入式SQL或动态SQL来使用BLOB或CLOB值;而是要使用SQL来找到BLOB或CLOB的流标识符,然后创建%AbstractStream对象的实例来访问数据。
从ODBC使用流字段
ODBC规范没有为BLOB和CLOB字段提供任何识别或特殊处理。
InterSystems SQL在ODBC中表示CLOB字段为LONGVARCHAR (-1)类型。BLOB字段被表示为LONGVARBINARY类型(-4)。
从JDBC使用流字段
在一个Java程序中,你可以使用标准的JDBC BLOB和CLOB接口从BLOB或CLOB中检索或设置数据。比如说
Statement st = conn.createStatement()。
ResultSet rs = st.executeQuery("SELECT MyCLOB,MyBLOB FROM MyTable")。
rs.next(); // 取出Blob/Clob
java.sql.Clob clob = rs.getClob(1);
java.sql.Blob blob = rs.getBlob(2);
// Length
System.out.println("Clob length = " + clob.length())。
System.out.println("Blob length = " + blob.length())。
// ...
注意:当完成对BLOB或CLOB的处理时,你必须明确地调用free()方法来关闭Java中的对象,并向服务器发送消息以释放流资源(对象和锁)。
文章
Nicky Zhu · 八月 10, 2022
InterSystems 数据平台的互操作功能与久经考验的Ensemble和HealthConnect集成引擎产品一脉相承。事实上,使用IRIS的典型客户不但应用了IRIS提供的多模型数据存储、分布式存储等数据存储特性,也广泛地应用如可视化数据转换,可视化数据流程编辑和可视化规则引擎等一系列互操作能力构建异构系统间或组织机构间的数据流程。
那么,在生产环境上,如何监控与评估数据流程的运行状况,在发生问题时如何快速定位并解决故障,就是用户的运维团队需要考虑的问题。
本系列文章将围绕IRIS互操作功能中核心的互操作消息管理,Production管理与优化及互操作告警与通知三个方面介绍互操作功能的运维基础知识和常用技巧,希望能够帮助客户平稳、高效地运用数据平台。
注:本文提到的InterSystems数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。
互操作消息管理
消息是互操作功能中各组件间通信的基本方法,在互操作Production业务服务、业务流程和业务操作之间广泛使用。
除承担信息传递的基本功能外,由于常常需要在生产环境中查看消息内容或重发消息以解决问题,消息检索就是大家最常用到的功能,而IRIS特有的结构化消息存储也为开发和运维团队使用和管理消息创造了便利。用户能够通过消息的内容,某项具体属性,来源/目标和发生时间等条件检索和过滤消息,迅速找到自己感兴趣的信息。
我们先回顾下消息的结构与关联的上下文。
消息结构
如图所示,消息分为消息头与消息体两部分。其中消息头(标头)主要用于记录消息发生的来源、趣向、时间和消息类型等上下文信息,而消息体(正文)则为消息的具体内容。
而在消息的上下文中,会话是一个比较重要的概念,它用于表达一次交互过程中,从初始的输入所触发的所有消息。在使用时,需要注意:
Message Trace将显示一个会话的所有信息
消息查看器默认只列出会话开始的信息(绿色消息)
消息检索
下图即为平台自带的消息查看器,可通过Ensemble > 查看 > 消息导航访问(Ensemble菜单项在IRIS和HealthConnect产品中的名称为Interoperability,位置,含义均相同,下文中将不再赘述)。
可见其中包含若干预制条件及可灵活扩展的查询条件以应对不同场景的需求。
需要注意的是,对检索所需的消息体或头属性建立索引很重要。因为在生产环境中,production中的消息存量可以轻易达到百万、千万甚至亿级,对于海量数据不经过索引进行检索就性能而言不可行。
应用SQL检索消息
如果需要,也可以使用SQL语句进行搜索
系统资源管理器SQL执行查询。
在运行前切换到正确的命名空间。
可以参考消息查看器使用的SQL语句来修改
在Terminal中,在执行搜索的命名空间中运行以下代码。
Set ^Ens.Debug("UtilEnsMessages", "sql")=1
在消息查看器中执行搜索
根据需要从消息查看器复制、修改和执行SQL。
需要SQL知识
用户可直接运用平台提供的SQL示例检索消息,这样的SQL也为用户学习和掌握IRIS持久话消息的结构和辅助函数等概念提供了基础。
用户在熟悉消息结构,并了解SQL的条件下,配合Search Table、索引等特性,可以实现更复杂的基于消息内容的查询。
其中,关于Search Table的应用,用户也可参考我们的另一篇文章《互操作消息统一管理系列:SearchTable加速检索》。此处不再赘述。
异常消息的处理
重发消息
借助消息的持久化,当通信异常导致消息传递失败时,用户也可通过重发消息重新触发业务
挂起消息
如果业务组件运行错误,可能会挂起消息
手动停止消息
队列查看页 > 选择业务组件 > 挂起按钮
组件配置页 > 作业 > 挂起按钮
挂起后消息保持静止,等待手工处理
用户也可有针对性地查看和处理被挂起的消息。
查看挂起消息
Ensemble > 查看 > 已挂起的消息
重发已挂起消息
从已挂起消息页重发将发送被挂起的这条消息
从消息查看器重发将复制并发送一条新的消息
中断消息
IRIS的业务组件有自动重发消息的能力。但但运维团队明确远端故障已发生,短期内重发消息没有意义时,也可下达指令丢弃消息,不再进行后续处理。
业务组件处于重试状态时
组件配置页 > 作业 > 放弃按钮
Ensemble > 监视器 > 队列 > 点击业务组件 > 选择活动的消息 > Abort 或 Abort All 按钮
中断被堆积的消息
Ensemble > 监视器 > 队列 > 点击业务组件 > 选择排队的消息 > Abort 或 Abort All 按钮
文章
he hf · 十月 8, 2022
安装InterSystems IRIS数据库的ODBC驱动,在Windows系统中配置数据源后,可以使用Microsoft Visual Studio 开发工具 中的服务器资源管理器很方便地连接到InterSystems IRIS数据库服务器,利用数据库连接的可视化视图,可以非常方便快捷地进行连接到InterSystems IRIS数据库的应用开发。本文将展示一个利用以上方式实现的例子,开发工具为Microsoft Visual Studio 2019,开发语言为C#,10分钟快速开发实现一个连接到InterSystems IRIS数据库的C#应用,在本例子中,可以通过选择日期和科室,查询指定日期和科室的就诊日志。
1、在成功安装InterSystems IRIS数据库的ODBC驱动后,从Windows的“控制面板”中选择“管理工具”,在“管理工具”中选择“ODBC数据源”。
2、在ODBC数据源管理的“用户DSN”标签下,选择“添加”,在随后弹出的“创建新数据源”窗口中选择“InterSystems ODBC”,点击“完成”进入下一步。
3、在弹出的“InterSystems ODBC数据源设置”窗口中,为数据源命名,填写连接数据库的信息,访问用户名和密码,点击“测试连接”,成功后点击“OK”保存。
4、打开Microsoft Visual Studio 2019,选择“文件”->“新建”->“项目” ,在弹出的创建新项目窗口中,选择C#语言、Windows窗体应用。
5、新建项目完成后,在 Microsoft Visual Studio 2019开发工具的菜单栏选择“视图”->“服务器资源管理器”,右键“服务器资源管理器”视图中的“数据连接”,在弹出的“添加数据库连接”窗口中,指定在3中已经新建好的数据源,点击“测试连接”,测试连接成功后,点击“确定”关闭窗口,在“服务器资源管理器”视图中的“数据连接”中可以看到添加成功的数据库连接,选中数据库后可以展开其中的表。
6、在本例子中,将介绍两种数据库查询操作方式,其一为常见使用SQL语句的方式,其二为添加数据集的方式,添加数据集的操作如下:从菜单栏选择“视图”->“其他窗口”->“数据源”,在“数据源”视图中点击“添加新数据源”,选择数据库后,可以为数据集添加绑定数据库的表,如为本例中Loc1(科室)数据集成功添加绑定CT_Loc表后,可以在可视化视图中查看数据表数据,并可以被Form可视化窗体中添加的控件直接使用。
7、在Form可视化窗体设计器中,通过工具箱视图添加3个Label控件,分别显示应用标题、日期和科室,再添加1个DateTimePicker日期/时间选择器,并在其CustomFormat属性中设置日期/时间格式“yyyy-MM-dd”,用于选择查询日期;1个ComboBox下拉列表选择框,用于选择查询科室;1个Button按钮,用于执行查询;一个DataGridView数据网格视图,用于显示查询结果。
8、选中ComboBox下拉列表选择框控件,点击控件中右上角出现的箭头,弹出ComboBox数据绑定窗口,勾选“使用数据绑定项”,之后选择6中添加的数据集Loc1,设置“显示成员”为“科室名称”字段,“值成员”为“科室ID”字段,“选定值”为“科室ID”,上述操作便完成了ComboBox控件直接使用数据集的设置。
9、点击项目启动按钮,点击选择科室的下拉列表框,可以看到科室列表,由此可以看出,通过上面6、7、8三个步骤的简单操作,即完成了C#窗体控件与已添加的数据集的快速绑定,实现了查询IRIS数据库的快速操作。
10、最后双击窗体中的“查询科室日志”按钮,在按钮点击事件函数中,添加通过SQL语句查询IRIS数据库的代码,并通过DataGridView的DataSource属性将SQL语句的查询结果绑定到DataGridView数据网格视图。完成后,再次运行项目,可以实现通过选择日期和科室,查询指定日期和科室的就诊日志。
附上项目的核心代码,少部分细节地方参见代码中注释部分:
Form1.cs //C#窗体及控件加载和操作代码
using System;
using System.Windows.Forms;
namespace QuickApp1
{
public partial class Form1 : Form
{
//新建IRIS数据库的ODBC连接对象
ODBCHelper1 dBCHelper1 = new ODBCHelper1();
//避免comboBox数据未绑定时的异常退出
bool cmbFlag = false;
public Form1()
{
InitializeComponent();
}
private void Loc_comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//排除窗体未加载时comboBox数据未绑定时的异常退出错误
try
{
if (cmbFlag && !String.IsNullOrEmpty(Loc_comboBox1.SelectedValue.ToString()))
{
string selectLoc = Loc_comboBox1.SelectedValue.ToString();
}
}
catch (Exception)
{
;
}
}
//按钮点击事件
private void findAdmListBtn1_Click(object sender, EventArgs e)
{
//取日期选择器的日期
string selectDate = dateTimePicker1.Text.ToString();
//取科室下拉选择框的科室
string selectLoc = Loc_comboBox1.SelectedValue.ToString();
//通过SQL语句查询IRIS数据库
string sql = "SELECT A.PAADM_DepCode_DR->CTLOC_Desc 科室, A.PAADM_PAPMI_DR->PAPMI_Name 患者姓名,decode(A.PAADM_PAPMI_DR->PAPMI_Sex_DR,1,'女',2,'男','未知') 性别,A.PAADM_AdmDocCodeDR->CTPCP_Desc 医生姓名, A.PAADM_ADMNo 就诊流水号,A.PAADM_AdmDate 就诊日期,A.PAADM_AdmTime 就诊时间 FROM PA_Adm A WHERE A.PAADM_AdmDate =" +
"'" + selectDate + "'" +
"AND A.PAADM_DepCode_DR = " +
"'" + selectLoc + "'";
//通过DataGridView的DataSource属性将SQL语句的查询结果绑定到DataGridView数据表格视图
this.dataGridView1.DataSource = dBCHelper1.CacheExeQuery(sql);
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
//为DataGridView数据表格添加行序号
try
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
this.dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
catch
{
MessageBox.Show("处理异常:表格行序号添加异常");
}
}
private void Form1_Load(object sender, EventArgs e)
{
//窗体加载时处理
// TODO: 这行代码将数据加载到表“loc1.CT_Loc”中。您可以根据需要移动或删除它。
this.cT_LocTableAdapter.Fill(this.loc1.CT_Loc);
cmbFlag = true;
}
}
}
ODBCHelper1.cs //ODBC数据库连接公共类
using System.Data;
using System.Data.Odbc;
namespace QuickApp1
{
internal class ODBCHelper1
{
//ODBC连接格式化字符串,将Dsn(连接名称)、Server(IRIS服务器IP)、Port(端口)、DataBase(数据库)、Uid(用户名)、Pwd(用户名)换成你自己的。
public static string conString = "Dsn=irisxxx;Server=xxx.xxx.xxx.xxx;Port=xxxx;DataBase=xxxx;Authentication method=0;Uid=xxxxxx;Pwd=******;static cursors=0;query timeout=0;unicode sqltypes=0;";
public DataTable CacheExeQuery(string sql)
{
using (OdbcConnection con = new OdbcConnection(conString))
{
using (OdbcCommand cmd = new OdbcCommand(sql, con))
{
using (OdbcDataAdapter da = new OdbcDataAdapter(cmd))
{
DataTable dt = new DataTable();
con.Open();
da.Fill(dt);
return dt;
}
}
}
}
}
}
好文! 快速开发、快速接入、快速应用、良好兼容,轻量级开发的好平台。 感谢分享 赞,值得学习 简单实用,学习了。 感谢分享!刚上班的小白接触感觉很有用
文章
jieliang liu · 一月 7, 2021
最近,我需要从持久类和序列类生成一个 Swagger 规范,所以我发布了我的代码(它并不完整 - 你仍然需要处理应用程序的细节,但这是一个开始)。 代码[在这里](https://github.com/eduard93/Utils/blob/master/Utils/YAML.cls.xml)。
假设你有下面的类:
类
Class REST.Test.Person Extends %Persistent
{
/// 人的名字。
Property Name As %String [ Required ];
/// 人的社会安全号。 这通过模式匹配进行验证。
Property SSN As %String [ Required ];
/// 人的出生日期。
Property DOB As %Date;
/// 人的家庭地址。 这里使用一个嵌入对象。
Property Home As Address;
/// 人的办公室地址。 这里使用一个嵌入对象。
Property Office As Address;
/// 人的配偶。 这是对另一个持久对象的引用。
Property Spouse As Person;
/// 代表人喜欢的颜色的字符串集合。
Property FavoriteColors As list Of %String;
/// 代表人喜欢的颜色的字符串集合。
Property FavoriteNumbers As array Of %Integer;
/// 人的年龄。<br>
/// 这是一个经过计算的字段,其值来自于 <property>DOB</property>。
Property Age As %Integer;
}
Class REST.Test.Address Extends %SerialObject
{
/// 街道地址。
Property Street As %String(MAXLEN = 80);
/// 城市名称。
Property City As %String(MAXLEN = 80);
/// 2 个字母的州名缩写。
Property State As %String(MAXLEN = 2);
/// 5 位美国 地区改进计划 (ZIP) 编码。
Property Zip As %String(MAXLEN = 5);
}
你可以通过以下代码自动生成此 Swagger 定义:
REST.Test.Person:
type: "object"
properties:
Age:
type: "integer"
DOB:
type: "string"
FavoriteColors:
type: "array"
items:
type: "string"
FavoriteNumbers:
type: "object"
Home:
$ref: "#/definitions/REST.Test.Address"
Name:
type: "string"
Office:
$ref: "#/definitions/REST.Test.Address"
SSN:
type: "string"
Spouse:
$ref: "#/definitions/REST.Test.Person"
REST.Test.Address:
type: "object"
properties:
City:
type: "string"
State:
type: "string"
Street:
type: "string"
Zip:
type: "string"
主方法:Utils.YAML:GenerateClasses
测试运行:do ##class(Utils.YAML).Test()
公告
Claire Zheng · 三月 10, 2021
亲爱的社区开发者,
我们诚挚邀请您参加 InterSystems编程大奖赛获奖成员线上见面会!
时间: 周五(2021年3月12日)-22:00(北京时间)
在此次线上见面会,您可以:
了解获胜者的个人履历
观看获奖应用的简短demo
针对此次大奖赛使用到的技术、奖金和各类疑问,您可以畅所欲言,各抒己见,为下一次竞赛做准备!
线上见面会参与成员:
@Dmitriy Maslennikov, CaretDev Corp联合创始人、首席技术官和开发者倡导者,
@José Roberto Pereira, Shift Consultoria e Sistemas Ltda BI开发者
@Henrique Dias, Sao Paulo Federal Court 系统管理专家/数据库管理员
@Botai Zhang, 中国开发者
@Weiwei Yang, 中国开发者
@Evgeny Shvarov, InterSystems 开发者生态系统经理
您还将有机会在一个特别的网络研讨会上向我们的开发人员提出任何问题。
欢迎您参加线上见面会!
现在就来报名吧! 什么时候搞中国自己的? Good question! 想围观中国获奖成员线上见面会的给Michael点赞
文章
姚 鑫 · 一月 22, 2023
# 第五十三章 使用 ^SystemPerformance 监视性能 - InterSystems IRIS Linux 平台性能数据报告
- `%SS` - 使用 `ALL^%SS` 命令在运行过程中采集了四个样本。
- `Configuration *` - 来自服务器的 `IRIS` 实例名称和主机名、完整的 `IRIS` 版本字符串、许可客户名称和许可订单号。
- `cpf file *` - 当前活动配置文件的副本。
- `irisstat -c` - 使用命令 `irisstat cache -p-1 -c-1 -e1 -m8 -n2 -N127` 在运行过程中以均匀的间隔采集四个样本。以下是对每个参数的简要说明:
- `-p-1`: 对进程表进行采样以包括进程和全局状态信息。
- `-c-1`: 对共享内存的计数器部分进行采样以显示日志、锁、磁盘和资源使用统计信息。
- `-e1`: SYSLOG 错误表。
- `-m8`: 文件表,其中包括所有 `IRIS.DAT` 文件及其属性。
- `-n2`: 网络结构表,包括本地到远程数据库的映射。
- `-N127`: 客户端和服务器连接的 `ECP` 统计信息。
- `irisstat -D` - 使用命令 `irisstat cache --f1 -D10,100` 在运行过程中以均匀的间隔采集八个样本。以下是对每个参数的简要说明:
- `-fl`: 基本标志。
- `-D10,100`: 在 `10` 秒的总采样周期内,每 `100` 毫秒对块碰撞进行采样。
- `df -m *` - 有关挂载文件系统的信息,包括挂载点、逻辑卷和可用空间; `df -m` 命令的输出。
- `free -m` - 以 `MB` (`-m`) 为单位的内存使用统计信息。
- `iostat` - `CPU` 和磁盘吞吐量。
- `license *` - 使用 `Decode^%LICENSE` 和 `counts^%LICENSE` 的 `IRIS` 许可使用信息。
- `mgstat` - 使用 `^mgstat` 实用程序在运行过程中获取 `IRIS` 特定数据。请参阅 `Monitoring Guide `的 `Monitoring Performance Using ^mgstat` 部分。
- `Profile *` - 有关创建此日志的 `^SystemPerformance` 配置文件的信息。
- `ps:` - 使用命令 `ps -efly` 在运行过程中以均匀的间隔采集四个样本。
- `sar -d` - 磁盘(块)设备吞吐量和延迟统计信息。
- `sar -u` - CPU 使用率统计信息包括 `iowait` 百分比。
- `vmstat -n - CPU`、排队、分页统计。只打印一个标题 (`-n`) 。
- `CPU *` - 从 `lscpu` 和 `/proc/cpuinfo` 收集的信息
- `Linux info *` - 一般操作系统和硬件信息;包括 `uname -a`、`lsb_release -a`、`id` 和 `ulimit -a` 命令的输出以及从 `/etc/issue.net`、`/proc/partitions` 和 `/dev/mapper` 收集的信息。
- `ipcs *` - 进程间通信配置信息,包括共享内存、信号量和消息队列; `ipcs -a` 命令的输出。
- `mount *` - 有关所有文件系统及其挂载选项的信息。
- `fdisk -l *` - `/proc/partitions` 中提到的所有设备的分区表。仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限时才包括在内。
- `ifconfig *` - 当前活动网络接口的状态信息。
- `sysctl -a *` - 内核和系统参数设置。
文章
Claire Zheng · 十二月 3, 2021
InterSystems面向中国用户推出InterSystems IRIS医疗版互联互通套件,以满足医院信息化建设的标准化要求,促进业务协同,助力公立医院高效建设互联互通平台。
公告
jieliang liu · 五月 21, 2021
随着InterSystems IRIS 2020.1和InterSystems IRIS for Health 2020.1中PEX的发布,客户有了比Java Business Host更好的方式来构建Java的产品。PEX为构建互操作性组件提供了一套完整的API,并有Java和.NET两种版本。
从InterSystems IRIS和InterSystems IRIS for Health的2020.4版本开始,Java Business Host已经被删除。 我们鼓励使用Java商业主机的客户迁移到PEX。
PEX的优势
* 允许开发人员在Java或.NET中创建任何生产组件
* 组件之间可以传递更复杂的消息结构
* 简化设置
* S简化了开发工作流程,无需使用ObjectScript。
关于迁移到PEX的更多信息,请参见从Java Business Host迁移到PEX。
文章
Hao Ma · 九月 17, 2022
因为篇幅太长, 我把它分为3篇贴在社区
# 配置前的准备
配置Mirror前要准备三件事儿:
1. 规划网络连接。
2. 在所有的服务器中启动ISCAgent服务。
3. 准备服务器的SSL/TLS证书。可选, 但非常推荐。
我假设您在动手前一定已经对Mirror的原理和架构已经不陌生了,对镜像成员,DR(灾备)成员, Arbiter, ISCAgent等术语已经自动切换的概念有大概的认识。如果不是这样,请先阅读在线文档,或者这篇文章。
## 规划网络连接
Mirror应该配置两个网段:一个用于IRIS和外部的通信;另一个用于两个Mirror成员间的内部通信,也就是数据的同步。 尽管不是必须的,但Mirror作为一个高可用方案,为了保证服务器之间的内部通信不受和外部连接的干扰,把内部通信放在单独的网段是通常的做法,尤其是在生产环境。
下图来自IRIS的在线文档:其中绿色所示的是IRIS提供服务的网段,IRIS到所有外部系统的连接,ECP应用服务器,和Arbiter在工作在这个网段。紫色的“Data Center Private LAN for Mirror Communication"用于内部通信,准确的说, 用于journal的同步。为了方便, 我会在后面的步骤中简单的把这两个网段简单的称为**外网网段**和**内网网段**。

也是来自在线文档,上图的IP地址配置像这个样子。(请忽略C栏和D栏,它们是DR服务器的地址)

在安装配置Mirror之前, 您需要检查的是:
( Agent address用的是公网地址,但书上有句话:When attempting to contact this member’s agent, other members try this address first. Critical agent functions (such as those involved in failover decisions) will retry on the mirror private and superserver addresses (if different) when this address is not accessible. Because the agent can send journal data to other members, journal data may travel over this network. )
- ServerA, ServerB, Arbiter三台机器的在绿色网段可以相互访问。ServerA, ServerB的1972端口可以访问,Arbiter的2188端口可以访问。
- ServerA, ServerB在紫色网段可以互相访问2188端口。
- Virtual IP绑定在Server A, 并且IRIS的服务和连接通过Virtual IP提供。
下面是我用的两个服务器的网络配置,因为不方便使用(懒的修改)上图的地址,我自己做的地址配置如下
| Virtual IP Address | | |
| ------------------------------ | -------------- | -------------- |
| Arbiter Address | 172.16.58.100 | |
| Member-Specific Mirror Address | serverA | serverB |
| SuperServer Address | 172.16.58.101 | 172.16.58.102 |
| Mirror Private Address | 172.16.159.101 | 172.16.159.102 |
| Agent Address | 172.16.58.101 | 172.16.58.102 |
其中172.16.58.0网段为外网网段; 172.16.159.0网段为内网网段。 在操作系统上查看IP, 是这个样子:
**servera**
```sh
#servera上的端口配置
[root@servera mgr]# ip -4 -br addr
lo UNKNOWN 127.0.0.1/8
ens33 UP 172.16.58.101/24
ens36 UP 172.16.159.101/24
[root@servera mgr]# firewall-cmd --list-ports
1972/tcp 52773/tcp 2188/tcp
[root@servera ~]#
#serverb上的端口配置
[root@serverb isc]# ip -4 -br addr
lo UNKNOWN 127.0.0.1/8
ens33 UP 172.16.58.102/24
ens36 UP 172.16.159.102/24
[root@serverb isc]# # firewall-cmd --list-ports
1972/tcp 52773/tcp 2188/tcp
```
## 在所有的镜像成员启动ISCAgent服务
无论是同步成员,异步成员,还是Arbiter,它们之间的通信都依赖ISCAgent服务。在操作系统上,它是一个独立于IRIS的服务,IRIS的默认安装也没有把它设置为自动启动,所以您需要在安装IRIS的机器,也就是同步,异步成员上手工启动这个服务。至于Arbiter,您可以理解Arbiter就是一个装了ISCAgent服务的机器,可以是任何一台客户的机器,装上ISCAgent, 能帮助IRIS主备成员自动切换判断,它就是Arbiter了。简单说, 您需要
1. 在Mirror的所有成员上启动ISCAgent
2. 在一台机器上安装ISCAgent并启动,它从此就是这个Mirror的Arbiter了。
Arbiter需要和IRIS服务器用相同的操作系统吗?没必要。很多客户的IRIS装在Linux上,而Arbiter是一个Windows机器, 跑着和IRIS无关的业务, 都不用是Server版的Windows。
默认配置下, ISCAgent通过TCP的2188端口和远端连接,启动ISC Agent后请检查防火墙,保证2188端口访问是可以访问的。
下面是具体的配置细节。
### 在Mirror的所有成员上启动ISCAgent
IRIS服务器不需要单独安装ISCAgent。 你需要做的是启动服务,并服务器重启后ISCAgent能自动启动。
- Windows: 进入管理工具—服务,选择ISCAgent,将启动类型改为自动。点启动ISCAgent,并确认服务已启动。
- Linux: 使用systemctl启动ISCAgent, 并加入系统自启动列表。
```sh
[root@servera isc]# systemctl start ISCAgent
[root@servera isc]# systemctl status ISCAgent
● ISCAgent.service - InterSystems Agent
Loaded: loaded (/etc/systemd/system/ISCAgent.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2022-04-15 10:26:20 CST; 11s ago
Process: 3651 ExecStart=/usr/local/etc/irissys/ISCAgent (code=exited, status=0/SUCCESS)
Main PID: 3653 (ISCAgent)
CGroup: /system.slice/ISCAgent.service
├─3653 /usr/local/etc/irissys/ISCAgent
└─3654 /usr/local/etc/irissys/ISCAgent
Apr 15 10:26:20 servera systemd[1]: Starting InterSystems Agent...
Apr 15 10:26:20 servera systemd[1]: Started InterSystems Agent.
Apr 15 10:26:20 servera ISCAgent[3653]: Starting
Apr 15 10:26:20 servera ISCAgent[3654]: Starting ApplicationServer on *:2188
[root@servera isc]#systemctl enable ISCAgent
Created symlink from /etc/systemd/system/multi-user.target.wants/ISCAgent.service to /etc/systemd/system/ISCAgent.service.
[root@servera isc]#
```
### Arbiter(仲裁服务)
你需要到WRC的下载网址下载ISCAgent的软件。下面是在Linux下安装ISCAgent的过程。
```sh
[root@serverc isc]# cd ISCAgent-2022.1.0.164.0-lnxrh7x64
[root@serverc ISCAgent-2022.1.0.164.0-lnxrh7x64]# ls
agentinstall cplatname dist package tools
[root@serverc ISCAgent-2022.1.0.164.0-lnxrh7x64]# ./agentinstall
Your system type is 'Red Hat Enterprise Linux (x64)'.
Please review the installation options:
------------------------------------------------------------------
ISCAgent version to install: 2022.1.0.164.0
------------------------------------------------------------------
Do you want to proceed with the installation ? yes
Starting installation...
Installation completed successfully
[root@serverc ISCAgent-2022.1.0.164.0-lnxrh7x64]
```
安装后同上一小节使用systemctl命令启动。
## 准备服务器的SSL/TLS证书
您的每个服务器需要准备两个证书:一个本机的证书, 一个是CA的证书。(如果是公开证书也要吗,openssl应该是没有,除非自己去下载)。 如果您使用的是IRIS自带的PKI签发的self-signed证书,那么每台服务器不仅仅要自己的证书,非CA所在的服务器要:“获取证书颁发机构证书”(‘Get Certificate Authority Certificate’)。这个选项“证书颁发机构客户端的”从证书颁发机构获取证书页面。
举例: servera, serverb为镜像成员。
```sh
[root@servera mgr]# ls *.cer *.key
iris.key iscCA.cer iscCASigned.cer iscCASigned.key
```
忽略iris.key。 其他的iscCA.cer是CA的证书, iscCASigned.cer是servera的证书, iscCASigned.key是servera的私钥。
同样, 在serverb:
```sh
[root@serverb ~]# cd /isc/iris/mgr
[root@serverb mgr]# ls *.cer *.key
iris.key iscCA.cer iscCASignedserverb.cer iscCASignedserverb.key
[root@serverb mgr]#
```
## 增加gmheap的大小
Mirror成员间的数据同步默认使用“Parallel dejournaling", 也就是多个进程并行处理同步数据,而这要求增大gmheap资源。
gmheap又被称为shared memory heap(SMH)。它的默认配置是38MB, 但在实际的生产系统中,gmheap通常配置比这要大。
每一个"parallel dejournalling job"需要增加200M的gmheap。比如说, 为了支持4个并行的同步任务, gmheap至少需要800M。如果系统资源足够,最多可以有16个并行同步任务。
**折中的考虑,当您配置镜像时,请将您系统的gmheap值增加为1GB。**
后面我们进入正式的Mirror的配置工作。Mirror的配置和把数据库添加入镜像。
文章
Claire Zheng · 一月 4, 2023
在InterSystems 2022年全球峰会上,InterSystems 数据平台负责人 Scott Gnau解读了智能数据编织(smart data fabric)及其实现方式。Scott 同时也是一位钢笔收藏家,他分享了自己学习收藏的过程,认为这种过程与智能数据编织有着异曲同工之妙。InterSystems IRIS数据平台的诸多优秀能力可以帮助用户实现智能数据编织,重塑数据利用方式!
公告
jieliang liu · 七月 5, 2023
嗨,开发者,
欣赏InterSystems Bilibili上的新视频:
⏯为什么水平可扩展性就像团队合作 @ 2022 年全球峰会
借助 InterSystems IRIS,您可以跨节点集群分配数据和工作负载、扩展和扩展以及根据需要动态重新平衡。在本次会议中,您将了解有关该技术和我们的一些部署的更多信息。
🗣演讲者:@Benjamin.DeBoe,InterSystems 产品经理
享受它并保持关注! 👍
问题
Michael Lei · 三月 1, 2022
Hi Community,
C:\InterSystems\IRISHealth\CSP\bin.csp.cni 有用户名, 但密码被加密了,如何解密或者重置?
谢谢!
1. Open <IRIS>\CSP\bin\CSP.ini
2. Edit Username/Password in [LOCAL] section.
3. Using Management Portal or ^SECURITY routine set the same user as (2) if they do not match.
4. Restart InterSystems IRIS.
问题
nianpeng qu · 五月 11
VSCode中安装InterSystems Language Server后,EXPLORER资源树使用Ctrl+F可以打开文件检索框,快速检索文件。 不知是VSCode版本更新不支持了,还是InterSystems Language Server更新,导致在EXPLORER资源树无法快速检索文件