文章
· 五月 26, 2023 阅读大约需 8 分钟

IRIS镜像配置(4)_配置后的步骤

题外话:我刚刚翻译了InterSystems专家Bob Binstock的Caché Mirroring 101:简要指南和常见问题解答。 尽管题目是Caché Mirror 101, 而且是写于2016年,但因为讲解的都是Mirror的基本原理,所以在大量使用IRIS的今天也完全适用。

前面的3篇文章,包括了配置Mirror的各个方面。如果您照着操作,现在已经有了一个工作的mirror环境,并加入了您的数据库。然而,还没完,这篇我来讨论一下后面的工作,首先的问题是:

Mirror不复制什么

简单说,Caché/IRIS镜像是数据库复制(Database Replication)。在Caché/IRIS里什么是数据库?也就是Cache.dat和iris.dat文件。数据库的修改日志,也就是journal,从主机被传送到其他镜像成员。而除此之外的内容,需要维护人员来分别的个个处理, 解决这些内容在各个镜像成员间的拷贝。需要很多的计划和细心。

系统数据库, 包括IRISSYS, IRISTEMP, IRISLIB等等, 这些Caché/IRIS本身的数据库不应该被加入Mirror,在大多数Caché/IRIS版本里也都设置成不可以加入入MIRROR。

例外的HealthCare产品, HSSYS需要做Mirror, HSCustom可以做Mirror, 而HSLIB不可以Mirror

我们可以把问题转换成下面的题目:

需要人工在镜像成员中同步的项目

命名空间(namespace)和Mapping

命名空间是应用开发的概念,它使用数据库。命名空间定义了3种映射关系:Package Mapping, Routing Mapping, Global Mapping。这样在一个命名空间可以使用多个数据库的内容。

通常情况下,用户会在主机创建命名空间的同时,创建一个新的带有mirror属性的数据库,然后会在其他mirror成员中手工一个个的创建命名空间,加入镜像的数据库。之后,管理员无需考虑更多的操作。

然而,对命名空间的修改,比如要添加或者删除命名空间的某些mapping,这偶尔会需要,尤其是应用迭代和系统扩容的情况下,那么,管理员/实施人员,必须清楚Mirror无法同步这个修改,您必须手工同步修改到其他机器去。

如果配置的mapping比较多, 我建议使用Manifest来操作。Mainfest是一个xml的文本,用来安装或者修改Caché/IRIS的配置,你可以参考在线文档: Using a Manifest, 或者社区文章使用Manifest

这里给一个配置mapping的例子:

<Manifest>
    <Namespace Name="FHIRNS">
        <Configuration>
            <Database Name="FHIRNS"/>
            <GlobalMapping Global="%SYS" From="IRISSYS"/> 
            <GlobalMapping Global="OAuth2.*" From="HSSYS"/> 
            <GlobalMapping Global="SchemaMap.*" From="HSLIB"/> 
            <ClassMapping Package="HS" From="HSLIB"/>
            <ClassMapping Package="HS.Local" From="HSCUSTOM"/>
            <ClassMapping Package="HSMOD" From="HSLIB"/>
            <ClassMapping Package="SchemaMap" From="HSLIB"/>
            <RoutineMapping Routines="HS.*" From="HSLIB"/>
            <RoutineMapping Routines="HSMOD.*" Type="INC" From="HSLIB"/>
            <RoutineMapping Routines="HSMOD.*" From="HSLIB"/>
            <RoutineMapping Routines="SchemaMap.*" From="HSLIB"/>
        </Configuration>
    </Namespace>
</Manifest>

如果是资深的Caché维护工程师,懂得如果修改CPF文件并在不重启实例的情况下应用修改后的内容,可以考虑把主机上的CPF中的mapping部分复制粘贴到其他机器。如果您没有这方面的经验,我不建议这种方式。

另外,在IRIS 2022后的版本中有了一个新工具,Configuration Merge。 文档在这里。可惜只有最新版的IRIS或者Health Connect 用户有的用。

数据库的修改

数据库的内容会通过Journal从主机同步到其他成员,但修改不会,一般会遇到的是压缩和截断

由于某种错误操作,某个数据库,会扩展到不正常的大,而当错误修正后,用户可能需要对该数据库进行压缩和截断,以释放被错误占用的空闲的磁盘空间。

由于除主机外,其他镜像成员的数据库都是只读的,这个操作的顺序应该是这样:

  1. 在主机A执行压缩和截断

  2. 切换到备机B, 再次执行压缩和截断。

  3. 异步成员DR。 一种方案是吧DR提升到备机。这时当前的备机A会将为灾备,然后再切换DR为主机,再进行压缩和截断。

    还有一个选择,就是重新配置DR上的这个数据库,这需要从主机到DR的数据库备份和恢复。

IRIS实例的配置

从最常用的内存的配置,Service的配置, 用户,权限,资源的配置等等。它们都不会被MIRROR同步。如果您在MIRROR主机里做了修改了缩表的大小,或者启动了一个,比如TELNET服务, 您需要人工在其他机器上做相同操作。

像上面的mapping配置一样,这里还是建议使用Manifest人工同步IRIS得修改。注意的是,Mainfest不保证能支持所有的配置。比如在Caché的版本下, 比如您在主机上启动了TELNET服务, Manifest没有相应的标签。这种情况下, 如果您熟悉ObjectScript语言,可以把ObjectScript实现加入执行Manifest的方法,比如说:

ClassMethod main(){
   //执行Manifest修改命名空间
   Set pVars("Namespace")="MYNAMESPACE"
   $$$ThrowOnError(..ModifyNamespace(.pVars))
   //启动IRIS的TELNET服务
   set properties("Enabled")=1            // 有効
    set sts=##class(Security.Services).Modify("%Service_Telnet",.properties) 
}

当然,如果您缺乏开发实施的知识,在用户界面上一个个机器的操作是最省心的办法。

问题是,打开一个服务,修改一个配置参数操作都很简单,但是如果要添加大量的用户和权限怎么办?

用Manifest管理是一个办法。但根本上,如果您经常有大量的用户管理的工作,其实使用Kerberos或者LDAP管理用户身份认证和授权的工作, 在有多个镜像成员的情况下,尤其的合适。 关于这部分内容,请参考在线文档:Authentication and Authorization

定时任务(TASK)

在主机上创建的定时任务, 您需要人工在其他机器上做相同操作。这里有2个步骤:

  1. 在主机上创建新任务的时候,要选择”应如何为镜像运行任务“。 这是个下拉菜单,选项有”仅在主镜像成员上运行“,“仅在非主镜像成员上运行“ ,“在任何镜像成员上运行"。

    选择的出发点是:非主镜像成员的数据库是只读的。因此,比如一个Ensemble的镜像配置中, 删除Ensemble消息的定时任务, 一定是”仅在主镜像成员上运行“。

  2. 把新的定时任务从主机同步到其他成员。

​ 如果是一个或者少量几个TASK, 那么手工在其他各个镜像成员上添加是最简单直接的做法。而如果是有很长 的任务列表,尤其在配置Mirror得时候可以需要同步一个长长的列表时, 您可以考虑从主机导出Task到其 他机器导入,我只知道使用ObjectScript命令的方法, 使用%SYS.Task.ExportTask()%SYS.Task.ImportTasks()。 文档在这里

Web Application

主机上配置的Web Applicaiton 也要同步到其他镜像成员。如果要同步的Web Application比较多,推荐的方式依然是Manifest, 下面是一个例子。

<Manifest>
    <Namespace Name="flagger">
      <CSPApplication CSPZENEnabled="1" LoginClass="/csp/flagger/Flagger.LoginAuth.cls" CustomErrorPage="/csperror.csp" ChangePasswordPage="/csp/flagger/ChangePassword.cls" AutoCompile="1" Url="/csp/flagger" IsNamespaceDefault="1" InboundWebServicesEnabled="1" Recurse="1" AuthenticationMethods="64" DefaultTimeout="900" Directory="${CSPDIR}flagger" UseSessionCookie="2" CookiePath="/csp/flagger/" ServeFiles="1" ServeFilesTimeout="3600"/>
   </Namespace>
</Manifest>

麻烦的是不同的版本Caché/IRIS使用的标签上会略有不同,要稍微仔细的查看一下您的版本的文档。

如果您对ZPM, 现在称为IPM熟悉的话, 用ZPM做同步也是个好选择。关于zpm, 您可以参考这个帖子zpm介绍。提醒一下的是,程序因为是存在数据库里面的,如果该数据库是被镜像的,您其实不需要用ZPM把程序代码拷贝到其他镜像成员。

Gateway

一般用到的有SQL GatewayExternal Language Gateway,它们分别用于连接其他的数据库和使用其他语音的代码包。

SQL Gateway

记录保存在%SYS命名空间的%Library.sys_SQLConnection数据表里。简单的方法是使用工具把表记录导入导出。

External Language Gateway(外部语言网关)

新版的IRIS系统内嵌了外部语言服务器,包括%Python Server, %Java Server, %Dotnet Server等。如果您使用的是默认配置,各个镜像成员是一致的,无需操心。如果只是IP端口的修改,手工同步一下也很容易,毕竟工作量有限,只是您需要清楚的记得,这个也是不被Mirror自动同步的。

文件

我把文件分为两类, 一类是“固定文件”,包括一下几个部分,

  • CSP文件,js文件,css文件,html文件等
  • XSLT文件
  • 其他语言的程序代码,Java文件,python文件, .Net文件

这类文件上传到主机的时候, 也必须上传到其他镜像成员,这是个简单的操作,别忘了就行。

麻烦的是流文件。在ObjectScript里如果使用了%Stream.FileBinary, %Stream.FileCharacter等类,那么数据不是保存到Cache.Dat或者IRIS.data, 而是保存在和.Dat同目录的一个stream的子目录下,而这个目录是不会被镜像同步的。 而且,因为这是实时数据,你也不可能手工的把它拷来拷去。

如果您的应用里用到了文件流,我任务您需要一个文件服务器保证流文件在各个各个镜像成员间的同步。

Ensemble Production Consideration

对于Ensemble和Health Connect用户,您需要阅读这部分在线文档: Production Considerations for Mirroring , 简单总结一下:

  • 创建的带有ensemble或者Inteoprability的命名空间,数据库要创建为Mirror的数据库。
  • "production是否自动启动“应该在主机和备机上,甚至DR上都配置为“自动启动”。 在Mirror配置下的Production会先检查这个实例是不是主机,如果不是,“自动启动”的配置也不会生效,这样保证了Production只在主机上运行,而切换后也不需要人工干预。

上面的这些并不是完整的内容,尽管在大多少情况下这些内容差不多够了。如果您想要确保Mirror的主机的工作内容完全同步到了备机和DR, 请仔细阅读在线文档的这一部分:Mirror Configuration Guidelines

另外,对于各种需要人工同步的内容的操作,还建议阅读在线文档:Server Migration

如果是最新的IRIS用户,请参考在线文档:Deploy Mirrors Using Configuration Merge

讨论 (0)1
登录或注册以继续