搜索​​​​

清除过滤器
问题
lin qijun · 九月 13, 2021

怎么获取Caché的CDC数据?

1.Caché数据库有没有办法配置然后用sql读取数据库实时变化的数据,类似于mssql那样?我看了可以写类去读取global获取journal的值,但是怎么用sql读呢? 2.不行的话,那用什么方式可以读取到journal日志文件,并输出日志文件的内容? 先谢谢大家了!!! 请参考CDC 系列文章:https://cn.community.intersystems.com/post/cdc%E7%B3%BB%E5%88%97%E4%B9%8B%E4%B8%80-%EF%BC%9A%E4%BD%BF%E7%94%A8dejournal-filter%E5%9C%A8intersystems-iriscach%C3%A9%E4%B8%8A%E9%80%9A%E8%BF%87mirroring%E5%AE%9E%E7%8E%B0cdc%E5%8A%9F%E8%83%BD 这个试过了,配置dejournal没有问题,但是用$$$JRNNEWVAL(Address) 输入偏移量获取不到值的 注意文章中的提示: 1. $$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)`这2个宏定义在%syJrnRecord.inc文件里,因此需要将这个include文件加入ZCustom.MirrorDejournal类定义:Include %syJrnRecord 2.在InterSystems IRIS上修改并编译dejournal过滤器类后,需要重启异步镜像成员的Mirror,以使更改生效。 加了这个定义,并重启了的Mirror的,还是获取不到值的 使用的产品版本是什么?Dejournal filter是在Mirror report类型的异步镜像成员做的还是在shadow上做的?不同给的版本对应不同的处理方式。 同时还是建议将问题提到WRC:support@intersystems.com,他们会给予更详细的错误分析以及解决方案。 是在Mirror report类型的异步镜像成员上做的,版本是Cache for Windows (x86-64) 2016.2 (Build 736_0_16871U) Wed Dec 21 2016 09:38:49 EST版本 可以参考 %SYS.Journal.File.cls 这个类下的代码是如何使用$$$JRNNEWVAL(Address) 、$$$JRNOLDVAL(Address)的。
文章
Claire Zheng · 九月 13, 2021

InterSystems IRIS医疗版互联互通套件”线上发布会(9月17日)邀请报名启动

针对新近面向中国推出的InterSystems IRIS医疗版互联互通套件,InterSystems将在9月17日(本周五)举办“InterSystems IRIS医疗版互联互通套件”线上发布会,会议详情如下,欢迎点击“此处”或扫描下方二维码报名。此次会议为邀请参会制,收到您的报名信息后,我们会及时与您确认参会资格并发送会议链接。
文章
Claire Zheng · 九月 12, 2021

InterSystems发布InterSystems IRIS医疗版互联互通套件,加速医院互联互通平台建设

2021年9月13日,中国 北京—— 致力于帮助客户解决最关键的可扩展性、互操作性和速度问题的创新数据技术提供商InterSystems今日宣布在中国推出InterSystems IRIS医疗版互联互通套件,以满足医院信息化建设的标准化要求,促进业务协同,助力公立医院高效建设互联互通平台。 中国医院信息互联互通标准化成熟度测评工作自2012年启动以来,已成为医院信息化建设的重要抓手。2020年发布的最新版测评方案(《国家医疗健康信息医院信息互联互通标准化成熟度测评方案(2020年版)》)结合医疗健康信息化建设新需求、新技术应用情况,强化了分级管理机构职责,修订了测评流程,补充完善了测评指标,提升了测评方案的科学性和指导性。 凭借多年来深耕医疗信息化建设领域的丰富经验和强大的医疗数据平台,InterSystems结合新版测评标准,及时推出InterSystems IRIS医疗版互联互通套件,从安全管理、监控、数据管理、互联互通文档、互联互通服务、集成与交换六大方面入手,在满足测评标准化组件的基础上,提供最新版医院互联互通标准化成熟度测评规定的文档、监控、服务、Schema等组件,充分满足医院快速落地互联互通标准化成熟度测评涉及到的标准化改造需求。通过内置的模块化服务,InterSystems IRIS医疗版互联互通套件将有效缩短实施周期,加快互联互通平台建设。 InterSystems IRIS医疗版互联互通套件兼备高性能与稳定性,连续多年支持数百家大型公立医院海量数据稳定运行。 主流 PC 服务器单实例下,支持日消息吞吐量可高达27.64亿。截至2021年,InterSystems技术已助力一百余家医院通过四级及以上医院信息互联互通标准化成熟度评级。目前获评医院互联互通成熟度五级乙等评级的32家医院中,有10家均采用了InterSystems的技术和产品,某大型三甲医院日均处理数据在千万量级。 InterSystems IRIS医疗版互联互通套件包含先进的互操作技术,同时具备强大的创新功能,包括数据库管理、敏捷开发、 API 管理、FHIR资源仓库、分布式扩展、一体化机器学习、自适应分析等,全面支持医院持续开展数字化创新与应用。 InterSystems亚太区总经理卢侠亮表示:“作为一家服务中国医疗信息化市场超过20年的创新数据提供商,InterSystems致力于为中国用户提供卓越服务,此次发布的InterSystems IRIS医疗版互联互通套件专为中国用户打造,将更高效地为医疗机构标准化互联互通和信息共享提供技术保障。接下来,我们会一如既往地与本土合作伙伴和医疗机构紧密合作,将全球领先的医疗信息平台解决方案与中国市场需求相结合,为更多的医院数字化转型提供强大支持。” InterSystems将于2021年9月17日举办“InterSystems IRIS医疗版互联互通套件”线上发布会,会议详情如下,欢迎点击“此处”或扫描下方二维码报名。 目前已经可以回放,节前错过的小伙伴可以继续注册观看啦
文章
Michael Lei · 九月 9, 2021

来自海外的全球独立调查:为什么InterSystems IRIS医疗版是医疗IT开发者的最佳选择

挑战一:缺乏一个统一的技术体系?InterSystems IRIS 医疗版通过统一的数据库、互操作性/中间件、机器学习和FHIR等医疗行业特有的功能来简化开发,开箱即用。 挑战二:需要高性能的解决方案,可以定制适合医疗行业使用的案例InterSystems IRIS for Health医疗版由医疗行业开发人员创建并为医疗服务服务,具有所需的性能、可扩展性和灵活性,大量的全球、全国大型顶级医院案例。全美排名前20医院,全国客户数百家,百强医院30余家; 挑战三:开源和专有软件缺乏灵活性,无法为医疗行业应用提供高可靠性。InterSystems IRIS医疗版实现一套平台兼容专有和开源模块,同时开发人员可以选择自己喜欢的开发语言和灵活性,支持多种开发语言(ObjectScript,.net, Java, Sql, 等等) 挑战四:缺乏具有医疗卫生领域专业知识的供应商,也没有为开发人员提供持续的支持。InterSystems IRIS 医疗版的产品开发能力、屡获殊荣的支持和长期深耕医疗的企业文化,确保开发人员持续成功。
文章
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 云管理器》)
文章
Claire Zheng · 九月 9, 2021

