Orientdb 3.0.25: сервер не может получить монопольную блокировку ресурса 'db_1' при создании базы данных в памяти в распределенном режиме
Я установил экземпляр OrientDB (версия 3.0.25) с конфигурацией из 3 узлов (пробовал как с конфигурацией мастер-мастер, так и с конфигурацией с одним мастером и двумя репликами). когда я создаю базу данных "в памяти", я вижу в журнале сервера это исключение:
11:51:57:409 INFO [odb2] Trying to recover current server for database 'db_memory_1'... [OClusterHealthChecker]
odb2_1 | 2020-05-07 11:52:30:446 WARNI [odb2] No undo because the task (exc_lock acquire resource=db_memory_1) is idempotent [ODistributedResponseManagerImpl]
odb2_1 | 2020-05-07 11:52:30:446 WARNI [odb2]->[odb1] Server 'odb2' cannot acquire distributed lock on resource 'db_memory_1' (timeout=20000)... [ODistributedLockManagerRequester]Error on checking cluster health
odb2_1 | com.orientechnologies.common.concur.lock.OLockException: Server 'odb2' cannot acquire exclusive lock on resource 'db_memory_1' (timeout=20000)
odb2_1 | at com.orientechnologies.orient.server.distributed.impl.ODistributedLockManagerRequester.acquireExclusiveLock(ODistributedLockManagerRequester.java:85)
odb2_1 | at com.orientechnologies.orient.server.distributed.impl.ODistributedAbstractPlugin.executeInDistributedDatabaseLock(ODistributedAbstractPlugin.java:1756)
odb2_1 | at com.orientechnologies.orient.server.distributed.impl.ODistributedAbstractPlugin.installDatabase(ODistributedAbstractPlugin.java:947)
odb2_1 | at com.orientechnologies.orient.server.distributed.impl.OClusterHealthChecker.checkServerStatus(OClusterHealthChecker.java:223)
odb2_1 | at com.orientechnologies.orient.server.distributed.impl.OClusterHealthChecker.run(OClusterHealthChecker.java:75)
odb2_1 | at com.orientechnologies.orient.core.Orient$3.run(Orient.java:433)
odb2_1 | at java.util.TimerThread.mainLoop(Timer.java:555)
odb2_1 | at java.util.TimerThread.run(Timer.java:505)
и после создания базы данных два узла застревают в состоянии "СИНХРОНИЗАЦИЯ". это происходит как при создании базы данных в студии, так и при использовании java API. при использовании java API - команда застревает на долгое время и не возвращается, а исключение, указанное выше, отображается в журналах.
try (OrientDB dbClient = new OrientDB(dbUrl, serverUser, serverPassword,
OrientDBConfig.defaultConfig())) {
dbClient.create(dbName, dbType);
try (ODatabaseSession dbSession = dbClient.open(dbName, "root", "root")) {
test.accept(dbSession);
}
}
В чем может быть проблема? поддерживается ли in-memory в распределенной конфигурации (версия 3.0)? эта проблема не возникает в базе данных PLOCAL.
файл docker-compose:
version: 3.3
services:
odb1:
image: orientdb:3.0.25
command: dserver.sh
volumes:
- ./var/odb1/config:/orientdb/config
- ./var/odb1/databases:/orientdb/databases
environment:
ORIENTDB_ROOT_PASSWORD: root
ORIENTDB_NODE_NAME: odb1
ports:
- 2480:2480
- 2424:2424
odb2:
image: orientdb:3.0.25
command: dserver.sh
volumes:
- ./var/odb2/config:/orientdb/config
- ./var/odb2/databases:/orientdb/databases
environment:
ORIENTDB_ROOT_USER: root
ORIENTDB_NODE_NAME: odb2
depends_on:
- odb1
odb3:
image: orientdb:3.0.25
command: dserver.sh
volumes:
- ./var/odb3/config:/orientdb/config
- ./var/odb3/databases:/orientdb/databases
environment:
ORIENTDB_ROOT_PASSWORD: root
ORIENTDB_NODE_NAME: odb3
depends_on:
- odb2
Я использую практически ту же конфигурацию, что и в этом примере: https://github.com/orientechnologies/orientdb-docker/tree/master/examples/3-nodes-compose/var
Буду признателен за вашу помощь в выяснении этого вопроса, спасибо!