feedmetoo


Гео и язык канала: Россия, Русский
Категория: Технологии


Ссылки на интересные статьи в инженерных блогах и выступления на конференциях по теме «Управление и разработка больших IT-проектов». Больше фокус на продуктовой и платформенной разработке и инфре (но мы работаем над этим).

Связанные каналы  |  Похожие каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций




Ребята, привет!

С сегодняшнего дня все статьи и новости, которые мне кажутся интересными, я буду публиковать в своем основном канале System Design & Highload (Alexey Rybak). Пожалуйста, подписывайтесь на него. Активно вести два канала со многих точек зрения затратно.

В самое ближайшее время я продолжу публиковать там результаты нашего большого исследования по скейлингу кешей (redis, valkey, dragonfly, keydb) и баз (postgresql, mysql), продолжим разбирать книжку Алекса Сюя про сисдизайн (было уже 2 выпуска), а так же там будут комментарии на интересные материалы последней недели
- сорок лямов RPS на кеш в Убере
- использование векторных возможностей редиса для эмбеддингов и раг (а так же ссылки на ликбез, что это)
- сцилла в медиуме (и может поштормим про p99 который уже в конце октября)
- завоз графаной-лабз (странного) детектора аномалий в промстэк
- а так же про новые реалии питона - лично я пока не понимаю, действительно ли с JIT и без GIL становится заметно лучше.

Короче, канал: @rybakalexey.

Полюс предлагаю вам присоединиться к чату @AlexeyRybakChat.
Ваши комментарии, дополнения, критика, вопросы крайне ценны и обогащают обсуждения.


prog_msk_files_are_hard.pdf
3.4Мб
Для надежной записи просто fsync – недостаточно. О подводных камнях записи и гарантий сохранения - в слайдах свежей лекции Дмитрия Родионова (Пикодата). Видео: https://www.youtube.com/watch?v=1V_UfMZdO6Q


Репост из: db.links
https://sigmodrecord.org/publications/sigmodRecord/2406/pdfs/04_Surveys_Stonebraker.pdf - обзорная статья от авторитетов индсутрии - Павло и Стоунбрейкера.

Цитата для привлечения внимания. Срывают покровы:

There have been major new ideas in DBMS architectures put forward in the last two decades that reflecting changing application and hardware characteristics. These ideas range from terrific to questionable, and we
discuss them in turn.

Вкратце:

Data Models & Query Languages

* MapReduce dead.
* Hadoop dead.
* Spark & Flink doing well.
* RocksDB ...
rocks for embedded use-case.
* Для современной СУБД хорошо бы иметь API хранилища для разработки своего.
* json > xml.
* ACID это хорошо и нужно.
* wide column db are dead.
* text search engines где-то сбоку и без транзакций.
* array db интересные и хорошие но только для своих областей - научные и подобные данные натурально ложатся на модель хранения "массив".
* vector db специальный случай массива - одноразмерный. привлекают самое большое внимание разработчиков и инвесторов сегодня. Много ML use-case'ов.

The key difference between vector and array DBMSs is their query patterns. The former are designed for similarity searches that find records whose vectors have the shortest distance to a given input vector in a highdimensional space.

* graph db - развивают совсем другую модель хранения. От этого другой API запросов. Узкоспециализированные сценарии использования.

SQL:2023 introduced property graph queries (SQL/PGQ) for defining and traversing graphs in a RDBMS

===

A reasonable conclusion from the above section is that non-SQL, non-relational systems are either a niche market or are fast becoming SQL/RM systems


System Architectures

Глава написана хорошо - даже не буду ее конспектировать - рекомендуется к прочтению полностью 🙂

NewSQL vendors also incorrectly anticipated that inmemory DBMS adoption would be larger in the last decade. Flash vendors drove down costs while improving storage densities, bandwidth, and latencies. Higher DRAM costs and the collapse of persistent memory(e.g., Intel Optane) means that SSDs will remain dominant for OLTP DBMSs.

The aftermath of NewSQL is a new crop of distributed, transactional SQL RDBMSs. These include TiDB [141],
CockroachDB [195], PlanetScale [60] (based on the Vitess sharding middleware [80]), and YugabyteDB [86]. The major NoSQL vendors also added transactions to their systems in the last decade despite previously strong
claims that they were unnecessary. Notable DBMSs that made the shift include MongoDB, Cassandra, and DynamoDB. This is of course due to customer requests
that transactions are in fact necessary. Google said this cogently when they discarded eventual consistency in
favor of real transactions with Spanner in 2012 [119].


