2.2. 群集设置

本节介绍准备、安装和设置第一个CouchDB2.x/3.x集群所需了解的所有内容。

2.2.1. 端口和防火墙

CouchDB使用以下端口:

端口号 协议 建议绑定 使用
5984 tcp协议 根据需要,默认情况下 localhost 所有HTTP API请求的标准群集端口
4369 tcp协议 默认情况下所有接口 Erlang端口映射器守护程序(epmd)
1024以上随机(见下文) tcp协议 自动的 与集群中其他CouchDB节点的通信

群集模式下的CouchDB使用端口 5984, just as in a standalone configuration. Port 5986, previously used in CouchDB 2.x, has been removed in CouchDB 3.x. All endpoints previously accessible at that port are now available under the /_node/{{node-name}}/... 通过主服务器的层次结构 5984 港口。

CouchDB使用Erlang本地集群功能来实现集群安装。Erlang使用TCP端口 4369 (EPMD)以查找其他节点,因此所有服务器都必须能够在此端口上相互通信。在Erlang集群中,在网状网络配置中,所有节点都连接到所有其他节点。

警告

如果你暴露港口 4369 对于Internet或任何其他不受信任的网络,那么唯一保护您的就是Erlang cookie .

然后,在该机器上运行的每个Erlang应用程序(比如CouchDB)使用自动分配的端口与其他节点通信。是的,这意味着随机端口。这显然不适用于防火墙,但可以强制Erlang应用程序使用特定的端口范围。

本文档将使用范围TCP 9100-9200 ,但这个范围是不必要的。如果您在一台机器上只运行一个Erlang应用程序,那么范围可以限制为一个端口: 9100-9100 ,因为epmd分配的端口用于 入站连接 只有。在同一台机器上运行的三个CouchDB节点,就像在开发集群场景中一样,在这个范围内需要三个端口。

2.2.2. 配置并测试与Erlang的通信

2.2.2.1. 使CouchDB使用正确的IP | FQDN和开放端口

在文件中 etc/vm.args 换行 -name couchdb@127.0.0.1-name couchdb@<reachable-ip-address|fully-qualified-domain-name> 它定义节点的名称。每个节点必须有一个标识符,允许远程系统与其通信。节点名称的格式为 <name>@<reachable-ip-address|fully-qualified-domain-name> .

所有节点上的name部分都可以是couchdb,除非您在同一台服务器上使用相同的IP地址或域名运行多个couchdb节点。在这种情况下,我们建议 couchdb1couchdb2 等。

节点名的第二部分必须是其他节点可以访问此节点的标识符——节点的完全限定域名(FQDN)或节点的IP地址。FQDN是首选,这样您就可以在不中断集群的情况下对节点的IP地址进行重新编号。(这在云托管环境中很常见。)

警告

诡计 /etc/hostslibresolv 不要和Erlang一起工作。请正确设置DNS并使用完全限定的域名,或者使用IP地址。首选DNS和FQDN。

稍后更改名称有点麻烦(即移动碎片),这就是为什么您希望设置一次名称而不必更改它的原因。

正常开放 etc/vm.args ,并添加 -kernel inet_dist_listen_min 9100-kernel inet_dist_listen_max 9200 如下所示:

-name ...
-setcookie ...
...
-kernel inet_dist_listen_min 9100
-kernel inet_dist_listen_max 9200

同样,小范围也可以,向下到一个端口(将两者都设置为 9100 )如果您只在每台机器上运行一个CouchDB节点。

2.2.2.2. 确认节点之间的连接

对于这个测试,您需要2台具有工作主机名的服务器。我们叫他们服务器1。测试网站和服务器2。测试网站. 他们住在 192.168.0.1192.168.0.2 ,分别。

在服务器1上。测试网站:

erl -name bus@192.168.0.1 -setcookie 'brumbrum' -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9200

然后在server2上。测试网站:

erl -name car@192.168.0.2 -setcookie 'brumbrum' -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9200
命令说明:
  • erl 二郎壳。
  • -name bus@192.168.0.1 Erlang节点的名称及其IP地址或FQDN。
  • -setcookie 'brumbrum' 节点相互连接时使用的“密码”。
  • -kernel inet_dist_listen_min 9100 范围内最低的端口。
  • -kernel inet_dist_listen_max 9200 范围内最高的端口。

