IBM Netcool/OMNIbus ObjectServerの冗長構成

## はじめに
IBM Netcool/OMNIbusのObjectServerを冗長構成とする手順を備忘録としてここに整理しておく。

:::note
本記事の内容はObjectServerを冗長構成で稼働させるために最低限必要な設定のみを記載しています。
:::

## 本記事での構成

* 正Netcoolサーバー
  * ObjectServer（NCOMSPRI）
- 副Netcoolサーバー
  * ObjectServer（NCOMSBAK）
  * Bidirectional gateway（BIGW）

カッコ内はObjectServerおよびBi-Gatewayの名前。
仮想ObjectServer名は NCOMS とする。
また、両サーバー同士で名前解決できるようhostsファイル等の設定を行っておく。


## インストール

冗長構成のObjectServerの構築に最低限必要なインストール・フィーチャーは以下の通り。（よくわからない場合は全フィーチャーを導入するのが無難）

* ObjectServer
* ObjectServer ゲートウェイ
* ゲートウェイ・サポート
* 拡張機能


## omni.datファイルの定義

$NCHOME/etc/omni.dat
```
[NCOMS]
{
        Primary: <正サーバーホスト名> 4100
        Backup:  <副サーバーホスト名> 4100
}
[NCOMSPRI]
{
        Primary: <正サーバーホスト名> 4100
}
[NCOMSBAK]
{
        Primary: <副サーバーホスト名> 4100
}
[BIGW]
{
        Primary: <副サーバーホスト名> 4300
}
```

omni.datの更新後は $NCHOME/bin/nco_igen の実行を忘れずに。


## ObjectServerのセットアップ
前提
* ObjectServerの各テーブルの構造は正副で合わせておくことが基本
* nco_dbinitでObjectServerを初期化した直後の状態は正副で内容が一致しているので心配いらないが、既存テーブルにカラムを追加する等した場合は注意
* 正副でテーブル構成が一致しているかどうか不明の場合は、nco_confpack/nco_osreportを使ったバックアップ＆リストアにてどちらかのDBをマスターとした構成の同期を行う

前提を満たして正副ObjectServerの起動まで完了したら、以下を実施して冗長構成のセットアップを行っていく。

### 正副ObjectServer共通の設定

基本的にはObjectServerのプロセスを起動した状態で設定を行う。

#### aggregation.sqlの実行

ObjectServer起動状態で以下のコマンドを実行する（正副サーバーで実行）。

正サーバー

```bash
$NCHOME/omnibus/bin/nco_sql -server NCOMSPRI -user root -password "<rootのﾊﾟｽﾜｰﾄﾞ>"  < $OMNIHOME/extensions/multitier/objectserver/aggregation.sql
```

副サーバー

```bash
$NCHOME/omnibus/bin/nco_sql -server NCOMSBAK -user root -password "<rootのﾊﾟｽﾜｰﾄﾞ>"  < $OMNIHOME/extensions/multitier/objectserver/aggregation.sql
```

#### Bidirectional Gateway用ユーザーの作成（オプション）

Bidirectional Gateway（以下Bi-Gateway）が正副ObjectServerに接続するためのユーザーを作成する。（デフォルトで存在するrootで接続してもいいが専用ユーザーの作成を推奨）

$OMNIHOME/bin/nco_sqlコマンドでObjectServerに接続し、以下を実行（正副サーバーで実行）。

```
1> create user '<ユーザー名>' full name '<任意のフルネーム>' password;
2> go

1> alter group 'Gateway' assign members '<ユーザー名>';
2> go
```
※ユーザー名は任意


### 正ObjectServerの設定

以下のトリガーを有効化する。
* pass_deletes

CLIで有効化する場合はnco_sqlコマンドで正ObjectServerに接続して以下を実行。
```
1> alter trigger pass_deletes set enabled true;
2> go
```


### 副ObjectServerの設定

$OMNIHOME/etc/NCOMSBAK.props を編集し、以下のパラメータを設定する。


```
ActingPrimary: FALSE      （デフォルト：TRUE）
BackupObjectServer: TRUE  （デフォルト：FALSE）
```

設定後は副ObjectServerを再起動する。
再起動後、続いてnco_sqlで副ObjectServerに接続して以下のトリガーを有効化する（コマンドは上記参照）。
* backup_counterpart_down
* backup_counterpart_up
* backup_startup
* pass_deletes
* resync_finished


## Bi-Gatewayの設定

### 設定ファイルの準備

Bi-Gateway用設定ファイルのテンプレートを$OMNIHOME/etc/ 以下にコピーする。

