GlobalsDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:07, 30 января 2019.

GlobalsDB - бесплатная NoSQL база данных, которая использует для сохранения данных механизм Глобальных Постоянных Переменных (Global Persistent Variables)

GlobalsDB
fraimed
Разработчики: InterSystems Inc.
Выпущена: 2011; 8 years ago (2011)
Постоянный выпуск: GlobalsDB v2012.296 / January 2015; 4 years ago (2015-01)
Состояние разработки: No Active
Написана на: Java, C++
Операционная система: Linux, Windows
Размер дистрибутива: 248 MB
Тип ПО: База данных
Веб-сайт InterSystems Inc.

О БД

Механизм Глобальных Постоянных Переменных значит,что значения переменных автоматически сохраняются на жёстком диске. Они представляют собой абстракцию над бинарными деревьями (B-trees) и могут быть использованы для хранения больших объёмов данных представленных как многомерные разреженные массивы.С помощью Глобальных Постоянных Переменных (обычно называемых глобалами , поэтому и база называется GlobalsDB) можно выразительно и высокоэффективно решать все обычные задачи, для которых принято использовать различные NoSQL-базы.Сердцем GlobalsDB является тот же движок, что используется в БД Caché.В отличие от Caché GlobalsDB бесплатна для использования, разработки и распространения без всяких ограничений, что делает эту платформу очень привлекательной (однако это не Open Source продукт).К GlobalsDB можно обращаться через высокопроизводительный внутрипроцессный API, который доступен для Node.JS (Javascript), .NET и Java.Команды к GlobalsDB передаются не через порты и сокеты, что замедлило бы работу с БД, а напрямую-путём обращения к программному коду GlobalsDB из процесса приложения. Для максимального быстродействия процесс GlobalsDB подлинкован к процессу приложения.

Краткий обзор глобалов

Ещё раз напомню, под глобалами мы понимаем структуры для хранения данных, а под GlobalsDB базу данных построенную на глобалах.[Источник 1]

  • Не имеют заранее заданной структуры (sсhema-free). Глобалы в отличие от таблиц не нуждаются в определении (CREATE TABLE) прежде чем с ними можно начать работу;
  • Иерархически структурированы (речь о внутренней структуре каждого отдельного глобала);
  • Разреженные;
  • Динамические;

Можете думать, что это автосохраняемые на диск ассоциативные массивы и вы недалеко уйдёте от истины.

Некоторые примеры глобалов:

myTable["101-22-2238", "Chicago", 2] = "Some information"
account["New York", "026002561", 35120218433001] = 123456.45

Каждый глобал имеет имя (как и массивы имеют имена). Далее следуют несколько индексов, значения которых могут быть численными или строковыми. Вы можете иметь любое число индексов. Есть ограничение только на суммарную их длину, которое довольно велико. Каждый элемент глобала (который определяется именем глобала и сочетанием индексов) хранит текстовую строку. Пустые строки разрешены. Вы можете создавать или удалять элементы глобала тогда, когда вы хотите. Всё происходит динамически и не требует никаких объявлений или определения схем данных. Глобалы чрезвычайно универсальны и могут быть легко использованы для моделирования всех 4-х типов NoSQL баз со сравнимой или во многих случаях значительно превосходящей производительностью:

Производительность как у баз в RAM, целостность как у баз на диске

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

Преимущества и недостатки GlobalsDB

В 2010 в TechRepublic был опубликован пост «10 вещей, которые вы должны знать о NoSQL базах». В нём приведено 5 преимуществ и 5 слабых мест характерных для NoSQL баз. Если мы рассмотрим GlobalsDB с точки зрения этого поста, то ей присуще все 5 преимуществ, вместе с тем, что более интересно, 4 из 5 недостатков к ней не относятся, чем не могут похвастаться другие NoSQL-базы.

5 преимуществ:

  • Эластичное масштабирование;
  • Много данных;
  • Отсутствие необходимости администраторов;
  • Экономичность;
  • Гибкие модели данных;

5 слабых мест:

  • Незрелость технологии;
  • Поддержка;
  • Аналитика и бизнес-аналитика;
  • Администрирование;
  • Число экспертов;

Рассмотрим каждое преимущество по очереди:

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

Для Caché создана сетевая технология ECP, которая позволяет прозрачно работать с глобалами, которые физически распределены по многим серверам. На текущий момент GlobalsDB не включает в себя ECP, но если потребуется эластичное масштабирование, то программы для GlobalsDB могут быть перенесены на Caché: Caché позволяет запускать любое приложение для GlobalsDB без всяких модификаций.

  • Много данных. GlobalsDB спроектирована для работы с такими объёмами данных, которые лежат далеко за пределами обычных реляционных баз данных. При этом с экстремально высокой производительностью.
  • Отсутствие необходимости администраторов. Интересно, что компания Intersystems (поставщик Caché) использовала этот аргумент в маркетинге много лет. Известны системы на глобалах, которые работали безо всякого присмотра десятилетиями.
  • Экономичность. GlobalsDB отлично работает на недорогом, обыкновенном оборудовании и выжимает из него максимальный уровень производительности. В системе здравоохранения Массачусета работали одновременно десятки тысяч пользователей в 1980-х и 1990-х годах на сетевом кластере из сотен обыкновенных PC, на которых под MS-DOS была запущена БД предшественница Caché.
  • Гибкие модели данных. Это сама суть хранилища на глобалах, что и будет показано далее.

Что касается слабых мест:

  • Незрелость технологии. В отличие от новых NoSQL-баз Caché имеет длинную родословную и выдающийся послужной список. На Caché работают огромные сложные базы данных в требовательных бизнес-отраслях. GlobalsDB, которая имеет тот же БД-движок, представляет собой быструю, экстремально надёжную и стабильную технологию, которую можно с уверенностью использовать в критически важных областях бизнеса.
  • Поддержка.Caché доминирует в индустрии здравоохранения США и интенсивно используется в финансовой сфере. Одна из причин такого доверия — это качество коммерческой поддержки от InterSystems. GlobalsDB предоставляется бесплатно и безо всякой поддержки, однако если она потребуется, то приложения для GlobalsDB могут быть перенесены без всяких изменений на полностью поддерживаемый Caché.
  • Аналитика и бизнес-аналитика. Интересно, что сейчас InterSystems широко рекламирует продукт под названием DeepSee. Он создан именно для аналитики и работает поверх GlobalsDB. Уже много лет к GlobalsDB можно подсоединиться с помощью инструментов бизнес-аналитики основанных на SQL.
  • Администрирование. GlobalsDB проста в установке и обслуживании, и, подобно Caché, может быть использована в ситуациях где есть всего несколько, если вообще есть, айтишников.
  • Число экспертов. Это единственная область, где позиции GlobalsDB слабы. Число пользователей Caché постоянно растёт. Однако число опытных профессионалов, имеющих опыт работы с БД основанными на глобалах, очень мало по сравнению с количеством людей имеющих опыт работы с реляционными БД. Собственно говоря, одна из целей разработки GlobalsDB — это расширение сообщества разработчиков и пользователей, которые через GlobalsDB узнают о Caché.

GlobalsDB Admin

[Источник 2] GlobalsDB Admin - это простой визуальный инструмент, разработанный для проекта InterSystems GlobalsDB, чтобы помочь администраторам достичь своих целей. Этот инструмент позволяет управлять любой базой данных Globals с простым и элегантным графическим интерфейсом с любого устройства и из любого места.

Установка сервера и клиента NodeJS

1. Убедитесь, что у вас правильно установлены NodeJS и GlobalsDB;
  • Получите последнюю версию NodeJS .
  • Загрузите последнюю версию GlobalsDB .
2. Скачать и распаковать последнюю версию GlobalsDB Admin ;
3. Измените настройки по умолчанию в файле config.js, отредактировав его;
  • Замените «C: / HardProgram / GlobalsDB / mgr» на местоположение вашей базы данных. Эта папка должна содержать файл (ы) CACHE.DAT. Также вы можете изменить отображаемое имя этой базы данных, заменив primaryDB .
  • Замените свойство masterPassword, чтобы обеспечить безопасность ваших данных.
  • Проверьте все остальные свойства.
4. Подготовить вашу среду;
  • Если вы НЕ используете операционную систему Windows (например, Linux), то вам нужно заменить файл node_modules / globalsDB / cache.node файлом, расположенным в каталоге вашей базы данных по адресу / db / installation / path / bin / cache ****. узел(или переименуйте один из подходящих файлов в каталоге node_modules / globalsDB / в cache.node, или просто измените имя модуля на подходящий модуль в config.js). Этот файл является адаптером GlobalsDB для NodeJS. Если такого файла нет, его необходимо загрузить с официального сайта GlobalsDB .
  • Убедитесь, что экземпляр GlobalsDB запущен.
  • Проверьте, доступны ли порты 57775 и 80 (по умолчанию) для прослушивания. Вы можете изменить их в файле config.js.
5. Запустите сервер из файла run.js;
  • Перейдите в каталог, в который вы распаковали файлы на системном терминале, с помощью команды:
$ cd/path/to/globalsDbAdmin
  • Запустите приложение:
$ node run 
  • Вы должны получить "Система запуска успешно. Все готово!" согласно версии 1.0.0.
6. То есть! Теперь вы можете использовать локальный клиент (по умолчанию127.0.0.1:80), чтобы присоединиться к приложению Сервера GlobalsDB Admin и найти вашу базу данных;
7. Кроме того, если вы хотите запустить приложение как демон (в фоновом режиме), вам нужно установить его.Запуск:
$ npm install -g

а затем запустить GlobalsDB Администратор с помощью команды:

$ forever start run.js

Как это использовать

В клиентском приложении (мобильном или через Интернет) вы должны сначала подключиться к вашему серверу. Введите IP-адрес сервера с портом, на котором размещено серверное приложение (по умолчанию 57775) и мастер-пароль, который был установлен в config.js .

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

И теперь все готово! Если вы используете ПК с клавиатурой, попробуйте поиграть со следующими клавишами: вверх, вниз, влево, вправо, ввод, возврат, плюс, минус, esc. И если вы используете сенсорный экран или мышь, есть некоторые вещи, на которые стоит обратить внимание. Выберите узлы для перемещения, нажав на них. Выберите опцию (удалить или изменить узел), щелкнув по измерению узла (ссылка между двумя узлами). Прокрутите набор узлов, нажав и удерживая палец или курсор на узле в наборе.

Моделируем 4 вида NoSQL-баз с помощью Globals

Перед тем как мы начнём моделировать различные виды NoSQL-баз, давайте взглянем на глобалы чуть более детально и определим некоторые термины, которые будем использовать позднее.[Источник 3] При сохранении данных в элементе глобала используются 3 компонента:

  • Имя глобала.
  • Индексы (ноль, один или несколько). Они могут быть текстовыми или численными.
  • Значение (которое, собственно, и хранится в элементе глобала). Оно м.б. текстовым или численным.

Эти три компонента часто записываются как N-арная реляционная переменная следующим образом:

globalName[subscript1, subscript2, ..subscriptN] = value

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

myGlobal["a"] = 123
myGlobal["b", "c1"] = "foo"
myGlobal["b", "c2"] = "foo2"
myGlobal["d", "e1", "f1"] = "bar1"
myGlobal["d", "e1", "f2"] = "bar2"
myGlobal["d", "e2", "f1"] = "bar1"
myGlobal["d", "e2", "f2"] = "bar2"
myGlobal["d", "e2", "f3"] = "bar3"

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

fraimed

Элементы в глобалах создаются командой set. Точный синтаксис этой команды зависит от используемого API. Так, для Node.JS API один и тот же элемент глобала мы можем создать двумя способами.

  • Ассинхронно
var globalNode = {
  global:"myGlobal",
  subscripts: ["b","c3"],
  data: "Rob"
};
db.set(globalNode, function(error,results) {
// etc
});
  • Синхронно
var globalNode = {
  global:"myGlobal",
  subscripts: ["b","c3"],
  data: "Rob"
};
db.set(globalNode);

Одним из интересных свойств GlobalsDB является то, можно широко использовать синхронное программирование без вреда для производительности, что упрощает работу с ней и позволяет использовать ОО-синтаксис в полном объёме внутри JavaScript.

Это возможно из-за уникальной производительности GlobalsDB: она работает в связке c NodeJS как подлинкованный процесс в оперативной памяти (в отличие от многих других NoSQL-баз, которые работают через различные сетевые сокеты), и в сочетании с глубокой оптимизацией, которая, как уже было озвучено, даёт производительность как у баз в памяти в RAM. Подобного сочетания свойств нет у самых популярных NoSQL-баз. Давайте теперь, помня основные свойства глобалов, посмотрим как мы можем их использовать для представления типовых структур данных, для хранения которых используются NoSQL-базы.

Хранилище Ключ/Значение

Реализация хранилища типа Ключ/Хначение на глобалах элементарна. Мы создаём его используя следующую структуру:

keyValueStore[key] = value

Например:

telephone["211-555-9012"] = "James, George"
telephone["617-555-1414"] = "Tweed, Rob"

В виде иерархического дерева эта структура выглядит так:

fraimed

Табличные (или колоночные) хранилища

Табличные или колоночные NoSQL-базы такие как BigTable, Cassandra и Amazon SimpleDB позволяют сохранять данные в разреженных таблицах, подразумевая что каждая строка может содержать значения в некоторых, но необязательно во всех, столбцах.

SimpleDB в дополнение позволяет каждой ячейке в столбце содержать более одного значения.

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

columnStore[columnName, rowId] = value

Пример с конкретными данными:

user["dateOfBirth", 3] = "1987-01-23"
user["email", 1] = "rob@foo.com"
user["email", 2] = "george@foo.com"
user["name", 1] = "Rob"
user["name", 2] = "George"
user["name", 3] = "John"
user["state", 1] = "MA"
user["state", 2] = "NY"
user["telephone", 2] = "211-555-4121"

В виде диаграммы:

fraimed

Документо-ориентированное хранилище

Документо-ориентированные NoSQL БД такие как CouchDB и MongoDB хранят множество пар ключ/значение и вложенные множества множеств различных аттрибутов.

Обычно используются JSON или JSON-подобные структуры для представления «документов» хранящихся в этих БД. GlobalsDB автоматически отображает JSON-документы или объекты в глобалы.

Для примера рассмотрим JSON-документ:

{
  "age": "26",
  "contact": {
    "address": {
      "city": "Boston",
      "street": "112 Beacon Street"
    },
    "cell": "617-555-1761",
    "email": "rob@foo.com",
    "telephone": "617-555-1212"
  },
  "knows": {
    "1": "George",
    "2": "John",
    "3": "Chris"
  },
  "medications": {
    "1": {
      "dose": "5mg",
      "drug": "Zolmitripan"
    },
    "2": {
      "dose": "500mg",
      "drug": "Paracetemol"
    }
  },
  "name": "Rob",
  "sex": "Male"
}

Он будет отображён на глобалы так:

person["age"] = 26
person["contact", "address", "city"] = "Boston"
person["contact", "address", "street"] = "112 Beacon Street"
person["contact", "cell"] = "617-555-1761"
person["contact", "eMail"] = "rob@foo.com"
person["contact", "telephone"] = "617-555-1212"
person["knows", 1] = "George"
person["knows", 2] = "John"
person["knows", 3] = "Chris"
person["medications", 1, "drug"] = "Zolmitripan"
person["medications", 1, "dose"] = "5mg"
person["medications", 2, "drug"] = "Paracetamol"
person["medications", 2, "dose"] = "500mg"
person["name"] = "Rob"
person["sex"] = "Male"

Или графически:

fraimed

Графовые базы данных

NoSQL-базы такие как Neo4j используются для представления сложных сетей взаимосвязей в терминах узлов и связей между ними (т.н. рёбер) с помощью пар ключ/значение связывающих узлы и рёбра.

Классическое использование графовой БД это представление социального графа. Давайте рассмотрим следующий пример:

fraimed

В этом примере стрелками показано какие пользователи знают (know) о других. С помощью глобалов он может быть представлен так:

person[personId, "knows", personId] = ""
person[personId, "knows", personId, key) = value
person[personId, "name"] = name

Время состояния «knows» («знает») может быть вычислено из временного штампа, который сохраняется при первичном создании связи, например так:

person[1, "knows", 2] = ""
person[1, "knows", 2, "disclosure"] = "public"
person[1, "knows", 2, "timestamp"] = "2008-08-16T12:23:01Z"
person[1, "knows", 7] = ""
person[1, "name"] = "Rob"
person[2, "name"] = "John"
person[7, "knows", 2] = ""
person[7, "knows", 2, "disclosure"] = "public"
person[7, "knows", 2, "timestamp"] = "2009-12-16T10:06:44Z"
person[7, "name"] = "George"

или графически (красные точечные пунктирные линии показывают отношения «know» между пользователями в этой модели):

fraimed

Модели других баз данных

Моделирование на глобалах не ограничивается только NoSQL-моделями данных. Они также могут быть использованы для моделирования:

  • XML DOM/Native XML-баз данных. GlobalsDB отлично подходит для работы с сохраняемыми XML DOM файлами. XML-документ, по существу, это граф, который представляет узлы различных типов и отношения между ними (например firstChild, lastChild, nextSibling, parent и т.п.). В сущности это позволяет GlobalsDB выступать в роли Native XML-базы данных. Модуль для Node.js ewdDOM — одна легковесных реализаций такой БД.
  • Реляционные таблицы. Caché моделирует реляционные таблицы на глобалах, таким образом что можно использовать стандартные SQL-запросы. Т.е. GlobalsDB можно рассматривать как основу для NoSQL-движка, а в Caché добавлены возможности NOSQL (т.е Not-Only SQL — не только SQL) базы данных.
  • Объектная БД. Caché моделирует на глобалах объекты, а также предоставляет прямое отображение между объектами и реляционными таблицами. Наверное, теперь вы понимаете как это реализовано.

