WSL経由でWindowsにGridDBをインストールする

WindowsマシンへのGridDBのインストールと利用は、[Docker][1]を利用することで非常に簡単になります。Dockerを利用することで、GridDBをインストールし、必要に応じてネットワーク環境も含めてサイロ化したコンテナ内で管理することができます。この方法は素晴らしいのですが、時にはもっと身近な方法でサーバーを運用したいと思うこともあるでしょう。今回は、DockerやVirtualboxを使わずに、WindowsマシンにGridDBをインストールする方法を紹介します（アプローチはあまり変わりませんが）。

これらの技術を使う代わりに、優れた[Windows Subsystem for Linux][2]を利用することになります。通常wslと略されるこのサブシステムは、開発者が「GNU/Linux環境（ほとんどのコマンドラインツール、ユーティリティ、アプリケーションを含む）を、従来の仮想マシンやデュアルブート設定のオーバーヘッドなしに、変更せずにWindows上で直接実行」できるようにします。基本的に、このツールは、ユーザーがネイティブのWindowsを実行しながら、Windowsマシンでターミナルアプリケーションを開くだけで、Linuxコマンドラインインタフェースにアクセスできるようにするものです。

この記事では、wslの基本的なインストール方法と、GridDBの適切なインストール方法を説明し、WindowsマシンでGridDBを実行するメリットをすべて享受できるようにします。

## WSLのインストール

まず、Windows 10または11の環境が必要です。次に、Windowsのpowershellまたはコマンドプロンプトを管理者権限で開き（右クリック→管理者として実行）、以下のコマンドを入力するだけです。

`wsl --install`

WSLを使い始めるためのもっと詳しい説明は[こちら][3]を参照してください。

重要な注意：私の限られたテストでは、`systemd`（下記参照）を有効にするのは、ここに見られるように、Microsoft Storeの中から直接Ubuntuをインストールする場合にのみ可能なようです：https://ubuntu.com/wsl. ですから、公式ストアからUbuntuをダウンロードした場合、WSLに表示され、通常通り動作します。

WSLをインストールすると、[Ubuntu][4]が利用できるようになり、GridDBのインストール作業を開始することができます。もちろん、[CentOS][5]などのLinuxディストロが好きな方は、マシン上で複数のLinuxサブシステムのインスタンスを実行することができます。

## GridDBのインストール

UbuntuへのGridDBのインストールについては、<https://docs.griddb.net/ja/gettingstarted/using-apt/>に記載されていますが、ここでは基本的な手順を説明します。apt-getのソースリストにGridDBのaptリポジトリを追加し、GridDBのダウンロード先がわかるようにします。追加された後は、apt installを実行するだけで、必要なものをすべて取得し、インストールしてくれます。

```sh
$ sudo sh -c 'echo "deb https://www.griddb.net/apt griddb/5.1 multiverse" >>  /etc/apt/sources.list.d/griddb.list'
$ wget -qO - https://www.griddb.net/apt/griddb.asc | sudo apt-key add -
```

これが追加されると、あとは以下のコマンドを実行するだけで単純にインストールできます。

```sh
$ sudo apt update
$ sudo apt install griddb-meta
```

griddb-metaパッケージには、GridDBサーバ、c_client、jdbc、GridDB CLIが含まれます。

### WSLでのGridDBの実行

そして、ここで通常のUbuntuのインストールプロセスから少し外れる必要があります。

#### SystemdによるWSLでのGridDB構築

デフォルトでは、GridDBを実行する最も簡単な方法はsystemdですが、残念ながらWSLでは利用できません -- ついこの間までは！systemdとは何かというと「"system and service manager" - ユーザ空間のブートストラップとユーザプロセスの管理に使用される init システム」を提供するソフトウェア群です。これがGridDBの文脈で何を意味するかというと、（WSLの）起動時にGridDBを実行し、システムによって管理されるようにすることができます。

そこで、WSLインスタンスでsystemdを有効にするには、お気に入りのテキストエディタを使い、以下のファイルを開きます（まだ存在しない場合は作成します）。

```sh
$ sudo vim /etc/wsl.conf
```

そして、開いたら、次の内容を追加します。

    [boot]
    systemd=true
    

WSLを再起動し、WSLインスタンスを開き直します。

これで、GridDBを起動することができます。

```sh
$ sudo systemctl start gridstore
```

実行されていることを確認するために、`sudo systemctl status gridstore`を実行します。WSL上でGridDBが動作するようになったので、[GridDB CLI][1]または以下の認証情報を使用してNoSQLインタフェースからアクセスできるようになりました。

    notificationMember: 127.0.0.0.1:10001
    user: admin
    password: admin
    cluster: myCluster
    database: public
    

#### Systemd を使用しない WSL での GridDB の使用について

上記の方法は、GridDBを実行する上でより簡単で好ましい方法でありますが、よりアドホックな方法でGridDBを実行したい場合は、代わりに手動で起動・停止することも可能です。

GridDBのインストール時に作成されたGridDBユーザ`gsadm`にログインする。ここから手動でGridDBを起動し、クラスタに参加してGridDBを通常利用することができます。

```sh
$ sudo su gsadm
$ gs_startnode -u admin/admin
```

また、以下のようなエラーが発生した場合は、ご注意ください。

    A00105: GS_HOME, GS_LOG environment variable not set.
    

このエラーは自明ですが、解決するには gsadm の .bash_profile ファイルを source コマンドで読み込んで実行するだけです。

```sh
$ source ~/.bash_profile
```

そして、もう一度挑戦してください。

```sh
$ gs_startnode -u admin/admin
```

そして、クラスタに参加するために以下のコマンドを実行します。