优秀案例:吉大中日联谊医院“通关”互联互通五级乙等

在医院信息化领域,中日联谊医院最近一次站在行业瞩目的聚光灯下,是在2021年7月。在国家卫生健康委统计信息中心发布的《关于2020年度国家医疗健康信息互联互通标准化成熟度测评结果公示的通知》中,9家医院获评五级乙等,中日联谊医院名列其中。这也是目前为数不多的“通关”互联互通五乙的医院之一。2021年是《国家医疗健康信息医院信息互联互通标准化成熟度测评方案(2020年版)》(以下简称新版测评方案)施行的第一个年头。由于测评方案的细化、参评机构的数量增多,业界普遍反映医院互联互通测评的整体难度正在逐年增大。而五级乙等,已是医疗机构目前所能取得的最高级别。 在互联互通新版测评方案中,对互联互通功能的“实际落地”与“有效应用”提出了很高的要求。在五级乙等的分级要求中就明确提出:“实现公众服务应用功能数量不少于27个、医疗服务应用功能数量不少于30个;提供较为完善的互联网诊疗服务,初步实现基于平台的临床决策支持、闭环管理、大数据应用。” 医院信息化建设立足于实际应用,为医院的医疗服务与运营管理提供助力,这是中日联谊医院能够获评五级乙等的重要原因之一。 医院在参与测评的过程中,遇到的首要问题即异构系统的接入问题。互联互通新版测评方案对医院信息系统内外联通业务的数量提出了明确要求,其中对五级乙等的分级要求是:集成平台至少需要接入54个内部业务系统,以及不少于7个外部机构数量,实现基于平台的内部与外部联通业务。 为达到上述要求,医疗机构需有效解决异构系统间的数据交互问题,完成交互服务接口和闭环管理改造。中日联谊医院采用了“东华医为医院信息平台产品”,该产品依托InterSystems技术实现,是互联互通标准化成熟度测评工作的基础。InterSystems数据平台技术不仅稳定可靠,有效支撑数百万级的大规模消息吞吐交换,而且以其强大的可扩展性、易用性和互操作能力,使各异构系统的直接连接更简单,降低了交互服务接口开发的时间和成本,帮助医院高质、高效地推进了业务联通工作。 点击此次,阅读全文
文章
Nicky Zhu · 九月 7, 2021

IRIS 2021 技术文档 First Look 12--技术概要:.NET Object Persistence with XEP

