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节点。在这种情况下,我们建议 couchdb1
, couchdb2
等。
节点名的第二部分必须是其他节点可以访问此节点的标识符——节点的完全限定域名(FQDN)或节点的IP地址。FQDN是首选,这样您就可以在不中断集群的情况下对节点的IP地址进行重新编号。(这在云托管环境中很常见。)
警告
诡计 /etc/hosts
和 libresolv
不要和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.1
和 192.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地址。在加入所有节点之前,您还应该确保一些关键设置在所有节点上都是相同的。
在将节点加入群集之前,我们建议您现在设置的设置是:
etc/vm.args
settings as described in the previous two sections- 至少一个 server administrator 用户(和密码)
- 群集端口(绑定
5984
)到可访问的IP地址 - 一致的
UUID
. UUID用于在复制时标识集群。如果这个值在群集中的所有节点上都不一致,则复制可能会被迫将更改反馈倒带到零,从而导致内存、CPU和网络的过度使用。 - 始终如一的
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_nodes
和 cluster_nodes
列表匹配。
CouchDB集群现在已经设置好了。