搜索​​​​

清除过滤器
文章
姚 鑫 · 四月 4, 2021

第十六章 导入SQL Code

# 第十六章 导入SQL Code 本章介绍如何将SQL代码从文本文件导入Intersystems SQL。导入SQL代码时,IntersystemsIris®数据平台使用动态SQL准备并执行每行SQL。如果遇到无法解析的代码行,则SQL导入跳过该行代码并继续准备和执行后续行,直到它到达文件的末尾。所有SQL代码导入操作导入到当前名称空间。 SQL导入主要用于导入数据定义语言(DDL)命令(例如`Create Table`),并使用`Insert`,`Update`和`Delete`命令填充表。 SQL导入确实准备并执行`SELECT`查询,但不创建结果集。 SQL导入可用于导入Intersystems SQL代码。它也可以用于代码迁移,从其他供应商导入SQL代码(`FDBMS`,`Informix`,`Interbase`,`MSSQLServer`,`MySQL`,`Oracle`,`Sybase`)。来自其他供应商的代码被转换为Intersystems SQL代码并执行。 SQL导入无法将所有SQL命令导入Intersystems SQL。它导入与SQL标准的Intersystems Iris实现兼容的那些命令和条款。不兼容的功能通常被解析,但忽略了。 SQL导入可以成功准备一个SQL查询 - 在适当的情况下创建相应的缓存查询 - 但它不会执行查询。 通过从`%system.sql.schema`类中调用相应的方法,执行SQL代码导入。导入SQL代码时,这些方法可以创建其他两个文件:`errors.log`文件,它记录解析SQL命令中的错误,以及一个不支持的。其中包含该方法无法识别为SQL命令的文字文本。 # 导入Intersystems SQL. 可以使用以下`%System.sql.schema`方法从文本文件中导入Intersystems SQL代码: - `ImportDDL()`是一个通用的SQL导入方法。此方法运行作为背景(非交互式)进程。要导入Intersystems SQL,请将“IRIS”指定为第一个参数。 - `run()`是一个Intersystems SQL导入方法。该方法从终端交互方式运行。它会提示指定导入文本文件的位置,创建`Errors.log`文件和U`nsupported.log`文件以及其他信息。 注意:此导入和执行SQL DDL代码不应与管理门户SQL接口的Import语句操作混淆。该操作以XML格式导入SQL语句。 以下示例导入Intersystems Iris SQL代码文件`Pathname MySQLCode.txt`,在当前命名空间中执行该文件中列出的SQL命令: ```java DO $SYSTEM.SQL.Schema.ImportDDL("IRIS",$USERNAME,"c:\temp\mysqlcode.txt",,1) ``` 默认情况下,`ImportDDL()`创建错误日志文件。此示例在与SQL代码文件中创建名为`mysqlcode_errors.log`的文件。第五个参数是一个布尔值,指定是否创建列出不受支持的SQL命令的文件。默认值为0.在此示例中,第五个参数设置为1,在与SQL代码文件相同的目录中创建名为`mysqlcode_unsupported.log`的文件。即使没有写入它们时,也会创建这些日志文件。 从终端执行`ImportDDL()`时,它首先列出输入文件,错误日志文件和不受支持的日志文件。然后,对于每个SQL命令,它显示一个列表,例如以下内容: ```sql SQL statement to process (number 1): CREATE TABLE Sample.MyStudents (StudentName VARCHAR(32), StudentDOB DATE) Preparing SQL statement... Executing SQL statement... DONE ``` 如果在任何SQL命令中发生错误,则终端显示错误,如以下示例所示: ```sql SQL statement to process (number 3): INSERT INTO Sample.MyStudents (StudentName,StudentDOB) SELECT Name, DOB FROM Sample.Person WHERE Age
文章
姚 鑫 · 九月 17, 2022

第三十五章 在 Windows 上使用 IRIS(二)

# 第三十五章 在 Windows 上使用 IRIS(二) # IRIS 启动器 `Microsoft Windows` 平台上的主要`IRIS` 界面是 `IRIS` 启动器。从 `IRIS` 启动器,可以启动所有 `IRIS` 配置和管理工具。还可以从快捷方式或命令行调用每个启动器命令。 相应地,可以从 `Windows` 程序菜单中启动许多 `IRIS` 工具,方法是指向 `IRIS` 文件夹,然后指向启动 `IRIS` 以获得适当的 `IRIS` 实例名称。 当在基于 `Windows` 的系统上启动 `IRIS` 时, `IRIS` 启动器图标会出现在任务栏的系统托盘中。 当单击 `IRIS` 启动器时,会出现一个菜单,其中包含使用 `ObjectScript` 实用程序和编程环境的命令。 下表描述了 IRIS 启动器菜单中可用的命令。 IRIS 启动器命令| 描述 ---|--- `Getting Started`|显示教程、发行说明、文档和其他相关信息的链接 `Start IRIS`|启动菜单项后方括号中指定的默认实例,例如 `[ii2081]`。如果 `IRIS` 服务器已经启动,这个选项会变暗——它不可用。 `Stop InterSystems`|关闭或重新启动本地 `IRIS` 实例。如果 `IRIS` 服务器已停止,此选项将显示为灰色——它不可用。 `Studio`|创建、编辑、删除和编译 `IRIS` 类定义和例程。 `Terminal`|调用 `IRIS` 的命令行解释器。 `Management Portal`|执行常见的系统管理任务。创建数据库和命名空间,并调整所有 `IRIS` 配置设置。显示类、全局变量和例程,以及用于管理它们的函数。显示表和视图,执行查询和 `SQL` 管理功能。 `Documentation`|显示 `IRIS` 在线文档。 `Preferred Server [server name]`|显示远程服务器列表并使用子菜单上的“添加/编辑”命令维护服务器连接。首选服务器出现在括号中,并且在服务器列表中旁边有一个复选标记。 `About`|显示 `IRIS` 版本和构建信息。 `Exit`|从系统托盘中删除`IRIS` 启动器图标;这不会停止 `IRIS`。当实例重新启动时,启动器会重新出现。 # 启动 IRIS 要启动 `IRIS`,请在系统级别运行启动程序。此过程使用默认配置文件或指定的配置文件运行。 **注意:如果在启动 `IRIS` 时遇到任何问题,请按照“监控指南”的“监控日志文件”部分中的说明查看 `messages.log` 文件。** 要在 `Windows` 平台上启动 `IRIS`,请从 `IRIS` 启动器中选择启动 `IRIS`。这将使用指定的配置文件启动 `IRIS` 实例。当 `IRIS` 未运行时, `IRIS` 启动器图标显示为灰色。 如果 `IRIS` 启动器不在系统托盘中,请从 `Windows` 程序菜单中选择 `IRIS` 文件夹并为该实例启动 `IRIS`。要将启动器返回到系统托盘,请转到 `install-dir/bin` 目录并双击 `iristray.exe` 文件。 或者,可以从“开始”菜单上“运行”命令的“打开”框中的 `install-dir/bin` 目录输入这些命令。例如,要从 `MyIris\bin` 目录启动名为 `MyIris` 的实例,请输入以下命令: ``` c:\MyIris\bin\iris start iris ``` # 停止 `IRIS` 通常让 `IRIS` 系统保持运行。但是,如果操作系统需要重新启动,请在关闭系统之前停止 `IRIS`。诸如备份和数据库修复实用程序等维护任务不需要停止 `IRIS`。 从 `IRIS` 启动器菜单中单击停止 以关闭或重新启动本地 `IRIS` 实例。默认情况下,此选项使用默认关闭例程立即关闭(或重新启动) `IRIS`。但是,它还提供了设置延迟关闭的计时器、运行用户定义的关闭例程、向服务器上的用户广播警告消息以及关闭而不进行故障转移的选项。可以从 `Windows` 程序菜单运行相同的过程。为该实例名称选择 `IRIS` 文件夹并停止 `IRIS`。一旦倒计时达到 `0` 并且关机程序已开始,将无法取消关机。 ![image](B69E2B79E8DD4AB1BB966D8CE3F1017F) **重要提示:`InterSystems` 建议运行 `Stop IRIS` 来关闭 `IRIS` 以确保其正确关闭。** ## 删除 `Stop InterSystems` 命令 为防止意外执行 `Stop InterSystems` 命令,可以通过从相应 `IRIS` 实例的 `install-dir/bin` 目录中删除 `irisstop.exe` 文件来从 `IRIS` 启动器中删除该命令。还可以从“开始”菜单中的相应 `IRIS` 实例中删除停止 `InterSystems` 快捷方式。指向 `Programs` 和 IRIS 实例名称,然后右键单击 `Stop` 并单击 `Delete`。 # 从命令提示符控制 `IRIS` 可以通过运行 `install-dir\bin` 目录中的 `iris.exe` 程序从 `Windows` 命令提示符控制 `IRIS` 实例。 要显示此命令的最新帮助信息,请从 `IRIS install-dir\bin` 目录调用 `iris` 帮助。例如: ```java C:\InterSystems\IRISHealth\bin>iris help usage: iris start [] to start instance , optionally using the specified .cpf file. An optional /EmergencyId=Username,Password can be used to start InterSystems IRIS in emergency mode. When the EmergencyId argument is supplied, the system starts up in emergency mode in which only the baseline databases are mounted and access to InterSystems IRIS is governed by InterSystems IRIS login using that username and password. Emergency mode is supplied to give access in the event that privileged users are not available or their password is forgotten. Emergency startup is only available from an administrator account. When InterSystems IRIS is started in emergency mode, the IRIS control service is not used. This means that if you log out of Windows, all the InterSystems IRIS processes will immediately exit. or: iris startnostu to start instance without running ^STU. or: iris stop to shut down instance . or: iris stopnoshut to shut down instance without running user shutdown routines. or: iris stopstart to shut down and restart instance . Note: An optional /nofailover argument can be specified for stop, stopnoshut, or stopstart to not trigger a mirror failover. or: iris force to force down instance . or: iris [ run OR console OR terminal ] to run InterSystems IRIS in programmer mode with [ no-device OR console OR terminal ] for $Principal. or: iris [ run OR console OR terminal ] to run InterSystems IRIS routine in application mode with [ no-device OR console OR terminal ] for $Principal. or: iris [ run OR console OR terminal ] to run InterSystems IRIS routine in in application mode with [ no-device OR console OR terminal ] for $Principal. or: iris runw [] to run InterSystems IRIS routine in application mode with no input/output device for $Principal using the optional namespace. When run from a batch script, iris will wait for the InterSystems IRIS process to terminate before returning. The exit code from the InterSystems IRIS process will be returned by iris. Note: An optional /Title="Title string" can specify the console or terminal title bar text. or: iris iristraystart to start IRISTray for instance . or: iris iristraystop to stop IRISTray for instance . or: iris licmanagerstop to stop licmanager running in instance . or: iris all [> outputfile] to list all installed instances. or: iris allw [> outputfile] to list (wide format) all installed instances. or: iris list [] [> outputfile] to list information about all installed instances or the specified instance. or: iris qlist [] [> outputfile] to display a quick list of information about all installed instances or the specified instance, in a format suitable for parsing in command scripts. The record for an instance contains fields separated by "^" (carats): Field 1: instance name Field 2: instance directory Field 3: version identifier Field 4: current status for the instance Field 5: configuration file name last used Field 6: SuperServer port number Field 7: WebServer port number Field 8: JDBC Gateway port number Field 9: Instance status (e.g., ok, warn, alert) Field 10: Product name of the instance Field 11: Mirror Member Type (e.g., Failover, Disaster Recovery) Field 12: Mirror Status (e.g., Primary, Backup, Connected) or: iris serverlist [> outputfile] to list information about all defined servers. Note: When [> outputfile] is present, output is redirected to the file instead of being displayed on the terminal. or: iris telnetstop to stop the InterSystems IRIS TELNET daemon. or: iris telnettrace to toggle the TELNET trace state. or: iris iristrmdstop to stop the InterSystems IRIS terminal daemon. Note: iris often displays error information in a message box. You can suppress the message box containing error information by adding "quietly" (without the quotation marks) as the final argument to the iris command. or: iris help [display] to show this help. If display is specified the help is displayed in a browser window. ``` `iris help` 命令将在终端中显示最新的帮助信息。还可以通过将 >outputfilename 添加到 `iris` 帮助命令,将帮助信息保存到 `intsall-dir\bin` 目录中的文件中。例如: ``` C:\MyIris\bin>iris help>helpinformation ``` # 在命令行上连接到 `IRIS` 可以使用 `iris` 终端命令在命令行上登录 `IRIS` 实例。
公告
Claire Zheng · 八月 2, 2022

