JavaScriptを有効にしてください

【Elixir】libclusterを使用して簡単にクラスタ化する

 ·  ☕ 2 分で読めます

【Elixir】libclusterを使用して簡単にクラスタ化する

libclusterというElixirのライブラリを使用することで、簡単にクラスタ構成を作ることができます。
Elixirとlibclusterを使用してクラスタ構成を作ってみます。

環境

  • Elixir 1.14.2

libcluster のインストール

まず、libcluster をプロジェクトに追加します。
mix.exsdeps 関数に以下のコードを追加してください。

1
2
3
4
5
defp deps do
  [
    {:libcluster, "~> 3.3.2"}
  ]
end

次に、ターミナルで mix deps.get コマンドを実行し、依存関係を取得してください。

使い方

以下のように application.ex にサクッと組み込み事で使用できます。
そうすると自動的にクラスタを構成してくれます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
defmodule MyApp.App do
  use Application

  def start(_type, _args) do
    topologies = [
      example: [
        strategy: Cluster.Strategy.Epmd,
        config: [hosts: [:"a@127.0.0.1", :"b@127.0.0.1"]],
      ]
    ]
    children = [
      {Cluster.Supervisor, [topologies, [name: MyApp.ClusterSupervisor]]},
      # ..other children..
    ]
    Supervisor.start_link(children, strategy: :one_for_one, name: MyApp.Supervisor)
  end
end

起動

起動時にはいくつか注意が必要です。
ノード名(--sname)とCookie(--cookie)の指定をしなければいけません。
ノード名は各端末別にCookieはクラスタを構築したいノード内で統一してください。

elixir --sname a@127.0.0.1 --cookie Cookie -S mix

構成方法

クラスタの構成にはいくつか方法があります。

他にも色々あるので自分の環境にあった方法を使用してください。

備考

私は Gossip を使用してクラスタを組んだのですが下記がサイトに載っている方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
config :libcluster,
  topologies: [
    gossip_example: [
      strategy: Elixir.Cluster.Strategy.Gossip,
      config: [
        port: 45892,
        if_addr: "0.0.0.0",
        multicast_if: "192.168.1.1",
        multicast_addr: "233.252.1.32",
        multicast_ttl: 1,
        secret: "somepassword"]]]

これを以下のようにするとネットワーク内で自動的にクラスタを組んでくれました。
Docker内で構成する時、すごい簡単です。

1
2
3
4
5
6
config :libcluster,
  topologies: [
    gossip_example: [
      strategy: Elixir.Cluster.Strategy.Gossip
    ]
  ]

デバッグ

debug: true を入れることでlibclusterのデバッグモードが動きログにデバッグが出力されるようになります。

1
2
config :libcluster,
  debug: true,

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer