Apache hbase с точки зрения теоремы cap обеспечивает

Каталог статьи

    • модель данных 5.2 HBase
        • теорема CAP

модель данных 5.2 HBase

  • Пространство имен: База данных «(Database)

  • Таблица (таблица): Он используется для данных управления магазином, с редкой, ориентированной характеристикой. Каждая таблица HBase является так называемым большим столом, который может иметь сотни миллионов строк, миллионы столбцов. Для столбцов, которые пусты, не занимает много места для хранения, так что таблица может быть разработана очень слабо.

  • Строка: В таблице, каждая строка представляет собой объект данных, каждая строку однозначно идентифицируется с помощью ключа строки, и не существует какой — либо конкретный типа данных, с двоичным байтом для хранения.

  • Колонка: Hbase состоит из колонки семьи и столбца Qualifier, двоеточие: межстрочный интервал, таких как семья: Классификатор

  • RowKey: Похож на первичный ключ в MySQL, HBase быстро извлекает данные в соответствии с кнопкой линии, и ключ линии соответствует записи. В отличие от первичного ключа MySQL, ключевой строки Hbase является естественным присущий, и каждая строка данных существует.

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

  • Renuished триггер (Column Qualifier): Данные в гонке отображение с помощью идентификаторов столбцов, которые могут быть поняты как ключ-значение, ряд орнаментом (Column Qualifier) Является ли столбец corresponditive базы данных ключей

  • Отметка: Это свойство столбца представляет собой 64-битовое целое число. Клетки, определенные с помощью клавиш строк и столбцов, множественные данные могут быть сохранены, каждый из временных меток данных содержат свойство, а также данные имеют версию характеристики. Вы можете указать версию истории запроса запроса в соответствии с версией (Версия) или метками времени, и если вы не указали, последняя версия данных по умолчанию возвращается.

  • Регион: HBase автоматически делит множество областей таблицы горизонтали и область разделения возрастает с увеличением данных.

  • HBase поддерживает ACID в определенном месте, то есть, оперативная КИСЛОТА уровня линии.

  • теорема CAP

    • Самая большая сложность распределенных систем, как синхронизируется состояние каждого узла. Теорема CAP является основной теоремой в этом отношении, но и отправной точкой распределенной системы.

      • Последовательность (все узлы имеют один и тот же объем данных)

        [ , , (img-ipsYaFFu-1584200333364)(img/Consistency.png)]

      • Наличие (гарантии, что каждый запрос имеет ответ, независимо от успеха или неудач, но не гарантирует правильность полученных данных)

      • отказоустойчивость Partition (потеря или отказ какой-либо информации в системе не влияет на работу системы, если система не может достичь согласованности данных в течение срока, вы должны сделать выбор между этими двумя операциями)

      [ , , (img-PnZLEcZl-1584200333364)(img/cap.jpg)]

      HBase система CP в CAP, т.е. HBase сильная последовательность.

As we mentioned in our Hadoop Ecosytem blog, HBase is an essential part of our Hadoop ecosystem. So now, I would like to take you through HBase tutorial, where I will introduce you to Apache HBase, and then, we will go through the Facebook Messenger case-study. We are going to cover following topics in this HBase tutorial blog:

  • History of Apache HBase 
  • Introduction of Apache HBase
  • NoSQL Databases and its types
  • HBase vs Cassandra
  • Apache HBase Features
  • HBase vs HDFS
  • Facebook Messenger Case Study

Apache HBase Tutorial: History

Let us start with the history of HBase and know how HBase has evolved over a period of time.

History of HBase - HBase Tutorial - Edureka

  • Apache HBase is modelled after Google’s BigTable, which is used to collect data and serve request for various Google services like Maps, Finance, Earth etc.
  • Apache HBase began as a project by the company Powerset for Natural Language Search, which was handling massive and sparse data sets.
  • Apache HBase was first released in February 2007. Later in January 2008, HBase became a sub project of Apache Hadoop.
  • In 2010, HBase became Apache’s top level project.

HBase Tutorial | NoSQL Databases | Edureka

After knowing about the history of Apache HBase, you would be curious to know what is Apache HBase? Let us move further and take a look.

Apache HBase Tutorial: Introduction to HBase

HBase is an open source, multidimensional, distributed, scalable and a NoSQL database written in Java. HBase runs on top of HDFS (Hadoop Distributed File System) and provides BigTable like capabilities to Hadoop. It is designed to provide a fault tolerant way of storing large collection of sparse data sets.

Since, HBase achieves high throughput and low latency by providing faster Read/Write Access on huge data sets. Therefore, HBase is the choice for the applications which require fast & random access to large amount of data.

It provides compression, in-memory operations and Bloom filters (data structure which tells whether a value is present in a set or not) to fulfill the requirement of fast and random read-writes.

Let’s understand it through an example: A jet engine generates various types of data from different sensors like pressure sensor, temperature sensor, speed sensor, etc. which indicates the health of the engine. This is very useful to understand the problems and status of the flight. Continuous Engine Operations generates 500 GB data per flight and there are 300 thousand flights per day approximately. So, Engine Analytics applied to such data in near real time can be used to proactively diagnose problems and reduce unplanned downtime. This requires a distributed environment to store large amount of data with fast random reads and writes for real time processing. Here, HBase comes for the rescue. I will talk about HBase Read and Write in detail in my next blog on HBase Architecture.

As we know, HBase is a NoSQL database. So, before understanding more about HBase, lets first discuss about the NoSQL databases and its types.

Apache HBase Tutorial: NoSQL Databases

NoSQL means Not only SQL. NoSQL databases is modeled in a way that it can represent data other than tabular formats, unkile relational databases. It uses different formats to represent data in databases and thus, there are different types of NoSQL databases based on their representation format. Most of NoSQL databases leverages availability and speed over consistency. Now, let us move ahead and understand about the different types of NoSQL databases and their representation formats.   

NoSQL Databases comparision - HBase Tutorial - Edureka

Key-Value stores: 

It is a schema-less database which contains keys and values. Each key, points to a value which is an array of bytes, can be a string, BLOB, XML, etc. e.g. Lamborghini is a key and can point to a value Gallardo, Aventador, Murciélago, Reventón, Diablo, Huracán, Veneno, Centenario etc.

Key-Value stores databases: Aerospike, Couchbase, Dynamo, FairCom c-treeACE, FoundationDB, HyperDex, MemcacheDB, MUMPS, Oracle NoSQL Database, OrientDB, Redis, Riak, Berkeley DB.

Use-case

Key-value stores handle size well and are good at processing a constant stream of read/write operations with low latency. This makes them perfect for User preference and profile stores, Product recommendations; latest items viewed on a retailer website for driving future customer product recommendations, Ad servicing; customer shopping habits result in customized ads, coupons, etc. for each customer in real-time.

Document Oriented:

It follows the same key value pair, but it is semi structured like XML, JSON, BSON. These structures are considered as documents.

Document Based databases: Apache CouchDB, Clusterpoint, Couchbase, DocumentDB, HyperDex, IBM Domino, MarkLogic, MongoDB, OrientDB, Qizx, RethinkDB.

Use-Case

As document supports flexible schema, fast read write and partitioning makes it suitable for creating user databases in various services like twitter, e-commerce websites etc.

Column Oriented:

In this database, data is stored in cell grouped in column rather than rows. Columns are logically grouped into column families which can be either created during schema definition or at runtime.

These types of databases store all the cell corresponding to a column as continuous disk entry, thus making the access and search much faster.  

Column Based Databases: HBase, Accumulo, Cassandra, Druid, Vertica.

Use-Case

It supports the huge storage and allow faster read write access over it. This makes column oriented databases suitable for storing customer behaviors in e-commerce website, financial systems like Google Finance and stock market data, Google maps etc. 

Graph Oriented:

It is a perfect flexible graphical representation, used unlike SQL. These types of databases easily solve address scalability problems as it contains edges and node which can be extended according to the requirements.

Graph based databases: AllegroGraph, ArangoDB, InfiniteGraph, Apache Giraph, MarkLogic, Neo4J, OrientDB, Virtuoso, Stardog.

Use-case

This is basically used in Fraud detection, Real-time recommendation engines (in most cases e-commerce), Master data management (MDM), Network and IT operations, Identity and access management (IAM), etc.

HBase and Cassandra are the two famous column oriented databases. So, now talking it to a higher level, let us compare and understand the architectural and working differences between HBase and Cassandra.

HBase Tutorial: HBase VS Cassandra

  • HBase is modelled on BigTable (Google) while Cassandra is based on DynamoDB (Amazon) initially developed by Facebook.
  • HBase leverages Hadoop infrastructure (HDFS, ZooKeeper) while Cassandra evolved separately but you can combine Hadoop and Cassandra as per your needs.
  • HBase has several components which communicate together like HBase HMaster, ZooKeeper, NameNode, Region Severs. While Cassandra is a single node type, in which all nodes are equal and performs all functions. Any node can be the coordinator; this removes Single Point of failure.
  • HBase is optimized for read and supports single writes, which leads to strict consistency. HBase supports Range based scans, which makes scanning process faster. Whereas Cassandra supports single row reads which maintains eventual consistency.
  • Cassandra does not support range based row scans, which slows the scanning process as compared to HBase.
  • HBase supports ordered partitioning, in which rows of a Column Family are stored in RowKey order, whereas in Casandra ordered partitioning is a challenge. Due to RowKey partitioning the scanning process is faster in HBase as compared to Cassandra.
  • HBase does not support read load balancing, one Region Server serves the read request and the replicas are only used in case of failure. While Cassandra supports read load balancing and can read the same data from various nodes. This can compromise the consistency.
  • In CAP (Consistency, Availability & Partition -Tolerance) theorem HBase maintains Consistency and Availability while Cassandra focuses on Availability and Partition -Tolerance.

Now let’s take a deep dive and understand the features of Apache HBase which makes it so popular.

Apache HBase Tutorial: Features of HBase

Features of HBase - HBase Tutorial - Edureka

  • Atomic read and write: On a row level, HBase provides atomic read and write. It can be explained as, during one read or write process, all other processes are prevented from performing any read or write operations.
  • Consistent reads and writes: HBase provides consistent reads and writes due to above feature.
  • Linear and modular scalability: As data sets are distributed over HDFS, thus it is linearly scalable across various nodes, as well as modularly scalable, as it is divided across various nodes.
  • Automatic and configurable sharding of tables: HBase tables are distributed across clusters and these clusters are distributed across regions. These regions and clusters split, and are redistributed as the data grows.
  • Easy to use Java API for client access: It provides easy to use Java API for programmatic access.
  • Thrift gateway and a REST-ful Web services: It also supports Thrift and REST API for non-Java front-ends.
  • Block Cache and Bloom Filters: HBase supports a Block Cache and Bloom Filters for high volume query optimization .
  • Automatic failure support: HBase with HDFS provides WAL (Write Ahead Log) across clusters which provides automatic failure support.
  • Sorted rowkeys: As searching is done on range of rows, HBase stores rowkeys in a lexicographical order. Using these sorted rowkeys and timestamp, we can build an optimized request.

Now moving ahead in this HBase tutorial, let me tell you what are the use-cases and scenarios where HBase can be used and then, I will compare HDFS and HBase.

I would like draw your attention toward the scenarios in which the HBase is the best fit. 

HBase Tutorial: Where we can use HBase?

  • We should use HBase where we have large data sets (millions or billions or rows and columns) and we require fast, random and real time, read and write access over the data.
  • The data sets are distributed across various clusters and we need high scalability to handle data.
  • The data is gathered from various data sources and it is either semi structured or unstructured data or a combination of all. It could be handled easily with HBase.
  • You want to store column oriented data.
  • You have lots of versions of the data sets and you need to store all of them.

Before I jump to Facebook messenger case study, let me tell you what are the differences between HBase and HDFS.

HBase Tutorial: HBase VS HDFS

HDFS is a Java based distributed file system that allows you to store large data across multiple nodes in a Hadoop cluster. So, HDFS is an underlying storage system for storing the data in the distributed environment. HDFS is a file system, whereas HBase is a database (similar as NTFS and MySQL).

As Both HDFS and HBase stores any kind of data (i.e. structured, semi-structured and unstructured) in a distributed environment so lets look at the differences between HDFS file system and HBase, a NoSQL database. 

  • HBase provides low latency access to small amounts of data within large data sets while HDFS provides high latency operations.
  • HBase supports random read and writes while HDFS supports WORM (Write once Read Many or Multiple times).
  • HDFS is basically or primarily accessed through MapReduce jobs while HBase is accessed through shell commands, Java API, REST, Avro or Thrift API.

HDFS stores large data sets in a distributed environment and leverages batch processing on that data. E.g. it would help an e-commerce website to store millions of customer’s data in a distributed environment which grew over a long period of time(might be 4-5 years or more). Then it leverages batch processing over that data and analyze customer behaviors, pattern, requirements. Then the company could find out what type of product, customer purchase in which months. It helps to store archived data and execute batch processing over it. 

While HBase stores data in a column oriented manner where each column is stored together so that, reading becomes faster leveraging real time processing. E.g. in a similar e-commerce environment, it stores millions of product data. So if you search for a product among millions of products, it optimizes the request and search process, producing the result immediately (or you can say in real time). The detailed HBase architectural explanation, I will be covering in my next blog.

As we know HBase is distributed over HDFS, so a combination of both gives us a great opportunity to use the benefits of both, in a tailored solution, as we are going to see in the below Facebook messenger case study.   