你的问题是一个 #KeyQuestion(关键问题) 吗?

开发者们,大家好! 在此向您介绍开发者社区的一个新特性—— InterSystems开发者关键问题(Key Questions). 我们增加了一个新的 #Key Question 标签(#关键问题),用以显著标识与InterSystems数据平台有关的、影响重大的提问/问题。 每个月,InterSystems专家会选择一些这类问题,提出这些问题的社区成员将被授予荣誉奖励! 有哪些荣誉呢?详情如下! 什么是 #Key Question(#关键问题) ? 这个标签突出了关于如何使用InterSystems数据平台开发、测试、部署、管理等解决方案的问题,这些问题或富有洞察、或有趣、或最令人困惑等等。 谁来决定? InterSystems 专家(Expert)会审阅开发者社区的问题,并决定将哪些问题归为 #Key Questions(#关键问题)。 哪些问题会被审阅? 开发者社区的所有问题都会被纳入审阅范围。 你多久可以在开发者社区上看到新的 #Key Questions(#关键问题)? 我们的专家每个月都会选取一些问题并赋予 #Key Question(#关键问题)标签。 你会获得什么荣誉? 在Global Masters,你会获得新增荣誉徽章 "Key Question"。 开发者社区亮点:我们会在被选为 #Key Question(#关键问题)的问题下面,以@DC.Administration 账号添加评论。 提问赢取奖励积分, 开发者社区探索之夏,或许你的问题就是我们专家选取的下一个 #Key Question(#关键问题)! 关注标签 ,时刻了解详情!
文章
Claire Zheng · 七月 20, 2021

扫码看回放 | InterSystems极客俱乐部线上直播课:Health Connect 系统运维培训

InterSystems极客俱乐部线上直播课“Health Connect系统运维培训”回放已准备好,欢迎您点击报名,扫码看回放!
文章
Claire Zheng · 二月 23, 2022

【极客聊吧】从商保结算谈起,聊聊医疗IT行业的数据交换难题

最新一期“极客聊吧”,InterSystems销售工程师们聊了聊这些话题:为什么有些医院和某些商保之间可以直接结算,有些又不能?医院和保险之间的结算难在哪儿?在InterSystems 2021全球线上峰会中提到的医保结算案例对国内实践有哪些借鉴意义?FHIR又能起到什么关键作用?医疗数据实现互联互通的关键是什么?来听听的答案。
公告
Jingwei Wang · 八月 29, 2022

[视频]使用 Business Process Designer(业务流程设计器)

各位开发者, 新的视频已经发布在BiliBili平台: ⏯ 在InterSystmes IRIS 使用 Business Process Designer(业务流程设计器) 请观看如何构建一个新的业务流程,在InterSystems Production 中提供业务逻辑和路由功能。了解如何使用管理门户中的业务流程设计器构建一个BPL业务流程。此外,还可以尝试使用InterSystems集成开发环境自己构建一个。 祝您观看愉快 ! B站上能看到字幕
问题
smith tob · 五月 12, 2023

使用sql访问数据库时,如何对sql语句进行加密?

使用sql访问数据库时,如何对sql语句进行加密? 您是想在 插入表数据的时候将数据加密吗? 比如 在执行insert的 时候把一个字段 用md5 hash 起来存储的,这个现成的sql function 是没有的。SQL Functions | InterSystems SQL Reference | InterSystems IRIS for Health 2023.1这个是我们目前最新版本支持的所有 sql function 如果你是想把sql语句作为整体加密,然后在cache执行的时候解密出来,这样操作的话,加密基本都行吧
文章
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等 运算符 关系运算符:= , < ,> ,<= ,>= 算术运算符:+ ,- , * , / 等 逻辑运算符:&& , || , ' 连字符:_ 运算优先级:严格按照从左到右执行,数学运算没有优先级,但先计算括号内表达式。
文章
姚 鑫 · 三月 4, 2021

第三章 SQL语言元素(二)

