У меня есть соединение 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.
Просто сделал. Странно, что журнал ошибок все еще выдает address=localhost:27017?
Обновление: все перезапустил, и журнал ошибок изменился на адрес=mongodb:27017; хотя все равно выдает ошибку тайм-аута

Слава @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 (имя пользователя:пароль) в строке подключения.
Можете ли вы попробовать удалить имя_контейнера из службы Mongo, а затем отредактировать свой вопрос, включив в него исправленную конфигурацию и сообщение об ошибке, в которой в строке подключения используется mongodb вместо localhost?