Facebook Messaging Platform shifted from Apache Cassandra to HBase in November 2010.

Facebook Messenger combines Messages, email, chat and SMS into a real-time conversation. Facebook was trying to build a scalable and robust infrastructure to handle set of these services.

At that time the message infrastructure handled over 350 million users sending over 15 billion person-to-person messages per month. The chat service supports over 300 million users who send over 120 billion messages per month.

By monitoring the usage, they found out that, two general data patterns emerged:

  • A short set of temporal data that tends to be volatile
  • An ever-growing set of data that rarely gets accessed

Facebook wanted to find a storage solution for these two usage patterns and they started investigating to find a replacement for the existing Messages infrastructure.

Earlier in 2008, they used open-source database, i.e. Cassandra, which is an eventual-consistency key-value store that was already in production serving traffic for Inbox Search. Their teams had a great knowledge in using and managing a MySQL database, so switching either of the technologies was a serious concern for them.

They spent a few weeks testing different frameworks, to evaluate the clusters of MySQL, Apache Cassandra, Apache HBase and other systems. They ultimately selected HBase.

As MySQL failed to handle the large data sets efficiently, as the indexes and data sets grew large, the performance suffered. They found Cassandra unable to handle difficult pattern to reconcile their new Messages infrastructure.

The major problems were: 

  • Storing the large sets of continuously growing data from various Facebook services.
  • Requires Database which can leverage high processing on it.
  • High performance needed to serve millions of requests.
  • Maintaining consistency in storage and performance.

Facebook Challenges - HBase Tutorial - Edureka

Figure: Challenges faced by Facebook messenger

For all these problems, Facebook came up with a solution i.e. HBase. Facebook adopted HBase for serving Facebook messenger, chat, email, etc.  due to its various features.

HBase comes with very good scalability and performance for this workload with a simpler consistency model than Cassandra. While they found HBase to be the most suitable in terms of their requirements like auto load balancing and failover, compression support, multiple shards per server, etc.

HDFS, which is the underlying file system used by HBase also provided them several needed features such as end-to-end checksums, replication and automatic load re-balancing.

Facebook HBase Solution - HBase Tutorial - Edureka

Figure: HBase as a solution to Facebook messenger

As they adopted HBase, they also focused on committing the results back to HBase itself and started working closely with the Apache community.

Since messages accept data from different sources such as SMS, chats and emails, they wrote an application server to handle all decision making for a user’s message. It interfaces with large number of other services. The attachments are stored in a Haystack (which works on HBase). They also wrote a user discovery service on top of Apache ZooKeeper which talk to other infrastructure services for friend relationships, email account verification, delivery decisions and privacy decisions.

Facebook team spent a lot of time confirming that each of these services is robust, reliable and providing good performance to handle a real-time messaging system.

I hope this HBase tutorial blog is informative and you liked it. In this blog, you got to know the basics of HBase and its features. In my next blog of Hadoop Tutorial Series, I will be explaining the architecture of HBase and working of HBase which makes it popular for fast and random read/write.

Now that you have understood the basics of HBase, check out the Hadoop training by Edureka, a trusted online learning company with a network of more than 250,000 satisfied learners spread across the globe. The Edureka Big Data Hadoop Certification Training course helps learners become expert in HDFS, Yarn, MapReduce, Pig, Hive, HBase, Oozie, Flume and Sqoop using real-time use cases on Retail, Social Media, Aviation, Tourism, Finance domain.

Got a question for us? Please mention it in the comments section and we will get back to you.


  Перевод


  Ссылка на автора

Давайте поймем, чтоNoSQLБаза данных и в этом блоге мы сосредоточимся наApache HBase

Если у вас есть веб-сайт с большим количеством клиентов, вы столкнулись с ужасным парадоксом производительности больших данных.

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

Сайты как facebook Twitter, и другие боролись с этой проблемой в течение многих лет, так как они выросли с тысяч до миллионов, а теперь и сотен миллионов пользователей.

Из-за огромного количества пользовательских данных они использовали технологии хранилищ данных, такие как Memcached и Redis, чтобы заставить свои сайты работать быстро. Но для сайтов без инженерных ресурсов таких компаний, как Facebook, внедрение этих технологий было сложной задачей.

В этом блоге я собираюсь рассказать о Apache HBase, базе данных NoSql. Чтобы понять, что сначала нам нужно понять, что такое NoSql, я разделил этот блог на 2 части. В первой части я буду говорить о NoSql, а во второй — о HBase.

Что такое NoSQL и зачем он нужен?

База данных NoSQL означает «Не только SQL» или «Не SQL». Карл Строцц представил концепцию NoSQL в 1998 году.

источник : https://www.getfilecloud.com/blog/2014/08/leading-nosql-databases-to-consider/#.XEgQpc8zaRs

NoSQL — это, в основном, база данных, используемая для управления огромными наборами неструктурированных данных, где данные не хранятся в табличных отношениях, таких как RDBMS. Большинство существующих в настоящее время реляционных баз данных не смогли решить некоторые из сложных современных проблем, таких как:

Во-первых, объем данных значительно увеличился до диапазона петабайт — один петабайт = 1024 терабайта. СУРБД сталкивается с трудностями при работе с такими огромными объемами данных. Для решения этой проблемы СУБД добавила больше центральных процессоров (или процессоров) или больше памяти в систему управления базами данных для вертикального масштабирования.

Во-вторых, большинство данных поступает в полуструктурированном или неструктурированном формате из социальных сетей, аудио, видео, текстов и электронных писем. Однако вторая проблема, связанная с неструктурированными данными, выходит за рамки СУРБД, поскольку реляционные базы данных просто не могут классифицировать неструктурированные данные. Они разработаны и структурированы для размещения структурированных данных, таких как датчик веб-журнала и финансовые данные.

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

В-четвертых, много ресурсов расходуется на ссылочную целостность и нормализацию.

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

Типы баз данных NoSQL

Базы данных документов:В этом типе ключ связан со сложной структурой данных, которая называется Документ. Пример: MongoDB

График магазинов:Этот тип базы данных обычно используется для хранения сетевых данных. Где мы можем связать данные на основе некоторых существующих данных.

Key-Value магазины:Это самые простые базы данных NoSQL. При этом каждый хранится с ключом для его идентификации. В некоторых базах данных Key-value мы можем даже сохранять тип сохраняемых данных, как в Redis.

Широкие колонны магазинов:Используется для хранения больших наборов данных (хранение столбцов данных вместе). Пример: Cassandra (используется в Facebook), HBase и т. Д.

CAP Теорема