本文档介绍了 XEP API,它在 InterSystems IRIS®数据平台上极其快速的 .NET 对象存储和检索支持。它向您提供了一个关于 .NET 对象持久化的 XEP 方法的进阶概述,并引导您通过一个简单的场景来演示 API 的主要功能。 这些活动被设计成只使用默认设置和功能,这样您就可以熟悉 XEP 的基本原理,而不必处理超出本概述范围的细节。有关 XEP 的完整文档,请参见 Persisting .NET Objects with InterSystems XEP (《使用 InterSystems XEP 持久化 .NET 对象》)。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 快速的对象存储和检索 面向对象编程是 .NET 框架的核心,因此 .NET 应用程序将数据建模为对象是很自然的。然而,当应用程序需要将数据存储在数据库中时,这可能会导致问题。如果您使用 ADO.NET 来存储和检索对象,您就面临着将对象数据转换为一组关系表、然后再将查询结果集转换为对象的问题。这个问题的通常解决方案是使用对象-关系映射(ORM)框架,如实体框架(Entity Framework) 来自动化这个过程。InterSystems IRIS 确实提供了实体框架(Entity Framework)接口,InterSystems 推荐它用于大型、复杂的对象层次结构。另一方面,对于执行实时数据采集等任务的应用程序,主要问题是速度而不是数据复杂性。虽然实体框架(Entity Framework)绝对不慢(如果适当优化的话),但对于需要极快地存储和检索简单或中等复杂数据的任务来说,XEP 是一个更好的选择。在大多数情况下,它比实体框架(Entity Framework)或 ADO.NET 快得多。 XEP 是如何工作的? XEP 是一个轻量级的 .NET API,它将 .NET 对象数据作为持久化事件(persistent event)来投射。持久化事件(persistent event)是 InterSystems IRIS 类的一个实例(通常是 %Persistent 的子类),包含 .NET 对象中数据字段的副本。与任何此类实例一样,可以通过对象访问、SQL 查询或直接 global 访问来检索它。 在创建和存储持久化事件(persistent event)之前,XEP 必须分析相应的 .NET 类,并将模式(schema)导入数据库。模式(schema)定义了用于存储 .NET 对象的持久化事件类的结构。如果持久化事件类不存在相应的 ObjectScript 模式,则导入模式(schema)将自动为其创建相应的 ObjectScript 模式。来自分析的信息可能是 XEP 导入简单模式所需要的全部信息。对于更复杂的结构,您可以提供额外的信息,允许 XEP 生成索引并覆盖导入字段的默认规则。 在为类创建模式(schema)之后,您可以使用各种 XEP 方法来存储、更新或删除事件、运行 SQL 查询,并通过查询结果集进行迭代。 试一试!XEP 的实际操作 现在是您自己尝试 XEP 的时候了。这个 XepSimple 演示是一个非常小的程序,但它提供了大多数关键 XEP 功能的示例,并概述了如何使用 XEP API。(想试试 InterSystems IRIS .NET 开发和互操作性功能的在线视频演示吗?请看.NET QuickStart(.NET 快速入门)!) 用前须知 要使用该程序,您需要一个安装了 .NET 框架和 Visual Studio 的 Windows 系统,以及一个运行中的 InterSystems IRIS 实例来连接。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;实例不需要由您正在工作的系统托管(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。使用同一文档中的 InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)和 .Net IDE 中的信息将 Visual Studio 连接到您的 InterSystems IRIS 实例。 配置 Visual Studio 项目 首先,打开 Visual Studio 并创建一个新的控制台(console)应用程序项目,选择 Visual C# 和 Console App (.NET Framework)(控制台应用程序(.NET 框架)) 选项。对于 Name(名称) 字段,输入 netxep。(想试试 InterSystems IRIS .NET 开发和互操作性功能的在线视频演示?请看.NET QuickStart(.NET 快速入门)!) 添加程序集引用 XEP API 被打包到 InterSystems.Data.XEP.dll 库中,该库必须安装在您的本地系统上。您可以通过克隆 repo https://github.com/intersystems/quickstarts-dotnet/tree/master/XEP 或从该 repo 下载文件来获取它。如果 InterSystems IRIS 安装在您的本地系统或您可以访问的另一个系统上,则该程序集已经安装在子目录 install-dir\dotnet\bin\v4.5 中,其中 install-dir 是实例的安装目录。 要将 InterSystems.Data.XEP.dll 的程序集引用添加到项目: 从 Visual Studio 主菜单中,选择 Project(项目) > Add Reference(添加引用)... 在出现的窗口中,点击 Browse(浏览).... 浏览到 InterSystems.Data.XEP.dll 文件的位置。 选择文件并点击 Add(添加)。 点击 OK(确定)。 在 Visual Studio Solution Explorer 中,InterSystems.Data.XEP.dll 程序集现在应该列在 References(引用)下。 添加示例类 在创建程序源文件之前,您将添加一个类,主程序会访问该类以生成用于存储的示例对象。在 Visual Studio 中,使用 Project(项目) > Add Class(添加类) 添加一个 C# 类文件到 netxep 项目。删除类文件的默认内容,并将以下代码复制并粘贴到文件中。 using System; namespace xep.samples { public class SingleStringSample { public string name; public SingleStringSample() { } internal SingleStringSample(string str) { name = str;} public static SingleStringSample[] generateSampleData(int objectCount) { SingleStringSample[] data = new SingleStringSample[objectCount]; for (int i = 0; i < objectCount; i++) { data[i] = new SingleStringSample("single string test"); } return data; } } } 因为这个类非常简单,所以 XEP 不需要任何注释就可以从中生成有效的模式。对于真实应用程序中更复杂的类,您可以使用各种选项来优化导入。 创建 XEP 演示程序 现在您可以创建 XEPSimple 演示程序了。在 Visual Studio 中,找到您在创建项目时创建的默认 program.cs 文件。删除该文件的默认内容,并粘贴下面的代码,用connection information for your InterSystems IRIS instance(您的 InterSystems IRIS 实例的连接信息)替换主机、端口、irisnamespace、用户名和密码变量的值。您可以指定所示的 USERnamespace,也可以选择在实例上创建的另一个命名空间。 using System; using InterSystems.XEP; using xep.samples; namespace XepSimpleNamespace { public class XepSimple { public static void Main(string[] args) { // Generate 12 SingleStringSample objects for use as test data SingleStringSample[] sampleArray = SingleStringSample.generateSampleData(12); // EventPersister EventPersister xepPersister = PersisterFactory.CreatePersister(); String host = "127.0.0.1"; // InterSystems IRIS host int port = 51774; // InterSystems IRIS Superserver port String irisnamespace = "USER"; // InterSystems IRIS namespace String username = "_system"; // Credentials for InterSystems IRIS String password = "SYS"; //Credentials for InterSystems IRIS xepPersister.Connect(host,port,irisnamespace,username,password); // connect to localhost xepPersister.DeleteExtent("xep.samples.SingleStringSample"); // remove old test data xepPersister.ImportSchema("xep.samples.SingleStringSample"); // import flat schema // Event Event xepEvent = xepPersister.GetEvent("xep.samples.SingleStringSample"); long[] itemIdList = xepEvent.Store(sampleArray); int itemCount = 0; for (int i = 0; i < itemIdList.Length; i++) { if (itemIdList[i] > 0) itemCount++; } Console.WriteLine("Stored " + itemCount + " of " + sampleArray.Length + " events"); // EventQuery EventQuery<SingleStringSample> xepQuery = null; String sqlQuery = "SELECT * FROM xep_samples.SingleStringSample WHERE %ID BETWEEN ? AND ?"; xepQuery = xepEvent.CreateQuery<SingleStringSample>(sqlQuery); xepQuery.AddParameter(3); // assign value 3 to first SQL parameter xepQuery.AddParameter(12); // assign value 12 to second SQL parameter xepQuery.Execute(); // get resultset for IDs between 3 and 12 xepQuery.Close(); xepEvent.Close(); xepPersister.Close(); } // end main() } // end class xepSimple } 演示程序分为三个部分,每个部分演示了 XEP 三个主要类——EventPersister、 Event 和 EventQuery 中的一个。运行时,XepSimple 演示程序执行以下任务: 首先,通过调用示例数据类(sample data class) xep.samples.SingleStringSample 这一方法生成一些示例对象。 EventPersister 是 XEP 的主要入口点(main entry point),并提供到数据库的连接。 它创建一个名为 xepPersister 的实例,该实例在数据库中建立到 User 命名空间的 TCP/IP 连接,并删除任何现有的示例数据。然后调用 ImportSchema() 来分析示例类并将模式发送到数据库,从而创建相应的 ObjectScript 模式来保存持久化 SingleStringSample 对象。 Event 封装了(encapsulate) .NET 对象和相应的数据库对象之间的接口。 一旦生成了模式(schema),xepPersister 就可以为示例类创建一个名为 xepEvent 的 Event 对象。Store() 方法将 .NET 对象数组存储为持久化事件。 EventQuery 用于准备和执行 SQL 查询的有限子集。 名为 xepQuery 的 EventQuery<SingleStringSample> 对象是通过将查询字符串传递给 xepEvent 对象的 CreateQuery() 方法创建的。 该字符串定义了一个接受两个参数(? 字符)的 SQL 查询。 参数值是通过调用 AddParameter() 定义的,调用 Execute() 来获取查询结果集。 当处理完成后,它通过调用 XEP 对象的 close() 方法进行清理。 运行 XEPSimple 程序 现在您可以构建和运行 XEPSimple 演示程序了。按 Ctrl + F5 运行程序,以便当程序结束时命令提示符保持打开状态。 下一步 XepSimple 演示的目的是让您体验 XEP,而又不陷入细节困境,它不是用于实际生产代码的模型——它甚至没有进行异常检查。最重要的简化是在示例数据中。您从一个不需要注释或其他机制来帮助模式(schema)生成和优化的类中持久化了一些很小的 .NET 对象。虽然在实际应用程序中通常需要注释和其他选项,但这些选项非常简单易用。API 也同样简单易用。 有关所有 XEP 功能的全面描述,请参见 Persisting .NET Objects with InterSystems XEP(《使用 InterSystems XEP 持久化 .NET 对象》)。 了解有关 .NET 支持的更多信息 InterSystems IRIS 提供了 .NET API,通过 SQL 表、对象和多维存储轻松访问数据库。有关每种类型的访问的详细信息,请参见以下书籍: Using the Native API for .NET(《使用 Native API for .NET》),了解从 .NET 应用程序访问 InterSystems IRIS globals。 Using ADO.NET Managed Provider Classes(《使用 ADO.NET Managed Provider Classes》),了解SQL 表访问。允许您的 .NET 项目使用完全兼容的通用 ADO.NET Managed Provider 版本访问 InterSystems IRIS 数据库。 Using the InterSystems ODBC Driver(《使用 InterSystems ODBC Driver》),了解 SQL 表访问。InterSystems ODBC 驱动程序允许 InterSystems IRIS 建立到外部应用程序的 ODBC 连接,并通过 SQL 提供对外部数据源的访问。 Persisting .NET Objects with InterSystems XEP(《使用 InterSystems XEP 持久化 .NET 对象》),了解对象访问。XEP 对事务处理应用程序进行了优化,这类程序使用复杂度从简单到中等的对象层次结构,且要求极高的对象数据持久化和检索速度。 Using the Entity Framework Provider(《使用 Entity Framework Provider》),了解对象-关系映射。提供有关使用实体框架(Entity Framework)技术访问 InterSystems IRIS 数据库的信息。 这是我们的Firstlook 文档? 对
公告
Johnny Wang · 九月 2, 2021

