CentOS7にRiakCS環境を構築


## 概要

CentOS7でRiakCSを3台構成でクラスタを構築する手順です。

使用するRiakCS, Riak, Stanchionのバージョンの組み合わせは次の通りです。

| Riak CS | Riak   | Stanchion |
|:--------|:-------|:----------|
| 1.5.2   | 1.4.10 | 1.5.0     |

※2014/11/04現在

バージョンの組み合わせに関する情報はriakdocsの[Install Riak CS - Version Compatibility](http://docs.basho.com/riakcs/latest/cookbooks/installing/Installing-Riak-CS/#Version-Compatibility)に記載があります。

## はじめに

CentOS7として記載していますが、CentOS6でもほぼ同じ手順で実施可能です。
CentOS6で実施する場合は、以下の通り読み替えてください。

```:サービスの無効化
systemctl disable サービス名
↓
chkconfig サービス名 off
```

```:サービスの開始
systemctl start サービス名
↓
service サービス名 start
```

```:サービスの停止
systemctl stop サービス名
↓
service サービス名 stop
```

```:サービスの再起動
systemctl restart サービス名
↓
service サービス名 restart
```

## SELinux無効化

お決まりの手順。
SELinux有効にして運用してるとこってどのくらいあるんだろう。

```shell-session:SELinux無効化
# setenforce 0
# vi /etc/selinux/config
```

```diff:/etc/selinux/config
-SELINUX=enforcing
+SELINUX=disabled
```

## ファイアウォール停止

こちらもお決まりの手順。
ファイアウォールは上位で実施することが前提。

```shell-session:ファイアウォール停止
# systemctl disable firewalld.service
# systemctl stop firewalld
```

## ttyなしのsudoをrootでも許可する。

```sudo設定変更
# visudo
```

```diff:/etc/sudoers
 Defaults    requiretty
+Defaults:root    requiretty
```

## RiakCSインストール準備

```shell-session:limits.confの編集
# vi /etc/security/limits.conf
```

```diff:/etc/security/limits.conf
+riak             soft    nofile          65536
+riak             hard    nofile          65536
+root             soft    nofile          65536
+root             hard    nofile          65536

 # End of file
```

# Riakのインストールと設定（192.168.1.101）

```shell-session:Riakインストール
# rpm -ivh riak-1.4.10-1.el6.x86_64.rpm
```

```shell-session:Riak設定（app.config）
# vi /etc/riak/app.config
```

```diff:/etc/riak/app.config
-            %% {pb_backlog, 64},
+            {pb_backlog, 128},

-            {pb, [ {"127.0.0.1", 8087 } ]}
+            {pb, [ {"191.168.1.101", 8087 } ]}

 {riak_core, [
+              %% Default bucket props
+              {default_bucket_props, [{allow_mult, true}]},

               %% Default location of ringstate
               {ring_state_dir, "/var/lib/riak/ring"},

-              {http, [ {"127.0.0.1", 8098 } ]},
+              {http, [ {"192.168.1.101", 8098 } ]},

+            {add_paths, ["/usr/lib64/riak-cs/lib/riak_cs-1.5.2/ebin"]},
-            {storage_backend, riak_kv_bitcask_backend},
+            {storage_backend, riak_cs_kv_multi_backend},
+            {multi_backend_prefix_list, [{<<"0b:">>, be_blocks}]},
+            {multi_backend_default, be_default},
+            {multi_backend, [
+              {be_default, riak_kv_eleveldb_backend, [
+                {max_open_files, 50},
+                {data_root, "/var/lib/riak/elevel_db"}
+              ]},
+              {be_blocks, riak_kv_bitcask_backend, [
+                {data_root, "/var/lib/riak/bitcask"}
+              ]}
+            ]},
```

```shell-session:Riak設定（vm.args）
# vi /etc/riak/vm.args
```

```diff:/etc/riak/vm.args
--name riak@127.0.0.1
+-name riak@192.168.1.101
```

# RiakCSのインストールと設定（192.168.1.101）

```shell-session:RiakCSインストール
# rpm -ivh riak-cs-1.5.2-1.el6.x86_64.rpm
```

```shell-session:RiakCS設定（app.config）
# vi /etc/riak-cs/app.config
```

```diff:/etc/riak-cs/app.config
-              {cs_ip, "127.0.0.1"},
+              {cs_ip, "192.168.1.101"},

-              {riak_ip, "127.0.0.1"},
+              {riak_ip, "192.168.1.101"},

-              {stanchion_ip, "127.0.0.1"},
+              {stanchion_ip, "192.168.1.101"},

```

```shell-session:RiakCS設定（vm.args）
# vi /etc/riak-cs/vm.args
```

```diff:/etc/riak-cs/vm.args
--name riak-cs@127.0.0.1
+-name riak-cs@192.168.1.101
```

# Stanchionのインストールと設定（192.168.1.101）

```shell-session:Stanchionインストール
# rpm -ivh stanchion-1.5.0-1.el6.x86_64.rpm
```

```shell-session:Stanchion設定（app.config）
# vi /etc/stanchion/app.config
```

```diff:/etc/stanchion/app.config
-                   {stanchion_ip, "127.0.0.1"},
+                   {stanchion_ip, "192.168.1.101"},

-                   {riak_ip, "127.0.0.1"},
+                   {riak_ip, "192.168.1.101"},
```

```shell-session:Stanchion設定（vm.args）
# vi /etc/stanchion/vm.args
```

```diff:/etc/stanchion/vm.args
--name stanchion@127.0.0.1
+-name stanchion@192.168.1.101
```

# サービス起動（192.168.1.101）

```shell-session:サービス起動
# systemctl start riak
# systemctl start stanchion
# systemctl start riak-cs
```

```shell-session:サービス起動確認
# riak ping
pong
# stanchion ping
pong
# riak-cs ping
pong
```

# 管理者ユーザー作成（192.168.1.101）

```shell-session:RiakCS設定変更
# vi /etc/riak-cs/app.config
```

```diff:/etc/riak-cs/app.config
-              {anonymous_user_creation, false},
+              {anonymous_user_creation, true},
```

```shell-session:RiakCS再起動
# systemctl restart riak-cs
```

```shell-session:管理者ユーザの作成
# curl -H 'Content-Type: application/json' -X POST http://192.168.1.101:8080/riak-cs/user --data '{"email":"admin@example.com", "name":"admin"}'
{"email":"admin@example.com","display_name":"admin","name":"admin","key_id":"XXXXXXXXXXXXXXXXXXXX","key_secret":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","id":"b8bb225535e278bb022ae292159b5f4309e5e9c3c16988b0c4a33b6dbc36839b","status":"enabled"}
key_idがACCESS KEY、key_secretがSECRET KEYとなる。
```

```shell-session:RiakCS設定変更
# vi /etc/riak-cs/app.config
```

```diff:/etc/riak-cs/app.config
+              {anonymous_user_creation, true},
-              {anonymous_user_creation, false},

-              {admin_key, "admin-key"},
-              {admin_secret, "admin-secret"},
+              {admin_key, "XXXXXXXXXXXXXXXXXXXX"},
+              {admin_secret, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"},
```

```shell-session:RiakCS再起動
# systemctl restart riak-cs
```

```shell-session:Stanchion設定変更
# vi /etc/stanchion/app.config
```

```diff:/etc/stanchion/app.config
-                   {admin_key, "admin-key"},
-                   {admin_secret, "admin-secret"}
+                   {admin_key, "XXXXXXXXXXXXXXXXXXXX"},
+                   {admin_secret, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
```

```shell-session:Stanchion再起動
# systemctl restart stanchion
```

# RiakCSクラスタ設定
他のノード（ここでは192.168.1.102, 192.168.1.103とする）も同様の手順でRiakとRiakCSをインストールする。変更箇所はノードのIPアドレスのみ。
Stanchionは一つだけあればいいのでインストールしない。管理者ユーザー作成も不要。

# Riakのインストールと設定（192.168.1.102）

```shell-session:Riak設定（app.config）
# vi /etc/riak/app.config
```

```diff:/etc/riak/app.config
-            %% {pb_backlog, 64},
+            {pb_backlog, 128},

-            {pb, [ {"127.0.0.1", 8087 } ]}
+            {pb, [ {"191.168.1.102", 8087 } ]}

 {riak_core, [
+              %% Default bucket props
+              {default_bucket_props, [{allow_mult, true}]},

               %% Default location of ringstate
               {ring_state_dir, "/var/lib/riak/ring"},

-              {http, [ {"127.0.0.1", 8098 } ]},
+              {http, [ {"192.168.1.102", 8098 } ]},

+            {add_paths, ["/usr/lib64/riak-cs/lib/riak_cs-1.5.2/ebin"]},
-            {storage_backend, riak_kv_bitcask_backend},
+            {storage_backend, riak_cs_kv_multi_backend},
+            {multi_backend_prefix_list, [{<<"0b:">>, be_blocks}]},
+            {multi_backend_default, be_default},
+            {multi_backend, [
+              {be_default, riak_kv_eleveldb_backend, [
+                {max_open_files, 50},
+                {data_root, "/var/lib/riak/elevel_db"}
+              ]},
+              {be_blocks, riak_kv_bitcask_backend, [
+                {data_root, "/var/lib/riak/bitcask"}
+              ]}
+            ]},
```

```shell-session:Riak設定（vm.args）
# vi /etc/riak/vm.args
```

```diff:/etc/riak/vm.args
--name riak@127.0.0.1
+-name riak@192.168.1.102
```

# RiakCSのインストールと設定（192.168.1.102）

```shell-session:RiakCSインストール
# rpm -ivh riak-cs-1.5.2-1.el6.x86_64.rpm
```

```shell-session:RiakCS設定（app.config）
# vi /etc/riak-cs/app.config
```

```diff:/etc/riak-cs/app.config
-              {cs_ip, "127.0.0.1"},
+              {cs_ip, "192.168.1.102"},

-              {riak_ip, "127.0.0.1"},
+              {riak_ip, "192.168.1.102"},

-              {stanchion_ip, "127.0.0.1"},
+              {stanchion_ip, "192.168.1.102"},

-              {admin_key, "admin-key"},
-              {admin_secret, "admin-secret"},
+              {admin_key, "XXXXXXXXXXXXXXXXXXXX"},
+              {admin_secret, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"},

```

```shell-session:RiakCS設定（vm.args）
# vi /etc/riak-cs/vm.args
```

```diff:/etc/riak-cs/vm.args
--name riak-cs@127.0.0.1
+-name riak-cs@192.168.1.102
```

```サービス起動
# systemctl start riak
# systemctl start riak-cs
```

```shell-session:サービス起動確認
# riak ping
pong
# riak-cs ping
pong
```

# クラスタ構成

3台のサーバでリングを作成します。リングとはクラスタ内でデータを分散保存するハッシュ空間を指します。

ノード192.168.1.101でクラスタの状態を確認してみます。
リングに参加しているのは1ノード（自分自身）となります。

```shell-session:クラスタ状態確認
[root@riak01 ~]# riak-admin member_status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%      --      'riak@192.168.1.101'
-------------------------------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

```

ノード192.168.1.102を192.168.1.101のリングに追加します。
ノード192.168.1.102で作業します。

```shell-session:クラスタへの追加
[root@riak02 ~]# riak-admin cluster join riak@192.168.1.101
Success: staged join request for 'riak@192.168.1.102' to 'riak@192.168.1.101'
```

クラスタ構成の計画を確認します。

```shell-session:クラスタ計画確認
[root@riak02 ~]# riak-admin cluster plan
=============================== Staged Changes ================================
Action         Details(s)
-------------------------------------------------------------------------------
join           'riak@192.168.1.102'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
                         After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%     50.0%    'riak@192.168.1.101'
valid       0.0%     50.0%    'riak@192.168.1.102'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 32
  32 transfers from 'riak@192.168.1.101' to 'riak@192.168.1.102'
```

続いて、クラスタ計画をコミットします。

```shell-session:クラスタ計画コミット
[root@riak02 ~]# riak-admin cluster commit
Cluster changes committed
```

この時点で192.168.1.102が192.168.1.101のリングに追加され、リバランスが実施されます。

```shell-session:クラスタ状態確認
[root@riak02 ~]# riak-admin member_status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      87.5%     50.0%    'riak@192.168.1.101'
valid      12.5%     50.0%    'riak@192.168.1.102'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```

次の通り、Pendingが -- となったらリバランスが終わり、リングへの追加が完了します。

```shell-session:クラスタ状態確認
[root@riak02 ~]# riak-admin member_status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      50.0%      --      'riak@192.168.1.101'
valid      50.0%      --      'riak@192.168.1.102'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```

同様に192.168.1.103もリングに追加します。
最終的なクラスタ構成は次のとおりです。

```shell-session:クラスタ状態確認
[root@riak03 ~]# riak-admin member_status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%      --      'riak@192.168.1.101'
valid      32.8%      --      'riak@192.168.1.102'
valid      32.8%      --      'riak@192.168.1.103'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```