Согласно Википедии,CAP теорематакже названныйТеорема Брюерапосле ученого Эрик Брюер утверждает, что это невозможно для распределенное хранилище данных одновременно предоставить более двух из следующих трех гарантий:

  • консистенция: Каждое чтение получает самую последнюю запись или ошибку
  • Доступность: Каждый запрос получает ответ (без ошибок) — без гарантии того, что он содержит самую последнюю запись
  • Допуск раздела: Система продолжает работать, несмотря на произвольное количество сообщений, сбрасываемых (или задерживаемых) сетью между узлами

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

Преимущества баз данных NoSQL

Динамические Схемы
В реляционных базах данных, таких как Oracle, MySQL, сервер MS SQL и т. Д., Мы определяем структуры таблиц. Например, если мы хотим сохранить записи данных студента, нам нужно будет создать таблицу с именем Student, добавить в нее столбцы, такие как student_id, student_name и т.д., это называется предопределенной схемой, в которой мы определяем структуру перед сохранением любых данных

В будущем, если мы захотим добавить еще несколько связанных столбцов в нашу таблицу Student, нам нужно будет добавить новый столбец в нашу таблицу. Что легко, если в наших таблицах меньше данных, но что, если у нас миллионы записей? Миграция на обновленную схему принесет адскую боль. Базы данных NoSQL решают эту проблему, так как в базе данных NoSQL определение схемы не требуется.

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

Реляционные базы данных следуют вертикальной архитектуре, в которой данные хранятся на одном сервере, поскольку все данные связаны между собой. Реляционные базы данных по умолчанию не предоставляют функцию шардинга, для достижения которой необходимо приложить немало усилий, поскольку целостность транзакций (вставка / обновление данных в транзакциях), множественные таблицы JOINS и т. Д. Не могут быть легко достигнуты в распределенной архитектуре в случае Реляционные базы данных.

Базы данных NoSQL по умолчанию имеют функцию Sharding. Никаких дополнительных усилий не требуется. Они автоматически распределяют данные по серверам, получают данные в кратчайшие сроки с свободного сервера, сохраняя при этом целостность данных.

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

Интегрированное кеширование
Многие базы данных NoSQL поддерживают интегрированное кеширование, при котором часто запрашиваемые данные хранятся в кеше для ускорения запросов.

Узнав о преимуществах и всех возможностях, которые предлагает база данных NoSQL, давайте погрузимся в Apache HBase.


Apache HBase

HBase является распределенной, версионной, нереляционной, ориентированной на столбцы базой данных с открытым исходным кодом, построенной на основе HDFS. Все данные взяты в виде пар ключ-значение.

Колонно-ориентированная база данных подходит дляАналитическая обработка онлайн (OLAP)Это вычислительный метод, который позволяет пользователям легко и выборочно извлекать и запрашивать данные, чтобы анализировать их с другой точки зрения. Например, анализ тенденций, финансовая отчетность, прогнозирование продаж, бюджетирование и т. Д.

Механизм хранения:

-> Таблица в HBase — это набор строк. (таблица отсортирована по rowID)
-> Row — это набор семейств столбцов.
-> Семейство столбцов — это коллекция столбцов.
-> Столбец — это коллекция пар ключ-значение.
-> Ячейка: {строка, столбец, версия}

На диаграмме ниже показано, как данные организованы и хранятся в таблице HBase.

источник: https://www.guru99.com/hbase-architecture-data-flow-usecases.html

Архитектура HBase

источник: https://mindmajix.com/hadoop-ecosystem

В HBase таблица разбивается на регионы (базовый элемент построения кластера HBase) и обслуживается серверами регионов.
HBase имеет 4 основных компонента:

-> Главный сервер
-> Сервер региона (может быть добавлен или удален в соответствии с требованием)
-> Регионы
-> Зоопарк

Главный сервер:Также называется HMaster, и он находится на NameNode.

-> Назначает регионы на серверы регионов с помощью zookeeper.
-> Он управляет балансировкой нагрузки регионов на серверах регионов, выгружая занятые серверы и перемещая регион на менее занятые серверы.
-> Он также отвечает за изменения схемы и операции с метаданными.

Региональный сервер:Также называется HRegionServer и находится на узлах данных.

-> Он связывается с клиентом и обрабатывает операции с данными в разных регионах.
-> Он обрабатывает запрос на чтение / запись всех регионов под ним.
-> Определяет размер региона, следуя пороговому значению размера региона.
-> Хлог присутствующий в регионе сервер хранит все логи.

Регионы:Также называется HRegions

Регионы являются основными строительными элементами кластера HBase, который состоит из распределения таблиц и состоит из семейств столбцов.

Регион сервер содержитрайоныа такжемагазины,
Регионы по семействам столбцов вертикально разделены на магазины.

Сейчас магазин содержит:
1.Memstores(Хранилище памяти): хранит данные точно так же, как и кеш-память, поэтому изначально данные хранятся здесь, затем данные передаются в HFiles, а хранилище метаданных сбрасывается.
2.HFiles:HFile — это просто специализированная файловая структура данных, которая используется для хранения данных в HBase. Hbase ранее использовал формат файла карты Hadoop (т.е. отсортированный файл последовательности). Тем не менее, это имеет ограничение производительности. Он был заменен форматом HFILE, который разработан специально для HBASE.

HFILE отсортировал пары ключ / значение. И ключи, и значения являются байтовыми массивами. Вы можете проверить официальный документ HBase узнать больше о HFiles.

Посмотрите на изображение ниже, чтобы иметь лучшее представление.

источник: https://mapr.com/blog/in-depth-look-hbase-architecture/

Вы, должно быть, задаетесь вопросом, что это за «WAL». Итак, давайте немного поговорим о WAL.

Write Ahead Log (WAL) предназначен для восстановления данных, в котором записываются все изменения данных в HBase в файловое хранилище. Если RegionServer падает или становится недоступным до сброса MemStore, WAL гарантирует, что изменения в данных могут быть воспроизведены.

При наличии одного WAL на RegionServer RegionServer должен выполнять последовательную запись в WAL, поскольку файлы HDFS должны быть последовательными. Это приводит к тому, что WAL является узким местом производительности. WAL можно отключить, чтобы улучшить производительность. Это делается путем вызова поля клиента HBase:

Mutation.writeToWAL(false)

Работник зоопарка

Zookeeper — это распределенная служба конфигурации и синхронизации с открытым исходным кодом, а также реестр имен распределенных приложений. Таким образом, он используется для управления и координации большого кластера машин.

источник: https://www.tutorialspoint.com/hbase/hbase_architecture.htm

Примечание: ZooKeeper существует независимо от HBase.

Он имеет эфемерные узлы, представляющие разные серверы региона. Главный сервер использует эти узлы для обнаружения доступных серверов.

Эти узлы используются для отслеживания сбоя сервера и сетевых разделов. При этом клиент общается с сервером региона только через zooKeeper.

Поток данных в HBase

