- PVSM.RU - https://www.pvsm.ru -

TiKV — распределённая база данных key-value для cloud native

TiKV — распределённая база данных key-value для cloud native - 1

28 августа организация CNCF (Cloud Native Computing Foundation), стоящая за Kubernetes, Prometheus и другими Open Source-проектами для современных облачных приложений, объявила [1] о принятии нового продукта в свою «песочницу» — TiKV [2].

Эта распределённая, транзакционная база данных типа ключ-значение зародилась как дополнение к TiDB [3] — распределённой СУБД, которая предлагает возможности OLTP и OLAP и обеспечивает совместимость с протоколом MySQL… Но давайте обо всём по порядку.

TiDB как родитель

Начнём с «родительского» проекта TiDB, созданного китайской компанией PingCAP Inc.

TiKV — распределённая база данных key-value для cloud native - 2

Первый крупный публичный релиз этой СУБД — 1.0 — состоялся [4] меньше года назад. Главные её особенности — «гибридность», совмещающая транзакционную и аналитическую обработку данных (Hybrid Transactional/Analytical Processing, HTAP), а также уже упомянутая совместимость с протоколом MySQL. Более полная картина TiDB возникает при упоминании других — уже обыденных для новых СУБД — фич, таких как горизонтальная масштабируемость, высокая доступность и строгое соответствие ACID.

Общая архитектура TiDB представляется следующим образом:

TiKV — распределённая база данных key-value для cloud native - 3

Поскольку TiDB предлагает масштабируемость NoSQL и гарантии по ACID, её относят к категории NewSQL. Авторы не скрывают, что создавали продукт под вдохновением от других представителей NewSQL: Google Spanner [5] и F1 [6]. Однако китайские разработчики настаивали на «своих лучших практиках и решениях при выборе технологий». В частности, они выбрали алгоритм для решения задач консенсуса Raft [7] (вместо Paxos [8], что используется в Spanner), хранилище RocksDB [9] (вместо распределённой файловой системы), а в качестве языка программирования — Go (и Rust).

Многие подробности об устройстве TiDB можно найти в докладе «How we build TiDB [10]» от соучредителя и генерального директора PingCAP — Max Liu, — а к некоторым из них, тесно связанным с TiKV, мы ещё вернёмся. Исходный код TiDB распространяется [3] под свободной лицензией Apache License v2. Среди её крупных пользователей [11] упоминаются Lenovo, Meizu, Bank of Beijing, Industrial and Commercial Bank of China и др.

Что же такое TiKV и какую роль играет в мире TiDB (и не только)?

Архитектура и особенности TiKV

Вернёмся к общей архитектуре TiDB, в чуть ином её представлении:

TiKV — распределённая база данных key-value для cloud native - 4

Можно увидеть, что сама TiDB обеспечивает реализацию SQL и совместимость с MySQL*, а остальную работу поручает кластеру TiKV. Что же это за «остальная работа»? Вот более подробная схема:

TiKV — распределённая база данных key-value для cloud native - 5

* В двух картинках о прослойке совместимости с MySQL в TiDB.

Преобразование таблиц в key-value происходит так, что из запросов:

INSERT INTO user VALUES (1, "bob", "huang@pingcap.com");
INSERT INTO user VALUES (2, "tom", "tom@pingcap.com");

… получаются:

TiKV — распределённая база данных key-value для cloud native - 6

Индексы в TiDB — обычные пары, значения в которых указывают на строку с данными:

TiKV — распределённая база данных key-value для cloud native - 7

Пояснения к схеме TiKV:

  • KV API — набор программных интерфейсов для записи/чтения данных;
  • Coprocessor — фреймворк сопроцессора для поддержки распределённых вычислений (сравнивается с аналогичным у HBase);
  • Transaction — транзакционная модель, похожая на Google Percolator [12] (протокол коммитов в 2 фазы; использует timestamp allocator; см. также сравнение со Spanner [13]);
  • MVCC (MultiVersion Concurrency Control) для обеспечения чтения без блокировок и ACID-транзакций (данные тегируются версиями; любые изменения, сделанные в текущей транзакции, не видны другим транзакциям до момента коммита);
  • Raft KV — уже упомянутый алгоритм Raft, используемый для горизонтального масштабирования и консистентности данных; его реализация на языке Rust портирована из etcd (проверена обширной эксплуатацией); к слову, авторами TiKV заявлена «простая масштабируемость до 100+ Тб данных»;
  • RocksDB — локальное хранилище типа ключ-значение, тоже уже хорошо зарекомендовавшее себя в масштабных проектах в production (Facebook);
  • Placement Driver — «мозг» кластера, созданный по концепту из Google Spanner и отвечающий за хранение метаданных о регионах, поддержку нужного количества реплик, равномерное распределение нагрузок (с помощью Raft).

