Aerospikeを使ってみる：Dockerを使ってCRUDのテストと管理

# はじめに
[前の記事](https://qiita.com/aerospike_nakadai/items/ac879d857c97d9c9428e "Aerospikeを使ってみる：Windows11環境のDockerを使って起動")で、AerospikeをWindows11上にDockerで起動する方法を説明しました。
この記事では、起動してAerospikeを使ってみます。
環境は、前回のWindows11上のDockerを想定していますが、他のDockerを使える環境でも同様です。

# AerospikeのデータのCRUD操作
Aerospikeを本格的に使用する場合は、Aerospike Client Libraryを使用しプログラムを開発していただくか、Connectorを経由し他のシステムからアクセスしていただく必要があります。
ここでは、テストなどで使用する、簡単にデータのCRUDを行う方法を記載します。

テストのためなどでデータのCRUDを行うツールとして、Aerospikeからaqlというツールが提供されています。
https://docs.aerospike.com/tools/aql

1. aqlの実行
    aqlは、linux環境とmacにインストールして利用することもできますが、ここではdockerで起動します。
    Ubuntから以下を実行してください。

    ```
    sudo docker run -it aerospike/aerospike-tools aql --host=$(sudo docker inspect -f '{{.NetworkSettings.IPAddress }}' [コンテナ名])
    ```
    [コンテナ名]は上記のaerospikeのコンテナ名に変更してください。
    Docker以外の環境にアクセスする場合は、`--host=`の後にIPアドレスかホスト名を指定してください。
1. 使用方法
    aqlの使用方法は、`aql> `プロンプトに`help`と入力すると表示されます。
    ```
    aql> help
    ```
    Aerospikeにアクセスするには、対象となるnamespaceの名称が必要です。dockerで起動したAerospikeでは`test`というnamespaceが作成されています。確認する方法は、以下になります。
    ```
    aql> show namespaces
    +------------+
    | namespaces |
    +------------+
    | "test"     |
    +------------+
    [172.17.0.2:3000] 1 row in set (0.010 secs)

    OK
    ```

1. レコードの作成
    Aerospikeではレコードの作成と更新は同じコマンドになります。ここではレコードの作成を説明します。
    以下では、KEYを数値で`1234`、`name`というbinに`nakadai`、`age`というbinに`22`という値でレコードを作成します。
    RDBのテーブルに該当するsetは、`employee`とします。
    作成・更新の仕様は以下の通りです。
    ```
    INSERT INTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)
    ```
    以下でレコードが作成できます。
    ```
    aql> insert into test.employee (PK,name,age) values (1234,'nakadai',22)
    OK, 1 record affected.
    ```
1. レコードの参照
    参照の仕様は以下の通りです。
    ```
    SELECT <bins> FROM <ns>[.<set>]
    SELECT <bins> FROM <ns>[.<set>] WHERE PK = <key>
    ```
    HELPには、binの値を使った参照方法が表示されますが、それを利用するためには対象のbinにsecondary indexを追加する必要があります。そのため、ここでは説明は省略します。

    実際に、前に作成したレコードを参照します。
    setに含まれるレコードすべてを表示する方法は以下の通りです。
    ```
    aql> select * from test.employee
    +------+-----------+-----+
    | PK   | name      | age |
    +------+-----------+-----+
    | 1234 | "nakadai" | 22  |
    +------+-----------+-----+
    1 row in set (0.024 secs)

    OK
    ```
    KEYを指定して表示する方法は以下の通りです。
    ```
    aql> select * from test.employee where pk=1234
    +------+-----------+-----+
    | PK   | name      | age |
    +------+-----------+-----+
    | 1234 | "nakadai" | 22  |
    +------+-----------+-----+
    1 row in set (0.000 secs)

    OK
    ```
1. レコードの更新
    前に記載した通り、レコードの作成と更新は同じコマンドになります。ここではレコードの更新を説明します。
    先ほど作成したレコードの`age`のみを更新し、更新結果を表示します。
    ```
    aql> insert into test.employee (PK,age) values (1234,23)
    OK, 1 record affected.

    aql> select * from test.employee where pk=1234
    +------+-----------+-----+
    | PK   | name      | age |
    +------+-----------+-----+
    | 1234 | "nakadai" | 23  |
    +------+-----------+-----+
    1 row in set (0.000 secs)

    OK
    ```

1. レコードの削除
    レコードの削除の仕様は以下の通りです。
    ```
    DELETE FROM <ns>[.<set>] WHERE PK = <key>
    ```
    以下で、先ほど作成したレコードが削除できます。
    ```
    aql> delete from test.employee where pk=1234
    OK, 1 record affected.

    aql> select * from test.employee where pk=1234
    Error: (2) 172.17.0.2:3000 AEROSPIKE_ERR_RECORD_NOT_FOUND
    ```

以上が基本的なaqlの使用方法です。
このツールはあくまでもテストや確認用のツールです。
RDBでselect文を使用するように、このツールや言語仕様はご利用いただけませんので、ご注意ください。

### Aerospikeの管理

Aerospikeのレコード数やメモリ等の仕様情報の確認、設定の変更をするツールが、asadmです。
https://docs.aerospike.com/tools/asadm

1. asadmの実行
    asadmは、linux環境とmacにインストールして利用することもできますが、ここではdockerで起動します。
    Ubuntから以下を実行してください。
    ```
    sudo docker run -it aerospike/aerospike-tools asadm --host=$(sudo docker inspect -f '{{.NetworkSettings.IPAddress }}' [コンテナ名])
    ```
    [コンテナ名]は上記のaerospikeのコンテナ名に変更してください。
    Docker以外の環境にアクセスする場合は、`--host=`の後にIPアドレスかホスト名を指定してください。
1. 使用方法
    asadmの使用方法は、`Admin> `プロンプトに`help`と入力すると表示されます。
    ```
    Admin> help
    ```

1. 概要の表示
    Aerospikeの概要の表示は、以下のように、`summary`と入力してください。

    ```
    Admin> summary
    ~~~~~~~~~~~~~~~~~~Cluster Summary~~~~~~~~~~~~~~~~~~~
    Migrations                |False
    Server Version            |E-6.1.0.3
    OS Version                |--
    Cluster Size              |1
    Devices Total             |1
    Devices Per-Node          |1
    Devices Equal Across Nodes|True
    Memory Total              |1.000 GB
    Memory Used               |0.000 B
    Memory Used %             |0.0
    Memory Avail              |1.000 GB
    Memory Avail%             |100.0
    Device Total              |4.000 GB
    Device Used               |0.000 B
    Device Used %             |0.0
    Device Avail              |3.960 GB
    Device Avail%             |99.0
    License Usage Latest      |0.000 B
    Active                    |0
    Total                     |1
    Active Features           |KVS,Primary Index Query
    Number of rows: 21
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Namespace Summary~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Namespace|~~~~Drives~~~~|~~~~~~~Memory~~~~~~~|~~~~~~~Device~~~~~~~|Replication| Master|~License~
             |Total|Per-Node|   Total|Used|Avail%|   Total|Used|Avail%|    Factors|Objects|~~Usage~~
             |     |        |        |   %|      |        |   %|      |           |       |   Latest
    test     |    1|       1|1.000 GB| 0.0| 100.0|4.000 GB| 0.0|  99.0|          1|0.000  | 0.000 B
    Number of rows: 1
    ```

1. 詳細の表示
    Aerospikeの詳細の表示は、以下のように、`info`と入力してください。 
    ```
    Admin> info
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Network Information (2022-12-26 16:35:47 UTC)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               Node|         Node ID|             IP|    Build|Migrations|~~~~~~~~~~~~~~~~~~Cluster~~~~~~~~~~~~~~~~~~|Client|  Uptime
                   |                |               |         |          |Size|         Key|Integrity|      Principal| Conns|
    172.17.0.2:3000|*BB9020011AC4202|172.17.0.2:3000|E-6.1.0.3|   0.000  |   1|C31E67B4DB7B|True     |BB9020011AC4202|     7|03:18:11
    Number of rows: 1
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Namespace Usage Information (2022-12-26 16:35:47 UTC)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Namespace|           Node|  Total|Expirations|Evictions|  Stop|~~~~~~~~~~Device~~~~~~~~~~|~~~~~~~~~~Memory~~~~~~~~~|~Primary~
             |               |Records|           |         |Writes|    Used|Used%|HWM%|Avail%|    Used|Used%|HWM%|Stop%|~~Index~~
             |               |       |           |         |      |        |     |    |      |        |     |    |     |     Type
    test     |172.17.0.2:3000|0.000  |    0.000  |  0.000  |False |0.000 B |  0.0|   0|    99|0.000 B |  0.0|   0|   90|shmem
    test     |               |0.000  |    0.000  |  0.000  |      |0.000 B |  0.0|    |      |0.000 B |  0.0|    |     |
    Number of rows: 1
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Namespace Object Information (2022-12-26 16:35:47 UTC)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Namespace|           Node|Rack|  Repl|  Total|~~~~~~~~~~Objects~~~~~~~~~~|~~~~~~~~~Tombstones~~~~~~~~|~~~~Pending~~~~
             |               |  ID|Factor|Records| Master|  Prole|Non-Replica| Master|  Prole|Non-Replica|~~~~Migrates~~~
             |               |    |      |       |       |       |           |       |       |           |     Tx|     Rx
    test     |172.17.0.2:3000|   0|     1|0.000  |0.000  |0.000  |    0.000  |0.000  |0.000  |    0.000  |0.000  |0.000
    test     |               |    |      |0.000  |0.000  |0.000  |    0.000  |0.000  |0.000  |    0.000  |0.000  |0.000
    Number of rows: 1
    ```

1. その他の操作
    asadmでは、他に設定の確認、設定の変更、パーティションの確認など様々な機能があります。
    サイトやhelpでご確認ください。また、何かご質問があればお気軽にコメントください。

### TOOLSの利用
上記のaqlとasadmは、aerospike-toolsに含まれるツールです。
他にも様々なツールがあります。
https://docs.aerospike.com/tools

これらのツールをdockerで使用するための情報は以下をご覧ください。
https://hub.docker.com/r/aerospike/aerospike-tools

このdockerで提供するaerospike-toolは、以下で構成されます。
- asinfo
    - 設定の確認、変更を行う。
- asadm
    - 前述の通り、クラスターの管理を行う。上記のasinfoはノード毎の管理になるが、asadmではすべてのノードの管理を同時に行うことができる。
- asloglatency
    - ログファイルから、latencyとThrouphputを表示する。
- aql
    - 前述の通り、レコードの管理を行う。
- asbackup
    - レコードのバックアップを行う。
- asrestore
    - バックアップされたレコードのリストアを行う。
- asbenchmark
    - Aerospikeのベンチマークを実施する。
- asvalidation
    - サーバーのバージョンアップに伴うデータの整合性のチェックを行う。
- asloader
    - JSONファイルからレコードを追加する。
    
上記の説明は以下をご覧ください。
https://docs.aerospike.com/tools/deploy_guides/docker/tools#usage

# 最後に
以上で、Aerospikeは周辺ツールも充実しています。
ぜひこれらを使って、Aerospikeを身近に感じていただければ幸いです。

また、複数ノード対応やAerospike Client Libraryの使用方法なども、今後記載していきます。