источник: https://beyondcorner.com/learn-apache-hbase/hbase-data-flow-mechanism-architecture/

Операции чтения и записи из клиента в HFile могут быть показаны на диаграмме выше.

Step 1) Client wants to write data and in turn first communicates with Regions server and then regionsStep 2) Regions contacting memstore for storing data associated with the column familyStep 3) First data stores into Memstore, where the data is sorted and after that it flushes into HFile. The main reason for using Memstore is to store data in Distributed file system based on Row Key. Memstore will be placed in Region server main memory while HFiles are written into HDFS.Step 4) Client wants to read data from RegionsStep 5) In turn Client can have direct access to Mem store, and it can request for data.Step 6) Client approaches HFiles to get the data. The data are fetched and retrieved by the Client.

Вывод

HBase позволяет хранить ваши данные как до, так и после обработки, обеспечивает вам большую гибкость и может хранить миллионы столбцов и миллиарды строк данных с быстрым доступом. Мы также можем проводить онлайн аналитику в реальном времени, используя HBase, интегрированный с экосистемой Hadoop, а также с Apache Spark.

Надеюсь, вам, ребята, понравилось читать эту статью. Для любых сомнений / запросов / предложений, пожалуйста, оставьте комментарий.

Вы можете связаться со мной в LinkedIn,

Счастливого обучения !!!

Сетевые технологии, Big Data, Блог компании DCA (Data-Centric Alliance)


Рекомендация: подборка платных и бесплатных курсов дизайна интерьера — https://katalog-kursov.ru/

Привет, Хабр! Наконец-то долгожданная четвёртая статья нашего цикла о больших данных. В этой статье мы поговорим про такой замечательный инструмент как Hbase, который в последнее время завоевал большую популярность: например Facebook использует его в качестве основы своей системы обмена сообщений, а мы в data-centric alliance используем hbase в качестве основного хранилища сырых данных для нашей платформы управления данными Facetz.DCA

В статье будет рассказано про концепцию Big Table и её свободную реализацию, особенности работы и отличие как от классических реляционных баз данных (таких как MySQL и Oracle), так и key-value хранилищ, таких как Redis, Aerospike и memcached.
Заинтересовало? Добро пожаловать под кат.

Кто и зачем придумал Hbase

Как обычно — начнём с истории вопроса. Как и многие другие проекты из области BigData, Hbase зародилась из концепции которая была разработана в компании Google. Принципы лежащие в основе Hbase, были описаны в статье «Bigtable: A Distributed Storage System for Structured Data».

Как мы рассматривали в прошлых статьях — обычные файлы довольно неплохо подходят для пакетной обработки данных, с использованием парадигмы MapReduce.

С другой стороны информацию хранящуюся в файлах довольно неудобно обновлять; Файлы также лишены возможности произвольного доступа. Для быстрой и удобной работы с произвольным доступом есть класс nosql-систем типа key-value storage, таких как Aerospike, Redis, Couchbase, Memcached. Однако в обычно в этих системах очень неудобна пакетная обработка данных. Hbase представляет из себя попытку объединения удобства пакетной обработки и удобства обновления и произвольного доступа.

Модель данных

Hbase — это распределенная, колоночно-ориентированная, мультиверсионная база типа «ключ-значение».
Данные организованы в таблицы, проиндексированные первичным ключом, который в Hbase называется RowKey.
Для каждого RowKey ключа может храниться неограниченны набор атрибутов (или колонок).

Колонки организованны в группы колонок, называемые Column Family. Как правило в одну Column Family объединяют колонки, для которых одинаковы паттерн использования и хранения.

Для каждого

аттрибута может храниться несколько различных версий. Разные версии имеют разный timestamp.

Записи физически хранятся в отсортированном по

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

При удалении определённого

атрибута физически он сразу не удаляется, а лишь маркируется специальным флажком tombstone. Физическое удаление данных произойдет позже, при выполнении операции Major Compaction.

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

Список и названия

групп колонок фиксирован и имеет четкую схему. На уровне группы колонок задаются такие параметры как time to live (TTL) и максимальное количество хранимых версий. Если разница между timestamp для определенно версии и текущим временем больше TTL — запись помечается к удалению. Если количество версий для определённого атрибута превысило максимальное количество версий — запись также помечается к удалению.

Модель данных Hbase можно запомнить как соответствие ключ значение:

<table, RowKey, Column Family, Column, timestamp> -> Value

Поддерживаемые операции

Список поддерживаемых операций в hbase весьма прост. Поддерживаются 4 основные операции:

— Put: добавить новую запись в hbase. Timestamp этой записи может быть задан руками, в противном случае он будет установлен автоматически как текущее время.

— Get: получить данные по определенному RowKey. Можно указать Column Family, из которой будем брать данные и количество версий которые хотим прочитать.

— Scan: читать записи по очереди. Можно указать запись с которой начинаем читать, запись до которой читать, количество записей которые необходимо считать, Column Family из которой будет производиться чтение и максимальное количество версий для каждой записи.

— Delete: пометить определенную версию к удалению. Физического удаления при этом не произойдет, оно будет отложено до следующего Major Compaction (см. ниже).

Архитектура

Hbase является распределенной базой данных, которая может работать на десятках и сотнях физических серверов, обеспечивая бесперебойную работу даже при выходе из строя некоторых из них. Поэтому архитектура hbase довольна сложна по сравнению с классическими реляционными базами данных.

Hbase для своей работы использует два основных процесса:

1. Region Server — обслуживает один или несколько регионов. Регион — это диапазон записей соответствующих определенному диапазону подряд идущих RowKey. Каждый регион содержит:

  • Persistent Storage — основное хранилище данных в Hbase. Данные физически хранятся на HDFS, в специальном формате HFile. Данные в HFile хранятся в отсортированном по RowKey порядке. Одной паре (регион, column family) соответствует как минимум один HFIle.
  • MemStore — буфер на запись. Так как данные хранятся в HFile d отсортированном порядке — обновлять HFile на каждую запись довольно дорого. Вместо этого данные при записи попадают в специальную область памяти MemStore, где накапливаются некоторое время. При наполнении MemStore до некоторого критического значения данные записываются в новый HFile.
  • BlockCache — кэш на чтение. Позволяет существенно экономить время на данных которые читаются часто.
  • Write Ahead Log(WAL). Так как данные при записи попадают в memstore, существует некоторый риск потери данных из-за сбоя. Для того чтобы этого не произошло все операции перед собственно осуществление манипуляций попадают в специальный лог-файл. Это позволяет восстановить данные после любого сбоя.

2. Master Server — главный сервер в кластере hbase. Master управляет распределением регионов по Region Server’ам, ведет реестр регионов, управляет запусками регулярных задач и делает другую полезную работу.