这给了我们2个Erlang shell。服务器1上的shell1,服务器2上的shell2。是时候联系他们了。输入以下内容,确保以句点结尾 (. ):

在shell1中:

net_kernel:connect_node('car@192.168.0.2').

这将连接到名为 car 在服务器上调用 192.168.0.2 .

如果返回true,那么就有一个Erlang集群,防火墙是打开的。这意味着这两台服务器上的2个CouchDB节点将能够成功地相互通信。如果你得到了错误或者什么都没有,那么你的防火墙,DNS,或者你的设置有问题。再试一次。

如果您担心防火墙问题,或者在以后连接集群的所有节点时遇到问题,请在所有服务器对之间重复上述测试,以确认连接和系统配置是否正确。

2.2.3. 准备CouchDB节点加入集群

在添加节点以形成群集之前,必须让它们侦听可从群集中的其他节点访问的IP地址。在加入所有节点之前,您还应该确保一些关键设置在所有节点上都是相同的。

在将节点加入群集之前,我们建议您现在设置的设置是:

  1. etc/vm.args settings as described in the previous two sections
  2. 至少一个 server administrator 用户(和密码)
  3. 群集端口(绑定 5984 )到可访问的IP地址
  4. 一致的 UUID . UUID用于在复制时标识集群。如果这个值在群集中的所有节点上都不一致,则复制可能会被迫将更改反馈倒带到零,从而导致内存、CPU和网络的过度使用。
  5. 始终如一的 httpd secret 。密码用于计算和评估Cookie和代理身份验证,并且应一致设置,以避免不必要的重复会话Cookie请求。

从couchdb3.0开始,当您使用下面描述的setupapi端点时,将自动执行上面的步骤4和5。

如果您使用配置管理工具,如Chef、Ansible、Puppet等,那么您可以将这些设置放在 .ini 提前归档并分发到所有节点。如果您使用此路径来避免CouchDB重写文件,请确保预加密密码(从测试实例中剪切和粘贴是最容易的)。

如果您不使用配置管理,或者只是第一次尝试CouchDB,请使用以下命令 每个服务器一次 执行上述步骤2-4。一定要改变 password 同样,在所有节点上使用相同的密码。您可能必须在每个节点上本地运行这些命令;如果是,请替换 <server-IP|FQDN> 下面有 127.0.0.1 .

# First, get two UUIDs to use later on. Be sure to use the SAME UUIDs on all nodes.
curl http://<server-IP|FQDN>:5984/_uuids?count=2

# CouchDB will respond with something like:
#   {"uuids":["60c9e8234dfba3e2fdab04bf92001142","60c9e8234dfba3e2fdab04bf92001cc2"]}
# Copy the provided UUIDs into your clipboard or a text editor for later use.
# Use the first UUID as the cluster UUID.
# Use the second UUID as the cluster shared http secret.

# Create the admin user and password:
curl -X PUT http://<server-IP|FQDN>:5984/_node/_local/_config/admins/admin -d '"password"'

# Now, bind the clustered interface to all IP addresses availble on this machine
curl -X PUT http://<server-IP|FQDN>:5984/_node/_local/_config/chttpd/bind_address -d '"0.0.0.0"'

# If not using the setup wizard / API endpoint, the following 2 steps are required:
# Set the UUID of the node to the first UUID you previously obtained:
curl -X PUT http://<server-IP|FQDN>:5984/_node/_local/_config/couchdb/uuid -d '"FIRST-UUID-GOES-HERE"'

# Finally, set the shared http secret for cookie creation to the second UUID:
curl -X PUT http://<server-IP|FQDN>:5984/_node/_local/_config/chttpd_auth/secret -d '"SECOND-UUID-GOES-HERE"'

2.2.4. 群集安装向导

CouchDB 2.x/3.x附带了一个方便的集群设置向导,作为Foxton Web管理界面的一部分。对于首次集群设置和实验,这是您的最佳选择。

它是 强烈推荐 集群中的最小节点数为3。有关更多说明,请参见 Cluster Theory 本文件的第节。