```bash
cd $NCHOME/omnibus/gates/objserv_bi/
cp objserv_bi.props $NCHOME/omnibus/etc/BIGW.props
cp objserv_bi.map $NCHOME/omnibus/etc/BIGW.map
cp objserv_bi.objectservera.tblrep.def $NCHOME/omnibus/etc/BIGW.objectservera.tblrep.def
cp objserv_bi.objectserverb.tblrep.def $NCHOME/omnibus/etc/BIGW.objectserverb.tblrep.def
cp objserv_bi.startup.cmd $NCHOME/omnibus/etc/BIGW.startup.cmd
```

:::note info
propsファイル以外はコピー先は任意ですが、 $OMNIHOME/etc/以下にまとめておく方が管理がしやすいです。
:::


### 設定ファイルの編集
* $NCHOME/omnibus/etc/BIGW.props


各パラメータはコメントアウトされているので、設定するパラメータのコメントを外した上で以下のように設定する。

```
MessageLog                              : '$OMNIHOME/log/BIGW.log'
Name                                    : 'BIGW'
PropsFile                               : '$OMNIHOME/etc/BIGW.props'

Gate.MapFile                            : '$OMNIHOME/etc/BIGW.map'
Gate.StartupCmdFile                     : '$OMNIHOME/etc/BIGW.startup.cmd'

Gate.ObjectServerA.Server               : 'NCOMSPRI'
Gate.ObjectServerA.Username             : '<gateway用ユーザー>'
Gate.ObjectServerA.Password             : '<gateway用パスワード>'
Gate.ObjectServerA.TblReplicateDefFile  : '$OMNIHOME/etc/BIGW.objectservera.tblrep.def'

Gate.ObjectServerB.Server               : 'NCOMSBAK'
Gate.ObjectServerB.Username             : '<gateway用ユーザー>'
Gate.ObjectServerB.Password             : '<gateway用パスワード>'
Gate.ObjectServerB.TblReplicateDefFile  : '$OMNIHOME/etc/BIGW.objectserverb.tblrep.def'

Gate.ObjectServerA.Description          : 'failover_gate'
Gate.ObjectServerB.Description          : 'failover_gate'
```

* $OMNIHOME/etc/BIGW.objectservera.tblrep.def
* $OMNIHOME/etc/BIGW.objectserverb.tblrep.def

この2ファイルの編集はオプション。
正副ObjectServer間でユーザー＆パスワード情報を同期させたい場合は35-65行目のコメントを外して以下のようにする。

```
REPLICATE ALL FROM TABLE 'security.users'
        USING MAP 'SecurityUsersMap'
        INTO 'transfer.users';

REPLICATE ALL FROM TABLE 'security.groups'
        USING MAP 'SecurityGroupsMap'
        INTO 'transfer.groups';

REPLICATE ALL FROM TABLE 'security.roles'
        USING MAP 'SecurityRolesMap'
        INTO 'transfer.roles';

REPLICATE ALL FROM TABLE 'security.role_grants'
        USING MAP 'SecurityRoleGrantsMap'
        INTO 'transfer.role_grants';

REPLICATE ALL FROM TABLE 'security.group_members'
        USING MAP 'SecurityGroupMembersMap'
        INTO 'transfer.group_members';

REPLICATE ALL FROM TABLE 'catalog.restrictions'
        USING MAP 'CatalogRestrictionFiltersMap'
        INTO 'transfer.restrictions';

REPLICATE ALL FROM TABLE 'security.restriction_filters'
        USING MAP 'SecurityRestrictionFiltersMap'
        INTO 'transfer.security_restrictions';

REPLICATE ALL FROM TABLE 'security.permissions'
        USING MAP 'SecurityPermissionsMap'
        INTO 'transfer.permissions';
```


* $OMNIHOME/etc/BIGW.map

上で \<Bi-Gateway名>.objectserver*.tblrep.def を編集してユーザー情報を同期させる設定にした場合はこちらのファイルの編集も必須となる。
以下のように135-205行目のコメントを外す。

```
CREATE MAPPING SecurityUsersMap
(
        'UserID'        =       '@UserID'               ON INSERT ONLY,
        'UserName'      =       '@UserName',
        'SystemUser'    =       '@SystemUser',
        'FullName'      =       '@FullName',
        'Passwd'        =       '@Passwd',
        'UsePAM'        =       '@UsePAM',
        'Enabled'       =       '@Enabled'
);
　　：
（中略）
　　：
CREATE MAPPING SecurityPermissionsMap
(
        'ApplicationID'         = '@ApplicationID'      ON INSERT ONLY,
        'ObjectType'            = '@ObjectType'         ON INSERT ONLY,
        'Object'                = '@Object'             ON INSERT ONLY,
        'GranteeType'           = '@GranteeType'        ON INSERT ONLY,
        'GranteeID'             = '@GranteeID'          ON INSERT ONLY,
        'Allows'                = '@Allows',
        'Denies'                = '@Denies',
        'GrantOptions'          = '@GrantOptions'
);
```

## 稼働確認
最後に副NetcoolサーバーにてBi-Gatewayを起動して、稼働確認を行う。