我目前正在开发一个docker-compose设置,可用于部署CouchDB 2节点集群。我终于让节点工作并且数据在节点之间同步,但除非我弄错了,否则看起来CouchDB不会同步用户会话。
我的设置有3个节点,并使用几乎与haproxy.cfg相同的haproxy设置。根据我的配置,haproxy将端口5984上的传入流量路由到所有3个节点上的端口5984。
假设管理员用户名为root
,密码为password
。
我首先登录:
curl -vX POST http://localhost:5984/_session -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=root&password=password'
请注意,返回的AuthSession在下面用作AUTHSESSION。
然后,我发出以下内容:
curl -X PUT http://localhost:5984/mydb --cookie AuthSession=AUTHSESSION -H "X-CouchDB-WWW-Authenticate: Cookie" -H "Content-Type: application/x-www-form-urlencoded"
这通常会失败“你不是服务器管理员。”我可以继续发出相同的PUT,它最终会成功,因为我认为haproxy最终将请求路由到我通过身份验证的单个节点。由于haproxy使用循环法,我将有三分之一的机会击中目标节点。
我认为CouchDB 2可以处理跨节点的用户会话同步。我在这里做一个愚蠢的假设吗?
(请参阅run cluster via docker-compose复制我的设置)
使用Docker-compose设置的特定解决方案进行更新
根据@lossleader,您需要在[couch_httpd_auth]部分设置秘密,以使其在节点之间相同。此外,您需要在[admins]部分中设置相同的管理员用户名和密码。我在这里错过的细节是,所有节点必须在.ini文件中具有完全相同的密码哈希。拥有相同的明文密码是不够的,否则,每个节点都会生成自己的盐并生成不同的哈希值。
有关我的完整设置,请参阅run cluster via docker-compose。
答案 0 :(得分:6)
简答:是的。
答案很长:
正如其他人所评论的那样,couchdb不知道它所做的会话,所以确实没有自己同步会话的机制,但是在一个会话cookie之前你需要自己同步两个非会话内容集群的节点在任何其他节点上都有效。
[couch_httpd_auth]
secret = foo
这是用于签署会话cookie的秘密值。如果在请求会话cookie时不存在,则将其设置为随机值。当然,群集的每个节点都会生成不同的值。
因此,在启动之前,安排将此值设置为较大的随机值,但在群集的所有节点上都相同。
[admins]
foo = -pbkdf2-2cbae77dc3d2dadb43ad477d312931c617e2a726,cd135ad4d6eb4d2f916cba75935c3ce7,10
此部分包含每个管理员用户的盐渍密码哈希值。盐包含在会话cookie中的签名中。在更改密码时,salt会被重新随机化,因此包含salt的效果是它会在密码更改之前使会话cookie无效。
您还需要此部分在所有节点上都相同。在对管理员密码进行哈希处理时,每个节点都会生成一个随机盐。
最好在外部生成此部分,作为节点配置自动化的一部分。
我希望能让你开始。我们希望在将来的版本中改进这种情况,它显然反映了couchdb的预聚类版本。
答案 1 :(得分:4)
CouchDB会话令牌只是用户密码盐,服务器机密和时间的HMAC哈希值。即使在单节点系统上,会话也根本不存储在CouchDB中。所以没有什么可以同步的。
你可以,而且很多人都可以在CouchDB外部以编程方式生成会话。