在安装并初始启动集群中的所有节点之后,确保所有节点都可访问,并完成上面列出的预配置步骤,请访问Fauxton http://<server1>:5984/_utils#setup . 您将被要求将CouchDB设置为单个节点实例或设置集群。

当您单击“设置群集”时,系统会再次要求您提供管理员凭据,然后按IP地址添加节点。要获得更多节点,请为每个节点执行相同的安装过程,使用相同的Machien执行设置过程。在添加节点之前,请确保指定要添加到群集的节点总数。

现在,在安装向导中输入每个节点的IP地址或FQDN,确保还输入以前设置的服务器管理员用户名和密码。

添加完所有节点后,单击“设置”,Fauxton将为您完成集群配置。

要检查所有节点是否已正确连接,请访问 http://<server-IP|FQDN>:5984/_membership 在每个节点上。返回的列表应显示群集中的所有节点:

{
  "all_nodes": [
    "couchdb@server1.test.com",
    "couchdb@server2.test.com",
    "couchdb@server3.test.com"
  ],
  "cluster_nodes": [
    "couchdb@server1.test.com",
    "couchdb@server2.test.com",
    "couchdb@server3.test.com"
  ]
}

这个 all_nodes 第节是 预期 节点;节点 cluster_nodes 第节是 实际连接 节点。确保两个列表匹配。

现在你的集群已经准备就绪,可以使用了!您可以向其中任何一个节点发送请求,这三个节点都将响应,就像您在处理单个CouchDB集群一样。

为了进行正确的生产设置,现在您需要在集群前面设置一个HTTP反向代理,用于负载平衡和SSL终止。我们建议 HAProxy ,但也可以使用其他方法。中提供了配置示例 最佳实践 部分。

2.2.5. 群集设置API

如果您希望手动配置CouchDB集群,CouchDB将公开 _cluster_setup 用于此目的的端点。在安装和初始setup/config之后,我们可以设置集群。在每个节点上,我们需要运行以下命令来设置节点:

curl -X POST -H "Content-Type: application/json" http://admin:password@127.0.0.1:5984/_cluster_setup -d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "admin", "password":"password", "node_count":"3"}'

然后我们可以把所有的节点连接在一起。选择一个节点作为“设置协调节点”来运行所有这些命令。此“设置协调节点”仅管理设置,并要求所有其他节点都能够看到它,反之亦然。 除了设置过程之外,它没有特殊用途;CouchDB没有集群中“主”节点的概念。

安装程序无法处理不可用的节点。所有节点必须联机并正确预配置,然后才能开始群集设置过程。

要将节点加入群集,请为要添加的每个节点运行以下命令:

curl -X POST -H "Content-Type: application/json" http://admin:password@<setup-coordination-node>:5984/_cluster_setup -d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "admin", "password":"password", "port": 5984, "node_count": "3", "remote_node": "<remote-node-ip>", "remote_current_user": "<remote-node-username>", "remote_current_password": "<remote-node-password>" }'
curl -X POST -H "Content-Type: application/json" http://admin:password@<setup-coordination-node>:5984/_cluster_setup -d '{"action": "add_node", "host":"<remote-node-ip>", "port": <remote-node-port>, "username": "admin", "password":"password"}'

这将把两个节点连接在一起。继续为要添加到集群的每个节点运行上述命令。完成后,运行以下命令以完成群集设置并添加系统数据库:

curl -X POST -H "Content-Type: application/json" http://admin:password@<setup-coordination-node>:5984/_cluster_setup -d '{"action": "finish_cluster"}'

验证安装:

curl http://admin:password@<setup-coordination-node>:5984/_cluster_setup

回复:

{"state":"cluster_finished"}

验证所有群集节点是否已连接:

curl http://admin:password@<setup-coordination-node>:5984/_membership

回复:

{
    "all_nodes": [
        "couchdb@couch1.test.com",
        "couchdb@couch2.test.com",
        "couchdb@couch3.test.com",
    ],
    "cluster_nodes": [
        "couchdb@couch1.test.com",
        "couchdb@couch2.test.com",
        "couchdb@couch3.test.com",
    ]
}

确保 all_nodescluster_nodes 列表匹配。

CouchDB集群现在已经设置好了。