At the present time, cryptocurrencies (Bitcoin) are the only use case for blockchains. In addition, there
have been attempts to build a usable DBMS on top of blockchains, notably Fluree [25], BigChainDB [12], and ResilientDB [136]. These vendors (incorrectly) promote
the blockchain as providing better security and auditability that are not possible in previous DBMSs.


Ну и в заключение нестареющие мудрости:

* Never underestimate the value of good marketing for bad products.

* Beware of DBMSs from large non-DBMS vendors.

* Do not ignore the out-of-box experience.

* Developers need to query their database directly

* The impact of AI/ML on DBMSs will be significant


CockroachDB убирает free core с ноября 2024. Интересно, что я сам только на прошлой неделе собрал 24-ю версию из сорцов, и никаких ограничений не обнаружил. Будем пользоваться поблажками для «малого бизнеса» (до $10 млн выручки).

https://www.infoq.com/news/2024/09/cockroachdb-license-concerns/


Репост из: ☕️ Мерлин заваривает τσάι 🐌
Вчера вышел релиз #go 1.23 - самый спорный релиз на моей памяти https://go.dev/doc/go1.23

В нём стали доступны функции-итераторы https://go.dev/doc/go1.23#language, добавление которых вызвало довольно много негативной реакции в сообществе https://www.gingerbill.org/article/2024/06/17/go-iterator-design/

Помимо пакета нового пакета iter в пакеты slices и maps много новых функций типа Backward, Chunk, Values, Keys и Collect