```sh
$ gs_joincluster -c myCluster -u admin/admin
```

そして、全て上手くいっていることを確認しましょう。

```sh
$ gs_stat -u admin/admin
```

    {
        "checkpoint": {
            "backupOperation": 0,
            "duplicateLog": 0,
            "endTime": 1681163543250,
            "mode": "NORMAL_CHECKPOINT",
            "normalCheckpointOperation": 747,
            "pendingPartition": 0,
            "periodicCheckpoint": "ACTIVE",
            "requestedCheckpointOperation": 0,
            "startTime": 1681163543246
        },
        "cluster": {
            "activeCount": 1,
            "applyRuleLimitTime": "2023-04-07T22:09:04.281-08:00",
            "autoGoal": "ACTIVE",
            "clusterName": "myCluster",
            "clusterRevisionId": "db3ff2a8-319e-42d3-8cb2-5ecf1657e0ad",
            "clusterRevisionNo": 8975,
            "clusterStatus": "MASTER",
            "currentRule": "Initial",
            "designatedCount": 1,
            "loadBalancer": "ACTIVE",
            "master": {
                "address": "127.0.0.1",
                "port": 10040
            },
            "nodeList": [
                {
                    "address": "127.0.0.1",
                    "port": 10040
                }
            ],
            "nodeStatus": "ACTIVE",
            "notificationMode": "FIXED_LIST",
            "partitionStatus": "NORMAL",
            "startupTime": "2023-04-07T09:40:58.181-08:00",
            "syncCount": 2
        },
        "currentTime": "2023-04-10T13:53:17-08:00",
        "performance": {
            "backgroundMinRate": 0.1,
            "backupCount": 0,
            "checkpointFileFlushCount": 128,
            "checkpointFileFlushTime": 37,
            "checkpointWrite": 0,
            "checkpointWriteCompressTime": 0,
            "checkpointWriteSize": 0,
            "checkpointWriteTime": 0,
            "currentTime": 1681163597511,
            "dataFileAllocateSize": 0,
            "dataFileSize": 0,
            "dataFileUsageRate": 1,
            "expirationDetail": {
                "batchScanNum": 2000,
                "batchScanTotalNum": 0,
                "batchScanTotalTime": 0,
                "erasableExpiredTime": "",
                "estimatedBatchFree": 0,
                "estimatedErasableExpiredTime": "",
                "lastBatchFree": 0,
                "latestExpirationCheckTime": "Under measurement"
            },
            "logFileFlushCount": 256,
            "logFileFlushTime": 385,
            "numBackground": 0,
            "numConnection": 1,
            "numNoExpireTxn": 0,
            "numSession": 0,
            "numTxn": 0,
            "ownerCount": 128,
            "peakProcessMemory": 136179712,
            "poolBufferMemory": 0,
            "processMemory": 136179712,
            "sqlNumConnection": 1,
            "sqlStoreSwapRead": 0,
            "sqlStoreSwapReadSize": 0,
            "sqlStoreSwapReadTime": 0,
            "sqlStoreSwapWrite": 0,
            "sqlStoreSwapWriteSize": 0,
            "sqlStoreSwapWriteTime": 0,
            "storeCompressionMode": "NO_BLOCK_COMPRESSION",
            "storeDetail": {
                "batchFreeMapData": {
                    "storeMemory": 0,
                    "storeUse": 0,
                    "swapRead": 0,
                    "swapWrite": 0
                },
                "batchFreeRowData": {
                    "storeMemory": 0,
                    "storeUse": 0,
                    "swapRead": 0,
                    "swapWrite": 0
                },
                "mapData": {
                    "storeMemory": 0,
                    "storeUse": 0,
                    "swapRead": 0,
                    "swapWrite": 0
                },
                "metaData": {
                    "storeMemory": 0,
                    "storeUse": 0,
                    "swapRead": 0,
                    "swapWrite": 0
                },
                "rowData": {
                    "storeMemory": 0,
                    "storeUse": 0,
                    "swapRead": 0,
                    "swapWrite": 0
                }
            },
            "storeMemory": 0,
            "storeMemoryLimit": 1073741824,
            "storeTotalUse": 0,
            "swapRead": 0,
            "swapReadSize": 0,
            "swapReadTime": 0,
            "swapReadUncompressTime": 0,
            "swapWrite": 0,
            "swapWriteCompressTime": 0,
            "swapWriteSize": 0,
            "swapWriteTime": 0,
            "totalBackupLsn": 0,
            "totalExternalConnectionCount": 0,
            "totalInternalConnectionCount": 0,
            "totalLockConflictCount": 0,
            "totalOtherLsn": 0,
            "totalOwnerLsn": 0,
            "totalReadOperation": 0,
            "totalRowRead": 0,
            "totalRowWrite": 0,
            "totalWriteOperation": 0,
            "txnDetail": {
                "totalBackgroundOperation": 0
            }
        },
        "recovery": {
            "progressRate": 1
        },
        "version": "5.1.0-39692 CE"
    }
    

## 次のステップへ

GridDBのインストールが完了したら、次は使用するプログラミング言語に合わせたコネクタをインストールし、プログラミングを開始します。より多くの情報は、ここ <https://docs.griddb.net/ja/> にあります。

## まとめ

そして、これでWindowsを使って様々な方法でGridDBを活用することができるようになりました。

 [1]: https://griddb.net/ja/blog/install-griddb-on-windows-via-wsl/
 [2]: https://learn.microsoft.com/ja-jp/windows/wsl/about
 [3]: https://learn.microsoft.com/ja-jp/windows/wsl/install
 [4]: https://ja.wikipedia.org/wiki/Ubuntu
 [5]: https://ja.wikipedia.org/wiki/CentOS