# 第三章 SQL语言元素(二) # 算术运算符和函数 InterSystems SQL支持以下算术运算符: - `+` 加法操作符。 例如,`17+7 = 24`。 - `–` 减法运算符。 例如,`17-7等于10`。 注意,这些字符中的一对是InterSystems SQL注释指示器。 因此,要指定两个或多个减法操作符或负号,必须使用空格或圆括号。 例如,`17- -7或17-(-7)等于24`。 运算符 | 描述 ---|--- `+` | 加法操作符。 `–` | 减法运算符。例如,`17-7等于10`。注意,这些字符中的一对是InterSystems SQL注释指示器。因此,要指定两个或多个减法操作符或负号,必须使用空格或圆括号。 `*` |乘法运算符。例如,`17*7等于119`。 `/` | 除法操作符。例如:`17/7 = 2.428571428571428571`。 `\` | 整数除法运算符。例如,`17\7等于2`。 `#` | 模运算符。例如,`17 #7等于3`。注意,因为#字符也是一个有效的标识符字符,要将它用作模运算符,应该指定它与操作数之间用前后空格分隔 `E` | 求幂(科学记数法)运算符。可以是大写或小写。例如:`7E3 = 7000`。指数过大会导致`SQLCODE -7`“指数超出范围”错误。例如1E309、7E308。 `()`| 分组操作符。用于嵌套算术运算。除非使用了圆括号,否则在InterSystems SQL中算术操作的执行顺序是严格的从左到右的顺序。例如,`17+7*2等于48`,但`17+(7 * 2)等于31`。 `||` | 连接运算符。例如,`17||7等于177`。 算术运算是对标准形式的数字进行的。 ## 产生的数据类型 当对两个具有不同数据类型的数值执行算术运算时,结果数据类型确定如下: 对于加法(`+`),减法(`-`),整数除法(`\`),和取模(`#`): 描述 |NUMERIC| INTEGER| TINYINT| SMALLINT| BIGINT| DOUBLE ---|---|---|---|---|---|--- NUMERIC| NUMERIC| NUMERIC| NUMERIC |NUMERIC| NUMERIC |DOUBLE INTEGER |NUMERIC| BIGINT |BIGINT| BIGINT| BIGINT| DOUBLE TINYINT |NUMERIC| BIGINT| SMALLINT| INTEGER |BIGINT| DOUBLE SMALLINT| NUMERIC |BIGINT| INTEGER| INTEGER |BIGINT| DOUBLE BIGINT| NUMERIC| BIGINT| BIGINT| BIGINT| BIGINT| DOUBLE DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE |DOUBLE |DOUBLE 对于乘法(`*`)或除法(`/`): 描述 |NUMERIC| INTEGER| TINYINT| SMALLINT| BIGINT| DOUBLE ---|---|---|---|---|---|--- NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE INTEGER| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE TINYINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE SMALLINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE BIGINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE |DOUBLE 连接任意数据类型的两个数字将产生VARCHAR字符串。 在动态SQL中,可以使用SQL列元数据来确定结果集字段的数据类型。 ## 运算符优先级 SQL-92标准在操作符优先级方面不精确; 关于这个问题的假设在不同的SQL实现中有所不同。 InterSystems SQL可以配置为支持任意一种优先级: - 在InterSystems IRIS 2019.1及其后续版本中,InterSystems SQL默认支持算术运算符的ANSI优先级。 这是一个系统范围的配置设置。 当配置ANSI优先级时,`"*"`、`"\"`、`"/"`和`"#"`操作符的优先级高于`"+"`、`"-"`和`"||"`操作符。 优先级高的操作符在优先级低的操作符之前执行。 因此,`3+3*5 = 18`。 如果需要,可以使用括号覆盖优先级。 因此,`(3+3)*5 = 30`。 在安装InterSystems IRIS 2019.1时,支持默认的ANSI优先级; 升级InterSystems IRIS 2018.1到InterSystems IRIS 2019.1时,操作符优先级仍然配置为InterSystems IRIS 2018.1 default:严格从左到右的顺序。 - 在InterSystems IRIS 2018.1中,InterSystems SQL默认不提供算术运算符的优先级。 默认情况下,InterSystems SQL严格按照从左到右的顺序执行算术表达式,没有操作符优先级。 这与ObjectScript中使用的约定相同。 因此,`3+3*5 = 30`。 可以使用括号来强制要求的优先级。 因此,`3+(3*5)= 18`。 谨慎的开发人员应该使用圆括号来明确地表达他们的意图。 **可以使用`$SYSTEM.SQL.SetANSIPrecedence()`方法在系统范围内配置任意一种SQL操作符优先级。 `1 = ANSI优先`; `0 =严格从左到右的计算`。** 要确定当前设置,调用`$SYSTEM.SQL.CurrentSettings()`。 更改此SQL选项将立即在系统范围内生效。 更改此选项将导致在系统范围内清除所有缓存的查询。 更改SQL优先级对ObjectScript没有影响。 ObjectScript总是严格遵循从左到右的算术运算符执行。 ## 精度和等级 数字结果的精度(数字中存在的最大数字数)为: - 使用以下算法确定加减:`resultprecision=max(scale1, scale2)+ max(precision1-scale1, precision2-scale2)+1`。 当计算结果精度大于36时,将精度值设置为36。 - 乘法使用以下算法确定:`resultprecision=min(36, precision1+precision2+1)`。 - 除法(value1 / value2)通过以下算法确定:`resultprecision=min(36, precision1-scale1 +scale2+max(6, scale1+precision2+1))`。 以下数字结果的比例(最大小数位数): - 加法或减法使用以下算法确定:`resultscale=max(scale1, scale2)`。 - 乘法使用如下算法确定:`resultscale=min(17, scale1+scale2)`。 - 除法(value1 / value2)通过如下算法确定:`resultscale=min(17, max(6, scale1+precision2+1))`。 ## 算术和三角函数 InterSystems SQL支持以下算术函数: 代码 | 描述 ---|--- ABS |返回数字表达式的绝对值。 CEILING|返回大于或等于数字表达式的最小整数。 EXP| 返回数值表达式的对数指数(以e为底)值。 FLOOR| 返回小于或等于数字表达式的最大整数。 GREATEST| 从逗号分隔的数字列表中返回最大的数字。 ISNUMERIC| 返回一个布尔码,指定表达式是否为有效数字。 LEAST| 从逗号分隔的数字列表中返回最小的数字。 LOG|返回数字表达式的自然对数(以e为基数)值。 LOG10| 返回数字表达式的以10为基数的日志值。 MOD| 返回除法运算的模值(余数)。与#操作符相同。 PI| 返回数值常量pi。 POWER| 返回数值表达式的指定幂的值 ROUND| 返回四舍五入(或截断)到指定数字数目的数字表达式。 SIGN|返回数值代码,指定数值表达式的计算结果是正、零还是负。 SQRT| 返回数值表达式的平方根。 SQUARE| 返回数值表达式的平方。 TRUNCATE|返回截断为指定数字数目的数字表达式。 InterSystems SQL支持下列三角函数。 代码 | 描述 ---|--- ACOS| 返回数值表达式的反余弦值。 ASIN| 返回数字表达式的反正弦值。 ATAN| 返回数值表达式的正切。 COS |返回数值表达式的余弦值。 COT |返回数值表达式的余切。 SIN |返回数值表达式的正弦值。 TAN |返回数值表达式的切线。 DEGREES| 将弧度转换为角度。 RADIANS |将角度转换为弧度。 # 关系运算符 条件表达式的计算结果为布尔值。条件表达式可以使用以下关系运算符: 代码 | 描述 ---|--- `=`| 等于运算符。 `!=` ``|不等于运算符。这两种句法形式在功能上是相同的。 ``| 大于运算符。 `=`| 大于或等于运算符。 比较表格字段值时,这些相等运算符将使用字段的默认排序规则。 InterSystems IRIS默认值不区分大小写。比较两个文字时,比较区分大小写。 比较浮点数时,应避免使用等号运算符(等于或不等于)。浮点数(数据类型为`%Library.Decimal`和`%Library.Double`类)存储为二进制值,而不是固定精度的数字。在转换过程中,舍入运算可能会导致两个浮点数不完全相等,这些浮点数旨在表示相同的数字。使用小于/大于测试来确定两个浮点数是否“相同”至所需的精度。 ## 包含并跟随运算符 InterSystems SQL还支持“包含”和“跟随”比较运算符: - `[` 包含运算符。返回包含操作数的所有值,包括等于该操作数的值。该运算符使用`EXACT`(区分大小写)排序规则。取反是`NOT [`。 - `Contains`运算符确定一个值是否包含指定的字符或字符串。区分大小写。 - `%STARTWITH`谓词条件确定值是否以指定的字符或字符串开头。它不区分大小写。 - InterSystems SQL搜索可用于确定值是否包含指定的单词或短语。 SQL Search执行上下文感知匹配。它不区分大小写。 - `]` 跟随运算符。返回排序规则序列中跟随操作数的所有值。排除操作数值本身。该运算符使用字段的默认排序规则。 InterSystems IRIS默认值不区分大小写。反之则不是`]`。 例如,`SELECT Age FROM MyTable,其中Age] 88`返回89或更大的值,但也返回9,因为在排序序列中9在88之后。 `SELECT Age FROM MyTable WHERE Age > 88`返回89以上; 它不会返回9。 字符串操作数,如`' ABC '`,排序在任何包含附加字符的字符串(如`' ABCA '`)之前; 因此,要从`[`操作符或`>`操作符中排除操作数字符串,必须指定整个字符串。 `Name ] ‘Smith,John’ `包含 `‘Smith,John’` 不包含 `‘Smith,John P.’` # 逻辑运算符 SQL逻辑运算符用于评估为True或False的条件表达式中。这些条件表达式在`SELECT`语句`WHERE`和`HAVING`子句,`CASE`语句`WHEN`子句,`JOIN`语句`ON`子句和`CREATE TRIGGER`语句`WHEN`子句中使用。 ## 非一元运算符 可以使用`NOT`一元逻辑运算符来指定条件的逻辑逆,如以下示例所示: ```sql SELECT Name,Age FROM Sample.Person WHERE NOT Age>21 ORDER BY Age ``` ```sql SELECT Name,Age FROM Sample.Person WHERE NOT Name %STARTSWITH('A') ORDER BY Name ``` 可以将`NOT`运算符放在条件之前(如上所示)。或者,不能将`NOT`放在单字符运算符之前;例如,`NOT =65 ORDER BY Age ``` ```sql SELECT Name,Age FROM Sample.Person WHERE Age>20 & Age=40 & (Age # 2)=0 ! Age>=65 ORDER BY Age ``` 可以使用括号将逻辑运算符分组。这将建立分组级别;评估从最低的分组级别到最高的分组级别进行。在下面的第一个示例中,“与”条件仅应用于第二个“或”条件。它返回来自MA的任何年龄的人,以及来自NY的小于25岁的人: ```sql SELECT Name,Age,Home_State FROM Sample.Person WHERE Home_State='MA' OR Home_State='NY' AND Age < 25 ORDER BY Age ``` 使用括号对条件进行分组会得出不同的结果。以下示例返回来自MA或NY的年龄小于25的人员: ```sql SELECT Name,Age,Home_State FROM Sample.Person WHERE (Home_State='MA' OR Home_State='NY') AND Age < 25 ORDER BY Age ``` - SQL执行使用短路逻辑。如果条件失败,将不会测试其余的`AND`条件。如果条件成功,则将不会测试其余的`OR`条件。 - 但是,由于SQL优化了`WHERE`子句执行,因此无法预测并且不应该依赖多个条件(在同一分组级别)的执行顺序。 # 注释 InterSystems SQL支持单行注释和多行注释。注释文本可以包含任何字符或字符串,当然,指示注释结尾的字符除外。 注意:使用嵌入式SQL标记语法`(&sql(...))` 对SQL注释的内容强加了限制。如果使用标记语法,则SQL代码中的注释可能不包含字符序列“)``”。 可以使用`preparse()`方法返回去除注释的SQL DML语句。 `preparse()`方法还用`?`替换每个查询参数。字符并返回这些参数的`%List`结构。以下示例中的`preparse()`方法返回查询的解析版本,除去单行和多行注释以及空格: ```sql /// d ##class(PHA.TEST.SQL).Null5() ClassMethod Null5() { SET myq=4 SET myq(1)="SELECT TOP ? Name /* first name */, Age " SET myq(2)=" FROM Sample.MyTable -- this is the FROM clause" SET myq(3)=" WHERE /* various conditions " SET myq(4)="apply */ Name='Fred' AND Age > 21 -- end of query" DO ##class(%SQL.Statement).preparse(.myq,.stripped,.args) WRITE stripped,! WRITE $LISTTOSTRING(args) } ``` ```sql DHC-APP>d ##class(PHA.TEST.SQL).Null5() SELECT TOP ? Name , Age FROM Sample . MyTable WHERE Name = ? AND Age > ? ?,?,c,Fred,c,21 ``` ## 单行注释 单行注释由两个连字符前缀指定。注释可以在单独的行上,也可以与SQL代码显示在同一行上。当注释在同一行上跟随SQL代码时,至少一个空格必须将代码与双连字符注释运算符分隔开。注释可以包含任何字符,包括连字符,星号和斜杠。注释继续到该行的末尾。 下面的示例包含多个单行注释: ```sql -- This is a simple SQL query -- containing -- (double hyphen) comments SELECT TOP 10 Name,Age, -- Two columns selected Home_State -- A third column FROM Sample.Person -- Table name -- Other clauses follow WHERE Age > 20 AND -- Comment within a clause Age < 40 ORDER BY Age, -- Comment within a clause Home_State -- End of query ``` ## 多行注释 多行注释由`/ * 开头定界符和 * /`结束定界符指定。注释可以出现在一个或多个单独的行上,或者可以与SQL代码在同一行上开始或结束。注释定界符应与SQL代码分隔至少一个空格。注释可以包含任何字符,包括连字符,星号和斜杠,但* /字符对显然是例外。 下面的示例包含多个多行注释: ```sql /* This is a simple SQL query. */ SELECT TOP 10 Name,Age /* Two fields selected */ FROM Sample.Person /* Other clauses could appear here */ ORDER BY Age /* End of query */ ``` 当注释掉嵌入式SQL代码时,请始终在`&sql`指令之前或括号内开始注释。下面的示例正确注释掉了两个嵌入式SQL代码块: ```sql SET a="default name",b="default age" WRITE "(not) Invoking Embedded SQL",! /*&sql(SELECT Name INTO :a FROM Sample.Person) */ WRITE "The name is ",a,! WRITE "Invoking Embedded SQL (as a no-op)",! &sql(/* SELECT Age INTO :b FROM Sample.Person */) WRITE "The age is ",b ``` ## SQL代码保留为注释 嵌入式SQL语句可以保留为例程的.INT代码版本中的注释。这是通过设置`$SYSTEM.SQL.SetRetainSQL()`方法完成的。若要确定当前设置,请调用`$ SYSTEM.SQL.CurrentSettings()`,它将显示“将SQL保留为注释”设置。默认值为1(“是”)。 将此选项设置为“是”以将SQL语句保留为例程的.INT代码版本中的注释。将此选项设置为“是”还会在注释文本中列出SQL语句使用的所有非%变量。这些列出的变量也应该在ObjectScript过程的PUBLIC变量列表中列出,并使用NEW命令重新初始化。 有用 欢迎来投票:) 讲的很细,非常有帮助! 非常不错的学习资料,十分感谢! 技术博主👍
文章
Michael Lei · 七月 6, 2021

