Руководство по предотвращению ям версии Canal v1.1.4

задняя часть
Руководство по предотвращению ям версии Canal v1.1.4

помещение

Потерпев долгое время, я не мог не взорваться и запостил точку кипения в Наггетс (опубликовал после выхода с работы):

Это"печальная история", точка кипения этого эмоционального всплеска как бы перекрыта, а остальные мелкие стоки(CanalЭто означает водный путь, трубопровод) был в сети в течение определенного периода времени, когда он находится вне ямы, волны спокойны, и как только он выходит из ямы, он заставляет людей чувствовать себя дерьмом. Несколько ключевых моментов:

  • последнийRELEASEВерсияv1.1.4,опубликовано2019-9-2, он не обновлялся почти год.
  • IssueЕсть много нерешенных или оставшихся без ответа вопросов, и многие из них старше.
  • masterВетка часто коммитит ненормальный код, а сборка не дружественная, т.к.v1.1.4Есть и другие проблемы, я также думал об использованииmasterКод собирается вручную.После импорта проекта вы решаете отказаться.Кто пробовал знает,можете попробовать сравнить импорт и сборкуMyBatisисходный код.

Это только видимость, давайте поговорим о ямах, на которые наступили.

Разобрать проблему блокировки потока

Это в основном каждое использованиеCanalОбязательная яма разработчиков.$CANAL_HOME/conf/canal.propertiesВ конфигурационном файле есть закомментированная строка конфигурации:canal.instance.parser.parallelThreadSize = 16. Эта конфигурация используется для указания количества одновременных потоков экземпляра парсера.Если она закомментирована, поток парсера будет заблокирован, и в результате ничего не произойдет.

Комментарий можно удалить, рекомендуется использовать значение по умолчанию16.

Проблема ненормальной блокировки кэша структуры таблицы

ЭтоIssueБольшинство вопрошавших упомянули давно не решаемую проблему, а именно проблему хранения метаданных структуры таблицы (используется в конфигурационном пунктеtsdbТо есть слово базы данных временных рядов, именуемое в дальнейшемtsdbФункции).

Включено по умолчаниюtsdbфункция, то есть она пройдетh2База данных кэширует проанализированную структуру таблицы, но на практике, если восходящий поток меняет структуру таблицы,h2Кэш, соответствующий базе данных, не будет обновляться. В это время обычно возникает волшебное исключение синтаксического анализа. Аномальная информация обычно выглядит следующим образом:

Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:数据库名称.表名称,新表结构的字段数量 vs 缓存表结构的字段数量;

Исключение также имеет ужасное последствие: поток синтаксического анализа блокируется, т.е.binlogСобытия больше не принимаются и анализируются. Я также много смотрел на этот вопросIssue, который все считают серьезнымBUG, наиболее подходящим решением в настоящее время является: отключитьtsdbфункция (действительно достаточно грубая), т.е.canal.instance.tsdb.enableУстановить какfalse. Если не отключенtsdbфункция, как только эта проблема возникает, она должна быть"остановись первым"Canalобслуживание, то"Удалить"$CANAL_HOME/conf/目标数据库实例标识/h2.mv.dbфайл, затем"запускать"CanalСлужить.

Из-за этой относительно неявной проблемы автор отключил ее в продакшене.tsdbфункцию и добавилDDLЛогика обработки оператора напрямую попадает в оповещение DingTalk и@целая группа людей.

Мне становится страшно каждый раз, когда я вижу это предупреждение.

журнал проблемы

Если вам просто нужно найтиbinlogДля файлов с относительно поздним расположением количество файлов относительно велико, и журнал обнаружения будет лихорадочно распечатываться. Я пытался перезапустить раньше, и он печатался несколько раз.GBжурнал, более99%позиционируетbinlogдокументы иpositionстрока журнала. можно рассмотреть, изменив$CANAL_HOME/conf/logback.xml(Не рекомендуется, неясный исходный код может легко вызвать другие новые проблемы) Настройте или укажите$CANAL_HOME/conf/目标数据库实例标识/instance.propertiesСледующие свойства ручного поиска начальной точки синтаксического анализа:

canal.instance.master.journal.name=binlog的文件名
canal.instance.master.position=binlog的文件中的位点
canal.instance.master.timestamp=时间戳
canal.instance.master.gtid=gtid的值

Вышеуказанные свойства начальной точки ручного позиционирования и парсинга необходимо обновить или закомментировать перед очередным перезапуском Canal, иначе это вызовет серьезные последствия повторного парсинга или файл не будет найден! ! !

"Во всяком случае, каждый перезапускCanalУслуги вызывают восторг, никакое программное обеспечение с открытым исходным кодом не может заставить людей чувствовать себя так". Поскольку произведенных серверных дисков не очень много, я купил только 100 дисков во время выбора.GB, а учитывая, что эти логи по сути ничего не значат, я могу только регулярно загружать и удалять логи. На начальном этапе я удалял их вручную. Позже мне стало хлопотно писать логи.ShellСкрипт периодически удаляет старые лог-файлы.

Проблемы использования облачной RDS MySQL

Если вам случится использовать Alibaba CloudRDS MySQL, то может быть яма побольше. Основные вопросы:

  • RDS MySQLСуществуют правила оптимизации дискового пространства, и когда правила срабатывают,binlogзагрузить файл вOSS, затем удалите локальныйbinlogдокумент.
  • отCanalСогласно документу, он будет автоматически вытянутOSSВверхbinlogФайл парсится, так что пользователь его не воспринимает, но у этой функции естьBUG, не смог нормально функционировать.
  • RDS MySQLЭто темный ящик, если есть проблема, его можно передать только черезMySQLсвязанные запросы, чтобы найти проблему, нет возможности войти на сервер, чтобы увидеть реальную сцену.

Ударьте эту проблему, общее исключение:

.................. sqlstate = HY000 errmsg = Could not find first log file name in binary log index file

В основном можно подтвердить, что эта функция неисправна, например, естьIssue-2596:

Мой текущий подход заключается в следующем:

  • полностью устарелCanalВытащитьOSSВверхbinlogфункция файла.
  • RDS MySQLРасширьте диск как можно больше и скорректируйте стратегию, чтобы разрешить как можно большеbinlogФайлы хранятся локально как можно дольше, и они полностью анализируются, а затем загружаются вручную или автоматически после достижения правила истечения срока действия.В этот период есть много вещей, которые требуют дополнительных сборов, которые нужно взвесить сами по себе.

Текущая (05.08.2020) ветка master по-прежнему имеет ошибки в чтении и разборе binlog-файла в OSS. Партнерам, которые хотят вручную создать ветку master, рекомендуется отказаться от своих иллюзий.

Серьезными последствиями этой проблемы являются:"Существует относительно высокая вероятность того, что определенныйbinlogПарсинг файлов полностью отсутствует", если нет возможностиbinlogфайл обратно вRDS MySQLВнутри, в противном случае вам нужно выполнить функцию ручной синхронизации восходящего и нисходящего потока.

to be continue

Кроме того, обратите внимание наCanalЛучше всего делать активное и резервное развертывание, рекомендуется использовать сайт отправки и управление кластером.Zookeeper, а сервисный режим (canal.serverMode, который в настоящее время поддерживаетtcp,kafkaиrocketmq) рекомендуется использоватьKafka(masterна веткеRabbitMQподдержка коннектора, если вы хотите попробовать его, вы можете создать его вручную), а требования к ресурсам каждого узла относительно высоки.2C8GНизкая частотаECS, я чувствую себя немного подавленным, особенно при перезапуске экземпляра, если вам нужно переместитьbinlogсайт,CPUСкорость использования будет стремительно расти в течение определенного периода времени.

Автор обнаружил, что Alibaba CloudDTSпросто используйтеCanalВ качестве базового промежуточного программного обеспечения для синхронизации данных это означает, что оно было запущено в производство в практических сценариях приложений, и я действительно не хочу, чтобы оно в конечном итоге превратилось в устаревшее.KPIпункт задачи. Я не знаю, сколько проблем возникнет в будущем, если они возникнут, я продолжу обновлять это руководство по предотвращению ям.

(Конец этой статьи c-2-d e-a-20200805)

Категории