弹性Beanstalk部署后SolR的自动重启

6

我在AWS上有一个RoR应用程序。我的应用程序使用SolR作为搜索引擎,但是每次部署后,应用程序都无法再次进行索引。因此,我必须手动重置权限并重新启动Solr:

chmod 777 -R /solr /tmp /log
RAILS_ENV=production rake sunspot:solr:stop # or I kill the processus if it doesn't work :D 
RAILS_ENV=production rake sunspot:solr:start
RAILS_ENV=production rake sunspot:reindex

我现在正在尝试将它设置为EB扩展以自动化部署。以下是我在.ebextensions/deploy.config中尝试的内容:

container_commands:
  1_change_permissions:
    command: chmod 700 .ebextensions/setup.sh 
  2_restart_solr:
    command: bash .ebextensions/setup.sh 

以下是setup.sh脚本:

#!/bin/bash
chmod 777 -R solr/ log/ tmp/
RAILS_ENV=production rake sunspot:solr:restart

结果是部署不会失败,但只有权限被正确更改,Solr服务正在运行,但当我尝试索引某些内容时,它会失败(查询工作正常)。
我还尝试在我的.ebextensions/deploy.config中添加一个commands块(并将我的sh脚本更改为启动服务而不是重新启动)来在应用程序部署之前停止服务器:
commands:
  1_stop_solr:
    command: cd /var/app/current & RAILS_ENV=production rake sunspot:solr:stop

我遇到了这个错误(我不知道它是从哪里执行的):

[2015-06-25T09:51:35.510Z] 信息 [13207] - [CMD-AppDeploy/AppDeployStage0/EbExtensionPreBuild/Infra-EmbeddedPreBuild/prebuild_0_My_First_Elastic_Beanstalk_Application/Command 1_stop_solr]:活动执行失败,原因是:rake中止! 找不到HOME环境--扩展`~'

编辑1(根据jay的评论): 当我保存对象时,索引过程会完成。

以下是一个实体的示例(以及出现错误的位置):

class Document < ActiveRecord::Base

  # .....

  # SolR entity 
  searchable do
    text :title, :description, :tags 
    integer :user_id
  end 

  # .....

end

**编辑 2:**

詹姆斯的答案没有解决问题,但是我意识到在我的EC2实例上手动运行以下两行代码即可:

chmod 777 -R solr/ tmp/ log/
RAILS_ENV=production rake sunspot:reindex"

我尝试使用James的链接来创建一个部署后脚本,chmod命令可以正常运行,但是当我将reindex命令添加到文件中时,部署失败并出现以下错误:

[2015-07-07T16:26:25.509Z] INFO  [20402] - [CMD-AppDeploy/AppDeployStage1/AppDeployPostHook/99_restart_delayed_job.sh] : Activity execution failed, because: rake aborted!
Could not find rake-10.4.2 in any of the sources 
/var/app/current/config/boot.rb:3:in `<top (required)>'
/var/app/current/config/application.rb:1:in `<top (required)>'
/var/app/current/Rakefile:4:in `<top (required)>'

此外,如果我尝试手动运行命令(在执行后部署脚本的chmod之后),每个重新索引的项目都会出现500错误。因此,我需要终止solr服务器,然后重新启动并重新索引。
这真的很痛苦 :)

你是如何索引文档的?使用脚本吗?还是使用Solr的post.jar文件?我猜测索引过程没有在Solr的索引文件夹上拥有写入权限,这可能解释了为什么你可以查询(只需要读取权限),但无法进行索引。 - jay
我在帖子中更新了一个索引示例。谢谢你的帮助! - Julian Le Calvez
2个回答

1
我不了解Beanstalk,但看起来执行您的命令的shell没有您期望的环境变量。假设发布后脚本上的博客文章是正确的,您应该能够将setup.sh脚本更改为以下内容:
 #!/usr/bin/env bash
 . /opt/elasticbeanstalk/support/envvars
 cd $EB_CONFIG_APP_CURRENT
 su -c "RAILS_ENV=production /usr/local/bin/rvm 2.2 do rake sunspot:solr:restart" $EB_CONFIG_APP_USER

谢谢詹姆斯的回答,但是它并没有解决我的问题。我在主贴中添加了一个“EDIT2”部分来说明我尝试过什么。 - Julian Le Calvez
肯定是环境问题。看起来EB可能正在使用RVM?尝试更新脚本。您可能需要调整它以获取正确的RVM路径和Ruby版本。 - James Mason
我在服务器上不使用RVM。通常情况下,该命令是通过bundler执行的,但它也无法正常工作。当我深入查看时,我发现在/opt/elasticbeanstalk/support/envvars文件中没有任何EB_*变量的导出。它应该在里面,对吧?我需要手动设置这些吗?因为当我尝试打印这些变量时,它没有返回任何内容。 - Julian Le Calvez
我认为硬编码数值应该没问题。只要路径不经常更改,就应该没问题。尝试使用硬编码路径编写一个命令到 bundler。看看是否能让你进一步。 - James Mason
好的,使用我尝试过的硬编码值无法工作。我尝试在/var/app/current中进行cd并执行:su -c,使用用户“ec2-user”。它甚至无法执行chmod操作。如果我尝试使用bundle的完整路径执行“bundle exec rake”,我会得到一个分段错误。只有rake时我没有收到任何错误,但它什么也没做(它不是手动的)。 - Julian Le Calvez

0

我知道这是一个旧问题,但我编写了一个ebextensions脚本,似乎很适合这种情况。希望如果人们仍然遇到此问题,这将有所帮助。

commands:
    000_sudo:
        command: sudo su
    001_cd_to_app:
        command: cd /var/app/current
    002_rm_solr:
        command: rm -rf solr/
    003_start_solr:
        command: bundle exec rails sunspot:solr:start RAILS_ENV=production
    004_reindex_solr:
        command: bundle exec rails sunspot:solr:reindex RAILS_ENV=production

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接