Для координации действий между сервисами Hbase использует Apache ZooKeeper, специальный сервис предназначенный для управления конфигурациями и синхронизацией сервисов.

При увеличении количества данных в регионе и достижении им определенного размера Hbase запускает split, операцию разбивающую регион на 2. Для того чтобы избежать постоянных делений регионов — можно заранее задать границы регионов и увеличить их максимальный размер.

Так как данные по одному региону могут храниться в нескольких HFile, для ускорения работы Hbase периодически их сливает воедино. Эта операция в Hbase называется compaction. Compaction’ы бывают двух видов:

  • Minor Compaction. Запускается автоматически, выполняется в фоновом режиме. Имеет низкий приоритет по сравнению с другими операциями Hbase.
  • Major Compaction. Запускается руками или по наступлению срабатыванию определенных триггеров(например по таймеру). Имеет высокий приоритет и может существенно замедлить работу кластера. Major Compaction’ы лучше делать во время когда нагрузка на кластер небольшая. Во время Major Compaction также происходит физическое удаление данных, ране помеченных меткой tombstone.

Способы работы с Hbase

Hbase Shell

Самый простой способ начать работу с Hbase — воспользоваться утилитой hbase shell. Она доступна сразу после установки hbase на любой ноде кластера hbase.

Hbase shell представляет из себя jruby-консоль c встроенной поддержкой всех основных операций по работе с Hbase. Ниже приведён пример создания таблицы users с двумя column family, выполнения некоторых манипуляций с ней и удаление таблицы в конце на языке hbase shell:

Простыня кода

create 'users', {NAME => 'user_profile', VERSIONS => 5}, {NAME => 'user_posts', VERSIONS => 1231231231}
put 'users', 'id1', 'user_profile:name', 'alexander'
put 'users', 'id1', 'user_profile:second_name', 'alexander'
get 'users', 'id1'
put 'users', 'id1', 'user_profile:second_name', 'kuznetsov'
get 'users', 'id1'
get 'users', 'id1', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
put 'users', 'id2', 'user_profile:name', 'vasiliy'
put 'users', 'id2', 'user_profile:second_name', 'ivanov'
scan 'users', {COLUMN => 'user_profile:second_name', VERSIONS => 5}
delete 'users', 'id1', 'user_profile:second_name'
get 'users', 'id1'
disable 'users'
drop 'users'

Native Api

Как и большинство других hadoop-related проектов hbase реализован на языке java, поэтому и нативный api доступен для языке java. Native API довольно неплохо задокументирован на официальном сайте. Вот пример использования Hbase API взятый оттуда же:

Простыня кода

import java.io.IOException;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

// Class that has nothing but a main.
// Does a Put, Get and a Scan against an hbase table.
// The API described here is since HBase 1.0.
public class MyLittleHBaseClient {
  public static void main(String[] args) throws IOException {
    // You need a configuration object to tell the client where to connect.
    // When you create a HBaseConfiguration, it reads in whatever you've set
    // into your hbase-site.xml and in hbase-default.xml, as long as these can
    // be found on the CLASSPATH
    Configuration config = HBaseConfiguration.create();

    // Next you need a Connection to the cluster. Create one. When done with it,
    // close it. A try/finally is a good way to ensure it gets closed or use
    // the jdk7 idiom, try-with-resources: see
    // https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
    //
    // Connections are heavyweight. Create one once and keep it around. From a Connection
    // you get a Table instance to access Tables, an Admin instance to administer the cluster,
    // and RegionLocator to find where regions are out on the cluster. As opposed to Connections,
    // Table, Admin and RegionLocator instances are lightweight; create as you need them and then
    // close when done.
    //
    Connection connection = ConnectionFactory.createConnection(config);
    try {

      // The below instantiates a Table object that connects you to the "myLittleHBaseTable" table
      // (TableName.valueOf turns String into a TableName instance).
      // When done with it, close it (Should start a try/finally after this creation so it gets
      // closed for sure the jdk7 idiom, try-with-resources: see
      // https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)
      Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));
      try {

        // To add to a row, use Put. A Put constructor takes the name of the row
        // you want to insert into as a byte array. In HBase, the Bytes class has
        // utility for converting all kinds of java types to byte arrays.  In the
        // below, we are converting the String "myLittleRow" into a byte array to
        // use as a row key for our update. Once you have a Put instance, you can
        // adorn it by setting the names of columns you want to update on the row,
        // the timestamp to use in your update, etc. If no timestamp, the server
        // applies current time to the edits.
        Put p = new Put(Bytes.toBytes("myLittleRow"));

        // To set the value you'd like to update in the row 'myLittleRow', specify
        // the column family, column qualifier, and value of the table cell you'd
        // like to update. The column family must already exist in your table
        // schema. The qualifier can be anything. All must be specified as byte
        // arrays as hbase is all about byte arrays. Lets pretend the table
        // 'myLittleHBaseTable' was created with a family 'myLittleFamily'.
        p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
        Bytes.toBytes("Some Value"));

        // Once you've adorned your Put instance with all the updates you want to
        // make, to commit it do the following (The HTable#put method takes the
        // Put instance you've been building and pushes the changes you made into
        // hbase)
        table.put(p);

        // Now, to retrieve the data we just wrote. The values that come back are
        // Result instances. Generally, a Result is an object that will package up
        // the hbase return into the form you find most palatable.
        Get g = new Get(Bytes.toBytes("myLittleRow"));
        Result r = table.get(g);
        byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
          Bytes.toBytes("someQualifier"));

        // If we convert the value bytes, we should get back 'Some Value', the
        // value we inserted at this location.
        String valueStr = Bytes.toString(value);
        System.out.println("GET: " + valueStr);

        // Sometimes, you won't know the row you're looking for. In this case, you
        // use a Scanner. This will give you cursor-like interface to the contents
        // of the table. To set up a Scanner, do like you did above making a Put
        // and a Get, create a Scan. Adorn it with column names, etc.
        Scan s = new Scan();
        s.addColumn(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
        ResultScanner scanner = table.getScanner(s);
        try {
           // Scanners return Result instances.
           // Now, for the actual iteration. One way is to use a while loop like so:
           for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
             // print out the row we found and the columns we were looking for
             System.out.println("Found row: " + rr);
           }

           // The other approach is to use a foreach loop. Scanners are iterable!
           // for (Result rr : scanner) {
           // System.out.println("Found row: " + rr);
           // }
         } finally {
           // Make sure you close your scanners when you are done!
           // Thats why we have it inside a try/finally clause
           scanner.close();
         }

         // Close your table and cluster connection.
       } finally {
         if (table != null) table.close();
       }
     } finally {
       connection.close();
     }
  }
}

Thrift, REST и поддержка других языков программирования.

Для работы из других языков программирования Hbase предоставляет Thrift API и Rest API. На базе них построены клиенты для всех основных языков программирования: python, PHP, Java Script и тд.