TiKV — распределённая база данных key-value для cloud native - 8

Если обобщить взаимосвязи основных компонентов, то получится следующее:

  • У каждого узла кластера TiKV есть одно или несколько хранилищ (RocksDB).
  • У каждого хранилища есть множество регионов.
  • Регион является «базовой единицей движения данных key-value», реплицируется (с помощью Raft) на множество узлов. Такие наборы реплик образуют группы Raft.
  • Наконец, управляющий этим кластером Placement Driver, как видно, и сам является кластером.

Установка и тестирование TiKV

Кодовая база TiKV написана преимущественно на Rust, но имеет и несколько сторонних компонентов на других языках (RocksDB на C++ и gRPC на Go). Распространяется [2] под той же свободной лицензией Apache License v2.

Как уже говорилось в начале статьи, TiKV изначально появился как важная составляющая TiDB, но на сегодняшний день может эксплуатироваться как в рамках этой СУБД, так и отдельно. (Но в любом случае для её работы потребуется Placement Driver [14], написанный на Go и распространяемый как отдельный компонент).

Самая короткая инструкция [15] для запуска TiKV вместе с СУБД TiDB требует наличия Git, Docker (17.03+), Docker Compose (1.6.0+), MySQL Client и сводится к следующей:

git clone https://github.com/pingcap/tidb-docker-compose.git
cd tidb-docker-compose && docker-compose pull
docker-compose up -d

Результатом выполнения этих команд станет развёртывание кластера TiDB, по умолчанию состоящего из следующих компонентов:

  • 1 экземпляр собственно TiDB;
  • 3 экземпляра TiKV;
  • 3 экземпляра Placement Driver;
  • Prometheus и Grafana (для мониторинга и графиков);
  • 2 экземпляра (мастер + слейв) TiSpark [16] (прослойка для запуска Apache Spark поверх TiDB/TiKV для выполнения сложных OLAP-запросов);
  • 1 экземпляр TiDB-Vision [17] (для визуализации работы Placement Driver).

Дальнейшая работа с развёрнутой СУБД:

  • подключение через MySQL-клиент: mysql -h 127.0.0.1 -P 4000 -u root;
  • веб-интерфейс Grafana для просмотра состояния кластера — http://localhost:3000 под admin/admin;
  • веб-интерфейс TiDB-Vision для информации о балансировке нагрузки в кластере и миграции данных по узлам — http://localhost:8010;
  • веб-интерфейс Spark — http://localhost:8080 (доступ к TiSpark — через spark://127.0.0.1:7077).

Если же хочется не совсем стандартного кластера TiDB (т.е. изменить его размеры, используемые Docker-образы, порты и т.п.), то после клонирования репозитория tidb-docker-compose [18] можно отредактировать конфиг для Docker Compose:

$ cd tidb-docker-compose
$ vi compose/values.yaml
$ helm template compose > generated-docker-compose.yaml
$ docker-compose -f generated-docker-compose.yaml pull
$ docker-compose -f generated-docker-compose.yaml up -d

Для ещё большей кастомизации — см. «Customize TiDB Cluster [19]», где описана информация, откуда берутся конфиги для TiDB, TiKV, Placement Driver и другая специфика.

Для удобного деплоя TiDB в кластер Kubernetes подготовлен одноимённый оператор — TiDB Operator [20]. Он есть в Helm-чартах, поэтому установка может быть сведена к следующим командам (слайд из презентации [21] на TiDB DevConf 2018):

TiKV — распределённая база данных key-value для cloud native - 9

К слову, в той же презентации говорится о взгляде разработчиков TiDB на мониторинг этой СУБД. Текстовое описание, к сожалению, на китайском языке, но общее представление можно получить из этих слайдов:

TiKV — распределённая база данных key-value для cloud native - 10
TiKV — распределённая база данных key-value для cloud native - 11

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

А для деплоя TiKV в production есть готовые наработки с Ansible — опять же, с TiDB [26] и без неё [27].

Наконец, в качестве интерфейсов для работы с TiKV предлагаются:

В планах разработчиков [31] также значится создание клиента на Rust.

Итоги

Зародившись как компонент более крупного Open Source-проекта китайской компании, TiKV уже успел завоевать известность в достаточно широких кругах. Статистика GitHub [32] свидетельствует не только о 3600+ звёздах, но и почти 500 форках, и почти 100 контрибьюторах (хотя более 10 коммитов сделали лишь два десятка из них).

Присоединение TiKV к числу проектов CNCF [33] и тот факт, что это первый проект подобного типа, тоже однозначно указывают на признание продукта сообществом cloud native… и должно придать импульс более активному развитию его кодовой базы сторонними (т.е. вне компании-основателя и её СУБД) специалистами.

P.S.

Читайте также в нашем блоге:

Автор: shurup

Источник [39]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/291629

Ссылки в тексте:

[1] объявила: https://www.cncf.io/blog/2018/08/28/cncf-to-host-tikv-in-the-sandbox/

[2] TiKV: https://github.com/tikv/tikv

[3] TiDB: https://github.com/pingcap/tidb

[4] состоялся: https://www.nixp.ru/news/14205.html

[5] Google Spanner: https://en.wikipedia.org/wiki/Spanner_(database)

[6] F1: https://ai.google/research/pubs/pub38125

[7] Raft: https://raft.github.io/

[8] Paxos: https://en.wikipedia.org/wiki/Paxos_(computer_science)

[9] RocksDB: https://rocksdb.org/

[10] How we build TiDB: https://pingcap.com/blog/2016-10-17-how-we-build-tidb/

[11] крупных пользователей: https://github.com/pingcap/docs/blob/master/adopters.md

[12] Google Percolator: https://ai.google/research/pubs/pub36726

[13] сравнение со Spanner: https://blog.yugabyte.com/implementing-distributed-transactions-the-google-way-percolator-vs-spanner/

[14] Placement Driver: https://github.com/pingcap/pd

[15] инструкция: https://pingcap.com/docs/QUICKSTART/

[16] TiSpark: https://github.com/pingcap/tispark

[17] TiDB-Vision: https://github.com/pingcap/tidb-vision

[18] tidb-docker-compose: https://github.com/pingcap/tidb-docker-compose

[19] Customize TiDB Cluster: https://github.com/pingcap/tidb-docker-compose#customize-tidb-cluster

[20] TiDB Operator: https://github.com/pingcap/tidb-operator

[21] презентации: https://zhuanlan.zhihu.com/p/35048966

[22] вместе с TiDB: https://www.pingcap.com/docs/op-guide/docker-compose/

[23] с Docker Compose: https://www.pingcap.com/docs/tikv/deploy-tikv-docker-compose/

[24] с Docker: https://www.pingcap.com/docs/tikv/deploy-tikv-using-docker/

[25] как бинарник: https://www.pingcap.com/docs/tikv/deploy-tikv-using-binary/

[26] с TiDB: https://www.pingcap.com/docs/op-guide/ansible-deployment/

[27] без неё: https://www.pingcap.com/docs/tikv/deploy-tikv-using-ansible/

[28] клиент TiDB на Go: https://github.com/pingcap/tidb/tree/master/store/tikv

[29] Java-клиент TiSpark: https://github.com/pingcap/tispark/tree/master/tikv-client/src/main/java/com/pingcap/tikv

[30] два типа API для Go: https://www.pingcap.com/docs/tikv/go-client-api/

[31] планах разработчиков: https://github.com/tikv/tikv/blob/master/docs/ROADMAP.md

[32] Статистика GitHub: https://github.com/tikv/tikv/pulse

[33] проектов CNCF: https://www.cncf.io/projects/

[34] Знакомство с СУБД CockroachDB и создание отказоустойчивого кластера с ней на Ubuntu 16.04: https://habr.com/company/flant/blog/327640/

[35] Rook — „самообслуживаемое“ хранилище данных для Kubernetes: https://habr.com/company/flant/blog/348044/

[36] Ускоряем bootstrap больших баз данных с помощью Kubernetes: https://habr.com/company/flant/blog/417509/

[37] Путеводитель CNCF по решениям Open Source (и не только) для cloud native: https://habr.com/company/flant/blog/350928/

[38] Операторы для Kubernetes: как запускать stateful-приложения: https://habr.com/company/flant/blog/326414/

[39] Источник: https://habr.com/post/421903/?utm_campaign=421903