ScyllaDBのマルチノードクラスタ―を構築してみる

# ScyllaDBとは
ScyllaDB(スキュラDB）とは、Apache CassandraをJAVAからC++でリプレースし、Cassandraより10倍以上高速であり、その速さを利用してノード数を1/5～1/10に圧縮できる異次元のデータベースです（スケールアップファーストのクラスター設計思想）。Cassandraとは互換性があり、開発ではCassandraのドライバ―やCQL、各種コネクター、CLIなどをそのまま利用できます。

![scylladb2.png](https://qiita-image-store.s3.amazonaws.com/0/69832/e83f0279-895f-0b7a-b1bc-8dafbdf74d26.png)

- https://www.scylladb.com/open-source/

ここでは、本格的なScyllaDB体験の入口として、マルチノードクラスタ―の構築手順をご紹介します。

# 事前準備

最小構成として3台のサーバが必要です。
筆者は、次のように構成しています。

* 2core/8GB　✖ 3
* Unbuntu16.04

クラウドを利用する場合、次のようなポートを開けておく必要があります。

![scylladb-azure.png](https://qiita-image-store.s3.amazonaws.com/0/69832/930c6b0a-50c4-16e2-27d6-d11e5b030d98.png)


# ScyllaDBのパッケージインストール

パッケージのインストールは、「ScyllaDBのスタンドアロンクラスタ―を構築してみる」を参照してください。パッケージインストール及びScyllaDBセットアップ(scylla_setup)までの手順は、まったく同じです。

[ScyllaDBのスタンドアロンクラスタ―を構築してみる](https://qiita.com/awk256/items/7332cfc3a870506fb0cb)

パッケージをインストールしてからクラスタ―の環境を設定します。

# /etc/scylla/scylla.yamlの設定
ScyllaDBのクラスタ―構築に必要なパラメータを簡略に説明します。

* cluster_name
<br>任意クラスタ―名を指定する。
* seeds
<br>必ず、1台以上のシードノードを指定する。シードノードは、他のノードのステータスに関する情報が集まるノードであり、他のノードのステータスを取得するためのハブノードでもある。シードノードが存在しないと初期のクラスター形成ができない。シードノードの一時的な不在でも致命的にはならないが、不在の状態でクラスタ―のメンテナンスは出来ない。事実上のレポジトリノードの役割を果たしているとみたほうがいい。商用環境の実装時には、冗長性を考慮するべきである。
* listen_address
<br>クラスタ―内で他のノードと通信を行うために使用するIPアドレス
* auto_bootstrap
<br>falseにする。デフォルトでは、trueになっている。
* endpoint_snitch
<br>GossipingPropertyFileSnitch。実稼働環境にはこのスニッチを推奨。/etc/scylla/cassandra-rackdc.propertiesファイルに定義されているデータセンターとラック配置の情報を参照する。
* rpc_address
<br>クライアント接続のためのIPアドレス

では、各サーバ上で設定を行います。筆者は、次のような構成にしています。

* 10.0.0.6(seed)
* 10.0.0.11
* 10.0.0.5(seed)


**10.0.0.6(seed)の設定**

```
cluster_name: 'Scylla_cluster_demo'
seeds: "10.0.0.6,10.0.0.5 "
endpoint_snitch: GossipingPropertyFileSnitch
listen_address: 10.0.0.6
rpc_address: 10.0.0.6
```

```
/etc/scylla/cassandra-rackdc.properties
dc=DC1
rack=RAC1
prefer_local=true
```


**10.0.0.11の設定**

```
cluster_name: 'Scylla_cluster_demo'
seeds: "10.0.0.6,10.0.0.5"
endpoint_snitch: GossipingPropertyFileSnitch
listen_address: 10.0.0.11
rpc_address: 10.0.0.11
```

```
/etc/scylla/cassandra-rackdc.properties
dc=DC1
rack=RAC1
prefer_local=true
```

**10.0.0.5の設定**

```
cluster_name: 'Scylla_cluster_demo'
seeds: "10.0.0.6,10.0.0.5"
endpoint_snitch: GossipingPropertyFileSnitch
listen_address: 10.0.0.5
rpc_address: 10.0.0.5
```

```
/etc/scylla/cassandra-rackdc.properties
dc=DC1
rack=RAC1
prefer_local=true
```

## ScyllaDBクラスターの起動

各サーバでScyllaDBのサービスをストップします。パッケージインストール時にプロセスが起動状態になっているはずです。

```
$ sudo systemctl stop scylla-server

$ sudo systemctl status scylla-server
```

各サーバで初期データを削除します。

```
$ sudo rm -rf /var/lib/scylla/data/system/*
```

各シードノードを先に起動にします。クラスターの初期形成時には、最初に起動したノードがリングの起点になります。

```
$ sudo systemctl start scylla-server

$ sudo systemctl status scylla-server
```

クラスタ―のステータスを確認します。2ノードが起動しているはずです。

```
$ nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Tokens       Owns    Host ID                               Rack
UN  10.0.0.5   811.88 KB  256          ?       2713d751-7592-441d-b13c-616bd9c263d9  RAC1
UN  10.0.0.6   786.95 KB  256          ?       4e0d3ebc-43cc-489b-bb24-1cf17252e5bf  RAC1
```

シードノードの起動を確認してから、ワーカーノード(10.0.0.11)を起動します。

```
$ sudo systemctl start scylla-server

$ sudo systemctl status scylla-server
```

クラスタ―のステータスを確認します。

```
$ nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Tokens       Owns    Host ID                               Rack
UN  10.0.0.5   811.88 KB  256          ?       2713d751-7592-441d-b13c-616bd9c263d9  RAC1
UN  10.0.0.6   786.95 KB  256          ?       4e0d3ebc-43cc-489b-bb24-1cf17252e5bf  RAC1
UJ  10.0.0.11  ?          256          ?       aa4cbe9f-cf79-415e-9e13-3ebeeb30f889  RAC1
```

# ScyllaDBへの接続

CQL(Cassandra Query Language)で接続します。

```
$ cqlsh [IP Address]
Connected to  at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
cqlsh>
cqlsh> help

Documented shell commands:
===========================
CAPTURE  CLS          COPY  DESCRIBE  EXPAND  LOGIN   SERIAL  SOURCE   UNICODE
CLEAR    CONSISTENCY  DESC  EXIT      HELP    PAGING  SHOW    TRACING

CQL help topics:
================
AGGREGATES               CREATE_KEYSPACE           DROP_TRIGGER      TEXT
ALTER_KEYSPACE           CREATE_MATERIALIZED_VIEW  DROP_TYPE         TIME
ALTER_MATERIALIZED_VIEW  CREATE_ROLE               DROP_USER         TIMESTAMP
ALTER_TABLE              CREATE_TABLE              FUNCTIONS         TRUNCATE
ALTER_TYPE               CREATE_TRIGGER            GRANT             TYPES
ALTER_USER               CREATE_TYPE               INSERT            UPDATE
APPLY                    CREATE_USER               INSERT_JSON       USE
ASCII                    DATE                      INT               UUID
BATCH                    DELETE                    JSON
BEGIN                    DROP_AGGREGATE            KEYWORDS
BLOB                     DROP_COLUMNFAMILY         LIST_PERMISSIONS
BOOLEAN                  DROP_FUNCTION             LIST_ROLES
COUNTER                  DROP_INDEX                LIST_USERS
CREATE_AGGREGATE         DROP_KEYSPACE             PERMISSIONS
CREATE_COLUMNFAMILY      DROP_MATERIALIZED_VIEW    REVOKE
CREATE_FUNCTION          DROP_ROLE                 SELECT
CREATE_INDEX             DROP_TABLE                SELECT_JSON

cqlsh> exit;
```

さらに、CQLを試すなら、こちら参照してください。
http://cassandra.apache.org/doc/latest/cql/index.html


# まとめ
ScyllaDBのマルチノードクラスター構築の手順も、ScyllaDBセットアップ(scylla_setup)を除いては、Apache Cassandraと同じです。筆者は、クラスタ―の構築や運用においてノード数という悩みの種を一掃してくれるScyllaDBのスケールアップファーストのアーキテクチャーに注目しています。マルチノードクラスターの構築が出来たということは、その体験が目前ということですね。