2021 年 8 月学习资料:现已上线!

2021 年 8 月的学习资料现在可以在learning.intersystems.com上独家获取!您可以: 先睹为快:2021 年虚拟峰会体验实验室 使用自适应分析(Adaptive Analytics)解决方案来组建你的第一个数据模型 免费试用 InterSystems IRIS 社区版 查看 InterSystems 文档中的分析 申请即将举行的线上技术课程 立刻报名! 注意:老是错过最新消息?别担心,我们会在9月恢复正常的邮件发送。
公告
jieliang liu · 九月 2, 2021

InterSystems公司合作伙伴名录已经推出!

开发者们好! 我们很高兴地宣布推出InterSystems公司的合作伙伴名录! 这里是寻找基于InterSystems产品的商业服务 和 解决方案 的地方。 为什么选择InterSystems合作伙伴目录? 每天,我们都会收到类似这样的问题: 是否有任何基于InterSystems技术的ERP解决方案? 我住在瑞典,我怎样才能得到InterSystems的培训? InterSystems在法国是否有任何实施伙伴? 无论我们的客户是在寻找建立解决方案的帮助,还是在寻找可信赖的咨询来源,还是在寻找实施项目的帮助,或者是寻找一些额外的培训,他们都可以通过合作伙伴名录来与适合他们的公司建立关系。 如果你的公司是InterSystems的合作伙伴,并且提供: 与InterSystems技术有关的实施、咨询或培训服务, 和使用InterSystems产品构建的解决方案。 我们欢迎你加入合作伙伴目录. 欢迎访问并与你的同事分享!
文章
Michael Lei · 八月 31, 2021

InterSystems被独立研究机构Forrester评为多模型数据平台领导者

InterSystemsIRIS® 数据平台在性能、分析/搜索和事务等标准中获得最高分 转载自Forester 报告: InterSystems是一个高性能的数据平台,具有强大的支持和可靠性。InterSystems的IRIS数据平台支持关系型、对象型、文档型、键值型、立方体和多维数组,但它没有原生的图形功能。该平台不需要整合多种技术栈,从而减少了代码、系统资源和维护。客户用它来支持客户分析、物联网、支持AI/ML的应用程序、风险分析和垂直特定的用例,如医疗保健应用程序和洞察力。InterSystems的愿景侧重于一个统一的平台,以支持各种应用和洞察力。该解决方案在性能、分析、搜索和交易方面得分很高。参考客户对InterSystems很满意;一个客户说:"他们的客户支持总是超级好。"另一个客户说他们 "在一个关键任务的应用中使用了10多年,对性能和功能以及可靠性总体上很满意。" Forester 报告原文下载:https://reprints2.forrester.com/#/assets/2/1735/RES161621/report
文章
姚 鑫 · 八月 27, 2021

Storage关键字SqlRowIdProperty,SqlTableNumber,State,StreamLocation,Type

# 第153章 Storage关键字 - SqlRowIdProperty 指定`SQL RowId`属性。 # 大纲 ```java prop ``` # 值 该元素的值是一个`SQL`标识符。 # 描述 此元素仅由从早期InterSystems产品迁移的类使用。 # 默认值 ``元素的默认值为空字符串。 # 第154章 Storage关键字 - SqlTableNumber 指定内部`SQL`表号。 # 大纲 ```java 123 ``` # 值 该元素的值是一个表号。 # 描述 此元素仅由从早期InterSystems产品迁移的类使用。 # 默认值 ``元素的默认值为空字符串。 # 第155章 Storage关键字 - State 指定用于串行对象的数据定义。 # 大纲 ```java state ``` # 值 此元素的值是此存储定义中的数据定义的名称。 # 描述 对于串行(嵌入式)类,此关键字指示使用哪个数据定义来定义对象的序列化状态(序列化时对象属性的排列方式)。这也是默认数据定义,默认结构生成器将向其添加未存储的属性。 # 默认值 ``元素的默认值为空字符串。 # 第156章 Storage关键字 - StreamLocation 指定流属性的默认存储位置。 # 大纲 ```java ^Sample.PersonS ``` # 值 此元素的值是带有可选前导下标的全局名称。 # 描述 此元素允许指定用于在持久化类中存储任何流属性的默认全局设置。存储在此全局的根位置的值是一个计数器,每当存储此类的流值时,该计数器就会递增。 请注意,还可以单独指定每个流属性的存储。 # 默认值 如果未指定,则类编译器将生成``元素的值。通常,该值是`^MyApp.MyClassS`(其中`MyApp.MyClass`是类名),但是,它可能会根据许多因素而有所不同。 # 第157章 Storage关键字 - Type 用于提供持久性的存储类。 # 大纲 ```java %Storage.Persistent ``` # 值 该元素的值是一个类名。 # 描述 此元素指定为此类提供持久性的存储类。 `%Storage.Persistent`类是默认存储类,并提供默认存储结构。 `%Storage.SQL`类用于将类映射到旧数据结构。 对于串行(嵌入式)类,必须将其设置为`%Storage.Serial`(由新建类向导自动设置)。 # 默认值 ``元素的默认值为`%Storage.Persistent`。
文章
Michael Lei · 八月 26, 2021

SAM - 设置和添加非 IRIS 目标指标的技巧和提示

# SAM - 设置和添加非 IRIS 目标指标的技巧和提示 SAM(系统警报和监视)以“功能齐全”的 docker-compose 容器集的形式提供,只要启动就可以开始以默认的仪表板监视 IRIS 实例。 使用初始配置就可以很好地了解 SAM 功能并开始对 IRIS 系统进行基本监视。 但是,当开始监视多个系统并收集大量指标数据时,需要更改一些默认设置。 为了从 SAM 获取更多价值,您还会想要添加来自其他数据源(目标)的指标。 以下技巧将帮助您在生产环境中部署 SAM,从多个目标收集指标并将这些指标组合到您自己的仪表板和图表中。 此外,您还将看到一些可能有助于探索 SAM 容器和应用程序的命令。 > *注意:*我应该指出,其中一些技巧和提示可能不是最佳做法;这更像是一个日志,记录了我第一次如何配置 SAM 来监视相同系统上的多个服务器和非 IRIS 目标的基准。 如果您有建议,请在评论中指教 ;) 所以,记住本帖可能会随着时间的推移而有所变化,让我们开始吧; --- 在下面的技巧中,有重启 docker 以及启动和停止 SAM 的操作。 请通读这些技巧,确定哪些适合您,然后按照下面的相同顺序执行。 ## 1. 确保有足够的空间用于 SAM 数据库 默认情况下,docker 容器将文件存储在根 (/) 文件系统。 SAM 不需要很多 CPU 或内存资源;但是,指标收集将占用空间。 > 指标需要的存储容量“视情况而定”。 虽然在开始监视之前可能无法明确数据库大小,但大致上,在抓取周期为 15 秒的情况下,监视 10 个 IRIS 虚拟机以及操作系统指标大约消耗 50GB 存储。 策略包括:增加监视实例的根存储,或更改数据库的卷位置。 我使用了以下命令来更改运行 docker 的虚拟机上的 docker 目录。 也许是杀鸡用了牛刀,但很管用。 - 停止 docker 并将 docker 文件复制到空间充足的文件系统(本例中为 /data/docker/data)。 见下面的示例: ```other [root@mysamserver lib]# sudo systemctl stop docker [root@mysamserver lib]# pwd /var/lib [root@mysamserver lib]# cp -rp docker /data/docker/data [root@mysamserver lib]# [root@mysamserver lib]# rm -rf docker ``` - 在 docker 配置文件中更新卷路径。 注意此文件还有一个网络设置“bip”(请参见注释:...) ```swift cat /etc/docker/daemon.json { "data-root": "/data/docker/data", "bip": "192.168.0.1/24" } ``` - 重启 docker ```swift sudo systemctl daemon-reload sudo systemctl restart docker systemctl status docker.service ``` ## 2. 设置 SAM 我假定您已在测试系统上设置 SAM,并熟悉它的基本操作:添加集群和实例,以及查看系统指标。 建议您花 20 分钟时间查看我在虚拟全球峰会 2020 上的展示,以了解安装步骤的概述,以及添加多个目标的运行指标时 SAM 的外观。 要观看此会议,请使用以下链接(您需要使用您的电子邮件注册): [DEV007 系统警报和监视](https://intersystems.6connex.com/event/virtual-summit/en-us/contents/434680/share?rid=Lobby&nid=804450) 登录到 SAM 门户并配置一些 IRIS 实例。 这会填充配置文件并提供向导。 `http://mysamserver:8080/api/sam/app/index.csp#/` > 注意:如果要添加多个实例,或者希望用脚本执行此步骤,可以通过 API 添加实例。 请参见文档。 ## 3. 升级到生产许可证 SAM 随附了一个 IRIS 社区版许可证。 有几个限制,包括 IRIS.DAT 限制为 10GB。 10GB 不足以长时间从多个目标收集数据。 请联系您的 InterSystems 联系人以获取生产许可证。 在没有编辑器的情况下,在精简的容器中更新许可证可能很棘手,我只是在 IRIS 容器上登录一个交互式会话,然后使用以下命令更新许可证密钥: - 打开 shell,切换目录至 mgr 文件夹(iris.key 文件的默认位置) ```swift docker exec -it sam_iris_1 bash cd /dur/iconfig/mgr ``` - 使用 unix“here 文档”更新密钥。 在“>”后面粘贴密钥文本。 在密钥文本后面,输入“>EOF”以提交命令。 然后输入“exit”退出 shell。 ```other cat [ConfigFile] FileType=InterSystems License Rev-A.1 LicenseID=999999 [License] LicenseCapacity=InterSystems IRIS 2020.2 Server for SAM:etc etc, the key you were sent by your InterSystems contact. >EOF exit ``` - 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` - 可以通过访问系统管理门户或登录到 iris 实例并检查 messages.log 来检查许可证是否一切正常。 ```shell docker exec -it sam_iris_1 bash cd /dur/iconfig/mgr cat messages.log ``` ## 4. 在目标上安装其他 prometheus 导出程序 例如,prometheus 节点导出程序可显示各种硬件和内核相关的指标。 [节点导出程序文档](https://prometheus.io/docs/guides/node-exporter/) 通过请求(抓取)实例端点的指标,测试节点导出程序是否正常工作: ```swift curl my_target_server_name:9100/metrics ``` 您应该看到类似下面的信息: ```swift mylaptop:~ mo$ my_target_server_name:9100/metrics | more HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 4.8862e-05 go_gc_duration_seconds{quantile="0.25"} 7.5898e-05 go_gc_duration_seconds{quantile="0.5"} 9.2974e-05 go_gc_duration_seconds{quantile="0.75"} 0.000130664 go_gc_duration_seconds{quantile="1"} 0.000358762 go_gc_duration_seconds_sum 303.291715258 go_gc_duration_seconds_count 2.572586e+06 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 9 : : many many metrics will be displayed ``` 注意您可以对您的 IRIS 实例执行同样操作: ```swift mylaptop:~ mo$ curl my_target_server_name:52776/api/monitor/metrics | more iris_cpu_pct{id="AUXWD"} 0 iris_cpu_pct{id="CSPDMN"} 0 iris_cpu_pct{id="CSPSRV"} 0 iris_cpu_pct{id="ECPCliR"} 0 iris_cpu_pct{id="ECPCliW"} 0 iris_cpu_pct{id="ECPSrvR"} 0 iris_cpu_pct{id="ECPSrvW"} 0 : : many many metrics will be displayed ``` ## 5. 编辑配置文件以添加对新目标的抓取 例如,前一个技巧中的 node-exporter 实例。 配置文件将位于 SAM 的安装位置。 如下所示,可以看到 grafana 和 prometheus `yml` 配置文件。 ```plaintext [root@mysamserver sam-1.0.0.115-unix]# ls config docker-compose.yml readme.txt start.sh stop.sh [root@mysamserver sam-1.0.0.115-unix]# tree -x config config ├── alertmanager │   └── isc_alertmanager.yml ├── grafana │   ├── dashboard.json │   ├── dashboard-provider.yml │   ├── datasource.yml │   └── grafana.ini ├── nginx │   └── nginx.conf └── prometheus ├── isc_alert_rules.yml └── isc_prometheus.yml 4 directories, 8 files ``` ## 5.1 添加目标到 prometheus 以下示例是使用 SAM 中的配置 GUI 屏幕创建的 `isc_prometheus.yml` 文件。 该文件包含两个集群。 一个集群监视 sam 实例本身,另一个集群监视五个 IRIS 实例。 ```yaml alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 global: evaluation_interval: 15s scrape_interval: 15s remote_read: - url: http://iris:52773/api/sam/private/db/read remote_write: - url: http://iris:52773/api/sam/private/db/write rule_files: - ./isc_alert_rules.yml scrape_configs: - job_name: SAM metrics_path: /api/monitor/metrics scheme: http static_configs: - labels: cluster: "1" targets: - mysaminstance.mycompany.com:8080 - labels: cluster: "2" targets: - myiristarget1:52776 - myiristarget2:52776 - myiristarget3:52776 - myiristarget4:52776 - myiristarget5:52776 ``` - 要添加对其他运行 node-exporter 的目标的抓取,请将以下内容添加到 `isc_prometheus.yml` 文件的底部。 注意 API `metrics_path` 与 IRIS 不同。 ```yaml alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 global: evaluation_interval: 15s scrape_interval: 15s remote_read: - url: http://iris:52773/api/sam/private/db/read remote_write: - url: http://iris:52773/api/sam/private/db/write rule_files: - ./isc_alert_rules.yml scrape_configs: - job_name: SAM metrics_path: /api/monitor/metrics scheme: http static_configs: - labels: cluster: "1" targets: - iscsydsam.iscinternal.com:8080 - labels: cluster: "2" targets: - myiristarget1:52776 - myiristarget2:52776 - myiristarget3:52776 - myiristarget4:52776 - myiristarget5:52776 - job_name: node_shard1 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget1:9100 - job_name: node_shard2 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget2:9100 - job_name: node_shard3 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget3:9100 - job_name: node_shard4 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget4:9100 - job_name: node_shard5 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget5:9100 ``` - 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` SAM 现在从您通过 GUI 添加的 IRIS 实例以及相同实例上的 node-exporter 中收集指标。 # 6. 增加 Prometheus 收集指标的天数 在 SAM 的第一版中,您可以在 GUI 中更改收集指标的天数。 但是,我在显示所有指标时遇到一个问题。 在我弄清楚发生了什么之前,我更改了 Prometheus 中的保留天数,否则 SAM 将收集数据,但是您在 Grafana 的 Prometheus 查询中看不到指标。 在文件 `docker-compose.yml` 中用来安装 SAM 的层,更改 Prometheus 启动时设置的保留天数,例如在 `prometheus` 部分中,更新 `storage.tsdb.retention.time` 参数以匹配所需的保留天数: ```swift prometheus: command: - --web.enable-lifecycle - --config.file=/config/isc_prometheus.yml - --storage.tsdb.retention.time=30d ``` > 注意:在 SAM 的第一版中,最长保留天数为 30 天。 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` ## 7. 创建您自己的仪表板 您可以向现有仪表板添加面板,也可以创建新的仪表板以满足您的监视需求。 这是一个很大的主题,所以留到下一个帖子再说。 不过,这里先帮助您上手。 在 SAM 屏幕上使用 `View in Grafana`(在 Grafana 中查看)按钮切换到 Grafana。 ![DraggedImage.png](https://res.craft.do/user/full/635e53bd-527a-1620-0e31-f8c3bdff1139/doc/CB3E6427-4D46-40C7-93DF-9E1FE801E814/C1AAEA2C-B8AF-4CF6-AB18-DD562971A9BC_2) 打开 Grafana 后,可以创建或编辑仪表板; ![DraggedImage-1.png](https://res.craft.do/user/full/635e53bd-527a-1620-0e31-f8c3bdff1139/doc/CB3E6427-4D46-40C7-93DF-9E1FE801E814/BC370FDF-308A-4917-9262-42AE286BDE8B_2) 网上有许多查询导出程序(如 node-exporter)的示例。 > 当可以显示 IRIS 系统指标(SAM 中的默认设置)、IRIS 应用程序指标(您需要将这些指标构建到应用程序中)以及其他指标(如 node-exporter 或由供应商创建的任何数量的指标)时,真正强大的功能才体现出来。 例如,[使用 SAM 和 cAdvisor 监视 Docker 容器](https://community.intersystems.com/post/monitor-docker-containers-using-sam-and-cadvisor)
文章
Jingwei Wang · 八月 25, 2021

