文章 Lele Yang · 六月 8, 2023 7m read

++ 更新:2018 年 8 月 1 日

使用内置于 Caché 数据库镜像的 InterSystems 虚拟 IP (VIP) 地址有一定的局限性。特别是,它只能在镜像成员驻留在同一网络子网时使用。当使用多个数据中心时,由于增加了网络复杂性( 此处有更详细的讨论),网络子网通常不会“延伸”到物理数据中心之外。出于类似的原因,当数据库托管在云端时,虚拟 IP 通常无法使用。

负载均衡器(物理或虚拟)等网络流量管理设备可用于实现相同级别的透明度,为客户端应用程序或设备提供单一地址。网络流量管理器自动将客户端重定向到当前镜像主服务器的真实 IP 地址。自动化旨在满足灾难后 HA 故障转移和 DR 升级的需求。

0
0 266
文章 Lele Yang · 三月 31, 2023 4m read

《WebGateway系列(4): 配置HTTPS访问IRIS的Web服务》中介绍了在Web服务器中配置SSL/TLS以实现从客户端浏览器到Web服务器之间的安全连接,从Web服务器到IRIS之间是否也可以通过配置SSL/TLS建立起安全连接呢?尤其是在Web服务器与IRIS没有安装在同一台Server上的情况下,这段连接的安全性也是需要考虑的。答案是肯定的,接下来我们就来介绍下配置Web Gateway使用SSL/TLS连接到IRIS的基本步骤。

1.首先,我们先准备一下所需要的证书。通讯的双方为Web Gateway 和 IRIS Super Server, 双方都需要准备好各自的证书和key。IRIS自带的Public Key Infrastructure(PKI)功能内置了OpenSSL,可以用来生成服务器端及客户端的证书和key。在使用此功能时,IRIS可以同时作为CA Server和CA Client,作为CA Server时可以生成自签名的证书,可以批准CA Client的证书申请并将证书下发给CA Client。

1)配置本地证书颁发机构服务器,生成sever端的证书和key。

2)配置本地证书颁发机构客户端,如下

3)将证书签名请求提交到证书颁发机构服务器

4)进程未决证书签名请求

发放证书。

至此,Client以及Server端证书和key都已准备完成。

1
0 1080
文章 Lele Yang · 二月 21, 2023 4m read

** 2018 年 2 月 12 日修订

虽然本文是关于 InterSystems IRIS 的,但它也适用于 Caché、Ensemble 和 HealthShare 发行版。

介绍

内存以页为单位进行管理。 Linux 系统上的默认页面大小为 4KB。 Red Hat Enterprise Linux 6、SUSE Linux Enterprise Server 11 和 Oracle Linux 6 引入了一种根据系统配置提供 2MB 或 1GB 大小的增加页面大小的方法,称为 HugePages。

起初 HugePages 需要在启动时分配,如果管理或计算不当可能会导致资源浪费。因此,各种 Linux 发行版引入了默认启用 2.6.38 内核的Transparent HugePages。这是一种自动创建、管理和使用 HugePages 的方法。以前的内核版本也可能具有此功能,但可能未标记为 [always] 而是设置为 [madvise]。

Transparent Huge Pages (THP) 是一种 Linux 内存管理系统,它通过使用更大的内存页面来减少在具有大量内存的机器上进行Translation Lookaside Buffer (TLB) 查找的开销。然而,在当前的 Linux 版本中,THP 只能映射单个进程的堆栈空间。

0
0 298
文章 Lele Yang · 二月 2, 2023 4m read

正如之前在 2022 年全球峰会上宣布的那样,InterSystems 将停止交付或安装基于 Apache 的web服务器(通常称为私有web服务器或 PWS);此更改目前计划用于 InterSystems IRIS 2023.2。


使用这种新方法,您可以完全控制选择最适合您目的的 Web 服务器,以及如何配置、维护和更新它。这一变化的一个主要好处是您将不再需要等待 InterSystems 的更新套件来获得最新版本,这在安全漏洞情况下尤其重要。 InterSystems 将提供可用于帮助配置 Apache 或 IIS 的工具。 (请注意,InterSystems IRIS Community Edition 将继续安装 PWS。)


安装 Web 服务器是一个常见的过程,通常很容易 - 各个 Web 服务器供应商都有详细的文档记录。

以下是适用于 Ubuntu、Windows 和 macOS 的示例。它们演示了快速安装,因此您可以看到当 InterSystems 产品不包含或安装 Web 服务器时的新行为。 (请注意,此代码按原样提供,不受支持,也不足以托管关键任务或数据敏感的应用程序。)

提供了常见问题解答,其中提供了更多信息并可访问用于尝试此新过程的工具包。请参阅本文末尾链接的 PDF 以获取常见问题解答,或者如果您想添加到讨论中,请访问https://community.intersystems.com/post/discontinue-apache-web-server-installations-faq

0
0 259
文章 Lele Yang · 四月 21, 2022 2m read

以下示例代码可实现在Java中通过JDBC向IRIS数据库中写入Stream数据,插入的该Stream大小约为4M,对应在IRIS中字段类型为%Stream.GlobalCharacter。以下代码在IRIS2021上测试成功,供大家参考,

Java代码,

public static void test96()
    {
        int rt;
        String sql="Insert into My_Msg.Test1(MsgControlID,S1) values(?,?)";
        try {

            IRISDataSource ds = new IRISDataSource();
            
            //172.19.85.72/:1972/YLL   IRIS Health 2021
            ds.setURL("jdbc:IRIS://<ip>:1972/YLL");
            ds.setUser("<username>");
            ds.setPassword("<password>");
            Connection connection = ds.getConnection();
            PreparedStatement pstmt = connection.prepareStatement(sql);
            System.out.println("1");
            StringBuffer txt = new StringBuffer();
               for (int i = 0; i < 4000000; i++) {
                txt.append("a");
            }
            pstmt.setInt(1, 1);
            pstmt.setObject (2, txt.toString());    
            rt = pstmt.executeUpdate();
            System.out.println("2:"+rt);
            
            pstmt.close();
            connection.close();
        }catch (Exception ex) {
               System.out.println("JDBC caught exception: " 
                         + ex.getClass().getName() + ": " + ex.getMessage());
        }    
    }
0
0 223
文章 Lele Yang · 二月 18, 2022 2m read

InterSystems的产品包括Caché/Ensemble/Health Connect/IRIS/IRIS for Health,均基于进程,当它们及在它们之上开发的应用运行时,您能在操作系统上看到大量cache/irisdb进程。下面以InterSystems IRIS为例,来说明下InterSystems产品的内存使用。

InterSystems IRIS进程的内存使用主要有以下两大类,

第一类,进程私有内存。

私有内存只由该进程使用,且会为每个进程单独分配。进程初始时会被分配128KB的内存空间,随着进程运行根据需要,这个内存空间会自动扩展。
InterSystems IRIS对于进程内存使用的限制是Maximum Per-Process Memory, 该参数的设置位置在系统管理门户SMP,System > Configuration > Memory and Startup,允许的取值范围是256KB到2147483647KB(2TB)。如果系统遇到<STORE>错误,那么可以尝试增加该数值,来解决进程运行时无法申请到更多内存的问题。从InterSystems IRIS开始,我们推荐将该值设置为-1, 也就是取上限2TB。

0
0 242
文章 Lele Yang · 一月 30, 2022 2m read

Linux内核机制OOM Killer,也即Out of Memory Killer, 顾名思义,该机制的主要职能就是当内存不足时,选择并杀掉一些进程,以使系统继续运行。

Caché/Ensemble/IRIS的多个客户曾经遇到过与此相关的系统宕机,宕机的直接原因是数据库核心写进程Write Daemon被OOM Killer选中并杀掉了,在我们的日志文件中可以看到如下信息,

06/15/21-10:50:31:035 (13579) 3 Daemon WRTDMN (pid 13588) died. Freezing system
06/15/21-10:52:25:940 (13601) 2 System Process 'WRTDMN' terminated abnormally (pid 13588)
0
0 1066
文章 Lele Yang · 八月 31, 2021 3m read

1 磁盘空间不足的常见情形
1)Journal所在磁盘空间不足。造成这种情况的原因有多种,比如,Mirror中备机未处于宕机状态,因此主机保留了Journal文件。
2)数据库所在磁盘空间不足。比如,集成平台上Ensemble/Health Connect/IRIS for Health的消息从未清除过,导致消息数据库DAT文件不断增大,直至将磁盘空间用尽。

我们可以看到以上两种情形下,Mirror都帮不上忙,也就是说一旦问题出现,主机和备机都没有办法立即承担起业务系统的运行,
第1)种,备机可能在故障出现前就已经宕机很长一段时间而没被发现,备机的数据很可能已经与主机严重不一致。实际上,主机之所以保留了大量的journal文件没有删除,就是为了让备机同步数据时使用。
第2)种,虽然配置了Mirror,但是消息主库正常情况下都是镜像库,在一个健康的Mirror中,备机和主机的镜像库数据保持同步,镜像库大小应当是相同的,假设主备机的硬件配置相同(这也是我们推荐的方式)那么磁盘空间不足在备机上同样存在。

2 应急措施 
切忌手动从文件系统中删除Journal文件!

0
0 659
文章 Lele Yang · 八月 13, 2021 1m read

众所周知,Object Script是一个弱类型开发语言,%String是我们非常常用的一个类型,时不时有客户在初次接触Object Script编写程序时遇到%String长度限制的问题,在这里做一个简单总结,以便于相关开发人员作为参考。

1. MAXLEN设置字符串的长度。
Property Name As %String(MAXLEN = 50);
a) 如果不设置MAXLEN, 默认长度限制为50
b) MAXLEN = "", 没有限制长度,也就是字符串本身的长度限制。

如果超限,您将会看到如下报错,
错误 #7201: 数据类型值'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'的长度超过50允许的MAXLEN 

2. 字符串本身的长度限制。
在没有开启长字符串的情况下,%String类型的长度限制是32,767个字符。

如果超限,您会遇到报错<MAXSTRING>,如果遇到这个报错,建议您改用流类型%Stream,如%Stream.FileCharacter, %Stream.GlobalCharacter等等,更多关于如何使用流类型,详见如下在线文档,
http://dreamymclean.intersystems.skytapdns.com:52773/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_propstream

2
0 587
文章 Lele Yang · 七月 22, 2021 4m read

提示:本文包含在Java中通过JDBC Driver对Caché/IRIS数据库进行查询的示例代码。

近期有客户反应使用Java从老版本Caché中读取数据时,如果数据中包含long varchar, Caché数据库中与之对应的属性类型为%Stream.GlobalCharacter,即使实际上该流数据长度非常小,也会成十几倍的降低性能。

大家先来看一段代码, 

public static void test99()
    {
        Statement stmt = null;
        ResultSet rs = null;
        
        int fetchSize = 100000;
        long before = System.currentTimeMillis();
        String sql="Select Title, Notes from My.Employee Where id=1";
        try {

            CacheDataSource ds = new CacheDataSource();
            
            ds.setURL("jdbc:Cache://123.123.123.1:1972/Samples");            //访问Caché数据库
            ds.setUser("_SYSTEM");
            ds.setPassword("SYS");
            Connection connection = ds.getConnection();
            connection.setAutoCommit(false);
            stmt = connection.createStatement();
            rs = stmt.executeQuery(sql);
            long executed = System.currentTimeMillis();
            System.out.println("execute take miliseconds of:"+(executed-before));
            ResultSetMetaData rsmd = rs.getMetaData();
            int colnum = rsmd.getColumnCount();
            String str = null;
            while (rs.next()) {
                for (int i = 1,ilen = colnum; i <= ilen; i++) {
                str = rs.getString(i);
                }
            }
          stmt.close();
          rs.close();
            connection.close();
            long end = System.currentTimeMillis();
            System.out.println("read take miliseconds of:"+(end - executed));
            System.out.print("total take miliseconds of:"+(end-before));
        }catch (Exception ex) {
              System.out.println("TinyJDBC caught exception: " 
                   + ex.getClass().getName() + ": " + ex.getMessage());
        }    
    }
3
0 370
文章 Lele Yang · 七月 13, 2021 2m read

近日遇到客户反映在Business Operation中使用SQL Outbound Adapter调用Oracle存储过程时,无法获取CLOB完整的返回内容。借此在这里介绍下该如何调用,话不多说,直接上代码。

注意,以下代码片段直接应用于Business Operation中,

set pIn = 4
set pIn(1) = "aaaa"
set pIn(1,"IOType") = 1    // 1:input , 4:output
set pIn(1,"SqlType") = 12  // 12: varchar

