Уменьшение размера стручков не изящно при использовании Kafka-connect на kubernetes - PullRequest
1 голос
/ 24 февраля 2020

Я запускал свой kafka-connect на двух машинах ec2. Таким образом, независимо от количества задач, эти две машины всегда будут продолжать выполнение задач. Отсюда и подержанные машины. Недавно я перенес кафку-коннект на кубернетес. Я добился хорошей эффективности процессора / памяти.

Но проблема возникает, когда происходит уменьшение масштаба kubernetes . Уменьшение размера стручков не происходит изящно .

Например. Предположим, есть 2 пакета p1 и p2. p1 выполняет 3 задачи t1, t2, t3 p2 выполняет 2 задачи t4, t5 (здесь задача t5 - это задача для исходного соединителя, который переносит данные из postgres в kafka)

Когда какой-либо модуль исчезает во время уменьшения масштаба, задачи, выполняемые на нем, перебалансированы на других модулях. Предположим, что pod p2 исчезает.

После перебалансировки задач новое состояние кластера выглядит следующим образом: - P1 выполняет 5 задач t1, t2, t3, t4_new, t5_new

Но в журналах для моего исходного соединителя говорится, что некоторые другая задача (предположительно задача, работающая на старом модуле t5) все еще выполняется и получает доступ к данным postgres db.

Как я могу убедиться, что всякий раз, когда модуль уменьшается, это происходит изящно в том смысле, что все задачи, выполняющиеся на модуле остановился.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Может оказаться, что по умолчанию grace period недостаточно для того, чтобы вы могли завершить sh его задачи после получения SIGTERM singal.

SIGTERM Сигнал отправляется основному процессу в контейнере, и как только сигнал получен, контейнер должен начать постепенное завершение работы запущенного приложения и выйти.

Существует очень хорошее объяснение / описание, описанное в официальной документации kubernetes о Termination of Pods.

Вы можете попытаться расширить terminationGracePeriodSeconds в своем развертывании, чтобы посмотреть, помогает ли это (по умолчанию 30):

spec:
    replicas: 
    template:
        spec:
            containers:
              - name: test
                image: ...
            terminationGracePeriodSeconds: 60

Другой способ - использовать preStop hook. Хук preStop выполняется непосредственно перед завершением контейнера. Как это работает, когда контейнер должен быть завершен, Kubelet запустит пре-стоп-хук и только затем отправит SIGTERM процессу. Это может быть использовано для инициирования постепенного отключения контейнера.

Его также можно использовать для выполнения некоторых других операций перед выключением без необходимости реализовывать их в самом приложении.

Это простой пример того, как это работает (это запрос HTTP GET, который будет отправлен на `http: /// shutdown):

lifecycle:
   preStop:
      httpGet:
         port: 80
         path: shutdown

Здесь также ссылка на kubernetes документация о Container hooks. Дайте мне знать, если это было ужасно.

0 голосов
/ 24 февраля 2020

просто увеличьте время ожидания отключения "task.shutdown.graceful.timeout.ms" в конфигурации kafka-connect. Также используйте preStop hook pods hooks и используйте некоторую команду sleep в hook, чтобы kubelet дождался завершения hook и запустил SIGTERM после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...