В отличие от хорошо известных NoSQL-баз, GlobalsDB это не жестко-специализированная БД. Она одновременно имеет множество свойств. Так GlobalsDB может поддерживать любые из вышеописанных типов баз данных. И даже одновременно, если потребуется.

Это похоже как будто у вас есть Redis, CouchDB, SimpleDB, Neo4j и Native XML БД запущенные в одной базе данных и в одно и тоже время!

Установка InterSystems GlobalsDB на Linux

Подготовка

Прежде чем начать установку, нужно подготовить машину для работы с GlobalsDB. [Источник 4]. Для начала нужно увеличить объем shared памяти который мы сможем использовать. Для работы GlobalsDB нужно больше чем обычно выставлено по умолчанию в Linux. В документации об этом написано на сайте компании [Источник 5]. Для этого нужно подкорректировать два параметра в sysctl, это shmall и shmmax. Проверить текущие значения можно командами (здесь и далее, предполагается, что действия выполняются под пользователем root):

$ sysctl kernel.shmmax
kernel.shmmax = 68719476736
$ sysctl kernel.shmall
kernel.shmall = 4294967296

Как видите, в моем варианте shmmax — 64GB, shmall — 4Gb. Дополнительно потребуется выставить объем памяти, который может быть заблокирован. Проверить текущее значение (результат в килобайтах):

$ ulimit -l
64

Установить значение, действующее до перезагрузки:

$ ulimit -l 4096000

Значение, которое будет сохраняться и после перезагрузки, нужно выставить в файле /etc/security/limits.conf

root           soft       memlock              4096000
root           hard       memlock              4096000

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

Установка

Распаковываем tar.gz дистрибутив GlobalsDB.

 $ mkdir globals_2013.2.0.350.0_unix
 $ tar -zxf globals_2013.2.0.350.0_unix.tar.gz -C ./globals_2013.2.0.350.0_unix

Запускаем установку:

 $ cd ./globals_2013.2.0.350.0_unix/kit_unix_globals/
 $ ./installGlobals 

Enter the number for your system:

Нам предлагают ввести номер нашей системы из списка, но выбора нет. Это связано с тем, что установка производится на CentOS, такая же проблема может возникнуть при установке на Ubuntu версии отличной от 11.04, так как в коде установщика есть жесткая привязка к номеру версии. Для решения этой проблемы применим патч. Создайте файл в текущей папке с именем cplatname.patch. Можно скачать с GitHubGist. Применим новый патч, он решит проблему как для CentOS, так и для Ubuntu.

$ patch < cplatname.patch

Пробуем повторно запустить установку:

$ ./installGlobals 

Installing Globals for Red Hat Enterprise Linux 6 (x64)
Enter destination directory name for this installation.
Directory :

Запуск и остановка сервера GlobalsDB выполняется командами, в подпапке mgr, где был установлен GlobalsDB:

$ cd /opt/globalsdb/mgr/
$ ./startGlobals 
$ ./stopGlobals 

При необходимости можно указать размер буфера глобалов, например 1024MB

$ ./startGlobals memory=1024

Источники

  1. GlobalsDB Part I // Habrahabr. [2006–2019]. URL:https://habr.com/company/intersystems/blog/184882/ (дата обращения: 08.10.2018)
  2. GlobalsDB Admin // Github [2006–2018]. Дата обновления: 15.10.2014. URL:https://habr.com/company/intersystems/blog/185472/ (дата обращения: 22.12.2018)
  3. GlobalsDB Part II // Habrahabr [2006–2018]. Дата обновления: 09.07.2013. URL:https://habr.com/company/intersystems/blog/185472/ (дата обращения: 08.10.2018)
  4. GlobalsDB Install // Habrahabr [2006–2018]. Дата обновления: 08.04.2014. URL: https://habr.com/company/intersystems/blog/217567/ (дата обращения: 08.10.2018)
  5. GlobalsDB // Documentation [1997–2018]. Дата обновления: 15.05.2018. URL: https://docs.intersystems.com/ens20141/csp/docbook/DocBook.UI.Page.cls?KEY=GCI_unixparms#GCI_unixparms_notes_linux_rh (дата обращения: 08.10.2018)

Ссылки