Тайм-аут соединения: невозможно подключить монго к дебезию для CDC

У меня есть соединение mongo и kafka, настроенное в docker-compose. Я хочу включить CDC из Монго с дебезием. Это мои услуги:

  mongodb:
    image: mongo
    restart: always
    command: mongod --replSet debezium --bind_ip_all
    environment:
      MONGO_INITDB_DATABASE: test
      MONGO_INITDB_FEATURES: "1"
    expose:
      - "27017"
    ports:
      - "27017:27017"
    volumes:
      - ~/mongos:/data/db

  debezium:
    image: debezium/connect:latest
    restart: always
    container_name: debezium
    hostname: debezium
    depends_on:
      - postgres
      - kafka
      - mongodb
    ports:
      - '8083:8083'
    environment:
      BOOTSTRAP_SERVERS: kafka:29092
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: connect_configs
      STATUS_STORAGE_TOPIC: connect_statuses
      OFFSET_STORAGE_TOPIC: connect_offsets
      KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      ENABLE_DEBEZIUM_SCRIPTING: 'true'
    healthcheck:
      test:
        [
          'CMD',
          'curl',
          '--silent',
          '--fail',
          '-X',
          'GET',
          'http://localhost:8083/connectors',
        ]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 5

Все остальные соответствующие службы также работают, поскольку я уже использую postgres с debezium. В случае монго соединитель всегда возвращает «Отказ в соединении». Я создал набор реплик в mongodb и инициализировал пользователя с привилегиями root:

Инициализация набора реплик rs.initiate({_id: "debezium",members:[{_id: 0, хост: "localhost:27017"}]}) Создание пользователя с разрешением использовать администратора db.createUser({ user: "debezium", pwd: "dbz", roles: ["dbOwner"] })

Это мой соединитель.json:

{
  "name": "mongo-db-connector",
  "config": {
    "connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
    "tasks.max": "1",
    "topic.prefix": "dbserver2",
    "mongodb.connection.string": "mongodb://debezium:dbz@mongodb:27017/?replicaSet=debezium",
    "database.include.list": "test",
    "key.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "false",
    "value.converter": "org.apache.kafka.connect.json.JsonConverter",
    "value.converter.schemas.enable": "false",
    "transforms": "unwrap",
    "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
    "transforms.unwrap.drop.tombstones": "true"
  }
}

Я могу подключиться к набору реплик mongo, используя компас mongodb, работающий локально; однако, когда я запускаю соединитель, он всегда возвращает мне Unable to connect: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=REPLICA_SET, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception = {com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}]\nYou can also find the above list of errors at the endpoint /connector-plugins/{connectorType}/config/validate"}.

Я дважды проверил, правильно ли инициализирован набор реплик, а также права пользователя. Я также могу создать соединитель Postgres. Я предполагаю, что это не проблема с сетью, поскольку все это находится в файле docker-compose.

Можете ли вы попробовать удалить имя_контейнера из службы Mongo, а затем отредактировать свой вопрос, включив в него исправленную конфигурацию и сообщение об ошибке, в которой в строке подключения используется mongodb вместо localhost?

OneCricketeer 03.06.2024 15:08

Просто сделал. Странно, что журнал ошибок все еще выдает address=localhost:27017?

Mir Humayun Nisar 03.06.2024 15:49

Обновление: все перезапустил, и журнал ошибок изменился на адрес=mongodb:27017; хотя все равно выдает ошибку тайм-аута

Mir Humayun Nisar 03.06.2024 16:29
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
3
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Слава @OneCricketeer. Теперь я определил hostname: mongodb в своем сервисе MongoDB. Раньше я тоже неправильно определял набор реплик: Это было rs.initiate({_id: "debezium", members:[{_id: 0, host: "localhost:27017"}]}); Я изменил его на rs.initiate({_id: "debezium",members:[{_id: 0, хост: "mongodb:27017"}]}), и теперь он работает. В целях тестирования я также удалил debezium:dbz (имя пользователя:пароль) в строке подключения.

Другие вопросы по теме