5

我使用实例化的 Amazon EC2 虚拟 Ubuntu 12.04 服务器作为我的单个 Riak 节点。我已经使用 basho 网站上的指南完成了在实例上设置 Riak 的所有适当阶段。x.x.x.x 实例的私有 IP 地址在哪里,包括:

安装

  • 用于获得 root 权限(EC2将sudo su -我登录为“Ubuntu”)。

  • 使用以下命令安装 SSL Lib:

    sudo apt-get install libssl0.9.8

  • 下载 12.04 的 64 位软件包:

    wget http://downloads.basho.com.s3-website-us-east-1.amazonaws.com/riak/CURRENT/ubuntu/precise/riak_1.2.1-1_amd64.deb

  • 然后通过以下方式解包:

    sudo dpkg -i riak_1.2.1-1_amd64.deb

按照basho 指南中的说明,我更新了这两个文件(使用 vi):

vm.args

  • 更改-name riak@x.x.x.x为我的实例的私有 IP。

应用程序配置

  • 更改{http, [ {"x.x.x.x", 8098 } ]}为我的实例的私有 IP。

  • 更改{pb_ip, "x.x.x.x"}为我的实例的私有 IP。

当我第一次设置服务器并执行上述操作时,Riak 节点工作正常,我可以连接到节点,然后使用riak start成功riak-admin test返回:

>Attempting to restart script through sudo -H -u riak
>Successfully completed 1 read/write cycle to 'riak@x.x.x.x'

第二天,我启动了实例,使用实例的新 IP 地址y.y.y.y(实例的私有 IP 每次停止/启动时更改)重复上述过程(忽略安装),然后riak start在终端中输入,只收到:

>Attempting to restart script through sudo -H -u riak
>Riak failed to start within 15 seconds,
>see the output of 'riak console' for more information.
>If you want to wait longer, set the environment variable
>WAIT_FOR_ERLANG to the number of seconds to wait

在 riak 控制台中给出的错误是:

>gen_server riak_core_capability terminated with reason: no function clause matching orddict:fetch('riak@y.y.y.y', [{'riak@x.x.x.x',[{{riak_core,staged_joins},[true,false]},{{riak_core,vnode_routing},[proxy,...]},...]}])

y.y.y.y新的实例 IP 地址在哪里x.x.x.x,旧的 IP 地址在哪里。

我已经为此苦恼了一段时间,找不到任何关于该主题的内容,我能想到的唯一解决方案是重新安装 Riak,以防我的 PATH 目录出错。如果失败了,我最后的办法是终止实例并在新实例上重新配置 Riak。所以在我开枪之前,我想问的是:

  • 使用新的实例 IP 地址更新字段后app.configvm.args为什么riak start命令不再成功?

  • 有没有办法为 Ubuntu EC2 实例分配静态私有 IP?这不仅有助于解决问题,而且节省了我每次更新app.config和启动/停止实例的时间。vm.args

4

3 回答 3

6

因此,经过更多的挖掘和深入的阅读,我找到了一个解决方案:

您需要移除 Riak 环并再次启动 Riak 以重置 riak_core。

您可以通过在终端中使用以下命令来执行此操作:

rm -rf /var/lib/riak/ring/*

  • 注意: 这应该您更新后完成app.configvm.args使用新的服务器 IP,否则可能会出现令人讨厌的副作用。

然后

riak start

我不再被抛出“连接失败”错误,并且在发出riak-admin test命令后我愉快地收到了(y.y.y.y我的实例的私有 IP 在哪里):

>Attempting to restart script through sudo -H -u riak
>Successfully completed 1 read/write cycle to 'riak@y.y.y.y'

我应该注意,此解决方案适用于虚拟服务器以及物理服务器。尽管我认为 IP 的重新分配在物理服务器中会很少发生。

现在虽然这解决了问题,但这仍然意味着每当我需要重新启动实例时,我必须通过编辑app.configvm.args文件来更改私有 IP 地址(记住每次启动/停止 Ubuntu 实例时私有 IP 都会更改)然后使用上面的命令清除 Riak 环,所以这不是一个优雅的解决方案。

如果有人知道为 EC2 实例设置静态私有 IP 的方法(或解决这两个障碍的另一种解决方案?),它将彻底解决这个问题。

编辑:12 年 12 月 14 日

将静态 IP 分配给 EC2 实例的有限解决方案:

Amazon Web Services 允许将弹性 IP 关联到 EC2 实例(任何类型)。因此,如果一个实例有一个与之关联的弹性 IP,即使它重新启动,该 IP 仍将与该实例关联。您可以在此处找到有关弹性 IP 的文档。

如果您在 Amazon 的免费使用套餐下,创建弹性 IP 不应该向您收费,只要它与正在运行的实例相关联。如果一个弹性 IP 被解除关联,只要该弹性 IP 保持解除关联,亚马逊就会为未使用的弹性 IP 的每个运行小时产生费用。例如,终止实例将解除与弹性 IP 的关联,除非该弹性 IP 被重新关联或释放,上述情况均适用。完全停止您的实例然后在稍后启动它也会解除弹性 IP 的关联。

每个实例最多可以拥有一个弹性 IP,并且这将产生费用。

对于那些感兴趣的人,您可以在弹性 IP 地址下找到更多弹性 IP 的定价信息

于 2012-12-13T16:02:37.520 回答
2

从 Riak 1.3 开始,riak-admin reip 已被弃用,使用 riak-admin cluster replace 是替换集群名称的推荐方式。

这些是我必须发出的命令:

riak stop # stop the node
riak-admin down riak@127.0.0.1 # take it down
sudo rm -rf /var/lib/riak/ring/* # delete the riak ring
sudo sed -i "s/127.0.0.1/`hostname -i`/g" /etc/riak/vm.args # Change the name in config
riak-admin cluster force-replace riak@127.0.0.1 riak@"`hostname -i`" # replace the name
riak start # start the node

这应该将节点的名称设置为 riak@[您的 EC2 内部 IP 地址]。

于 2013-07-05T11:10:14.803 回答
0

除了更改 app.config 中的 PB 和 HTTP IP 以及 vm.args IP,我还必须运行:

http://docs.basho.com/riak/1.2.0/references/Command-Line-Tools---riak-admin/#reip

如果不这样做,运行 riak 控制台并查看输出,旧 IP 仍然存在于错误日志中。

于 2013-01-25T16:11:51.847 回答