我正在尝试找出一种正确的方法来使用 Docker 集群模式在服务副本之间实现主动/被动故障转移。
该服务将保存一个不会丢失的宝贵内存状态,这就是我需要它的多个副本的原因。副本将在内部实现 Raft,以便只有在给定时刻处于事件状态的副本(“领导者”)才会接受来自客户端的请求。
( If you're unfamiliar with Raft : 简单地说,它是一种分布式共识算法,有助于实现副本的主动/被动容错集群。根据 Raft,主动副本 - 领导者 - 将其数据的更改复制到被动副本- 追随者。唯一的领导者接受来自客户端的请求。如果领导者失败,则从追随者中选出新的领导者。
据我了解,Docker 将保证指定数量的副本启动并运行,但它会以主动/主动方式平衡所有副本之间的传入请求。
如何告诉 Docker 仅将请求路由到事件副本,但仍保证所有副本都已启动?
一个选项是通过一个额外的 NGINX 容器路由所有请求,并在每次选出新的领导者时更新其规则。但这将是一个额外的跳跃,我想避免。
我还试图避免使用外部/重叠工具,例如 consul 或 kubernetes,以使解决方案尽可能简单。 (HAProxy 不是一个选项,因为我需要一个 Linux/Windows 可移植解决方案)。所以目前我正在尝试了解这是否可以单独使用 Docker swarm mode 来完成。
我遇到的另一种方法是从被动副本返回失败的运行状况检查。 kubernetes according to this answer ,但我不确定它是否适用于 Docker。群管理器如何解释来自任务容器的失败的健康检查?
如果有任何想法,我将不胜感激。
最佳答案
Active Passive 副本可以通过以下部署模式实现:
模式:全局
打开相应服务的这个端口,即可以通过swarm中的任何节点访问服务,但容器将只在特定节点上运行。
引用:https://docs.docker.com/compose/compose-file/#mode
示例: 带有 Consul 后端 docker 堆栈文件的 VAULT-HA: https://raw.githubusercontent.com/gtanand1994/VaultHA/master/docker-compose.yml
这里,Vault 和 Nginx 容器只能在 swarm 中的一个节点中看到,但 Consul 容器(具有模式:已复制)将出现在 swarm 的所有节点上。 但正如我之前所说,VAULT 和 NGINX 服务可以通过 'any_node_ip:corresponding_port_number' 获得
关于nginx - 具有 Docker swarm 模式的被动副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686770/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我主要使用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
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移: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
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl