aql
コマンドでキーそのものも確認したい
分散型 KVS である Aerospike では、 aql
という SQL ライクにデータを確認・操作できるコマンドラインインターフェースが提供されています。使える機能はかなり限られているものの、 KVS にもかかわらずまるで RDB であるかのように扱えるので、データの確認には重宝しています。
たとえば、以下のように INSERT
したり SELECT
したりできます。
1 | aql> INSERT INTO test.testset (PK, a, b) VALUES ('xyz', 'abc', 123) |
しかしながらここで注目してもらいたいのが、キーである 'xyz'
が表示されていないということです。
Aerospike は内部的にはキーそのものを使用していない
Aerospike は内部的には、レコードを指定するのにキーそのものではなくそのハッシュ値を使用しています。 Aerospikeのデータモデルの説明 から引用してみます。
Key / Digest
In the application, each record will have a key associated with it. This key is what the application will use to read or write the record.
However, when the key is sent to the database, the key (together with the set information) is hashed into a 160-bit digest. Within the database, the digest is used address the record for all operations.
The key is used primarily in the application, while the digest is primarily used for addressing the record in the database.
The key maybe either an Integer, String, or Bytes value.n
キー / ダイジェスト
アプリケーションの中では、各レコードにはそれに対応するキーがあります。このキーはアプリケーションがレコードを読み出したり書き出したりするのに使うものです。
しかしながら、キーがデータベースに送られるときには、そのキー(とセットの情報)は 160 bit のダイジェストにハッシュ化されます。データベースの中では、すべての操作において、レコードを指定するのにはそのダイジェストが使用されます。
キーは主にアプリケーションの中で使用され、ダイジェストは主にデータベースの中でレコードを指定するのに使用されます。
キーは整数か文字列、バイト値のどれかです。
このような事情のため、 aql
ではそのままではキーが表示されないようです。
Aerospike にキーの情報も格納するには
aql
でキーも表示するようにするためには、まずそもそも Aerospike にキーそのものの情報も格納するようにしなければなりません。つまり、クライアントアプリケーションからデータを送る際に、キーの情報も保存するように明示的に指定する必要があります。どのクライアントライブラリにも WritePolicy.sendKey
のようなフラグがあるはずなので、それを true
に設定します。
たとえば、 Go 言語のサンプルアプリケーションの場合には、以下のようにします。
main.go
1 | package main |
このプログラムを実行してから、 aql
で確認してみます。
1 | $ go run main.go |
きちんとキーも表示されるようになりましたね。