╮(╯3╰)╭

虽然不太明白,但是好厉害啊

【译】在Elixir中创建riak_core应用(1)

最近不知道咋了,有些高产啊,目前网上似乎没人翻译这个,争取周末前把三篇翻完

1 在Elixir中创建riakcore应用(I)

12月3号(2016年),我在NoSlidesConf做了一次关于riakcore的演讲, 为了用Elixir展示riakcore一些特性,我写了这个简单的应用。

在那以后,我决定写一篇关于在Elixir中使用riakcore的教程,在Elixir中调用Erlang的库确实非常简单, 比如这个app就是个很好的例子,网上有很多用Erlang(使用riakcore)的例子, 但遗憾的是,依然有很多“炼金术士”们并不熟悉Erlang的语法:-(

本文中,我将描述如何创建一个空的Elixir应用,它只能作为多个节点在同一台机器上启动而没有其他功能, 要等到下一篇文章,您才能看到实用的功能:-).

1.1 如何开始

Riakcore是由basho开发,从riakKV/riakTS中剥离出来的一个独立的库。 basho的这个Repo对于Elixir应用来说并不容易使用,但是你可以检出代码作为“main source”。 当然作为一名“炼金师”,你肯定非常熟悉https://hex.pm/(如果不是,那你该努力了:-)) 在hex.pm里搜索riakcore,你会发现riakcoreng。 这是从原库中fork出来的, 由Heinz N. Gies维护的版本。

开始之前,先介绍一下我的Erlang和Elixir的版本。本系列教程中,我会一直使用Elixir 1.3.4和Erlang 18.3。 在测试时,我没能用Erlang 19成功运行riakcore。如果你查看basho的Repo和 riakcoreng的Repo,你会发现其中包含了移植到Erlang 19的工作,不过至今还未完成。 我建议使用[kerl][kerl]或者[asdf][asdf]来管理Erlang的版本。如果你想用observer(你肯定想的:-))。 我建议在编译Erlang OTP的时候开启wx。如果你使用OSX,请看这里, Linux用户请看这里)。 其他系统用户请尝试google。

那么我们开始吧,附上=–sup=参数,创建一个新的mix应用

$ mix new no_slides --sup

用这种方法,我们创建了一个空的app,首先要做的是把riakcore加入依赖项中。在=mix。exs=文件中加入如下内容:

def application do
  [applications: [:riak_core, :logger],
   mod: {NoSlides, []}]
end
# ...
defp deps do
  [
    {:riak_core, "~> 2.2.8", hex: :riak_core_ng}
  ]
end

记得要把=:riakcore=放在放在第一位,否则可能会发生一些奇怪的事情:-D.

然后,就像平时一样,获取依赖

$ mix deps.get

现在可以用下面的命令运行你的第一个riakcore app了:

$ iex -S mix run

你看到了好多的error,首先你应该用参数=–name <nodename>=运行node,我的是这样:

$ iex --name gpad@127.0.0.1 -S mix run

这是使用全名启动程序的方式, 之后,你会得到另一个错误,需要为你的代码配置schema和一些其他的设置。schema存在在=deps/riakcore/priv=目录中, 使用下面的命令,将其拷贝到你的=priv=目录下

$ cp -r deps/riak_core/priv .

最后,要告诉riakcore如何管理节点的必需的信息,我建议在=config/config.exs=文件中加入如下内容:

config :riak_core,
  ring_state_dir: 'ring_data_dir',
  handoff_port: 8099,
  handoff_ip: '127.0.0.1',
  schema_dirs: ['priv']
config :sasl,
  errlog_type: :error

配置项=riakcore=是riakcore作为单节点启动的必要配置(多节点时我们会做一些小修改), 我们告诉riakcore在哪里保存上的数据(集群配置)。 管理handoff的IP/端口,以及在哪里找到schema。 最后的配置也同样重要,我们告诉sasl应用只打印错误日志。

至此,你终于可以启动一个单节点的riakcore应用了

$ iex --name gpad@127.0.0.1 -S mix run

万岁!!!

1.2 多节点环境

我们当然希望用riakcore创建一个分布式的应用,所以我们的应用应当运行在不同的节点上。在开发时,在一台机器上面运行多个节点会更加简单易行。 为了做到这一点,有必要让每个节点用不同的配置来运行,我们可以用mix的environments达到这一目的。 我们为每个环境(environment)添加不同的配置文件,通过这些不同的环境来区分各个节点。 在本例中,我把环境命名为=gpad1=、=gpad2=和=gpad3=。我建议在=config=目录中添加三个文件=gpad1.exs=、=gpad2.exs=和=gpad3.exs=。 修改=config.exs=,在文件末尾添加以下内容

import_config “#{Mix.env}.exs”

在每个新文件中,你需要设置riakcore的配置,使其不会与在同一台机器上运行的其他节点冲突,因此我们有:

gpad1.exs

use Mix.Config
config :riak_core,
  node: 'gpad_1@127.0.0.1',
  web_port: 8198,
  handoff_port: 8199,
  ring_state_dir: 'ring_data_dir_1',
  platform_data_dir: 'data_1'

gpad2.exs

use Mix.Config
config :riak_core,
  node: 'gpad_2@127.0.0.1',
  web_port: 8298,
  handoff_port: 8299,
  ring_state_dir: 'ring_data_dir_2',
  platform_data_dir: 'data_2'

gpad3.exs

use Mix.Config
config :riak_core,
  node: 'gpad_3@127.0.0.1',
  web_port: 8398,
  handoff_port: 8399,
  ring_state_dir: 'ring_data_dir_3',
  platform_data_dir: 'data_3'

这样,我们就有了三个不同的环境,你可以在三个不同的终端下启动它们,在开始之前,请记得要使用Erlang 18, 因为我们需要在不同的环境下编译这个应用,因此要在不同的终端下运行下面的每行命令:

# this is node 1
MIX_ENV=gpad_1 iex --name gpad_1@127.0.0.1 -S mix run

# this is node 2
MIX_ENV=gpad_2 iex --name gpad_2@127.0.0.1 -S mix run

# this is node 3
MIX_ENV=gpad_3 iex --name gpad_3@127.0.0.1 -S mix run

如果你希望像之前一样,仍然使用命令=iex –name gpad@127.0.0.1 -S mix run=来运行一个单节点, 你需要添加一个名为=dev。exs=的文件,它只有一行:

use Mix.Config

现在,你应该能够在同一台机器上运行三个不同的节点了。

做的不错!!!

下一篇中,我们会尝试添加一个简单的ping功能并将三个节点连接在一起。

在结束前,我需要感谢:

敬请期待,下次再见!!!

Comments

comments powered by Disqus