こんにちは、GMOアドマーケティングのM.H.と申します!
大量のデータを扱うとき、データベースを活用しよう。というのは自然な流れだと思います。MySQLやMariaDB…データ間に関連性のある場合にはとても強力な武器になりますが、今回はそのようなRDBMSではなく、NoSQLであるAerospikeについて簡単に書いていこうと思います。
Aerospike(NoSQL)とは
NoSQLとは、ざっくりと言って関係モデルにならない形でのデータベースの管理システムのことです。ちなみにNoSQLはNot only SQLの略とされるのが普通らしいです。(最初何も考えずNo SQLだと思っていました)
基本的にNoSQLにおいてデータの取得や更新はかなり高速です。データの持たせ方には色々ありますが、たとえば1つのレコードをkeyとvalueとして保管する、いわゆるkey-value型のデータベースなどもNoSQLにあたり、このようなモデルによって高速化を図っています。
Aerospikeとは、そんなNoSQLの1つであり、key-value型のデータベースです。
導入
今回はCentOS7に入れますが、他のバージョンやディストリビューションに入れたい場合は、参照先が変わるので、こちらを参考にしてURLを適宜変更してください。
1 2 3 4 5 |
$ sudo yum install wget $ wget -O aerospike.tgz 'https://www.aerospike.com/download/server/latest/artifact/el7' $ tar -xvf aerospike.tgz $ cd aerospike-server-community-5.6.0.5-el7 $ sudo ./asinstall |
これで導入完了です。たった数行でできちゃいます。
また、Aerospike Server 5.1以降をインストールする場合は、libcurl
ライブラリを導入しておく必要があります。
1 2 3 4 5 |
$ sudo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/city-fan.org-release-2-1.rhel7.noarch.rpm $ sudo yum -y install libcurl libcurl-devel --enablerepo=city-fan.org # curlの最新版が入っていることを確認 $ curl -V |
以下のコマンドを入力して、Aerospikeを起動してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo systemctl start aerospike $ sudo systemctl status aerospike ● aerospike.service - Aerospike Server Loaded: loaded (/usr/lib/systemd/system/aerospike.service; disabled; vendor preset: disabled) Drop-In: /etc/systemd/system/aerospike.service.d └─aerospike.conf Active: active (running) since Fri 2021-05-28 10:12:51 UTC; 13min ago Process: 1726 ExecStartPre=/bin/systemctl start aerospike_telemetry (code=exited, status=0/SUCCESS) Process: 1719 ExecStartPre=/usr/bin/asd-systemd-helper (code=exited, status=0/SUCCESS) Main PID: 1729 (asd) CGroup: /system.slice/aerospike.service └─1729 /usr/bin/asd --config-file /etc/aerospike/aerospike.conf --fgdaemon |
aql
Aerospikeには、AQL(Aerospike Query Language)というCLIがあり、SQLライクに使用することができます。
たとえば、データを挿入したい場合には insert into 、参照したい場合は select from など、SQLを扱うような感覚で簡単な操作が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ aql aql> insert into test.hoge (PK, number, string) values (1, 1, "a")" OK, 1 record affected. aql> select * from test.hoge; +--------+--------+ | number | string | +--------+--------+ | 1 | "a" | +--------+--------+ 1 row in set (0.093 secs) OK aql> delete from test.hoge where PK = 1 OK, 1 record affected. aql> select * from test.hoge; 0 rows in set (0.093 secs) OK |
PKはprimary keyのことで、ここで指定した値をハッシュ化しています。値の型に指定はありませんが、入力は必須です。また、cオプション(–command)を付けることでターミナル上からコマンドを実行することもできます。
1 2 3 |
$ aql -c "insert into test.hoge (PK, number, string) values (1, $RANDOM, 'b')" insert into test.hoge (PK, number, string) values (1, 30447, 'b') OK, 1 record affected. |
ここで、SQLとは違う細かい操作についてまとめると
- Aerospikeはスキーマレスのため、複数のvalueを一度にinsertできない
- データの更新は既存のPKを指定してもう一度 insert into を実行する
- クエリの末尾にセミコロンを入れる必要がない
などがあります。
aerospike.conf
Aerospikeは、1つのconfファイルを使用してデータベースのノードの構成を指定します。これが aerospike.conf です。このファイルを変更してAerospikeを再起動すると、設定が変更されていることが確認できます。試しにクエリの実行ログを標準出力ではなく、メッセージの重要度に応じて出力先を変えてみましょう。
設定ファイルの場所はデフォルトで /etc/aerospike/aerospike.conf です。中身を開いて、loggingについて編集してみます。事前に /var/log/aerospike ディレクトリを作成しておいてください。
1 2 3 4 5 6 7 8 |
logging { file /var/log/aerospike/aerospike.log { context any info } console { context any critical } } |
これで、基本的な情報は外部ファイルに出力されつつ、致命的なバグが発生した時には標準出力されます。外部ファイルへの出力は自動的にログローテートされます。
設定を適応するには以下のコマンドでAerospikeを再起動する必要があります。
1 2 |
$ sudo systemctl restart aerospike $ sudo systemctl status aerospike |
以下では、他の設定としてnamespaceの構成についていくつか触れていきます。
データストレージ
Aerospikeは基本的にはハッシュ化したkeyをメモリ上に、データをSSDなどのストレージ上に保管します。これにより高速なデータへのアクセスを可能にしています。データの数が多くなければ、valueを明示的にメモリ上に格納することも可能です。(Redisのような使い方)
1 2 3 4 5 6 7 8 |
namaspace test { memory-size 4G # 1 storage-engine memory # 2 storage-engine device { # 3 device /dev/sdb write-block-size 128K } } |
- primary keyを保存するためのメモリ使用領域
- valueをRAMに保存する
- valueをストレージに保存する
valueをRAMに保存する場合には、データは揮発しますので、 Aerospikeの再起動をかけた時には消失します。ストレージに保存する場合は df コマンドなどで参照できるデバイスを確認し、保存対象のストレージを指定します。この時は、Aerospikeの再起動をかけてもデータは永続します。上の例で#2か#3を選ぶことになります。
SSDストレージを保存対象にする時には、 write-block-size の値をデフォルトである1MBから減らした方がいいです。このオプションは、ディスクに書き込まれるI/Oブロックのサイズですが、大きい値だとその分パフォーマンスは下がります。SSDに書き込む場合基本的には128KBを指定すると良いらしいです。実際は格納したいvalueの最大サイズと相談の必要があるかと思います。ただし、指定する値は2の累乗値でなければいけません。
レプリケーション
Aerospikeの強みとして、自動migrationがあります。クラスタに新しいサーバを投入するときも、フェイルオーバー時にも勝手にやってくれます。
replication-factor で設定できます。
1 2 3 |
namespace test { replication-factor 3 } |
注意すべき点としては以下の2つがあります。
- この値を変更した場合、クラスターを完全再起動する必要があるため、実運用前に注意深く設定する必要がある。
- このファクター数はmasterも含む。3を設定した場合、データはmaster・slave1・slave2という状態でクラスタに保存される。
データの有効期限
流動性のあるデータをどんどん格納したいユースケースなどでは、古いデータを優先的に消去していきたい場合が出てくると思います。それを可能にするのが、データにexpiration(有効期限)を設定することです。TTL(Time To Live)とも呼ばれます。Aerospikeでは以下のように設定します。
1 2 3 4 |
namespace test { nsup-period 10S default-ttl 60S } |
default-ttl で設定します。単位は秒 (S)、分(M)、時(H)、日(D)から設定でき、何も指定しないか0を明示的に指定する場合にはデータは永久存続します。また、データの期限や削除に関する処理のインターバルを設定する nsup-period を明示的に設定する必要があります。上の例では、データが最終更新されてから60秒後に削除されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ aql -c "insert into test.fuga (PK, number, string) values (1, $RANDOM, 'EXPIER')" insert into test.fuga (PK, number, string) values (1, 30545, 'EXPIER') OK, 1 record affected. $ date Mon May 31 07:07:25 UTC 2021 $ aql -c "select * from test.fuga" select * from test.fuga +--------+----------+ | number | string | +--------+----------+ | 30545 | "EXPIER" | +--------+----------+ 1 row in set (0.098 secs) OK $ date Mon May 31 07:08:58 UTC 2021 $ aql -c "select * from test.fuga" select * from test.fuga 0 rows in set (0.066 secs) OK |
また、これらの設定を行わないと、Aerospikeが対応している各クライアント上でも有効期限を設定できないことに注意してください。
まとめ
今回はAerospikeの、結構基本的な部分をつらつらと書いてみましたが、NoSQLという分野自体かなり幅広く、様々な特徴があるので、他のプロダクトとの比較なども今後触れていきたいです!