更改IP地址后,Riak节点不再工作

时间:2012-12-13 12:29:25

标签: amazon-ec2 ubuntu-12.04 riak

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

安装

  
      
  • 使用 sudo su - 获取root权限(EC2以'Ubuntu'身份登录)。

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

         

    sudo apt-get install libssl0.9.8

  •   
  • 下载64位软件包12.04:

         

    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 guide 中的说明,我更新了这两个文件(使用vi):

vm.args

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

的app.config

  
      
  • {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 是旧的。

我一直在摸不着头脑,但是找不到任何关于这个主题的内容,我能想到的唯一解决办法是重新安装Riak,因为我的PATH目录出错了。如果失败了,我的最后一招就是终止实例并在新实例上重新配置Riak。所以在我开枪之前,我想问的是:

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

  • 是否有任何方法可以为Ubuntu EC2实例分配静态专用IP?这不仅可以帮助解决问题,还可以节省每次启动/停止实例时更新app.configvm.args的时间。

3 个答案:

答案 0 :(得分:5)

因此,经过一些更深入的阅读和激烈的阅读,我找到了一个解决方案:

  

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

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

  

<强> rm -rf /var/lib/riak/ring/*

     
      
  • 注意: 这应该在 更新 app.config后完成 vm.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地址(请记住私有IP)每次启动/停止Ubuntu实例时都会更改,然后使用上面的命令清除Riak环,所以它不是一个优雅的解决方案。

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

编辑:12/12/12

有限的解决方案,用于为EC2实例分配静态IP:

  

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

     

如果您使用亚马逊的免费使用层,那么创建弹性IP不应向您收取,只要它与正在运行的实例相关联。如果弹性IP被解除关联,只要该弹性IP仍未解除关联,亚马逊将对未使用的弹性IP的每个运行时间收取费用。例如,终止实例将解除弹性IP的关联,除非重新关联或释放弹性IP,否则上述情况适用。完全停止您的实例然后在以后启动它也将解除弹性IP的关联。

     

每个实例最多可以包含一个弹性IP,这将产生费用。

     

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

答案 1 :(得分:2)

从Riak 1.3开始,不推荐使用riak-admin reip,并且使用riak-admin集群替换是替换集群名称的推荐方法。

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

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地址]。

答案 2 :(得分: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仍会出现在错误日志中。