草庐IT

docker - 以 swarm 模式运行 Elasticsearch 容器

coder 2023-05-06 原文

Elasticsearch 设计为在集群模式下运行,我所要做的就是通过环境变量定义集群中的相关节点 IP,只要网络连接可用,它就会将其他节点连接并加入集群。

我有 3 个节点,1 个充当 docker swarm 管理器,另外两个是 worker 。我已经初始化了管理器并加入了工作节点,从这个角度来看一切都很好。

现在我正在尝试以允许我将所有节点加入同一个 elasticsearch 集群的方式运行 elasticsearch 容器,但是,我希望节点使用它们的覆盖网络接口(interface)加入,这意味着我需要在运行 docker service create 命令时知道容器内部 IP 地址,我该怎么做?我必须使用 consul 之类的东西来实现这一点吗?

一些说明:

我需要在创建服务时知道所有 Elasticsearch 参与者的 IP 地址(或 DNS 名称),这样我才能正确启动集群。这必须是在创建时,而不是之后。另外,据我了解,我可以为所有服务公开端口 9200/9300 并使用外部机器 IP 并使其正常工作,但我想使用覆盖网络进行所有这些通信(我认为这就是 swarm模式用于)。

最佳答案

这里只是部分解决方案。 因此,当将您的服务附加到 custom 覆盖网络时,您确实可以访问 Docker 的自定义服务发现功能。在尝试将其与您的问题联系起来之前,我将详细介绍 Docker Swarm 模式的网络功能。

我将使用 servicestasks 的不同术语,其中服务可以是 elasticsearch,而任务是该 Elasticsearch 服务的单个实例

Docker 网络

这个想法是,对于您创建的每个 服务,docker 都会分配一个虚拟 IP (VIP) 和一个自定义 dns 别名。您可以使用 docker service inspect myservice 命令检索此 VIP。

但是,有两种模式可以将服务附加到覆盖网络dnsrrVIP。您可以使用 docker service create--endpoint-mode 选项选择这些选项。

VIP 模式(我相信它是默认的,或者至少是最常用的),会影响到服务的 dns 别名的虚拟 ip。这意味着执行 nslookup servicename 将返回给您一个 vip,在幕后,它将以循环方式链接到您的一个容器。但是,还有一个特殊的 dns 别名,可让您访问所有实例 ip(所有任务 ip):tasks.myservice

因此,在 VIP 模式下,您可以使用简单的 nslookup tasks.myservice 检索所有任务 ip,其中 myservice 是服务名称。

另一种模式是 dnsrr。这种模式只是摆脱了 VIP,并以循环方式将 dns 别名连接到不同的任务(=服务实例)。这样,您只需执行 nslookup myservice 即可检索不同的服务实例 ip。

Elasticsearch 集群

好吧,首先我不太熟悉 elasticsearch 让您进行集群的方式。根据我从您的问题中了解到的情况,您需要在运行 elasticsearch 二进制文件时将其作为参数提供,它需要集群的其他节点的 all 的地址。

所以我要做的是创建一个自定义的 Elasticsearch 图像,可能基于默认库中的图像,我将向其中添加一个自定义 Entrypoint,它将首先运行一个脚本来检索其他任务 ip。

我相信保持 VIP 模式适合你,因为有 tasks.myservice dns 别名。然后,您需要解析输出以检索任务 ip(并可能删除您的)。然后您就可以将它们保存在配置文件环境变量中,或者将它们用作 Elasticsearch 二进制文件的运行时选项。

编辑:要创建自定义覆盖网络,您需要使用 docker network create 命令,并使用 --network docker service create

的选项

这个答案主要基于Swarm mode networking documentation

关于docker - 以 swarm 模式运行 Elasticsearch 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719959/

有关docker - 以 swarm 模式运行 Elasticsearch 容器的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  9. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  10. ruby-on-rails - before_filter 运行多个方法 - 2

    是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

随机推荐