Некоторые особенности работы с HBase

1. Hbase «из коробки» интегрируется с MapReduce, и может быть использована в качестве входных и выходных данных с помощью специальных TableInputFormat и TableOutputFormat.

2. Очень важно правильно выбрать RowKey. RowKey должен обеспечивать хорошее равномерное распределение по регионам, в противном случае есть риск возникновения так называемых «горячих регионов» — регионов которые используются гораздо чаще остальных, что приводит к неэффективному использованию ресурсов системы.

3. Если данные заливаются не единично, а сразу большими пачками — Hbase поддерживает специальный механизм BulkLoad, который позволяет заливать данные намного быстрее чем используя единичные Put’ы. BulkLoad по сути представляет из себя двухшаговую операцию:

— Формирование HFile без участия put’ов при помощи специального MapReduce job’a

— Подкладывание этих файликов напрямую в Hbase.

4. Hbase поддерживает вывод своих метрик в сервер мониторинга Ganglia. Это может быть очень полезно при администрировании Hbase для понимания сути происходящих с hbase проблем.

Пример

В качестве примера можем рассмотреть основную таблицу с данными, которая у нас в Data-Centric Aliance используется для хранения информации о поведении пользователей в интернете.

RowKey

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

Column Family

В нашем хранилище используются две column family:

Data. В этой группе колонок хранятся данные, которые теряют свою актуальность для рекламных целей, такие как факты посещения пользователем определенных URL. TTL на эту Column Family установлен в размере 2 месяца, ограничение по количеству версий — 2000.

LongData. В этой группе колонок хранятся данные, которые не теряют свою актуальность в течение долгого времени, такие как пол, дата рождения и другие «вечные» характеристики пользователя

Колонки

Каждый тип фактов о пользователе хранится в отдельной колонке. Например в колонке Data:_v хранятся URL, посещенные пользователем, а в колонке LongData:gender — пол пользователя.

В качестве timestamp хранится время регистрации этого факта. Например в колонке Data:_v — в качестве timestamp используется время захода пользователем на определенный URL.

Такая структура хранения пользовательских данных очень хорошо ложится на наш паттерн использования и позволяет быстро обновлять данные о пользователях, быстро доставать всю необходимую информацию о пользователях, и, используя MapReduce, быстро обрабатывать данные о всех пользователях сразу.

Альтернативы

Hbase довольно сложна в администрировании и использовании, поэтому прежде чем использовать hbase есть смысл обратить внимание на альтернативы:

  • Реляционные базы данных. Очень неплохая альтернатива, особенно в случае когда данные влезают на одну машину. Также в первую очередь о реляционных базах данных стоит подумать в случае когда важны транзакции индексы отличные от первичного.
  • Key-Value хранилища. Такие хранилища как Redis и Aerospike лучше подходят когда необходима минимизация latency и менее важна пакетная обработка данных.
  • Файлы и их обработка при помощи MapReduce. Если данные только добавляются, и редко обновляются/изменяются, то лучше не использовать Hbase, а просто хранить данные в файлах. Для упрощения работы с файлами можно воспользоваться такими инструментами как Hive, Pig и Impala, о которых речь пойдет в следующих статьях.

Checklist по использованию Hbase

Использование Hbase оправдано когда:

— Данных много и они не влезают на один компьютер
— Данные часто обновляются и удаляются
— В данных присутствует явный «ключ» по к которому удобно привязывать все остальное
— Нужна пакетная обработка данных
— Нужен произвольный доступ к данным по определенным ключам

Заключение

В данной статье мы рассмотрели Hbase — мощное средство для хранения и обновления данных в экосистеме hadoop, показали модель данных Hbase, её архитектуру и особенности работы с ней.

В следующих статьях речь пойдет о средствах, упрощающих работу с MapReduce, таких как Apache Hive и Apache Pig.

Ссылки на другие статьи цикла

» Big Data от А до Я. Часть 1: Принципы работы с большими данными, парадигма MapReduce
» Big Data от А до Я. Часть 2: Hadoop
» Big Data от А до Я. Часть 3: Приемы и стратегии разработки MapReduce-приложений

Время на прочтение
7 мин

Количество просмотров 89K

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

CAP теорема

Эта теорема была представлена на симпозиуме по принципам распределенных вычислений в 2000 году Эриком Брюером. В 2002 году Сет Гилберт и Нэнси Линч из MIT опубликовали формальное доказательство гипотезы Брюера, сделав ее теоремой.

По словам Брюера, он хотел, чтобы сообщество начало дискуссию о компромиссах в распределённых системах и уже спустя некоторое количество лет начал вносить в неё поправки и оговорки.

Что стоит за CAP

В CAP говорится, что в распределенной системе возможно выбрать только 2 из 3-х свойств:

  • C (consistency) — согласованность. Каждое чтение даст вам самую последнюю запись.
  • A (availability) — доступность. Каждый узел (не упавший) всегда успешно выполняет запросы (на чтение и запись).
  • P (partition tolerance) — устойчивость к распределению. Даже если между узлами нет связи, они продолжают работать независимо друг от друга.

Уже есть достаточно наглядных доказательств этой теоремы, поэтому дам ссылки на университет Баумана и доказательство в виде сервиса «Позвони, напомню!».

В основном это всё треугольник

Многие статьи сводятся к вот такому вот простому треугольнику.

image

Применяем на практике

Для применения CAP теоремы на практике, я выбрал 3 наиболее, на мой взгляд, подходящие и достаточно популярные системы баз данных: Postgresql, MongoDB, Cassandra.

Посмотрим на Postgresql

Следующие пункты относятся к абстрактной распределенной БД Postgresql.

  • Репликация Master-Slave — одно из распространенных решений
  • Синхронизация с Master в асинхронном / синхронном режиме
  • Система транзакций использует двухфазный коммит для обеспечения consistency
  • Если возникает partition, вы не можете взаимодейстовать с системой (в основном случае)

Таким образом, система не может продолжать работу в случае partition, но обеспечивает strong consistency и availability. Это система CA!

Посмотрим на MongoDB

Следующие пункты относятся к абстрактной распределенной БД MongoDB.

  • MongoDB обеспечивает strong consistency, потому что это система с одним Master узлом, и все записи идут по умолчанию в него.
  • Автоматическая смена мастера, в случае отделения его от остальных узлов.
  • В случае разделения сети, система прекратит принимать записи до тех пор, пока не убедится, что может безопасно завершить их.

Таким образом, система может продолжать работу в случае разделения сети, но теряется CAP-availability всех узлов. Это CP система!

Посмотрим на Cassandra

Cassandra использует схему репликации master-master, что фактически означает AP систему, в которой разделение сети приводит к самодостаточному функционированию всех узлов.

Казалось бы всё просто… Но это не так.

Проблемы CAP