Object Script 基础知识(二)

Object Script(二) 特殊符号 ObjectScript没有定义任何保留字:你可以自由地使用任何字作为标识符(如变量名)。为了达到这个目的,ObjectScript使用了一组内置的命令以及特殊的字符(比如函数名的"$"前缀),以便将标识符与其他语言元素区分开来。 示例 含义 abc^def 调用routine中的一个标签: def是一个routine,abc是该routine中的一个标签。 i%abcdef i%<PropertyName> 用于从实例变量自身的Get或Set访问器方法中引用该变量,或者绕过其Get或Set方法 abc->def 这种语法只在InterSystems的SQL语句中可以使用。它指定了一个隐含的左外连接。abc是你正在查询的类中的一个对象值字段,def是子类中的一个字段。 abc?def 一个问号是模式匹配操作符,测试变量abc中的值是否与def中指定的模式相匹配 abc[def 左括号([)是二进制包含运算符。这个表达式检测字符串"abc "是否包含字符串 "def" abc]def 右括号(])是二进制跟随运算符。这个表达式检测字符串"abc "是否在字符串 "def "之后,以ASCII的顺序排列。 abc]]def 两个右括号(]])是二进制排序运算符。这个表达式检测字符串 "abc "是否排在字符串 "def "之后,以数字下标排序。 .. 相对点语法,两个句号组成,是一个类成员内部对另一个类成员的引用的开始。或者用于访问当前对象的一个属性或调用一个方法 ##Class() 用于调用一个类的方法,将一个对象引用转换为另一个类来调用一个方法,或者用于访问一个类参数的值。 ##super 用于从子类方法中调用父类方法 $abc 系统变量或自定义变量 $abc() 系统函数或者自定义函数,括号中可用逗号分隔参数 $abc.def.ghi(xxx) $abc是$SYSTEM,def是%SYSTEM包中的类的名称,ghi是该类中一个方法的名称,xxx是该方法的一个可选的逗号分隔的参数列表 $SYSTEM是%SYSTEM包的别名,用来提供对该包中类的方法的访问 $$abc abc是一个宏,美元符号不是其名称的一部分 $$abc() 是一个定义在包含此引用的routine或函数中的子程序。这种语法调用子程序abc并获得其返回值 %abc InterSystems IRIS系统类中的大多数包、类和方法都以百分号开头。也有可能是InterSystems IRIS设置的一个局部变量,Routine或者嵌入SQL变量 %%abc 有关于InterSystems SQL,是伪字段的关键字 ^abc 一个函数或者一个执行程序(Roution),也可表示为全局参数 ^$abc 结构化的系统变量 ^||abc 进程私有的全局参数,是一个用于临时存储大数据值的机制 ^[XXX]%abc 对另一个名字空间中的全局或例程的引用 常用系统变量及函数: 变量/函数/类 含义 $SYSTEM 提供系统信息 $HOROLOG 当前进程的日期和时间 $zv 系统版本信息 $ZDH() 用于检验日期格式,并将可读的日期格式转换成InterSystems IRIS 数据库可读格式 $zd() 用于检验日期格式,并将InterSystems IRIS数据库日期格式转换成可读的日期格式。 示例: 字符串类型与日期类型相互转换:$ZDH/$ZD w $ZDH("2017-03-13",3) w $zd(0) $Random(range) 返回符合范围内的随机正整数 $zlog() Log指数计算 $zsqr() 平方根计算 $Case 根据第一个参数,可以返回相关的值,类似于Switch case。或者返回一个procedure或者一个routine 示例: s x =2 w $CASE(x,1:"single",2:"double",3:"triple",:"input error") 数组 本地数组:生命周期在当前进程 SET a(1) = "A local variable array" SET a(1,1,1) = "Another local variable array" 全局数组:持久化数组,直接存于磁盘 SET ^||a(1) = "A process-private global array" SET ^a(1) = "A global array"
文章
Jingwei Wang · 八月 25, 2021

精华文章---Object Script 基础知识(一)

Object Script(一) 概况 ObjectScript是一种用于在InterSystems IRIS数据平台上快速开发编程语言,它是面向对象的弱类型脚本语言,非常适用于各种应用,包括业务逻辑、应用集成和数据处理。 在这里,我将主要介绍ObjectScript的命令脚本,类,方法和Routine等使用方式和语法规范。如有任何疑问,可在InterSystems开发者社区进行深入讨论。 IDE选择 可以使用InterSystems IRIS内置的Studio或Visual Studio Code(需要安装Object Script扩展)来查看和编辑代码。这里我们使用InterSystems IRIS内置Studio来做示例。 如果你已安装InterSystems IRIS或者InterSystems HS 等任何InterSystems产品,找到右下角的图标 ,单击鼠标右键,点击Studio,如下图所示: 输入用户名和密码(用户名:superuser 密码:安装时自己设置的密码),即可进入到Studio开发环境,如下图所示: Terminal 可以直接打开InterSystems IRIS的终端尝试执行ObjectScript的简单指令。通过右下角的图标 ,单击鼠标右键,点击Terminal,如下图所示: 命名空间 启动一个终端会话后,输入用户名和密码(用户名可以使用superuser,密码是安装时自己设置的密码),之后就会显示你在哪个命名空间下,如下图所示,我的就在USRE这个命名空间下。 命名空间切换 do ^%CD set $namespace = "Namespace" Terminal指令语法 在终端中,可以输入各种ObjectScript命令语句。但是不支持多行模式,所以整个命令必须在单行输入。 常用执行指令 指令 缩写 操作 语法/示例 write w 打印变量 write "Hello World!" write ! W ! 新行打印变量 write !, "This", !, "Is", !, "A", !, "Multi-line", !, "Message!", ! write ? w ? 列定位打印变量 write !, "This", ?9, "Is", ?18, "A", ?27, "Columnar", ?36, "Message!", ! write # w # 清除屏幕 write # zwrite zw 打印变量的名称和它们的值 zwrite read r 读入字段 read x set s 赋值 set x = "Hello World!" kill k 清除变量,慎用(不加参数调用时将清除内存中的所有变量!) kill x quit q 终止一个例程的执行 后面加返回值(类似return) do d 调用函数,routine do ##class(myclass).[method](…) if 评估条件,并根据条件来决定运行哪些代码 if condition { code } elseif condition {code} else {code} for 重复代码的部分 FOR variable=start:increment:end {…} while 作用与无参数的For类似,都是重复代码的部分. 2. 与for的区别在于条件是在整个代码块之前(While)还是之后(Do/While)被评估 do {code} while condition 或者 while condition {code} 异常错误解读 输入 quit 退出错误 数据类型 %String, %Status, %Integer, %Double, %DateTime等 运算符 关系运算符:= , < ,> ,<= ,>= 算术运算符:+ ,- , * , / 等 逻辑运算符:&& , || , ' 连字符:_ 运算优先级:严格按照从左到右执行,数学运算没有优先级,但先计算括号内表达式。
文章
Michael Lei · 八月 20, 2021

IRIS ObjectScript 原生API Demo