Так же в этом релизе добавлена функциональность сбора телеметрии тулчейна Go. Телеметрия отключена по умолчанию и собирает анонимную информацию о параметрах go и gopls (https://go.dev/doc/telemetry). Одно время обсуждения самой возможности были довольно бурными https://www.reddit.com/r/golang/comments/10z5ig1/googles_go_may_add_telemetry_reporting_thats_on/ . Телеметрия не затрагивает результат сборки.

Посмотреть на статистические выкладки телеметрии и скачать собранный датасет можно вот тут https://telemetry.go.dev/

Список багов, пойманных телеметрией https://github.com/golang/go/issues?q=label%3Agopls%2Ftelemetry-wins

Из менее противоречивых изменений мне приглянулись
⁃ Новый флаг go mod tidy -diff - печатает изменения, которые произойдут при go mod tidy и возвращает exit_code=1 если такие изменения есть. Сильно упрощает проверки в CI
⁃ Новый флаг go env -changed - печатает изменения в go env, сделанные с помощью -w
⁃ Упрощена работа с time.Timer и time.Ticker - теперь вызовов .Reset и .Stop достаточно для корректного сброса и остановки - не надо вытаскивать stale значения из каналов
⁃ Новый пакет unique, который позволяет интернировать comparable значения
⁃ Новый пакет structs с маркерным типом structs.HostLayout для контроля memory layout структур
⁃ В go.mod корневых модулей (не зависимостей) можно использовать директиву godebug (https://go.dev/doc/godebug), которая позволяет включать старое runtime поведение некоторых частей стандартной библиотеки. Например, новое поведение таймеров можно отключить вот так

godebug(
asynctimerchan=1
)


⁃ В net/http добавили много утилит для работы с cookie и поле Request.Pattern, которое содержит паттерн роута из http.Mux. Ждём когда chi будет выставлять его тоже
⁃ Новая функция os.CopyFS, которая копирует содержимое fs.FS в локальную директорию. Писать распаковщики zip никогда не было так просто!
⁃ Максимальная глубина стека для runtime/pprof увеличина до 128 фреймов (да, я упирался в глубину стека на трейсах 😔)
⁃ Новые функции atomic.And и atomic.Or (и комплиментарные методы), которые позволяют атомарно применять битовые маски

Интерактивные заметки к релизу https://antonz.org/go-1-23/


Репост из: eapotapov.am
Пока меня тянет на низкоуровневое программирование, вот вам интересное видео с недавней конференции GOTO о том, как докладчик участвовал в соревновании на то, чтобы сделать максимально быструю агрегацию файла с миллиардом строк с информацией о погоде на Java. На старте время выполнения занимало 5 минут, а в конце — 1,5 секунды.

Если лень смотреть, вот саммари (простите за стиль, я сделал транскрипцию видео, а потом суммаризировал в Claude и подправил стиль, но все-таки немного кривовато):

Задача:
Обработать файл с миллиардом строк погодных данных, содержащий названия городов и температуры. Базовая реализация занимала около 5 минут.

Наблюдение, обучение, адаптация, эксперименты (06:07):
Первым этапом все стали загружать свои версии на GitHub и делиться базовыми, самыми простыми оптимизациями.

"You don't have to be an engineer to be a racing driver, but you do have to have Mechanical Sympathy" (08:00):
Автор объясняет важность понимания работы процессора и памяти для оптимизации кода.

Температура как Int (09:32):
Оптимизация, заключающаяся в использовании целых чисел вместо чисел с плавающей точкой для представления температуры.

Memory-mapped файлы (10:37):
Использование этой техники для быстрого доступа к данным файла.

Использование unsafe (11:54):
Применение небезопасных методов Java для прямого доступа к памяти.

SWAR (13:31):
Использование техники SIMD (Single Instruction, Multiple Data) для обработки нескольких байтов одновременно.

Безстроковая обработка (17:22):
Оптимизация, позволяющая избежать создания объектов String.

Бесветвленное программирование (18:18):
Техника оптимизации, позволяющая избежать условных переходов в коде.
Вот тут классно: автор решил не использовать if-ы. Процессор пытается предсказать код, который будет выполняться далее, еще до выполнения if-а. Если он ошибется, это приведет к падению производительности. Это может не сильно влиять в общем случае, но если вы уже боретесь за секунды оптимизации, то имеет смысл.

Парсинг температуры (20:35):
Детальное описание оптимизированного алгоритма парсинга температуры.
Мы знаем формат строк, мы знаем разделитель, мы можем переписать parseInt так, чтобы это выполнялось гораздо быстрее с помощью булевой логики.

Отслеживание данных (30:14):
Реализация собственных хэш-таблиц.

Выбор JVM (36:22):
Эксперименты с различными реализациями Java Virtual Machine.

Graal и нативная компиляция (37:21):
Использование GraalVM для компиляции Java-кода в нативный исполняемый файл.

Итоги (39:38):
Краткое изложение основных оптимизаций и их влияния на производительность.

Результаты (40:50):
Финальные результаты соревнования, где время выполнения было сокращено с почти 5 минут до примерно 1,5 секунд.

https://www.youtube.com/watch?v=EFXxXFHpS0M

776 0 19 3 14

Если не PgBouncer, то что?

Обзорный доклад пулеров соединений к PostgeSQL, с фокусом на поддержку prepared statements. Ответ на вопрос – Odyssey (разработка одной из команд Яндекс.Клауда) и Multi-PgBouncer (я кстати не знаю что это за зверь, и думал, что это тот же баунсер с SO_REUSEPORT).

https://youtu.be/O3gLgN517JA?si=0t0_hkeyTyD7rhU2


Репост из: Pavel Velikhov
Выложили все лекции из нашего продвинутого курса по СУБД из ШАД:

1. Современные и графовые СУБД (13.02.2024)
Лекция: https://disk.yandex.ru/i/O5ioXU6b_8YXtA
Семинар: https://disk.yandex.ru/i/TXHXRhEkevSEXg

2. Транзакция в распределенных СУБД & Обзор домашнего задания. Протокол паксос (27.02.2024)
Лекция: https://disk.yandex.ru/i/LasmL4lpMFYbYg
Семинар: https://disk.yandex.ru/i/Zja_e4cxD6_gIg

3. Query Compilers. JIT (05.03.2024)
Лекция: https://disk.yandex.ru/i/QN33G7JowTSOaw
Семинар: https://disk.yandex.ru/i/ynfMwbzez36G5g

5. Протокол tapir. Поколонночные базы данных (12.03.2024)
Лекция: https://disk.yandex.ru/i/vXHtsMfMfyqPFQ

6. Оптимизация SQL-запросов (19.03.2024)
Лекция: https://disk.yandex.ru/i/6L21N7aVisKkrA

7. Оптимизация SQL запросов, часть 2 (26.03.2024)
Лекция: https://disk.yandex.ru/i/dHyuQ-sVRio3Aw

8. Многопоточные операторы SQL (02.04.2024)
Лекция: https://disk.yandex.ru/i/zk0BRG-OqibCNg
Семинар (запись прошлого года): https://disk.yandex.ru/i/sTyzNvNdzRm8-Q

9. Протокол Raft & MPP аналитика (09.04.2024)
Лекция (Протокол Raft): https://disk.yandex.ru/i/3YTiavRj2IcDoA
Лекция (MPP аналитика): https://disk.yandex.ru/i/kkB_ck0emWbCjQ

10. Main memory базы данных (16.04.2024)
Лекция: https://disk.yandex.ru/i/SvBqT8_ZTjvHXA

11. Разработка Postgres (23.04.2024)
Лекция: https://disk.yandex.ru/i/tERU5moyX7j7gQ

12. Обзор индустриальных СУБД: Cassandra, ScyllaDB, Tarantool, Picodata (Часть 1). Обзор ClickHouse. (14.05.2024)
Лекция (Обзор индустриальных СУБД): https://disk.yandex.ru/i/pv_Ks-QrICtIkg
Лекция (Обзор ClickHouse): https://disk.yandex.ru/i/h4PDp5QhfRGVXg

13. YDB. Распределённая масштабируемая отказоустойчивая СУБД с открытым исходным кодом от Яндекс & Динамические таблицы YTsaurus (21.05.2024)
Лекция (YDB): https://disk.yandex.ru/i/5-Ej1jknvEb1OA
Лекция (Динамические таблицы YTsaurus): https://disk.yandex.ru/i/cM7g4Day0U2Gcw

14. Обзор индустриальных СУБД: Cassandra, ScyllaDB, Tarantool, Picodata (Часть 2) (28.05.2024)
Лекция: https://disk.yandex.ru/i/gkK8JvUiiAe8Hw


Смотрите, выложили лекции ШАД про современные СУБД. Мощный курс.


MySQL 8 неизбежен: Oracle прекращает поддержку пятерки.

Если вдруг вы еще на 5-ке, смотрите слайды Светы Смирновой о том, что нового в восьмерке. Не то чтобы это прям совсем новость, мне кажется, этим фичам уж пару лет точно - но так, освежить.

Вот я бы сказал главное в восьмерке это SKIP LOCKED, транзакционный DDL для маньяков миграций и клонирования и улучшенная поддержка JSON. Но Светин список длиннее.

Я знаю тех, кто из секты Бойса-Кодда, и крутит у виска, когда слышит про JSON во взрослых базах. Братья, это неизбежно и этому нужно учиться asap. Мне кажется, это самое важное изменение в мире реляционных СУБД лет за 10: фактически, происходит массовый, поддержанный всеми производителями отказ от нормальных форм (маньяки аккуратно говорят про частичный отказ: типа, 1NF для атрибутов, не участвующих в SQL). JSON очень спасает и тех, кто не умеет в базы без ORM и любит Монгу, и тех, кто задолбался альтерить атрибуты юзерских сеттингов в своих PAAS/SAAS. Вы офигеете, но они добавили консоль, где вместо SQL вы пишете запросы в ORM-стиле, натурально, на джава, мать его, скрипте! А ещё JSON спасает тех, кто «шардит» руками и вкусил боль DDL на шардированной инфре.

А ещё в PostgreSQL всё это давно было (кроме ORM-консоли, наверное). Но PostgreSQL использует PPC модель обработки соединений, и мы будем его попинывать до тех пор, пока они это не переделают, и тогда PostgreSQL улетит в космос, но этого никогда не произойдет, поэтому PostgreSQL молодец, но на нагрузках PostgreSQL жилец ещё меньший, чем MySQL и похоже, это навсегда (и это основная причина существования миллиона альтернативных СУБД, а не повсеместной победы PostgreSQL).

Enjoy.

https://www.slideshare.net/slideshow/mysql-2024-mysql-8-5/267334433?fbclid=IwZXh0bgNhZW0BMQABHZA-Hm7RHMhEsQuJSaKboRY64gLEA68x5rpMs-FpIike4OPknu18mRN9yg_aem_AZszecyGkrxoK1GS1YamXUO8pnCSCDfpQoMB9VxHZHBXCblESjSeChQ-g-6bzcIeRI8
MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает?
MySQL 2024: Зачем переходить на MySQL 8, если в 5.х всё устраивает? - Download as a PDF or view online for free


Вторичные индексы в распределенных СУБД

Статья Алекса ДеБри, посвященная вторичным индексам в распределенных базах, полезна двумя вещами.

Во-первых, тема вторичных индексов в распределенных субд интересна и нетривиальна, отсюда несколько принципов со своими плюсами и минусами. Во-вторых, в целом распределенные СУБД и «примочки» для кластеризации множатся и множатся, и любые статьи с классификацией полезны. Инджой.

https://alexdebrie.com/posts/distributed-databases-indexes/


Репост из: Делаю вид что разбираюсь
Как известно все новое это хорошо забытое старое, потому начну рассказ со времен когда люди еще не ставили nginx перед апачем. И когда шутник даже через крайне узкий канал мог делать slowloris: в кучу потоков делаем большой post запрос отправляя тело по байту в минуту, а сервер вынужден из-за этого аллоцировать кучу ресурсов.

Собственно в http/2 настолько намудрили в протоколе, что переизобрели эту атаку. Для этой атаки нам понадобятся два фрейма: HEADERS и CONTINUATION. Первый посылает в упакованном виде заголовки для запроса/ответа и содержит флаг "будет ли еще", ну а второй соответственно досылает еще (если не влезли в первый пакет) и имеет аналогичный флаг. Интересно, а что же будет если просто посылать CONTINUATION фреймы с флагом "жди еще"? Правильный ответ на этот вопрос с собеса "it depends":

Самый примитивный вариант это просто выжраная память под хранение этих заголовков для будущего запроса

Вот в случае Go чуть интереснее, он, конечно, выплюнет ошибку, что достиг лимита заголовков, но цикл парсинга не остановит (который крутится до получения флага "на этом все") и проц умрет быстрее

Самый веселый вариант конечно же в Node.js — там напрограммировали рейс и если сначала послать фрейм "щас еще докину заголовков", а потом разорвать коннект то нода просто упадет с коркой

https://nowotarski.info/http2-continuation-flood-technical-details/


Хорошее краткое объяснение свежей уязвимости в HTTP/2


А вот интересная исследовательская статья о производительности PostgreSQL и YDB (TPC-C benchmark).

https://habr.com/ru/companies/ydb/articles/801587/

Выводы:
- репликация в постгресе очень сильно «затормаживает» hot standby конфигурацию, один постгрес или реплика-сет не в hot standby конфигурации могут сильно быстрее
- YDB не хуже CockroachDB
- кластерные базы показывают хороший результат уже на трех-нодовом кластере

Что было бы интересно посмотреть в отчетах - загрузку сети, особенно для кластерных баз.


Когда б вы знали, из какого (open) сора…

Не знал, что Телемост Яндекса построен на Jitsi.
Посмотрите, как устроен современный софт для видео-конференций, и какие эпичные трудности превозмогаются на фронтирах (огребая и от Jitsi - и внезапно от PostgreSQL; привет, process-per-conn модель обработки соединений).

Вообще интересно наблюдать, как революции, сходные с теми, что произошли с веб-серверами в нулевых (nginx), происходят в серверах VoIP и ВКС. Правда, мне казалось, что первая скрипка ВКС у livekit, а не Jitsi (но я не настоящий сварщик).

https://habr.com/ru/companies/yandex/articles/801647/


PostgreSQL FILLFACTOR & HOT updates

Modern versions of Postgres are able to perform HOT (Heap Only Tuple) updates. A HOT update occurs when a new version of a row can be stored on the same page as the original version, without the need to move the row to a new page.

(…)

For HOT updates, Postgres will skip the update to the index IF you aren’t updating the index key.

By skipping the index update step, HOT updates reduce the amount of disk I/O and CPU processing required for an update operation, leading to better performance, especially for tables with large indexes or frequent updates.

https://www.crunchydata.com/blog/postgres-performance-boost-hot-updates-and-fill-factor


Репост из: Алексей Рыбак: системный дизайн, хайлоад, разработка с агентами
Пикодата, in-memory data-grid.

Немного выпал и не писал, много проектов. Добрался, наконец, до видео доклада Кости Осипова о Пикодате. Кстати, где был доклад - тоже интересно само по себе. Это была первая встреча нового комьюнити разработчиков СУБД - Database Internals Meetup. Свежая история, дело было в офисе Яндекса, драйвером, как я понимаю, выступили ребята из YDB.

Доклад ретроспективный, несмотря на название. Пикодата - осносительно новый продукт поверх Тарантула. Грубо, для каждой отдельной ноды взяли Тарантул, но поверх натянули “кластерную” обёртку - и всё вместе получилось Пикодата. Про то, как выбирали подходы к работе со схемами данных, как обжигались о Lua, как в новом продукте стали использовать Rust, и какой подход к конфигурации и управлению кластером. Немного про логику “втянуть данные поближе к приложению”, “уволить С++ программистов”, бесперспективность GC-рантаймов для high performance задач.

Видео никто не любит, но на ускоренной промотке до вопросов уложитесь примерно за 20 минут, я проверял. Инжой. Не оставляю надежды сделать пикодатовский ресёрч-клауд в рамках образовательного клауда devhands.io.

https://www.youtube.com/watch?v=_UNok-uXql4


Свежая статья от Uber, не быстрое чтиво. Кластер поверх MySQL, кеширующий фронт поверх Redis. Самое интересное - в конце.
* Sharding and cache warming allow it to be scalable and fault tolerant. In fact, one of our largest initial use cases drives over 6M RPS with a 99% cache hit rate with a proven successful failover where all traffic was redirected to the remote region.
* The same use-case would have originally required approximately 60K CPU cores in order to serve 6M RPS from the storage engine directly. With CacheFront we serve approximately 99.9% cache hits with only 3K Redis cores, allowing us to reduce the capacity
* Today CacheFront supports over 40M requests per second across all Docstore instances in production, and the number is growing

https://www.uber.com/blog/how-uber-serves-over-40-million-reads-per-second-using-an-integrated-cache/


Репост из: Алексей Рыбак: системный дизайн, хайлоад, разработка с агентами
Балансировка нагрузки

Комьюнити-чат образовтельного проекта приносит интересные ссылки и обсуждения.
Началось с обсуждения твита кого-то из Амазона, о том, что обычный алгоритм round robin (последовательно раскидывает нагрузку по всем нодам) даёт сильные “перекосы” в нагрузке. Предлагался альтернативный способ: выбирать случайно пару нод для балансировки, и из этой пары уже выбирать ту ноду, которая нагружена меньше.

Это безусловно шаг вперёд, но вообще ход рассуждений нужен следующий: давайте учитывать нагрузку и производительность. Ведь как только мы заявили требование "хочу уметь выбрать наименее загруженный", мы автоматически получаем требование сбора метрик, причем собирать нужно реалтайм. А как только ты собрал такие метрики реалтайм - открывается масса других возможностей, не только просто взять два и выбрать наименее загруженный.

Тот же Weighted Round-Robin (распределение нагрузки с динамическими весами) даёт отличные результаты, причем конечный результат заметно улучшается даже без реалтайма. Вот на этой уже довольно древней Хайлоад-конфе Юра Насретдинов, на тот момент ещё сотрудник Badoo, рассказывает, как он динамически раз в 15 минут пересобирает веса и регенерит их для LTM - и это даже нормально работало: https://www.youtube.com/watch?v=jHYzy6DDo9c.

А ещё прикольная статья с анимационной иллюстрацией алгоритмов балансировки (RR, WRR, Least connections, Latency-based). В конце страницы отличный “симуляционный” плейграунд на яваскрипте, можно выбрать любой алгоритм, плотность входящих запросов и смотреть, как наполняются очереди (и дропаются заявки от переполнения).
Сама статья здесь: https://samwho.dev/load-balancing/, ссылки изначально нашел Андрей Л, участник буткемпа, вот в этом канале: https://t.me/ThePr0Ger.

----
https://devhands.io/ru/ - образовательные треки по хайлоаду, системному дизайну, linux и другим advanced темам
https://t.me/feedmeetoo - интересные статьи, ссылки, презентации

Показано 20 последних публикаций.

451

подписчиков
Статистика канала