На тему проблем в CAP теореме написано множество подробных и интересных статей, здесь, на Хабре, поэтому я оставлю ссылку на CAP больше не актуален и мифы о CAP теореме. Обязательно почитайте их, но относитесь к каждой статье, как к своего рода новому взгляду и не принимайте слишком близко к сердцу, потому что одни ругают, другие хвалят. Сам же я не буду слишком углублятся, а постараюсь выдать некоторую необходимую компиляцию.

Итак, проблемы CAP теоремы:

  • Далёкие от реального мира определения
  • В рамках разработки, выбор в основном лежит между CP и AP
  • Множество систем — просто P
  • Чистые AP и CP системы могут быть не тем, что ожидаешь

Что не так с определениями?

Consistency в CAP фактически означает линеаризуемость (и ее действительно трудно достичь). Чтобы объяснить, что такое линеаризуемость, давайте посмотрим на следующую картинку:

image

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

Availability в CAP, исходя из определения имеет две серьёзные проблемы. Первая — нет понятия частичной доступности, или какой-то её степени (проценты например), а есть только полная доступность. Вторая проблема — неограниченное время ответа на запросы, т.е. даже если система отвечает час, она всё ещё доступна.

Устойчивость к распределению не включает в себя упавшие узлы, и вот почему:

  1. По определению. В availability так и прописано «…every node (if not failed) always…»
  2. Исходя из доказательства. Доказательства CAP теоремы гласят что на узлах должен исполняться некоторый код.
  3. Ну и немного моих (и не только) домыслов. В случае падения узла, система может восстановиться, пообщаться с другими узлами и продолжить работу как ни в чем ни бывало. В случае разделения сети — придётся ждать восстановления соединения.

Поэтому, нужно помнить про способность системы восстанавливаться, но за рамками CAP теоремы.

AP / CP выбор

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

Многие системы — просто P

Представьте систему, в которой два узла (Master, Slave) и клиент. Если вдруг вы потеряли связь с Master, клиент может читать из Slave, но не может писать — нет CAP-availability.

Ок, вроде CP система, но если Master и Slave синхронизируются асинхронно, то клиент, может запросить данные от Slave раньше успешной синхронизации — теряем CAP-consistency.
image

Чистые AP и CP системы

Чистые AP системы, могут включать в себя просто 2 генератора чисел. Чистые CP системы, могут вообще не быть доступны, т.к. буду пытаться придти к согласованному состоянию и не будут нам отвечать. Идём дальше, CP системы дают нам не ожидаемый нами strong consistency, а eventual consistency. О нём поговорим чуть позже.

Как с этим жить

В конце концов, это всего лишь попытка классифицировать что-то абстрактное, поэтому вам не нужно изобретать велосипед. Я рекомендую использовать следующий подход при попытке работать с распределенными БД:

  • Помните об определениях CAP и об их ограничениях.
  • Используйте теорему PACELC вместо CAP, она позволяет взглянуть на систему ещё с одного ракурса.
  • Помните про принципы ACID / BASE и насколько они применимы к вашей системе.
  • Любые телодвижения следует делать, учитывая проект, над которым вы работаете.

PACELC

Теорема PACELC была впервые описана и формализована Даниелом Дж. Абади из Йельского университета в 2012 году. Поскольку теорема PACELC основана на CAP, она также использует его определения.

Вся теорема сводится к IF P -> (C or A), ELSE (C or L).

Latency — это время, за которое клиент получит ответ и которое регулируется каким-либо уровнем consistency. Latency (задержка), в некотором смысле представляет собой степень доступности.

image

Немного о BASE

BASE — это своеобразный контраст ACID, который говорит нам, что истинная согласованность не может быть достигнута в реальном мире и не может быть смоделирована в высокомасштабируемых системах.

Что стоит за BASE:

  • Basic Availability. Система отвечает на любой запрос, но этот ответ может быть содержать ошибку или несогласованные данные.
  • Soft-state. Состояние системы может меняться со временем из-за изменений конечной согласованности.
  • Eventual consistency (конечная согласованность). Система, в конечном итоге, станет согласованной. Она будет продолжать принимать данные и не будет проверять каждую транзакцию на согласованность.

Меня несколько раз спрашивали о том, что лучше ACID или BASE — это зависит от вашего проекта. Например, если ваши данные не критичны, и пользователь действительно заботится о скорости взаимодействия, BASE будет лучшим вариантом. Если всё наоборот — ACID поможет вам сделать систему максимально надежной с точки зрения данных.

Свежий взгляд

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

Postgresql

Postgresql действительно допускает множество различных конфигураций системы, поэтому их очень сложно описать. Давайте просто возьмем классическую Master-Slave репликацию с реализацией через Slony.

  • Система работает в соответствии с ACID (существует пара проблем с двухфазным коммитом, но это вне рамок статьи).
  • В случае разрыва связи, Slony попытается переключиться на новый Master, и у нас есть новый мастер с его согласованностью.
  • Когда система функционирует в нормальном режиме, Slony делает все, чтобы достичь strong consistency. На самом деле, ACID — причина большой задержки в этой системе.
  • Классификация системы — PC / EC (A).

MongoDB

Давайте узнаем что-то новое о MongoDB:

  • Это ACID в ограниченном смысле на уровне документа.
  • В случае распределенной системы — it’s all about that BASE.
  • В случае отсутствия разделений сети, система гарантирует, что чтение и запись будут согласованными.
  • Если Master узел упадёт или потеряет связь с остальной системой, некоторые данные не будут реплицированы. Система выберет нового мастера, чтобы оставаться доступной для чтения и записи. (Новый мастер и старый мастер несогласованы).
  • Система рассматривается как PA / EC (A), так как большинство узлов остаются CAP-available в случае разрыва. Помните, что в CAP MongoDB обычно рассматривается как CP. Создателль PACELC, Даниэль Дж. Абади, говорит, что существует гораздо больше проблем с согласованностью, чем с доступностью, поэтому PA.

Cassandra

  • Предназначена для «скоростного» взаимодействия (low-latency interactions).
  • ACID на уровне записи.
  • В случае распределенной системы — it’s all about that BASE.
  • Если возникает разрыв связи, остальные узлы продолжают функционировать.
  • В случае нормального функционирования — система использует уровни согласованности для уменьшения задержки.
  • Система рассматривается как PA / EL (A).

Выводы

  • Компромиссы распределённых систем — это то, с чего стоит начинать процесс проектирования.
  • Достаточно трудно классифицировать абстрактную систему, гораздо лучше сначала сформировать требования исходя из технического задания, а уже затем правильно сконфигурировать нужную систему баз данных.
  • Не перетруждайтесь, мы ведь просто любопытные разработчики, если в чем-то есть сомнения — обратитесь к эксперту.

Спасибо за внимание!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *