为什么在增加max_dbs_open之后,复制仍会因"增加max_dbs_open"而失败?

lam*_*bmj 8 couchdb

我们的应用程序使用CouchDB过滤的复制在用户数据库和主数据库之间移动数据.随着我们增加用户数量,复制开始失败并显示此消息

Source and target databases out of sync. Try to increase max_dbs_open at both servers.
Run Code Online (Sandbox Code Playgroud)

我们已经这样做了,将max_dbs_open的数量增加到一个可笑的高数字(10,000),但失败和消息保持不变.显然其他事情是错的.有谁知道它是什么?

lam*_*bmj 12

事实证明,消息increase max_dbs_open至多是部分答案,最坏的情况是误导.在我们的例子中,问题不是打开的数据库的数量,而是我们的许多复制使用的HTTP连接的数量.

每个复制可使用min(worker_processes + 1, http_connections)其中worker_processes被分配给每个复制工作者的数量和http_connections是分配给所描述的每个复制的HTTP连接的最大数量在本文档中.

所以使用的连接总数是

number of replications * min(worker_processes + 1, http_connections)
Run Code Online (Sandbox Code Playgroud)

默认值为worker_processes4,默认值为http_connections20.如果有100个复制,则复制使用的HTTP连接总数为500.另一个设置max_connections确定CouchDB服务器允许的最大HTTP连接数,如上所述在这份文件中.默认值为2048.

在我们的例子中,每个用户有两个复制 - 一个从用户到主数据库,另一个从主数据库到用户.因此,在我们的情况下,使用默认设置,每次添加用户时,我们都会添加额外的10个HTTP连接,最终通过默认设置max_connections.

由于我们的复制很少,并且只有少量数据从用户移动到主服务器,从主服务器移动到用户,我们拨回了数量,增加了数量worker_processes,一切都很好.http_connectionsmax_connections

UPDATE

其他一些发现

  1. 有必要提高进程的ulimit,使其具有更多的开放连接

  2. 过快地创建复制也会导致问题.如果我拨回了我创建新复制的速度,它也有助于缓解问题.因人而异.