CouchDB 2是否跨节点同步用户会话?

red*_*off 3 couchdb couchdb-2.0

我目前正在开发一个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'
Run Code Online (Sandbox Code Playgroud)

请注意,返回的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"
Run Code Online (Sandbox Code Playgroud)

这通常会失败,"你不是服务器管理员."我可以继续发出相同的PUT,它最终会成功,因为我认为haproxy最终将请求路由到我通过身份验证的单个节点.由于haproxy使用循环法,我将有三分之一的机会击中目标节点.

我认为CouchDB 2可以处理跨节点同步用户会话.我在这做一个愚蠢的假设吗?

(请通过docker-compose查看运行集群以复制我的设置)

使用docker-compose设置的特定解决方案进行更新

根据@lossleader,您需要在[couch_httpd_auth]部分中设置秘密,以使其在节点之间相同.此外,您需要在[admins]部分中设置相同的管理员用户名和密码.我在这里错过的细节是所有节点必须在.ini文件中具有完全相同的密码哈希.拥有相同的明文密码是不够的,否则,每个节点将生成自己的salt并生成不同的哈希.

有关我的完整设置,请参阅通过docker-compose运行集群.

Rob*_*son 7

简短回答:是的.

答案很长:

正如其他人所评论的那样,couchdb不知道它所做的会话,所以确实没有自己同步会话的机制,但是在一个节点上创建一个会话cookie之前,你需要自己同步两个非会话内容.集群将在任何其他集群上有效.

[couch_httpd_auth] secret = foo

这是用于签署会话cookie的秘密值.如果在请求会话cookie时不存在,则将其设置为随机值.当然,群集的每个节点将生成不同的值.

因此,在启动之前,安排将此值设置为大的随机值,但在群集的所有节点上都相同.

[admins] foo = -pbkdf2-2cbae77dc3d2dadb43ad477d312931c617e2a726,cd135ad4d6eb4d2f916cba75935c3ce7,10

此部分包含每个管理员用户的盐渍密码哈希值.盐包含在会话cookie中的签名中.在密码更改时,salt被重新随机化,因此包含salt的效果是它会在密码更改之前使会话cookie无效.

您还需要此部分在所有节点上都相同.在散列管理员密码时,每个节点都会生成一个随机盐.

最好在外部生成此部分,作为节点配置自动化的一部分.

我希望能让你开始.我们希望在将来的版本中改进这种情况,它显然反映了couchdb的预聚类版本.