вторник, 29 мая 2012 г.

Пост 3. Архитектура Oracle NoSQL Database.

Доброго времени суток!

В данной статье хотел бы рассказать об архитектуре Oracle NoSQL Database. Oracle NoSQL DB - кластерная база данных (информация хранится на множестве серверов, распределена по принципу партишенинга). Данные задублированы на нескольких серверах (количество копий называется Replication factor). Сервера содержащие одинаковые данные объединяются в Replication  Groups (Shard). Внутри шарда реализована мастер-слейв репликация (пишет один, читают со всех). Если Мастер умирает - кто то из слейвов становится мастером (подробнее про master - slave репликацию можно посмотреть здесь). Чем больше мастеров(читай shard-ов) - тем быстрее система работает на запись.



   Рис. 1. Пример топологии NoSQL базы.

Минимальная еденица данной системы - Storage Node (применительно к картинке выше - один из девяти серверов). Каждый  Storage Node состоит из партиций (помните в самой первой статье говорилось, что на высшем уровне абстракции можно понимать Oracle NoSQL DB как одну огомную таблицу,на самом деле сегментируемую по хэшу от ключа на несколько частей). Секционирование - способ разделения инормации на независимые сегменты. Каждая секция имеет локальный B-Tree индекс. Соответственно, если у нас будет мало секций мы получим большие локальные индексы, а как известно чем больше индекс, тем выше стоимость добавления нового элемента.
Если секций будет очень много - мы получим высокую стоимость накладных расходов на вычисление нужной секции. В общем надо искать компромисс.

Рис.2. Key - Value Store в реляционном мышлении.

Строго говоря, Storage Node - логическая еденица(процесс в ОС), то есть один сервер может включать в себя несколько Storage Node. К примеру, если у нас есть 3 сервера и мы хотим обеспечить 3 репликацию данных - без проблем. Это будет выглядеть как то так:

Рис 3. Пример топологии NoSQL базы. 

Но все же не рекомендуется держать всю базу на одном очень мощном сервере. Идея NoSQL баз в разнесении хранилища на множество дешевых серверов.

Это касаемо топологии хранилища. Теперь хотелось бы сделать одно маленькое, но весьма значительное замечание по поводу ключа. Ключ состоит из 2х частей major и minor (пример: /Smith/Bob/-/foto/, /Smith/Bob - это major составляющая ключа, а /foto/ - minor). Major part + Minor part = Key. Minor составляющей может и не быть. Major составляющая влияет на распределение ключа по партициям (и как следствие по серверам), minor - просто вспомогательная составляющая.

Пример:
Key:  /Mijatovic/foto/                               Value: здесь будет аватар
Key:  /Mijatovic/foto/-/album1/My_dog      Value: здесь будет фотография собаки
Key:  /Mijatovic/foto/-/album1/My_Саt      Value: здесь будет фотография кошки

В первом примере Minor составляющая отсутствует. У всех трех записей одинаковый Major key => все записи попадут в одну партицию (ну и конечно же в одну репликационную группу).

Key:  /Mijatovic/foto/                                 Value: здесь будет аватар
Key:  /Mijatovic/foto/album1/ - /My_dog      Value: здесь будет фотография собаки
Key:  /Mijatovic/foto/album1/ - /My_Саt      Value: здесь будет фотография кошки


В этом случае Major key у второй и третей записи будет отличаться от первой. Скорее всего 1 запись попадет в партицию отличную от партиции 2 и 3 записи. Вот как то так...

Если у вас есть какие-либо вопросы по Oracle NoSQL - задавайте в комментах, постараюсь ответить, либо пишите на oracle.nosql@gmail.com.

Продолжение следует!

1 комментарий:

  1. "едИница" пишется правильно. А так очень даже толково написано, спасибо!

    ОтветитьУдалить