検索

質問
· 2024年9月12日

Running IRIS in a Swarm Cluster

Hi there,

I'm discovering IRIS and I need to POC the solution, with a constraint: containerization.
I'm used to deploy my apps in a Swarm cluster, and all my bind volumes are written on a GlusterFS volume.

The problem here, when I start my stack, the first log is:

[WARN] ISC_DATA_DIRECTORY is located on a mount of type 'fuse.glusterfs' which is not supported, consider a named volume for '/iris_conf'

And of course the deployment fails.

Any idea? How can I provide my data on all my cluster nodes? I read this article: https://community.intersystems.com/post/deploying-sharded-cluster-docker... But no swarm cluster here, it's only docker compose and 3 containers running, which is not I want. I don't want 3 containers, but just one, able to retrieve its data on the same path, without worrying about the cluster node on which it is running. So, any idea of how I can have the same behavior than data replication and availibilty without using GlusterFS?

My infrastructure is a 3 nodes Swarm Cluster, with a GlusterFS volume replicated on the 3 nodes, and keepalived for HA and vIP. And Traefik reverse proxy.

If someone can help me :D it would be nice.

 

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
質問
· 2024年9月12日

SYSTEM OBJ Export

I have a DOS batch file that calls *.scr script to back up an existing routine and upload the newly updated one.

I have a backup folder setup in C:\Users\[username]\Backup\ on each server, some with more recent versions of cache. The *.scr script calls on the command:  $SYSTEM.OBJ.Export(routine,path) . 

The problem is that it works consistently in some servers but not in others. Where it fails, the session unexpectedly terminated. Please note that the command works on the remote server terminal window where the script terminates unexpectedly. Is there a setting I need to change in Management Portal or somewhere else for my cache USER and ROLE under my name in the destination server? Is there another system command, perhaps, I should use that is better than OBJ.Export? If so, I have not found it.

Thank you for your anticipated replies.

ディスカッション (0)2
続けるにはログインするか新規登録を行ってください
記事
· 2024年9月12日 2m read

適正なロックテーブルサイズの算出方法

これは InterSystems FAQ サイトの記事です。
 

ロックテーブルの1エントリは管理領域の固定512 bytesとロック文字列情報などの可変領域から構成されます。

 

可変領域はロック対象のグローバルノード名に関連する情報に必要な長さ(bytes)になります。

 

1つのLockコマンドにつき、上記で示した長さのデータが必要です。

 

そしてその可変領域に必要なデータ長は、ロック対象のグローバルノード名(^xxx(xxx,xxx)) の長さに見合う16,32,64,128,256,…bytesのバケットの長さになります。

 

例えばロック対象のグローバルノード名が^xxx(123,"data")とすると、 ^xxx(123,"data")にデータのロケーション等のデータが付加されたものがその可変領域となり、32byteまたは64bytes(データロケーションが相応に長い場合)のバケットを使用しますので、

 

このロックで使用するデータサイズが、64byteのバケットを使用すると仮定すると、

 

512(固定領域)+ 64 (可変領域)= 576 bytes

 

となります。

 

これを基本とし、システムのピーク時に保持することが想定されるロック件数を掛け合わせることで必要なロックテーブルのサイズはある程度は想定することができますが、グローバルノード名に関連する情報が可変であるために正確な見積もりは、一般的には困難です。

 

現実的には、予めおおよその想定使用量より大きめのサイズを仮設定し、運用状況を定期的に観察して、ロックサイズの最大値をモニターしながら調整していくことを推奨します。

 

ロックサイズの最大値をモニターする方法は、カスタマーサポートまでお問い合わせください。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年9月12日 2m read

gmheapとlocksizの新しいデフォルト値

これは InterSystems FAQ サイトの記事です。
 

IRIS2023.1から導入されたgmheapとlocksizの新しいデフォルト値について紹介します。

 

gmheap=0は、特別な設定の必要性がないほとんどのシステム(実運用システムを含む)に適切なように設計された新しいデフォルト値です。

 

0に設定することで、システムがシステム全体のサイズを推測し、妥当な値を算出してくれます。

 

gmheap=0 に設定した場合、システムは、グローバルバッファ用に設定されたメモリの合計に3%を乗じた値を基準に、300MBの下限と2GBの上限の範囲内でgmheap値を設定します。

 

0以外の値はそれをそのまま使用し、2GBよりはるかに大きく、あるいは300MBよりはるかに小さく設定することができます。

 

(ただし、小さな値を設定した場合、メモリを必要とする機能の利用が失敗する可能性があります。 同様に極端に大きな値を設定することでシステムに悪影響を与える可能性があります)

 