这是一个IRIS 2020.2上的代码示例,并非InterSystems 官方支持! 本demo基于原始类描述 is based on the raw class descriptions.使用的数据类是Address, Person, Employee, Company如果要做更有吸引力的 demo, 可以添加 JSONtoString by ID的方法 用ZPM安装后从终端启动:After installation with ZPM just run from Terminal USER>do ##class(rcc.ONAPI.demo).Run() Adjust Parameters host[127.0.0.1]: port[51773]: namespace[USER]: user[_SYSTEM]: pwd[SYS]: timeout[5]: ****** connected ******** 下一步, 你会得到一系列可能的Demo动作。you get a list of possible demo actions.没有输入就意味着没有动作No input means no action.菜单会一直循环直到退出The menu loops until you exit. Populate Person by:100 100 Populate Company by:10 10 Populate Employee by:50 50 Show Person by ID:3 {"Name":"Rogers,Norbert V.","SSN":"990-11-9806","DOB":"1962-04-23","Home":{"Street":"867 Oak Street","City":"Denver","State":"NH","Zip":"64647"},"Office":{"Street":"3309 Oak Court","City":"Denver","State":"NY","Zip":"76436"},"FavoriteColors":["Green","Green"],"Age":58} Show Company by ID:3 {"Name":"CompuComp Corp.","Mission":"Specializing in the development and manufacturing of open-source object-oriented models for additive manufacturing.","TaxID":"Y8155","Revenue":819493934,"Employees":[{"Name":"Ahmed,Sophia P.","SSN":"936-73-5161","DOB":"1933-08-08","Home":{"Street":"8758 Elm Street","City":"Fargo","State":"OH","Zip":"40652"},"Office":{"Street":"1578 Maple Street","City":"Larchmont","State":"IA","Zip":"89021"},"Spouse":{"Name":"Olsen,William A.","SSN":"912-52-4809","DOB":"2010-01-26","Home":{"Street":"2933 Main Street","City":"Bensonhurst","State":"WA","Zip":"51960"},"Office":{"Street":"4994 Ash Street","City":"Gansevoort","State":"OR","Zip":"89750"},"Spouse":{"Name":"Adam,Brian D.","SSN":"799-82-3083","DOB":"2005-11-04","Home":{"Street":"1264 Oak Avenue","City":"Chicago","State":"WV","Zip":"34943"},"Office":{"Street":"7443 Second Avenue","City":"Zanesville","State":"CO","Zip":"30478"},"Spouse":{"Name":"Cooke,Diane C.","SSN":"754-49-5729","DOB":"1984-01-12","Home":{"Street":"9624 Maple Place","City":"Albany","State":"MS","Zip":"60948"},"Office":{"Street":"4711 Second Place","City":"Youngstown","State":"VA","Zip":"31250"},"Age":36},"FavoriteColors":["Orange"],"Age":14},"FavoriteColors":["Green","Green"],"Age":10,"Title":"Senior Systems Engineer","Salary":61511},"Age":87,"Title":"Product Manager","Salary":59127},{"Name":"Ng,Elmo S.","SSN":"201-15-3259","DOB":"1954-10-14","Home":{"Street":"2437 Main Avenue","City":"Xavier","State":"KY","Zip":"10156"},"Office":{"Street":"2770 Oak Drive","City":"Tampa","State":"OH","Zip":"18459"},"Spouse":{"Name":"Eastman,Linda M.","SSN":"110-41-1818","DOB":"1980-03-19","Home":{"Street":"5309 Ash Drive","City":"Xavier","State":"RI","Zip":"36964"},"Office":{"Street":"4288 Washington Place","City":"Xavier","State":"HI","Zip":"41889"},"Spouse":{"Name":"Huff,Dave C.","SSN":"559-32-3838","DOB":"1973-05-05","Home":{"Street":"6216 First Avenue","City":"Tampa","State":"WA","Zip":"68628"},"Office":{"Street":"2896 Clinton Drive","City":"Elmhurst","State":"UT","Zip":"97796"},"FavoriteColors":["Purple"],"Age":47},"FavoriteColors":["Purple","Blue"],"Age":40},"FavoriteColors":["Red","Purple"],"Age":65,"Title":"Laboratory Marketing Manager","Salary":35888}]} Show Employee by ID:103 {"Name":"Faust,Buzz H.","SSN":"979-41-6347","DOB":"1938-02-07","Home":{"Street":"6231 Madison Avenue","City":"Gansevoort","State":"TX","Zip":"49085"},"Office":{"Street":"6402 Main Street","City":"Elmhurst","State":"RI","Zip":"82976"},"Spouse":{"Name":"Joyce,Chad C.","SSN":"199-86-8085","DOB":"1974-11-17","Home":{"Street":"6229 Main Street","City":"Reston","State":"FL","Zip":"16922"},"Office":{"Street":"8509 Elm Blvd","City":"Bensonhurst","State":"HI","Zip":"90665"},"Spouse":{"Name":"Cooke,Diane C.","SSN":"754-49-5729","DOB":"1984-01-12","Home":{"Street":"9624 Maple Place","City":"Albany","State":"MS","Zip":"60948"},"Office":{"Street":"4711 Second Place","City":"Youngstown","State":"VA","Zip":"31250"},"Age":36},"FavoriteColors":["Purple"],"Age":45},"Age":82,"Title":"Global Administrator","Salary":13813} Show Global PersonD by ID:4 $Data()=1 Value=$lb("","Eastman,Mary C.","887-18-3730",44711,$lb("3889 Ash Blvd","Washington","TX",67862),$lb("5709 Oak Blvd","Chicago","IL",30845),"","") Index list for Person & Employee (n,y):y $Employee $Person NameIDX SSNKey ZipCode Exit Demo (n,y,*): Populate Person by: Populate Company by: Populate Employee by: Show Person by ID: Show Company by ID: Show Employee by ID:104 {"Name":"Novello,Emily I.","SSN":"411-35-4234","DOB":"1943-01-07","Home":{"Street":"3353 Washington Court","City":"Hialeah","State":"MT","Zip":"22403"},"Office":{"Street":"9743 Clinton Blvd","City":"Xavier","State":"OH","Zip":"89038"},"Spouse":{"Name":"Goldman,Usha T.","SSN":"465-59-4053","DOB":"1987-07-16","Home":{"Street":"2578 Second Blvd","City":"Gansevoort","State":"FL","Zip":"77552"},"Office":{"Street":"6986 Main Street","City":"Elmhurst","State":"VT","Zip":"48713"},"Spouse":{"Name":"Rogers,Norbert V.","SSN":"990-11-9806","DOB":"1962-04-23","Home":{"Street":"867 Oak Street","City":"Denver","State":"NH","Zip":"64647"},"Office":{"Street":"3309 Oak Court","City":"Denver","State":"NY","Zip":"76436"},"FavoriteColors":["Green","Green"],"Age":58},"Age":33},"FavoriteColors":["Green","White"],"Age":77,"Title":"Senior Product Specialist","Salary":96469} Show Global PersonD by ID: Index list for Person & Employee (n,y): Exit Demo (n,y,*):y ****** done ******** USER>