使用 Yape 解包 pButtons - 更新说明和快速指南

如果一张图片胜过千言万语,那么一段视频又价值几何? 当然胜过敲一个帖子。 请在 [InterSystems Developers YouTube](https://www.youtube.com/c/InterSystemsDevelopers) 观看我的“Coding talks”: 1. 使用 Yape 分析 InterSystems IRIS 系统性能。 第 1 部分:安装 Yape   在容器中运行 Yape。 2. Yape 容器 SQLite iostat InterSystems 提取和绘制 pButtons 数据,包括时间范围和 iostat。 如果您需要一个简单的方法来捕获和查看 Caché 和 IRIS 以及系统性能指标,可以安排每天运行 pButtons 来轻松实现。 [我之前写过这方面的文章](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章)。 我经常需要查看客户系统以进行容量规划和性能检查,这就是我编写 Yape 并在 [GitHub](https://github.com/murrayo/yape "GitHub") 上提供它的原因。 我的 InterSystems 同事 Fabian 将 Yape 的内部结构带入了新方向,并[使其正式在容器中运行](https://community.intersystems.com/post/visualizing-data-jungle-part-iv-running-yape-docker-image)。 Fabian 已经离开 InterSystems,但我继续在 GitHub 上进行开源开发。 在过去一个月左右的时间里,我修复了一些操作系统命令格式错误,使日期处理更智能,在 vmstat 中添加了“Total CPU”图表(倒着看“id”导致我的脖子拉伤),以及其他修饰性更改。 如果您想为 Yape 做出贡献,它在 GitHub 上是开源的。 如果您有功能要求,请[通过建议页面](https://github.com/murrayo/yape/issues)告诉我。 另外,请查看 [Open Exchange 上的 Yape 应用程序](http://bit.ly/2WnqmSt)。 在接下来的几个月,我将分享工作流程中的其他一些技巧,并期望继续开发以使呈现的数据更加有用。 Yape 非常适合检查和查看昨天或过去一周发生的事件的趋势,但是您还需要实时监视和警报... 这里我也对将来的一些帖子做个预告 ;)  
文章
Michael Lei · 五月 12, 2021

InterSystems 最佳实践系列之--数据平台和性能 – 虚拟机备份和 Caché 冻结/解冻脚本

在本帖中,我将展示使用_外部备份_来备份 Caché 的策略,以及与基于快照的解决方案集成的示例。 如今,大多数解决方案部署在基于 VMware 的 Linux 上,因此许多帖子都以展示解决方案如何集成 VMware 快照技术为例。 ## Caché 备份 - 包括电池? Caché 安装后即包含 Caché 在线备份,可提供不间断的 Caché 数据库备份。 但随着系统规模的扩大,您应该考虑更高效的备份解决方案。 集成了快照技术的_外部备份_是推荐的系统(包括 Caché 数据库)备份解决方案。 ## 外部备份有特殊注意事项吗? [外部备份](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_backup#GCDI_backup_methods_ext)的在线文档包含了全部详细信息。 一个关键考虑事项是: > “为确保快照的完整性,Caché 提供了在创建快照时冻结数据库写操作的方法。 在创建快照期间,只冻结对数据库文件的物理写入,从而允许用户进程继续在内存中不间断地执行更新。” 还需要注意的是,虚拟化系统上的部分快照过程会导致正在备份的虚拟机短暂暂停,这段时间通常称为关闭时间。 该时间通常不到一秒,因此不会被用户注意到,也不会影响系统运行,但在某些情况下,关闭时间可能较长。 如果关闭时间长于 Caché 数据库镜像的 QoS 超时时间,那么备份节点将认为主节点出现故障,并将进行故障转移。 在本帖的后面部分,我将说明在需要对镜像 QoS 超时时间进行更改时如何查看关闭时间。 [这里是 InterSystems 数据平台和性能系列的其他帖子的列表。](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章) 对于本帖,您还应该查看 Caché 在线文档中的[备份和还原指南](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_backup)。 # 备份选择 ## 最低限度的备份解决方案 - Caché 在线备份 如果您没有其他备份方案,可使用 InterSystems 数据平台附带的这一功能,以实现零停机时间的备份。 请记住,_Caché 在线备份_只备份 Caché 数据库文件,它将捕获数据库中为数据分配的所有块以及写入到顺序文件的输出。 Caché 在线备份支持累积备份和增量备份。 在 VMware 的上下文中,Caché 在线备份是一种客户机内备份解决方案。 与其他客户机内解决方案一样,无论应用程序已虚拟化还是直接在主机上运行,Caché 在线备份的操作都基本相同。 Caché 在线备份必须与系统备份配合使用,才能将 Caché 在线备份输出文件与应用程序使用的所有其他文件系统一起复制到备份介质中。 最低限度的系统备份必须包括安装目录、日志和备用日志目录、应用程序文件以及包含应用程序使用的外部文件的任何目录。 Caché 在线备份应被视为小型站点的入门级方法,这些站点希望实施低成本解决方案,只备份 Caché 数据库或临时备份,例如,该方案在设置镜像时非常有用。 然而,随着数据库规模的扩大,加上 Caché 通常只是客户数据环境的一部分,建议将_外部备份_与快照技术和第三方实用工具相结合来作为最佳做法。这样做的优点包括可备份非数据库文件、更快的还原时间、企业范围的数据视图以及更好的目录和管理工具。 ## 推荐的备份解决方案 - 外部备份 以 VMware 为例;VMware 上的虚拟化为保护整个虚拟机增加了额外的功能和选择。 将解决方案虚拟化后,您就有效地将系统(包括操作系统、应用程序和数据)全部封装在 .vmdk(和其他一些)文件中。 需要时,可以非常方便地管理这些文件,并使用它们恢复整个系统,这与物理系统上的操作截然不同。在物理系统中,必须分别恢复和配置各个组件 - 操作系统、驱动程序、第三方应用程序、数据库和数据库文件等。 # VMware 快照 VMware 的 vSphere Data Protection (VDP) 和其他用于虚拟机备份的第三方备份解决方案(如 Veeam 或 Commvault)利用 VMware 虚拟机快照的功能来创建备份。 以下是 VMware 快照的高阶说明,有关更多详细信息,请参见 VMware 文档。 快照应用于整个虚拟机,操作系统和所有应用程序或数据库引擎都不知道快照的进行,记住这一点很重要。 此外,还要记住: > VMware 快照本身不是备份! 快照_使_备份软件进行备份,但它们本身并不是备份。 VDP 和第三方备份解决方案将 VMware 快照过程与备份应用程序相结合来管理快照的创建及非常重要的删除。 从高级别看,使用 VMware 快照进行外部备份的过程和事件顺序如下: - 第三方备份软件请求 ESXi 主机触发 VMware 快照。 - 虚拟机的 .vmdk 文件被置于只读状态,并且为虚拟机的每个 .vmdk 文件都创建一个子 vmdk 增量文件。 - 使用写入时复制机制,对虚拟机的所有更改都将写入增量文件。 任何读取都先从增量文件进行。 - 备份软件管理只读父 .vmdk 文件到备份目标的复制。 - 备份完成后,将提交快照(虚拟机磁盘恢复写入,并且增量文件中更新的块将写入父文件)。 - VMware 快照此时已删除。 备份解决方案还使用其他功能,如变更块跟踪 (CBT) 允许增量或累积备份,以提高速度和效率(对节省空间尤为重要),并且通常还增加其他重要功能,如重复数据删除和压缩、调度、挂载已更改 IP 地址的虚拟机以进行完整性检查等、完整的虚拟机和文件级恢复,以及目录管理。 > 管理不当或长时间不运行的 VMware 快照可能会占用过多存储(随着越来越多的数据被更改,增量文件会持续增长),还会拖慢虚拟机的速度。 在生产实例上运行手动快照之前,您应该非常仔细地考虑。 为什么要这么做? 如果*时光倒流*到创建快照的时候,会发生什么? 从创建到回滚之间的所有应用程序事务会发生什么? 如果您的备份软件创建和删除快照,没有问题。 快照应该只存在很短的时间。 备份策略的关键部分是选择系统使用率较低的时间,以最大程度地减少对用户和性能的影响。 ## 快照的 Caché 数据库注意事项 拍摄快照之前,数据库必须处于静默状态,以便提交所有待处理的写入,并且数据库处于一致状态。 Caché 提供了方法和 API,以在创建快照时先提交对数据库的写入,再短时间冻结(停止)写入。 这样,在创建快照期间,只冻结对数据库文件的物理写入,从而允许用户进程继续在内存中不间断地执行更新。 触发快照后,将解冻数据库写入,备份继续将数据复制到备份介质。 冻结和解冻的间隔应该非常短(几秒钟)。 除了暂停写入,Caché 冻结还会处理日志文件的切换并向日志写入备份标记。 在物理数据库写入被冻结时,日志文件继续正常写入。 如果在物理数据库写入被冻结时系统崩溃,则在启动过程中,会照常从日志恢复数据。 下图显示了为创建具有一致数据库映像的备份,所执行的冻结和解冻以及 VMware 快照步骤。 ![](https://community.intersystems.com/sites/default/files/inline/images/snapshot-timeline.png "快照时间线") > _请注意,冻结和解冻之间的短暂时间只是创建快照的时间,而不是将只读父文件复制到备份目标的时间。_ # 整合 Caché 冻结和解冻 vSphere 允许在创建快照的任一侧自动调用脚本,此时会调用 Caché 冻结和解冻。 注意:为了使此功能正常工作,ESXi 主机会请求客户机操作系统通过 _VMware Tools_ 静默磁盘。 > 客户机操作系统中必须安装 VMware Tools。 脚本必须遵守严格的名称和位置规则。 还必须设置文件权限。 对于 Linux 上的 VMware,脚本名称为: # /usr/sbin/pre-freeze-script # /usr/sbin/post-thaw-script 以下是我们团队对内部测试实验室实例进行 Veeam 备份时使用的冻结和解冻脚本示例,这些脚本应该也适用于其他解决方案。 这些示例已在 vSphere 6 和 Red Hat 7 上测试和使用。 > 虽然这些脚本可用作示例并说明了方法,但您必须针对您自己的环境进行验证! ### pre-freeze-script 示例: #!/bin/sh # # Script called by VMWare immediately prior to snapshot for backup. # Tested on Red Hat 7.2 # LOGDIR=/var/log SNAPLOG=$LOGDIR/snapshot.log echo >> $SNAPLOG echo "`date`: Pre freeze script started" >> $SNAPLOG exit_code=0 # Only for running instances for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5- | awk '{print $1}'`; do echo "`date`: Attempting to freeze $INST" >> $SNAPLOG # Detailed instances specific log LOGFILE=$LOGDIR/$INST-pre_post.log # Freeze csession $INST -U '%SYS' "##Class(Backup.General).ExternalFreeze(\"$LOGFILE\",,,,,,1800)" >> $SNAPLOG $ status=$? case $status in 5) echo "`date`: $INST IS FROZEN" >> $SNAPLOG ;; 3) echo "`date`: $INST FREEZE FAILED" >> $SNAPLOG logger -p user.err "freeze of $INST failed" exit_code=1 ;; *) echo "`date`: ERROR: Unknown status code: $status" >> $SNAPLOG logger -p user.err "ERROR when freezing $INST" exit_code=1 ;; esac echo "`date`: Completed freeze of $INST" >> $SNAPLOG done echo "`date`: Pre freeze script finished" >> $SNAPLOG exit $exit_code ### 解冻脚本示例: #!/bin/sh # # Script called by VMWare immediately after backup snapshot has been created # Tested on Red Hat 7.2 # LOGDIR=/var/log SNAPLOG=$LOGDIR/snapshot.log echo >> $SNAPLOG echo "`date`: Post thaw script started" >> $SNAPLOG exit_code=0 if [ -d "$LOGDIR" ]; then # Only for running instances for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5- | awk '{print $1}'`; do echo "`date`: Attempting to thaw $INST" >> $SNAPLOG # Detailed instances specific log LOGFILE=$LOGDIR/$INST-pre_post.log # Thaw csession $INST -U%SYS "##Class(Backup.General).ExternalThaw(\"$LOGFILE\")" >> $SNAPLOG 2>&1 status=$? case $status in 5) echo "`date`: $INST IS THAWED" >> $SNAPLOG csession $INST -U%SYS "##Class(Backup.General).ExternalSetHistory(\"$LOGFILE\")" >> $SNAPLOG$ ;; 3) echo "`date`: $INST THAW FAILED" >> $SNAPLOG logger -p user.err "thaw of $INST failed" exit_code=1 ;; *) echo "`date`: ERROR: Unknown status code: $status" >> $SNAPLOG logger -p user.err "ERROR when thawing $INST" exit_code=1 ;; esac echo "`date`: Completed thaw of $INST" >> $SNAPLOG done fi echo "`date`: Post thaw script finished" >> $SNAPLOG exit $exit_code ### 记得设置权限: # sudo chown root.root /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script # sudo chmod 0700 /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script ## 测试冻结和解冻 要测试脚本是否正确运行,可以在虚拟机上手动运行快照并检查脚本输出。 以下截图显示了“Take VM Snapshot”(拍摄虚拟机快照)对话框和选项。 ![](https://community.intersystems.com/sites/default/files/inline/images/snapshot-screen.png "手动快照示例") **取消选中** -“Snapshot the virtual machine's memory”(拍摄虚拟机内存快照)。 **选中** -“Quiesce guest file system (Needs VMware Tools installed)”(静默客户机文件系统(需要安装 VMware Tools))复选框以暂停客户机操作系统上运行的进程,以便在拍摄快照时文件系统内容处于已知的一致状态。 > 重要! 完成测试后,记得删除快照!!! 如果静默标志为真,并且在拍摄快照时虚拟机已开机,将使用 VMware Tools 静默虚拟机中的文件系统。 静默文件系统是使磁盘上的数据进入适合备份的状态的过程。 此过程可能包括将脏缓冲区从操作系统的内存中缓存刷新到磁盘等诸如此类的操作。 以下输出显示了在运行将快照包括为操作一部分的备份后,上述冻结/解冻脚本示例中设置的 `$SNAPSHOT` 日志文件的内容。 Wed Jan 4 16:30:35 EST 2017: Pre freeze script started Wed Jan 4 16:30:35 EST 2017: Attempting to freeze H20152 Wed Jan 4 16:30:36 EST 2017: H20152 IS FROZEN Wed Jan 4 16:30:36 EST 2017: Completed freeze of H20152 Wed Jan 4 16:30:36 EST 2017: Pre freeze script finished Wed Jan 4 16:30:41 EST 2017: Post thaw script started Wed Jan 4 16:30:41 EST 2017: Attempting to thaw H20152 Wed Jan 4 16:30:42 EST 2017: H20152 IS THAWED Wed Jan 4 16:30:42 EST 2017: Completed thaw of H20152 Wed Jan 4 16:30:42 EST 2017: Post thaw script finished 此示例显示,冻结和解冻之间经过了 6 秒 (16:30:36-16:30:42)。 在此期间,用户操作不会中断。 _您将必须从您自己的系统中收集指标_,但为说明起见,此示例来自在虚拟机上运行应用程序基准测试的系统,该虚拟机没有瓶颈,且平均指标为每秒超过 2 百万 Gloref、每秒 17 万 Gloupd、每秒 1100 次物理读取以及每个写守护进程周期 3000 次写入。 > 请记住,内存不是快照的一部分,因此在重启时,虚拟机将重启并恢复。 数据库文件将保持一致。 您不希望”恢复“备份,而是需要在某个时间点的文件。 恢复文件后,您可以前滚日志,并执行保持应用程序和事务一致性所需的任何其他恢复步骤。 为实现额外的数据保护,系统还可以自行完成[日志切换](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_journal#GCDI_journal_util_JRNSWTCH "Journal switch"),并将日志备份或复制到其他位置,例如每小时备份一次。 以下是上述冻结/解冻脚本示例中的 `$LOGFILE` 的输出,其中显示了快照的日志详细信息。 01/04/2017 16:30:35: Backup.General.ExternalFreeze: Suspending system Journal file switched to: /trak/jnl/jrnpri/h20152/H20152_20170104.011 01/04/2017 16:30:35: Backup.General.ExternalFreeze: Start a journal restore for this backup with journal file: /trak/jnl/jrnpri/h20152/H20152_20170104.011 Journal marker set at offset 197192 of /trak/jnl/jrnpri/h20152/H20152_20170104.011 01/04/2017 16:30:36: Backup.General.ExternalFreeze: System suspended 01/04/2017 16:30:41: Backup.General.ExternalThaw: Resuming system 01/04/2017 16:30:42: Backup.General.ExternalThaw: System resumed # 虚拟机关闭时间 在创建虚拟机快照时以及完成备份和提交快照后,虚拟机需要短时间冻结。 这个短时间冻结通常指关闭虚拟机。 [这里](http://cormachogan.com/2015/04/28/when-and-why-do-we-stun-a-virtual-machine/ "Blog Post on stun times")是一篇不错的关于关闭时间的博客文章。 我在下面总结了细节,并将其放在 Caché 数据库注意事项的上下文中。 根据那篇关于关闭时间的文章:”要创建虚拟机快照,需要“关闭”虚拟机,以便 (i) 将设备状态序列化到磁盘,以及 (ii) 关闭当前正在运行的磁盘并创建快照点。进行整合时,“关闭”虚拟机是为了关闭磁盘并将其置于适合整合的状态。” 关闭时间通常是几百毫秒;但是,如果在提交阶段有非常高的磁盘写入活动,关闭时间可能为几秒。 > 如果虚拟机是参与 Caché 数据库镜像的主成员或备份成员,并且关闭时间长于镜像服务质量 (QoS) 超时时间,则镜像将报告主虚拟机故障并启动镜像接管。 **2018 年 3 月更新:** 我的同事 Peter Greskoff 向我指出,在虚拟机关闭期间或主镜像成员不可用的任何其他时间,备份镜像成员可以在稍微超过半个 QoS 超时的时间内启动故障转移。 有关 QoS 注意事项和故障转移方案的详细说明,请参见以下精华帖:[镜像服务质量超时指南](https://community.intersystems.com/post/quality-service-timeout-guide-mirroring),不过关于虚拟机关闭时间和 QoS 的简述是: > 如果备份镜像在半个 QoS 超时的时间内未收到来自主镜像的任何消息,它将发送一条消息以确保主镜像仍处于活动状态。 然后,备份镜像将再等待半个 QoS 超时的时间,以接收来自主镜像的响应。 如果主镜像没有任何响应,则认为主镜像已关闭,备份镜像将接管。 在繁忙的系统上,日志不断从主镜像发送到备份镜像,并且备份镜像无需检查主镜像是否仍在运行。 但是,在安静的时间内(更可能发生备份),如果应用程序处于空闲状态,则主镜像和备份镜像之间可能在超过半个 QoS 超时的时间内没有消息。 以下是 Peter 的示例;考虑以下空闲系统时间框架,其中 QoS 超时为 :08 秒,虚拟机关闭时间为 :07 秒: - :00 主成员使用保持连接信号 ping 仲裁器,仲裁器立即响应 - :01 备份成员向主成员发送保持连接信号,主成员立即响应 - :02 - :03 虚拟机关闭开始 - :04 主成员尝试向仲裁器发送保持连接信号,但没有发送成功,直到关闭完成 - :05 备份成员 ping 主成员,因为 QoS 已过半 - :06 - :07 - :08 仲裁器在整个 QoS 超时时间内未收到主成员的响应,因此关闭连接 - :09 备份成员没有收到主成员的响应,并与仲裁器确认连接丢失,因此开始接管 - :10 虚拟机关闭结束,太迟了!! 另请阅读上面链接的帖子中的“_配置服务质量超时时的陷阱和注意事项_”部分,以理解让 QoS 超时只有必要长度的这一平衡。 QoS 太长(尤其是超过 30 秒)也会导致问题。 **2018 年 3 月更新结束:** 有关镜像 QoS 的更多信息,另请参见[文档](https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror#GHA_mirror_set_tunable_params_qos)。 > 将关闭时间保持在最低限度的策略包括:在数据库活动较少并且存储设置良好时运行备份。 如上文所述,在创建快照时,有几个选项可以指定,其中一个选项是在快照中包含内存状态 - 请记住,_Caché 数据库备份不需要内存状态_。 如果设置了内存标志,则快照中会包含虚拟机内部状态的转储。 创建内存快照需要较长时间。 内存快照可用于恢复到拍摄快照时运行中的虚拟机状态。 数据库文件备份并不需要。 > 拍摄内存快照时,虚拟机的整个状态将关闭,**关闭时间是可变的**。 如前所述,对于备份,必须针对手动快照或通过备份软件将静默标志设置为真,以保证备份的一致性和可用性。 ## 查看 VMware 日志以了解关闭时间 从 ESXi 5.0 开始,快照关闭时间会记录在每个虚拟机的日志文件 (vmware.log) 中,消息类似于: `2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us` 关闭时间以微秒为单位,所以在上面的示例中,`38123 us` 为 38123/1000000 秒或 0.038 秒。 要确保关闭时间在可接受的限制范围内,或者要在怀疑关闭时间长而导致问题时进行故障排除,可以从您感兴趣的虚拟机文件夹中下载并查看 vmware.log 文件。 下载后,您可以提取日志并进行排序,例如使用下面的 Linux 命令示例。 ### 下载 vmware.log 文件的示例 下载支持日志有几种方法,包括通过 vSphere 管理控制台或从 ESXi 主机命令行创建 VMware 支持包。 有关所有详细信息,请查阅 VMware 文档,但下面给出一个简单方法来创建和收集小得多的支持包,其中包括 vmware.log 文件,以便查看关闭时间。 您将需要虚拟机文件所在目录的长名称。 使用 ssh 登录到运行数据库虚拟机的 ESXi 主机,并使用命令:`vim-cmd vmsvc/getallvms` 列出 vmx 文件以及与它们唯一关联的长名称。 例如,本帖中使用的数据库虚拟机示例的长名称输出为:`26 vsan-tc2016-db1 [vsanDatastore] e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0/vsan-tc2016-db1.vmx rhel7_64Guest vmx-11` 接下来运行命令以只收集和捆绑日志文件: `vm-support -a VirtualMachines:logs`。 该命令将回显支持包的位置,例如:`To see the files collected, check '/vmfs/volumes/datastore1 (3)/esx-esxvsan4.iscinternal.com-2016-12-30--07.19-9235879.tgz'`。 您现在可以使用 sftp 将文件传输出主机,以进行进一步处理和查看。 在此示例中,解压缩支持包后,导航到与数据库虚拟机长名称相对应的路径。 例如,在此例中: `/vmfs/volumes//e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0`。 您将看到几个已编号的日志文件,最新的日志文件没有编号,即 `vmware.log`。 该日志可能只有几百 KB,但是有很多信息,不过我们只关心关闭/取消关闭时间,使用 `grep` 可以轻松找到。 例如: $ grep Unstun vmware.log 2017-01-04T21:30:19.662Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 1091706 us --- 2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us 2017-01-04T22:15:59.573Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 298346 us 2017-01-04T22:16:03.672Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 301099 us 2017-01-04T22:16:06.471Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 341616 us 2017-01-04T22:16:24.813Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 264392 us 2017-01-04T22:16:30.921Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 221633 us 我们可以看到,示例中有两组关闭时间,一组来自快照创建,另一组是删除/整合快照(例如,备份软件复制只读 vmx 文件完毕后)45 分钟后每个磁盘的关闭时间 。 在上面的示例中,我们可以看到大多数关闭时间为亚秒级,尽管初始关闭时间刚刚超过一秒。 短暂的关闭时间对于最终用户来说并不明显。 但是,Caché 数据库镜像等系统进程会持续监视实例是否“活动”。 如果关闭时间超过镜像 QoS 超时时间,那么节点可能被视为不可联系并已“死亡”,并且将触发故障转移。 _提示:_要查看所有日志或进行故障排除,一个方便的命令是 grep 所有 `vmware*.log` 文件,并查找关闭时间接近 QoS 超时时间的任何异常值或实例。 以下命令将输出传输到 awk 进行格式化: `grep Unstun vmware* | awk '{ printf ("%'"'"'d", $8)} {print " ---" $0}' | sort -nr` # 总结 您应该在系统正常运行期间定期监视系统,以了解关闭时间以及它们可能对 HA(如镜像)的 QoS 超时有何影响。 如前所述,将关闭/取消关闭时间保持在最低限度的策略包括:在数据库和存储活动较少并且存储设置良好时运行备份。 要持续监视,可以使用 VMware Log insight 或其他工具处理日志。 我将在将来的帖子中重新讨论 InterSystems 数据平台的备份和还原操作。 但现在,如果您基于您的系统工作流程有任何意见或建议,请通过下面的评论部分分享。
文章
Michael Lei · 五月 24, 2021

InterSystems 最佳实践系列之数据平台和性能 - 第 6 部分 Caché 存储 IO 配置文件

我本人和其他技术架构师经常需要向客户和供应商说明 Caché IO 要求以及 Caché 应用程序使用存储系统的方式。 在向客户和供应商说明典型的 Caché IO 配置文件和事务性数据库应用程序的要求时,下面的表格很有用。  原始表格由 Mark Bolinsky 创建。 在以后的帖子中,我将讨论更多关于存储 IO 的内容,所以现在贴上这些表格也作为将来文章的参考。  * * * [本系列其他帖子的列表](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章)   * * * 拥有设置良好的存储(如存储阵列)以提供可预测的磁盘 IO 性能,支持高可用性功能并为应用程序提供存储冗余、可伸缩性和可靠性,这几点至关重要。 ## Caché 存储 IO 配置文件 根据所选的存储阵列技术,物理层的磁盘存储可分为池或磁盘组。 如果可能,出于可用性和性能考虑,应根据预期的 IO 配置文件对存储进行分区。 例如,数据和日志(事务日志)应该在不同的物理磁盘组上,因为它们有不同的 IO 配置文件,这也是出于可用性考虑,因为数据磁盘组中的损坏可以通过与损坏隔离的单独磁盘组中的日志来恢复。 同样,备份应该在单独的磁盘组中。 存储配置有多种选择,具体取决于操作系统、存储供应商和阵列型号。 具体要求因应用程序而异,需要特别注意物理和逻辑配置,包括物理和逻辑组或池的分配、RAID 类型、文件系统类型和并发性、分配的 GB 空间等。 下表详细介绍了 Caché 的读写 IO 配置文件: ![](/sites/default/files/inline/images/2016-11-14_09-45-42.png) ## Caché 存储 IO 要求 我发现存储瓶颈是影响数据库系统性能的最常见问题之一。 一个常见的问题是只针对 GB 容量来调整存储大小,而不是分配足够多的独立磁盘来支持预期的每秒输入/输出操作数 (IOPS)。 尽管 SSD 和分层存储现在更加常见,但必须小心以确保 IOPS 可用。 为了保证可被最终用户接受的响应时间,需要具有最低 IO 性能配置文件的磁盘阵列。 根据是否使用单独的应用程序 (ECP) 服务器,要求会略有不同。 下表详细说明了预期的存储响应时间和关于 IO 配置文件的备注。   ![](/sites/default/files/inline/images/2016-11-14_09-45-09.png) ## 缺少了什么? 在与供应商交谈之前,您需要估计您的应用程序预期将驱动的 IOPS ,以便配置存储选项以满足上述要求。 本系列的第 1 和第 2 部分给出了如何收集指标的示例。
文章
Michael Lei · 二月 14, 2022

成功案例分享--Cognetivity Neurosciences利用InterSystems的互操作性技术解决日益严重的痴呆症问题

痴呆症是一个重大的全球性问题,困扰着5400万人,到2050年这个数字将上升到1.3亿。由英国剑桥大学的学者创立的Cognetivity Neurosciences公司设计了一个尖端的解决方案,以帮助缓解全球痴呆症的流行。 根植于先进神经科学的简单解决方案 在出现临床症状之前的早期检测,为专家干预和改变生活方式打开了大门,可以减缓痴呆症的发展,提高生活质量。生活方式的改变有可能将症状的出现推迟五年,进而将普通人群中的痴呆症发病率降低50%。 Cognetivity Neurosciences的综合认知评估测试(ICA)是基于人类对动物刺激的强烈反应,以及健康的大脑在不到200毫秒内处理动物图像的能力。 ICA将基于云的人工智能和神经科学的进展结合起来,进行快速的动物/非动物视觉分类测试,目的是在记忆症状出现之前发现疾病的迹象。它涉及在阿尔茨海默症的前症状阶段受到影响的大脑区域,并检测出信息处理速度的细微损伤。 ICA基于云的敏捷性使临床医生和用户能够在熟悉的硬件上进行ICA测试,如iPad和智能手机,并在任何有互联网连接的地方进行。 Cognetivity Neurosciences正在通过一个先进的、可扩展的解决方案,利用神经科学的进步、人工智能和InterSystems IRIS for Health云数据管理平台的力量,重新发明痴呆症检测。 核心需求是数据的互操作性 任何新的诊断技术的成功都在很大程度上受其与现有工作流程和信息系统的整合程度的影响。对于像ICA平台这样具有巨大全球潜力的解决方案,要想在临床上有效和可扩展,它必须与已有的临床数据整合。在大多数国家,这需要完全遵守强制性的医疗数据标准,如HL7® FHIR®和HL7 V2,这些标准规定了互操作性。 Cognetivity Neurosciences选择InterSystems作为其技术合作伙伴,以实现这一重要的数据管理和互操作性。InterSystems IRIS for Health™数据平台非常适合这一高要求的角色,它是专门为从医疗保健数据中提取洞察力而设计的。它完全云中立,支持在所有主要的公有云、多云和混合云环境中部署。InterSystems IRIS for Health还使该团队能够减少在创建平台时使用的不同技术的数量。结果是--关键信息在正确的时间流向正确的人,这是高效采用和有效决策所需的关键因素。 "Cognetivity Neurosciences的首席技术官Jonathan El-Sharkawy说:"InterSystems作为我们的互操作性和集成合作伙伴,选择是自然的。"从一开始,我们就对引进他们帮助我们发展的决定充满信心。InterSystems IRIS for Health的功能非常强大,经过验证并被英国国家卫生服务系统(NHS)完全接受,更重要的是,InterSystems团队在NHS环境中拥有丰富的经验。" InterSystems IRIS for Health完全云中立,支持在公有云、多云和混合云环境中部署。 一个完全集成的、用户友好的、能发挥作用的测试 InterSystems IRIS for Health使Cognetivity Neurosciences能够与消费者设备和医疗级设备有效连接,并让患者使用现有的iPad和智能手机等硬件进行ICA测试。 随着Cognetivity Neurosciences公司向英国以外的地区扩展,与电子病历(EHR)的高度整合正在推动其技术的广泛采用。该公司还希望扩展到多发性硬化症等疾病的早期检测。 InterSystems IRIS for Health为Cognetivity Neurosciences提供了其尖端技术所需的互操作性和灵活性,以帮助改变整个NHS的痴呆症护理路径,并满足全球对远程测试、诊断和监测工具的广泛需求。 "El-Sharkawy说:"InterSystems IRIS for Health独特的数据管理和整合能力对我们的工作至关重要。"对我们来说,InterSystems IRIS for Health已经成功地与这么多医疗信息系统整合,包括最大的EHR供应商的系统,这对我们来说意义重大。随着我们的平台无缝协作,现在我们可以使用的国际应用程序的范围非常大。" 随着我们的平台无缝连接,我们现在可以使用的国际应用范围很广。 临床实施进展顺利,有可能使数百万人受益 ICA测试是早期痴呆症检测的一个重大进步,使其更快、更便宜、更可靠。它的简单性消除了语言、文化或教育障碍,使该解决方案几乎在世界任何地方都能得到采用。该平台得到了英国药品和保健品监管局的批准,并已在NHS精神健康专业机构North Staffordshire Combined Healthcare NHS Trust部署。它还在英国桑德兰的初级保健中使用。 ICA平台也被英国政府的G-Cloud所接受,并被选入美国德克萨斯医学中心秋季2020创新项目的最后一批小组。 其创新的力量,以及InterSystems IRIS for Health先进的云数据管理和整合能力,使Cognetivity Neurosciences能够大幅扩展,帮助全球数百万人。 "Cognetivity Neurosciences首席执行官Sina Habibi博士说:"我们与InterSystems的合作大有裨益,帮助我们实现了我们的愿景。"和我们一样,InterSystems的员工也热衷于利用技术对病人护理进行重大的、有影响力的改进。InterSystems IRIS for Health为我们提供了我们的尖端技术所需的互操作性和敏捷性,以帮助改变NHS和国际上的痴呆症护理路径。我们可以满足对更快、更准确和更有成本效益的诊断的加速需求。" 关于Cognetivity Neurosciences(https://cognetivity.com/about/) Cognetivity Neurosciences是一家成立于英国剑桥大学的医疗技术公司,它开发了一种由人工智能驱动的五分钟认知功能测试。其综合认知评估(ICA)是一种易于使用、敏感、可靠和可扩展的测试,代表了监测大脑健康的重大进展。ICA通过触摸屏设备和网络提供,为测量认知能力提供了一个独特的端到端解决方案。它可以早期发现神经系统问题,为病人带来更好的结果,并降低医疗系统的成本。Cognetivity正在美国、欧洲、中东和其他地区的医疗和企业市场上将ICA商业化。预计到2026年,全球认知评估和训练的市场规模将达到114亿美元,以26.6%的年均增长率增长,美国、欧盟和中东地区有超过3.5亿的55岁以上人口,Cognetivity的独特技术有望改变测量大脑健康的方式,并服务数百万以上的人群。
文章
Hao Ma · 十一月 2, 2021

IRIS 2021 技术文档 First Look 23 - 使用 InterSystems 分布式缓存扩展用户容量

本文档将向您介绍 InterSystems IRIS®数据平台如何通过使用应用服务器进行分布式缓存,利用企业缓存协议(Enterprise Cache Protocol,ECP)来扩展用户容量(User Volume)。本指南介绍了如何使用分布式缓存架构进行扩展,并介绍了与部署 InterSystems IRIS 分布式缓存集群相关的一些初始任务。一旦您完成了本指南,您将对分布式缓存集群的工作原理和设置方法有一个基本的了解。这些活动被设计成只使用默认的设置和功能,这样您就可以熟悉该功能的基本原理,而不必处理细节(尽管这些细节在执行实现时可能很重要)。有关使用 InterSystems IRIS 分布式缓存和 ECP 的完整文档,请参见本指南末尾 " For More Information (更多信息)" 部分中的参考资料列表。要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 1 问题:扩展用户容量(User Volume) 当用户通过应用程序连接到您的 InterSystems IRIS 数据库时,他们需要快速、有效地访问数据。无论您的企业是小型、大型,还是介于两者之间,对数据库的大量并发用户请求——用户容量(user volume)——都会在托管数据库的系统上造成性能问题。这可能会影响更多用户,使他们等待更长时间才能收到所需信息。在一个动态业务中,用户容量(User Volume)可能会迅速增长,从而进一步影响性能。特别是,如果很多用户在执行许多不同的查询,这些查询的大小会超过缓存,这意味着,它们不能再存储在内存中,而是需要从磁盘上读取数据。这种低效的过程会导致瓶颈和性能问题。您可以增加系统的内存和缓存大小(垂直扩展),但这种解决方案可能是昂贵的、不灵活的,并最终受限于硬件的最大功能。将用户的工作量分散到多个系统上(水平扩展)是一种更加灵活、高效和可扩展的解决方案。 2 解决方案:分布式缓存(Distributed Caching)为了提高用户访问数据的速度和效率,InterSystems IRIS 可以使用分布式缓存(Distributed Caching)。这种技术允许 InterSystems IRIS 在多个应用服务器(application server)上存储数据库缓存。然后,用户容量(User Volume)可以分布在这些服务器上,从而提高缓存效率。使之成为可能的节点间通信是由 ECP,即企业缓存协议(Enterprise Cache Protocol)启用的。使用分布式缓存(Distributed Caching),您可以让进行类似查询的用户共享一部分缓存,该缓存托管在应用服务器集群中,与托管数据的数据服务器一起。实际数据保留在数据服务器上,但缓存保留在应用服务器上,以加快用户访问。数据服务器负责保持企业中每台应用服务器上的缓存数据是最新的。 分布式缓存是如何工作的? 有了分布式缓存集群,您可以根据需要添加或删除应用服务器,轻松地扩展您的解决方案。所有的应用服务器都会自动维护自己与数据服务器的连接,并在连接中断时尝试恢复连接。您可以在单个集群实例上使用管理门户(Management Portal)配置应用服务器及其相关的数据服务器,或使用 InterSystems 云管理器(InterSystems Cloud Manager,ICM)部署和配置集群。有关 ICM 的更多信息 ,请参见 First Look:ICM(《技术概要:ICM》)和 InterSystems Cloud Manager Guide(《InterSystems 云管理器指南》)。 3 分布式缓存是如何工作的?当您部署一个 InterSystems IRIS 分布式缓存集群时,指定一个实例为数据服务器,指定一个或多个实例为应用服务器。这些实例不需要在相同的操作系统或硬件上运行,它们只需要符合 InterSystems IRIS 系统的要求。• 数据服务器的执行方式与标准的 InterSystems IRIS 服务器一样,在命名空间中托管数据库,并根据请求向其他系统提供数据。• 应用服务器接收来自应用程序的数据请求。当用户打开一个应用程序时,它不是连接到数据服务器,而是连接到应用服务器。用户不会注意到有什么不同。应用服务器从数据服务器获取必要的数据并提供给用户。• 应用服务器将数据存储在自己的缓存中,这样,下次任何用户请求相同的数据时,应用服务器不需要再次联系数据服务器就可以提供。• 数据服务器监控所有的应用服务器,以确保其缓存中的数据是最新的。数据服务器还处理整个系统的数据锁。• 如果应用服务器和数据服务器之间的连接丢失,应用服务器会自动尝试重新连接并恢复任何需要的数据。• 您可以设计您的应用程序,将进行类似查询的用户引导到同一个应用服务器。这样一来,用户可以共享一个包含他们最需要的数据的缓存。例如,在医疗保健设置中,您可能会让临床医生运行一组特定的查询,而前台工作人员使用相同的应用程序和相同的底层数据运行不同的查询;这些用户组可以在不同的应用服务器上分组。再比如,如果集群处理多个应用程序,每个应用程序的用户可以被引导到他们自己的应用服务器上,以获得最大的缓存效率。 4 亲自尝试分布式缓存使用 InterSystems IRIS 建立一个分布式缓存集群很容易。这个简单的程序将引导您完成在几个实例上配置 ECP 的基本步骤。注意: 为了让您体验分布式缓存,而又不至于在细节上陷入困境,我们保持了简单的探索;例如,我们让您尽可能多地使用默认设置。不过,当您把这个功能带到您的生产系统时,您可能需要以不同的方式配置一些设置(例如,安全设置)。本文档末尾提供的参考资料将为您提供更多细节。 亲自尝试分布式缓存4.1 用前须知在这个示例中,您将设置一个InterSystems IRIS 实例作为数据服务器,再设置两个实例作为应用服务器。这意味着您将总共需要三个实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的实例;这些实例不需要由您正在工作的系统托管(尽管它们必须相互有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有三个实例可以使用),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying Licensed Instances(部署已授权的实例)。注意:InterSystems IRIS 数据平台(Data Platform)提供了几种自动部署分布式缓存集群的方法,这些集群在部署后可以完全运行;请参见 Scalability Guide(《可扩展性指南》)中的 Deploying a Distributed Cache Cluster Automatically(自动部署分布式缓存集群)。4.2 启用 ECP 服务器 首先,在三个实例上启用 ECP 服务器,如下所示:1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL),在您的浏览器中打开实例的管理门户(Management Portal)。2. 进入 Services(服务器) 页面(System Administration(系统管理) > Security(安全) > Services(服务器))。3. 选择 %服务_ECP。在 Edit Service(编辑服务器)页面上,选择 Service Enabled(已启用的服务器)复选框,然后选择 Save(保存)。您现在已经在系统上启用了 ECP。只需要几个步骤就可以完成对数据服务器和两个应用服务器的设置。4.3 配置数据服务器 在将要成为您的数据服务器的系统上,只需要两个快速步骤就可以完成设置。首先,您需要将允许的应用服务器的数量从默认值增加一个。然后,您将创建一个新的数据库供应用服务器连接。当然,在生产环境中,您已经有一个正在使用的数据库。要完成数据服务器配置:1. 在管理门户(Management Portal)中,进入 ECP Settings(ECP 设置) 页面(System Administration(系统管理) > Configuration(配置) > Connectivity(连接) > ECP Settings(ECP 设置))。2. 在标有 This System as an ECP Data Server(本系统作为 ECP 数据服务器)的部分中,将 Maximum number of application servers(应用服务器的最大数量) 设置为 2。 选择 Save(保存)。3. 重新启动实例。 有关创建数据服务器和设置可用选项的更多细节,请参见 Scalability Guide(《可扩展性指南》)中 "Horizontally Scaling Systems for User Volume with InterSystems Distributed Caching(《使用 InterSystems 分布式缓存为用户容量水平扩展系统》)"一章中的 Preparing the Data Server(准备数据服务器)。要为这个练习创建一个新的数据库:1. 在管理门户(Management Portal)中,进入 Local Databases(本地数据库) 页面(System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Local Databases(本地数据库))。2. 选择 Create New Database(创建新的数据库)。3. 为新数据库输入一个名称。对这个练习来说,称它为 ECP。4. 选择 Next(下一步) ,然后 Finis(完成)。 您已经创建了新数据库,并且您的数据服务器也已经准备好了。 亲自尝试分布式缓存 在接下来的章节中,您将设置两个应用服务器,并配置它们使其能够与数据服务器进行通信。为此,您需要知道数据服务器的超级服务器端口号(superserver port number),如 InterSystems IRIS Basics:Connecting an IDE(《技术概要:连接一个 IDE》)中所述。 4.4 配置应用服务器 接下来,您将把另外两个实例设置为应用服务器。您将配置每个应用服务器以指向数据服务器,并在每个服务器上创建一个新的命名空间,映射到您在数据服务器上创建的数据库。请确保在每个应用服务器上执行以下两个程序。 4.4.1 设置应用服务器1. 登录管理门户(Management Portal),进入 ECP Settings(ECP 设置) 页面(System Administration(系统管理) > Configuration(配置) > Connectivity(连接) > ECP Settings(ECP 设置))。2. 选择 Data Servers(数据服务器) ,然后选择 Add Server(添加服务器)。3. 填写所需信息:• Server Name(服务器名称)——输入一个名称或标签来识别这个服务器。它不需要与实例名称或实例的主机名称相同。• Host DNS Name or IP Address(主机 DNS 名称或 IP 地址)——输入托管您在上一节配置的数据服务器实例所在系统的主机标识符。• IP Port(IP 端口)——输入数据服务器实例的超级服务器端口号(superserver port number)。 4. 选择 Save(保存)。您的数据服务器现在出现在列表中。应用服务器连接到数据服务器,验证连接可能需要一些时间。4.4.2 创建命名空间和远程数据库现在您已经将应用服务器连接到数据服务器,您需要在每个应用服务器上创建一个命名空间。这个命名空间将是应用服务器的本地命名空间,但它不是包含本地数据库,而是映射到远程数据库——也就是您在上一节创建的数据服务器上的 ECP 数据库。1. 在管理门户(Management Portal)中,进入 Namespaces(名称空间) 页面(System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置)> Namespaces(命名空间))。2. 选择 Create New Namespace(创建新的命名空间)。3. 在 Name of the namespace(命名空间名称) 字段中,输入 ECPNS。4. 对于 The default database for Globals in this namespace is a(这个命名空间中的 Globals 的默认数据库是一个),选择 Remote Database(远程数据库)。然后选择 Create New Database...(创建新数据库...) 按钮。 这将打开 Create Remote Database(创建远程数据库)窗口。5. 填写所需信息:• Remote Server(远程服务器)——使用下拉菜单来选择您在前面的程序中给数据服务器的 Server Name(服务器名称)。• Remote Directory(远程目录)——在数据服务器上,选择包含 ECP 数据库的目录。• Database Name(数据库名称)——输入一个数据库的名称。这可以与它在数据服务器(本例中是 ECP)上的名称相同,也可以不同。 6. 选择 Finish(完成)。窗口关闭,您会返回到 New Namespace(新的命名空间) 页面。 您应该看到,您刚刚创建的数据库现在显示在 Select an existing database for Globals(为 Globals 选择一个现有的数据库) 字段中。 亲自尝试分布式缓存 7. 由于这个命名空间中的例程(Routines)的默认数据库是 a(The default database for Routines in this namespace is a),选择 Remote Database(远程数据库)。现在您应该能够从下拉菜单中选择您刚刚创建的新数据库。8. 清除 Enable namespace for interoperability productions(为互操作性产品启用命名空间) 复选框。9. 选择 Save(保存)。现在新的命名空间出现在列表中。 有关创建命名空间及其相关数据库的更多细节,请参见 System Administration Guide(《系统管理指南》)中 "Configuring InterSystems IRIS(《配置 InterSystems IRIS》)"一章中的 "Create/Modify a Namespace(创建/修改命名空间)"。有关背景信息,请参见 Orientation Guide for Server-Side Programming(《服务器端编程指导手册》)中的"Namespaces and Databases(命名空间和数据库)"。您已经完成了! 一旦您在每个应用服务器实例上执行了这两个程序,您就成功地创建了一个集群 ,这个集群有一个数据服务器和两个应用服务器。在下一节中,您将测试这些连接,以确保所有三个实例都能正确地相互通信。 4.5 测试设置 现在您已经启用了 ECP 服务器,并设置了两个应用服务器,其命名空间指向数据服务器上的数据库,现在是时候做一个快速测试了,以确保这三个系统相互之间的通信。为了达到这个目的,您将在一个应用服务器上设置一个简单的 global,然后在第二个应用服务器上读取并改变它。要了解有关 globals 的更多信息,请参见 Using Globals(《使用 Globals》)。1. 在一个应用服务器上,使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中为您的实例描述的程序打开 InterSystems 终端(Terminal),并更改到您在上一节创建的命名空间。在这个示例中,命名空间被称为 ECPNS,因此您将执行以下操作:USER>set $namespace="ECPNS" ECPNS> 2. 创建一个 global,只需给它一个值即可: ECPNS> set ^MyGlobal = "My Value" 3. 在另一个应用服务器上,登录到终端(Terminal),并按照上面的描述更改到 ECPNS 命名空间。4. 写入 global 的值: ECPNS> write ^MyGlobal My Value 这表明两个应用服务器正在与数据服务器正常通信。您使用其中一个应用服务器来创建 global,但由于您是在包含远程数据库的命名空间中工作,global 实际上是在数据服务器上创建的。这就是为什么其他应用服务器可以读取它的原因。当然,这只是一个示例,但其机制是相同的,无论您是在终端(Terminal)上手动设置然后读取 global,还是有大量的用户通过十几台应用服务器在同一数据服务器前每秒发行数千个事务。ECP 将确保数据保持同步,并保证所有这些用户与系统交互的事务的一致性。5. 如果您愿意,可以在数据服务器实例上查看 global 作为最后检查。在管理门户(Management Portal)中,进入本地数据库(Local Databases)页面(System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Local Databases(本地数据库))。找到您的应用服务器所指向的数据库,并为该数据库选择 Globals。您应该会看到 MyGlobal 在列表中。 了解有关分布式缓存和 ECP 的更多信息 5 了解有关分布式缓存和 ECP 的更多信息 要了解有关使用 InterSystems IRIS 分布式缓存和 ECP 的更多信息,请参见以下参考资料:• Scalability Guide(《可扩展性指南》)的 "Horizontally Scaling Systems for User Volume with InterSystems Distributed Caching(《使用 InterSystems 分布式缓存为用户容量水平扩展系统》)"章节• Sample Mirroring Architecture and Network Configurations(《镜像架构和网络配置示例》)、Redirecting Application Connections Following Failover or Disaster Recovery(《故障转移或灾难恢复后重定向应用连接》)、Configuring Application Server Connections to a Mirror(《配置应用服务器到镜像的连接》),以及 High Availability Guide(《高可用性指南》)中"Mirroring(《镜像》)"章节中的其他分布式缓存和 ECP 相关章节