set pIn(2,"IOType") = 4     
set pIn(2,"SqlType") = 4   // 4: integer

set pIn(3,"IOType") = 4     
set pIn(3,"SqlType") = 12  

set pIn(4,"IOType") = 4     
set pIn(4,"SqlType") = 2005   // CLOB
set pIn(4,"LOB") = 1

set tQuery = "{ call test_hc(?,?,?,?) }"  /// the first one parameter is input parameter, the last three are all output parameters.

set tSC = ..Adapter.ExecuteProcedureParmArray(.tRS,.pOut,tQuery,"iooo",.pIn)

set cnt = pOut.Count()

// you will get this stream data 
if cnt >1
{
  for i=1:1:cnt
  {
     set ov = pOut.GetAt(i))
     $$$TRACE("pOut("_i_")="_ov)

     /// the third one is the CLOB output.
     if (i = 3)
     {
        while 'ov.AtEnd 
        { 
          $$$TRACE(ov.Read())
        }
     }
  }
}
1
0 219
文章 Lele Yang · 七月 13, 2021 4m read

与Windows上默认安装为服务随机自启动不同,我们在Linux上安装完InterSystems IRIS后,默认是没有配置系统服务的,需要做手动配置。本文提供使用systemd方式来配置InterSystems IRIS服务随机自启动的简单示例,供大家参考。

假设我们已经安装了InterSystems IRIS产品,安装完成后您可以通过iris list来来查看实例信息,包括安装路径,如:"/intersystems/iris"

[root@RHEL8-64-001 ~]# iris list

Configuration 'IRIS'   (default)
  directory:    /intersystems/iris
  versionid:    2021.2.0L.546.0
  datadir:      /intersystems/iris
  conf file:    iris.cpf  (SuperServer port = 51773, WebServer = 52773)
  status:       running, since Mon May 31 05:03:09 2021
  state:        ok
  product:      InterSystems IRIS

在安装完成后,用以下方式搜索不到iris.

0
0 317
文章 Lele Yang · 六月 23, 2021 3m read

Production是指Ensemble/HealthShare Health Connect/IRIS/IRIS for Health产品中提供的互操作功能模块,更多关于Production介绍,可参见在线文档,
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_productions#AFL_productions_quicklook

Production中访问外部数据库常用的适配器Adapter有两个,一个是用于Business Service中的Enslib.SQL.InboundAdapter,另一个是用于Business Operation中的Enslib.SQL.OutboundAdapter,
更多关于这两个Adapter的使用说明可以参见在线文档"Using SQL Adapters in Productions",

本文主要涵盖以下内容

1. 基本配置步骤(仅涉及与JDBC连接相关配置)
2. JDBC Gateway和Java Gateway Service的区别
3. 常见的问题类型
4. 常用基本故障排查

基本配置步骤

前提,在配置之前请您首先确认您的环境中已经正确安装了Java。
1.

2
0 339
文章 Lele Yang · 六月 8, 2021 1m read

如果您在升级了系统之后,打开SMP时看到如下报错,
ERROR #5001: 对象的服务器版本与客户端发送的版本不一致: %ZEN.Component.vgroup

一般情况下,这个报错是由浏览器缓存中残留的过期信息造成的,可以通过清除浏览器缓存来解决。

如果清除浏览器缓存之后仍然未能解决此问题,请您前往系统安装目录, 如:d:\InterSystems\IRIS\CSP\broker,查看css/js文件的时间戳在本次更新安装之后是否并没有相应地更新,如果没有,请您做以下尝试,
1)在IRIS中更改数据库IRISLIB, 之前的版本是CACHELIB, 取消只读装载,方法如下,打开管理门户SMP, 系统管理->配置->本地数据库,选择要更改的数据库,取消"只读方式挂载",点击【保存】。
2)重新编译%Zen组件,
w ##class(%SYSTEM.OBJ).Compile("%ZEN.Component.vgroup")
此时,再次前往,d:\InterSystems\IRIS\CSP\broker,会看到相关的css/js文件时间戳已经更新。
3)恢复上述数据库的只读装载。

如果以上办法仍然未能解决您的问题,建议您联系WRC,寻求Support的进一步帮助。

0
0 399