RabbitMQでクラスタリング

`/usr/local/sbin/rabbitmq-server&`
前回は上記コマンドでサーバーを起動しましたが、マニュアルを読むと[クラスタリング](https://www.rabbitmq.com/clustering.html)設定ができるみたいなので、同じPCの中で2つのノードを起動してHAクラスター作ってみましょう。ちなみにRAMノードいうインメモリ型を選択する事も可能です。この場合、揮発性が高いデータになるので、リスクよりもパフォーマンス優先型の場合にのみ利用してください。

[rabbitmqctl](https://www.rabbitmq.com/man/rabbitmqctl.1.man.html)というコマンドがインストールされていますので早速使っていきます。
[サーバー起動オプション](https://www.rabbitmq.com/man/rabbitmq-server.1.man.html)はこちらに詳細が記載されています

# 1. vegrantを起動
```text:
 ~/Vagrant/CentOS64
[root]$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
...
...
[root]$ vagrant ssh
```

# 2. EPELの設定
/etc/yum.repos.d/内にEPELリポジトリの設定をします。
>yum install epel-release

```text:
[root@kalturaadmin vagrant]# cd /etc/yum.repos.d/
[root@kalturaadmin yum.repos.d]# yum install epel-release
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.vodien.com
 * epel: ftp.kddilabs.jp
 * extras: mirror.readyspace.com
 * updates: mirror.readyspace.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:5-4 will be updated
---> Package epel-release.noarch 0:6-8 will be an update
--> Finished Dependency Resolution
..........

[root@kalturaadmin yum.repos.d]# ls -al
合計 36
drwxr-xr-x.  2 root root 4096 11月  1 01:09 2015 .
drwxr-xr-x. 83 root root 4096 11月  1 00:55 2015 ..
-rw-r--r--.  1 root root 1926  2月 25 08:57 2013 CentOS-Base.repo
-rw-r--r--.  1 root root  638  2月 25 08:57 2013 CentOS-Debuginfo.repo
-rw-r--r--.  1 root root  630  2月 25 08:57 2013 CentOS-Media.repo
-rw-r--r--.  1 root root 3664  2月 25 08:57 2013 CentOS-Vault.repo
-rw-r--r--   1 root root 1056 11月  5 03:52 2012 epel-testing.repo
-rw-r--r--   1 root root  957 11月  5 03:52 2012 epel.repo
-rw-r--r--   1 root root  998  8月 24 10:20 2015 kaltura.repo
```

```
[root@kalturaadmin yum.repos.d]# yum search rabbitmq-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
[root@kalturaadmin yum.repos.d]# yum search rabbitmq-server --enablerepo=epel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```

ちょっとyumでエラーでるので証明書のアップグレードします。
>yum upgrade ca-certificates --disablerepo=epel

```text:
[root@kalturaadmin yum.repos.d]# yum upgrade ca-certificates --disablerepo=epel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Setting up Upgrade Process
Resolving Dependencies
.........
```

# 3. Rabbit MQ のインストール
>yum -y install rabbitmq-server --enablerepo=epel

```
[root@kalturaadmin yum.repos.d]# yum -y install rabbitmq-server --enablerepo=epel
Loaded plugins: fastestmirror
.....
.....

Installed:
  rabbitmq-server.noarch 0:3.1.5-1.el6

Dependency Installed:
  erlang.x86_64 0:R14B-04.3.el6                       erlang-appmon.x86_64 0:R14B-04.3.el6                 erlang-asn1.x86_64 0:R14B-04.3.el6
  erlang-common_test.x86_64 0:R14B-04.3.el6           erlang-compiler.x86_64 0:R14B-04.3.el6               erlang-cosEvent.x86_64 0:R14B-04.3.el6
  erlang-cosEventDomain.x86_64 0:R14B-04.3.el6        erlang-cosFileTransfer.x86_64 0:R14B-04.3.el6        erlang-cosNotification.x86_64 0:R14B-04.3.el6
  erlang-cosProperty.x86_64 0:R14B-04.3.el6           erlang-cosTime.x86_64 0:R14B-04.3.el6                erlang-cosTransactions.x86_64 0:R14B-04.3.el6
  erlang-crypto.x86_64 0:R14B-04.3.el6                erlang-debugger.x86_64 0:R14B-04.3.el6               erlang-dialyzer.x86_64 0:R14B-04.3.el6
  erlang-diameter.x86_64 0:R14B-04.3.el6              erlang-docbuilder.x86_64 0:R14B-04.3.el6             erlang-edoc.x86_64 0:R14B-04.3.el6
  erlang-erl_docgen.x86_64 0:R14B-04.3.el6            erlang-erl_interface.x86_64 0:R14B-04.3.el6          erlang-erts.x86_64 0:R14B-04.3.el6
  erlang-et.x86_64 0:R14B-04.3.el6                    erlang-eunit.x86_64 0:R14B-04.3.el6                  erlang-examples.x86_64 0:R14B-04.3.el6
  erlang-gs.x86_64 0:R14B-04.3.el6                    erlang-hipe.x86_64 0:R14B-04.3.el6                   erlang-ic.x86_64 0:R14B-04.3.el6
  erlang-inets.x86_64 0:R14B-04.3.el6                 erlang-inviso.x86_64 0:R14B-04.3.el6                 erlang-jinterface.x86_64 0:R14B-04.3.el6
  erlang-kernel.x86_64 0:R14B-04.3.el6                erlang-megaco.x86_64 0:R14B-04.3.el6                 erlang-mnesia.x86_64 0:R14B-04.3.el6
  erlang-observer.x86_64 0:R14B-04.3.el6              erlang-odbc.x86_64 0:R14B-04.3.el6                   erlang-orber.x86_64 0:R14B-04.3.el6
  erlang-os_mon.x86_64 0:R14B-04.3.el6                erlang-otp_mibs.x86_64 0:R14B-04.3.el6               erlang-parsetools.x86_64 0:R14B-04.3.el6
  erlang-percept.x86_64 0:R14B-04.3.el6               erlang-pman.x86_64 0:R14B-04.3.el6                   erlang-public_key.x86_64 0:R14B-04.3.el6
  erlang-reltool.x86_64 0:R14B-04.3.el6               erlang-runtime_tools.x86_64 0:R14B-04.3.el6          erlang-sasl.x86_64 0:R14B-04.3.el6
  erlang-snmp.x86_64 0:R14B-04.3.el6                  erlang-ssh.x86_64 0:R14B-04.3.el6                    erlang-ssl.x86_64 0:R14B-04.3.el6
  erlang-stdlib.x86_64 0:R14B-04.3.el6                erlang-syntax_tools.x86_64 0:R14B-04.3.el6           erlang-test_server.x86_64 0:R14B-04.3.el6
  erlang-toolbar.x86_64 0:R14B-04.3.el6               erlang-tools.x86_64 0:R14B-04.3.el6                  erlang-tv.x86_64 0:R14B-04.3.el6
  erlang-typer.x86_64 0:R14B-04.3.el6                 erlang-webtool.x86_64 0:R14B-04.3.el6                erlang-wx.x86_64 0:R14B-04.3.el6
  erlang-xmerl.x86_64 0:R14B-04.3.el6                 libXxf86vm.x86_64 0:1.1.3-2.1.el6                    mesa-dri-drivers.x86_64 0:10.4.3-1.el6
  mesa-dri-filesystem.x86_64 0:10.4.3-1.el6           mesa-dri1-drivers.x86_64 0:7.11-8.el6                mesa-libGL.x86_64 0:10.4.3-1.el6
  mesa-libGLU.x86_64 0:10.4.3-1.el6                   mesa-private-llvm.x86_64 0:3.4-3.el6                 tcl.x86_64 1:8.5.7-6.el6
  tk.x86_64 1:8.5.7-5.el6                             unixODBC.x86_64 0:2.2.14-14.el6                      wxBase.x86_64 0:2.8.12-1.el6.centos
  wxGTK.x86_64 0:2.8.12-1.el6.centos                  wxGTK-gl.x86_64 0:2.8.12-1.el6.centos

Complete!
```

# 4. 管理画面のプラグインを有効化
>rabbitmq-plugins enable rabbitmq_shovel
>rabbitmq-plugins enable rabbitmq_management
>rabbitmq-plugins enable rabbitmq_shovel_management

```
[root@kalturaadmin yum.repos.d]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_shovel
The following plugins have been enabled:
  amqp_client
  rabbitmq_shovel
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@kalturaadmin yum.repos.d]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@kalturaadmin yum.repos.d]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_shovel_management
The following plugins have been enabled:
  rabbitmq_shovel_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
```

# 5. 起動と終了
>/etc/init.d/rabbitmq-server start / stop

```
[root@kalturaadmin yum.repos.d]#  /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.
[root@kalturaadmin yum.repos.d]# /etc/init.d/rabbitmq-server stop
Stopping rabbitmq-server: rabbitmq-server.
[
```

# 6. .erlang.cookieの値を確認
クラスタリング時にクラスタノード間の値を同一にしないといけないらしいので確認。
今回は同一ホストに入れるので見るだけ。

```
[root@kalturaadmin yum.repos.d]# cat /var/lib/rabbitmq/.erlang.cookie
AENTCZPNUAGIQDBLZTJF
```

# 7. ホスト名の確認
ホスト名が正しく登録されているか確認しましょう。
変更する場合はrabbitmq-serverを再起動してください。
`/etc/init.d/rabbitmq-server restart`

```
[root@kalturaadmin mnesia]# cat /etc/hostname
kalturaadmin
[root@kalturaadmin mnesia]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.3 kalturaadmin
```
# 8. 管理画面のユーザー追加
http://192.168.3.3:15672/
にアクセスするユーザーを追加します。

> rabbitmqctl add_user admin admin
> rabbitmqctl set_user_tags admin administrator
> rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

起動している状態でアクセスしてみて画面がみられたらとりあえずOKです。![スクリーンショット 2015-11-01 10.55.38.png](https://qiita-image-store.s3.amazonaws.com/0/89997/8f4bd7c4-2361-45c4-9eaf-3380938674a8.png)

# 9. ノードhareを追加
2台めのノードとしてhareを追加します。
今回は同じサーバー内で2台のノードをポートを変えて動かします。
> RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare rabbitmq-server -detached

```text:
[root@kalturaadmin mnesia]# RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@kalturaadmin mnesia]# rabbitmqctl -n hare start_app
Starting node hare@kalturaadmin ...
...done.
```

# 10.2台目ノードの追加 
hareをノードとしてrabbitに追加します
> rabbitmqctl -n hare stop_app
> rabbitmqctl -n hare join_cluster rabbit@&#096;hostname -s&#096;
> rabbitmqctl -n hare start_app

```
[root@kalturaadmin mnesia]# rabbitmqctl -n hare stop_app
Stopping node hare@kalturaadmin ...
...done.
[root@kalturaadmin mnesia]# rabbitmqctl -n hare join_cluster rabbit@`hostname -s`
Clustering node hare@kalturaadmin with rabbit@kalturaadmin ...
...done.
[root@kalturaadmin mnesia]#  rabbitmqctl -n hare start_app
Starting node hare@kalturaadmin ...
...done.
```

管理画面上でも無事に閲覧できるようになりました。
![スクリーンショット 2015-11-01 11.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/89997/8caecaaa-5f3f-dd8c-9b4f-b4e67f71f48f.png)

# 11. データストアの確認
`/var/lib/rabbitmq/mnesia`に移動して中身を見てみます。
ノードごとにフォルダができていてconfigファイルやログなどが入っているので、必要に応じてチェックしましょう。

```
[root@kalturaadmin mnesia]# cd /var/lib/rabbitmq/mnesia
[root@kalturaadmin mnesia]# ls -al
合計 32
drwxr-xr-x  8 rabbitmq rabbitmq 4096 11月  1 02:03 2015 .
drwxr-x---  3 rabbitmq rabbitmq 4096 11月  1 01:29 2015 ..
drwxr-xr-x  4 rabbitmq rabbitmq 4096 11月  1 02:11 2015 hare
drwxr-xr-x 10 rabbitmq rabbitmq 4096 11月  1 02:03 2015 hare-plugins-expand
drwxr-xr-x  4 rabbitmq rabbitmq 4096 11月  1 01:32 2015 rabbit
drwxr-xr-x 10 rabbitmq rabbitmq 4096 11月  1 01:29 2015 rabbit-plugins-expand
drwxr-xr-x  4 rabbitmq rabbitmq 4096 11月  1 02:09 2015 rabbit@kalturaadmin
drwxr-xr-x 10 rabbitmq rabbitmq 4096 11月  1 01:48 2015 rabbit@kalturaadmin-plugins-expand
```

# 12. hareノードをRAMモードで動かす
RAMモードに変更してみましょう。
> rabbitmqctl -n hare stop_app
> rabbitmqctl -n hare change_cluster_node_type ram
> rabbitmqctl -n hare start_app

```
[root@kalturaadmin hare]# rabbitmqctl -n hare stop_app
Stopping node hare@kalturaadmin ...
...done.
[root@kalturaadmin hare]# rabbitmqctl -n hare change_cluster_node_type ram
Turning hare@kalturaadmin into a ram node ...
...done.
[root@kalturaadmin hare]# rabbitmqctl -n hare start_app
Starting node hare@kalturaadmin ...
...done.
```
![スクリーンショット 2015-11-01 11.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/89997/59991a58-4cfe-f2b4-3b3f-cecd511041de.png)