さらにこの変更以前は、.cpfファイルのgmheap設定に加えて、CPUスレッド数 に2MBを掛けた値をシステムが内部的に追加していました。

 

このため、異なるシステムに構成を移動するときや、物理メモリの使用量を理解しようとするときに混乱を招くことがありました。

 

この変更により、この追加は発生しなくなり、gmheap 設定で与えられた値が直接使われるようになりました。

 

以前のバージョンからのアップグレード時には、現在の gmheap 設定は、.cpf ファイルで明示的に設定された値に、明示的にこの量 (2MB * $system.Util.NumberOfCPUs()) を追加することで自動的に調整されます。

 

locksiz=0は、すべてのシステムに適合するように設計された新しいデフォルト値です。

 

この値は、ロックテーブルのサイズがgmheap パラメータで指定された共有メモリヒープのサイズによってのみ制限されることを意味します。

 

システムをバージョンアップする際に現在の locksiz パラメータは自動的に 0 に設定されます。

 

0 以外の値が指定された場合、locksizに指定されたバイト数をgmheap内で使用可能なメモリから確保します。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年9月12日 3m read

PythonからIRISルーチンに引数を渡すサンプル

これは InterSystems FAQ サイトの記事です。
 

PythonからObjectScriptのルーチンを直接呼び出すことはできませんが、クラスメソッドを経由して間接的に呼び出すことができます。

しかし、Pythonの変数とObjectScriptのローカル変数は内部構造が異なるため、情報の交換には少し工夫が必要です。

簡単なサンプルでその方法について説明します。

まず、2つの変数を足し算する簡単なルーチン ^testを作ります。 

 

TEST    ;
    set sum = a + b

 

次にこの^testを呼び出すPythonのメソッドを含んだUser.testというクラスを作ります。

そしてpyという名前のPythonのメソッドを作成します。

先述の通りPythonからObjectScriptのルーチンを直接呼び出すことはできないので、ルーチンを間接的に呼び出すObjectScriptのメソッドを作成する必要があり、そのメソッドをPythonメソッドから呼び出すようにします。

渡したいデータが複数個ある場合、その数分引数を用意するのは面倒なため、Pythonの場合、情報をまとめて交換する際にdictionary(辞書)やlistという構造を使用することができます。

ここでは、dictionaryを使用する例を紹介します。

ClassMethod py() [ Language = python ]

{

   import iris

   rtn = "^test"
#  変数argのdictionary構造にa = 10, b = 20を設定
   arg = {"a":10, "b":20}

   ret = iris.cls('User.test').callrtn(rtn, arg)

# 戻り値のdictionary変数retにローカル変数sumの値が設定されている   
   print (ret.get("sum"))

}

 

次にルーチンを呼び出すためのクラスメソッドを定義します。

PythonのDictionary構造をObjectScriptで操作するためには、少し特別な処理が必要です。

ClassMethod callrtn(rtnname As %String, plist As %String) As %Integer [ ProcedureBlock = 0 ]

{
    // python dictから変数を取得
    set a = plist."get"("a")
    set b = plist."get"("b")
    
   // 2. ルーチンを実行する
   do @rtnname

   // 3. ローカル変数 ==> 戻り値 (python dict)
   kill rtnname,plist

   set ret = ##class(%SYS.Python).Builtins().dict()

   // 存在するローカル変数からdictionaryを生成する    set %="%"
   for {
       // ローカル変数を順番に取得
       set %=$Order(@%)

       quit:%=""        
       //変数retは除く
       continue:%="ret"
       do ret.setdefault(%, @%)

   }

   quit ret

}

 

2023.2以降のバージョンではarrayrefのサポートが追加されており、より直感的な処理が可能になりました。

 

ClassMethod py() [ Language = python ]
{
    import iris
    rtn = "^test"
    arg = {"a":10, "b":20}
    ar = iris.arrayref(arg)
    ret = iris.cls('Test.pytest').callrtn(rtn,ar)

    print (ret.get("sum"))
}

 

ClassMethod callrtn(rtnname As %String, plist As %String) As %Integer [ ProcedureBlock = 0 ]
{

    set a = plist("a")
    set b = plist("b")

    // ルーチン実行
    do @rtnname

    //ローカル変数 ==> 戻り値(python dict)
    kill rtnname, plist
    set ret = ##class(%SYS.Python).Builtins().dict()
    set % = "%"
    for {
        set %=$order(@%)
        quit:%=""
        continue:%="ret"
        do ret.setdefault(%, @%)
    }
    quit ret
}
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください