Orientdb 3.0.25: сервер не может получить монопольную блокировку ресурса 'db_1' при создании базы данных в памяти в распределенном режиме - PullRequest
0 голосов
/ 07 мая 2020

Я установил экземпляр 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)

и после создания базы данных два узла застревают в состоянии «SYNCRONIZING». это происходит как при создании базы данных в студии, так и при использовании 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

Буду признателен за вашу помощь в выяснении этого вопроса, спасибо!

...