Aerospikeことはじめ　～DockerイメージでAerospikeをローカル環境構築～


# はじめに
お仕事でAerospikeを使うことになったので勉強めも👊
まずはAerospikeとはなんぞやを知ることとと
ローカル環境で簡単に動作確認するところまで。

# Aerospikeとは？

## 概要
高速な分散KVS型のNoSQLデータベース。
SSDに最適化されてるから早いのとスケーラビリティの機能があるよというようなことがウリらしい。

【引用】
[Aerospike概要](https://aerospike.com/jp/home/)から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/dd10e618-1999-3694-7c5f-03a37b4d94ee.png)

[Aerospikeユースケース](https://aerospike.com/jp/use-cases/)から
> また、MemcacheやRedisと比較すると、Aerospikeにはクラスタリング機能が組み込まれており、高性能なフラッシュストレージ(SSD)を使用できます。ベンチマークによると、Aerospikeの単一サーバの速度はRedisやMemcacheの両方に匹敵することが示されていますが、Aerospikeには自動クラスタリングと透過的なリシャーディングの機能が含まれています。これにより、ノードを起動するだけで容量を追加できます。継続的なデフラグとデータ消去、Memcacheのようなチェック&セット操作により、使い慣れた、かつ、必要な機能が提供されます。

## データ構造

[公式ページ Data Modelより](https://docs.aerospike.com/docs/architecture/data-model.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712352/1461ffc8-3d61-a088-d7ca-906310210a8f.png)

RDBに置き換えると下記のようなイメージらしい

|Aerospike|RDB|
|:-:|:-:|
|Namespace|Database|
|Set|Table|
|Record|Row|
|Bin|Column|

とりあえず今回はローカルで動かすだけなので
この程度の知識だけ押さえておく。

# インストール環境

|ソフトウェア|バージョン|
|:-:|:-:|
|OS|Windows10|
|Docker Engine|20.10.5|

# インストール

## 1. DockerイメージDL

今回はAerospike公式が配布しているDockerイメージをDLして構築する。
[Aerospike公式DockerHub]
(https://hub.docker.com/_/aerospike)

以下が無料のCommunityEditionっぽいので`docker pull`。

```:コマンド
docker pull aerospike:ce-5.5.0.9
```

```:実行結果
ce-5.5.0.9: Pulling from library/aerospike
62deabe7a6db: Pull complete
6b52c9d72afa: Pull complete
6d38b2c09d49: Pull complete
7bcce1b84cb4: Pull complete
Digest: sha256:a26a8b17bded550b130952bc012d435e52326de11fbe003f7e2dbc4d42006e9d
Status: Downloaded newer image for aerospike:ce-5.5.0.9
docker.io/library/aerospike:ce-5.5.0.9
```

`docker images`で以下の`aerospike`があればOK。

```:DockerイメージDL確認
>docker images
REPOSITORY               TAG          IMAGE ID       CREATED       SIZE
aerospike                ce-5.5.0.9   76214490c04c   2 weeks ago   195MB
```

## 2. Aerospike起動
以下の`docker run`コマンドで起動。
EnterpriseEditionならFEATURE_KEY_FILEなるものが必要だが、CommunityEditionは不要。

```:起動コマンド
docker run -d -v DIR:/opt/aerospike/etc/ --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 aerospike:ce-5.5.0.9
```

`docker ps`で`aerospike`が動いてたらOK。

```:起動確認
>docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                        NAMES
8064986acda1   aerospike:ce-5.5.0.9   "/usr/bin/dumb-init …"   16 minutes ago   Up 16 minutes   0.0.0.0:3000-3002->3000-3002/tcp, 3003/tcp   aerospike
```

## 3. Aerospike動作確認

以下のコマンドでコンテナにログイン

```:ログインコマンド
docker exec -it aerospike /bin/bash
```

Keyを指定してデータの登録、参照などをするだけなら
`ascli`というCLIを使えばシンプルなコマンドで確認できるのだが、このDockerイメージに入ってなかった？ので
その代わりにSQLのようなAerospike独自のクエリ言語`AQL(Aerospike Query Language) `を使用する。
コンテナ内で`aql`コマンドを叩けばaqlプロンプトモードになる。

```:aqlコマンド実行
# aql
Seed:         127.0.0.1
User:         None
Config File:  /etc/aerospike/astools.conf /root/.aerospike/astools.conf
Aerospike Query Client
Version 5.0.1
C Client Version 4.6.17
Copyright 2012-2020 Aerospike. All rights reserved.
aql>
```

AQLの各クエリ構文を知りたかったら、
aqlプロンプトモードで`HELP 〇〇〇`を叩けば説明文が出る。
例えば、INSERTクエリを知りたければ下記の通り。

```:HELP文実行
aql> HELP INSERT
  DML
      INSERT INTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)
      DELETE FROM <ns>[.<set>] WHERE PK = <key>
      TRUNCATE <ns>[.<set>] [upto <LUT>]

          <ns> is the namespace for the record.
          <set> is the set name for the record.
          <key> is the record's primary key.
          <bins> is a comma-separated list of bin names.
          <values> is comma-separated list of bin values, which may include type cast expressions. Set to NULL (case insensitive & w/o quotes) to delete the bin.
          <LUT> is last update time upto which set or namespace needs to be truncated. LUT is either nanosecond since Unix epoch like 1513687224599000000 or in date string in format like "Dec 19 2017 12:40:00".

          ～省略～
```
こんな感じでメチャクチャ長い説明文が出てくる。
他のクエリのHELPコマンドは下記を参照。
https://docs.aerospike.com/docs/tools/aql#starting-aql-and-running-commands

とりあえず、挿入・参照・削除をしてみる。

### 挿入
[構文]
`INSERT INTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)`

```:挿入例
aql> INSERT INTO test.NintenGames (PK, Name, Release) VALUES ('SMB', 'SuperMarioBros', 1983)
OK, 1 record affected.

aql> INSERT INTO test.NintenGames (PK, Name, Release) VALUES ('LOZ', 'LegendOfZelda', 1986)
OK, 1 record affected.

aql> INSERT INTO test.NintenGames (PK, Name, Release) VALUES ('PKM', 'Pockemon', 1998)
OK, 1 record affected.
```


### 参照
[構文]
`SELECT <bins> FROM <ns>[.<set>] WHERE PK = <key>`

```:参照例
aql> SELECT Name, Release FROM test.NintenGames WHERE PK = 'LOZ'
+-----------------+----------+
| Name            | Release  |
+-----------------+----------+
| "LegendOfZelda" | 1986     |
+-----------------+----------+
1 row in set (0.000 secs)

OK
```


### 削除
[構文]
`DELETE FROM <ns>[.<set>] WHERE PK = <key>`

```:削除例
aql> DELETE FROM test.NintenGames WHERE PK = 'PKM'
OK, 1 record affected.

aql> SELECT Name, Release FROM test.NintenGames
+------------------+----------+
| Name             | Release  |
+------------------+----------+
| "LegendOfZelda"  | 1986     |
| "SuperMarioBros" | 1983     |
+------------------+----------+
2 rows in set (0.094 secs)

OK
```

おぉ～できた！🤞
これだけならRBDにSQLクエリを投げてるのと同じ感覚。

上記クエリ文中の`test`が`Namespace`で、インストール時のデフォルトのもの。
以下の設定ファイルで確認、および各種設定の追加・変更などができる。

`/etc/aerospike/aerospike.conf `

ちなみに`quit`コマンドでaqlプロンプトから抜けられる。

ひとまず今日はインストールまでなのでここまで。
次回はプログラムからAerospikeにアクセスしてみたいところ。


# 参考
https://aerospike.com/jp/home/
https://docs.aerospike.com/docs/tools/aql/#starting-aql-and-running-commands
https://blog.idcf.jp/entry/2016/08/10/122055
https://recruit.gmo.jp/engineer/jisedai/blog/introducing-high-speed-kvs-aerospike-features-and-user-cases/
https://tech-blog.fancs.com/entry/aerospike-introduction
https://qiita.com/amotz/items/b8f52e9e09bce1ddea6b