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

CrateDB: снаружи как PostgreSQL, а внутри Elasticsearch

С моей прошлой публикации о распределенной базе данных CrateDB прошло около года. Проект на основе Elasticsearch и PrestoDB написан на Java. Он за это время активно развивался и обрастал новым функционалом в github [1] репозитарии:

  • поддержка outer join;
  • case when… then… end в запросах;
  • функции для работы с пространственными(Geospatial) данными;
  • возможно отображение данных временных рядов (Time Series) в Grafana;
  • ограниченная поддержка подзапросов;
  • узлы кластера работающие в режиме только чтения;
  • эмуляцией подмножества протокола PostgreSQL 9.5;
CrateDB: снаружи как PostgreSQL, а внутри Elasticsearch - 1

Приятной неожиданностью было обнаружить в github проекта, что в команде CrateDB есть русскоговорящий разработчик Руслан [2]. Достаточно быстро получил от него ответ на вопросы про внутреннее устройство и зависимости проекта.

Когда в прошлый раз на хабре я рассказывал про особенности работы с запросами в статье «JOIN the dark side of the SQL» [3], то упоминал о недостатках монструозного по объему родного jdbc драйвера для crate и неполной поддержке join операций. Эти недочеты устранили в последних версиях (>1.0)!

Теперь можно пользоваться jdbc драйвером PostgreSQL, утилитами командной строки pg и не нужно паковать вместе с приложением отдельный драйвер для crate. Это стало возможно благодаря частичной эмуляции wire протокола [4] PostgreSQL 9.5 на сервере. С оглядкой на то что не поддерживаются транзакции (поэтому установлен autocommit), аутентификация с любым логином/паролем успешная, не поддерживается SSL для соединений и поддерживается только кодировка символов UTF-8. Еще не поддерживается COPY подпротокол pg и подпротокол вызова хранимых функций. При этом надо помнить, что синтаксис SQL запросов и подмножество поддерживаемых функций специфичны для CrateDB.

Наконец-то в сервере появилась поддержка Left, Right и Full Outer Join [5]. Хоть не применяются специальные оптимизации планировщика и join реализован как nested loop, но при этом фильтры применяются распределенно — на каждой шарде таблиц из запроса.

Появился странный синтаксис [6] в SELECT, напоминающий PL/SQL CASE:

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

С подзапросами в FROM пока чудо не случилось. Поддерживаются [7] либо подзапросы с агрегатами, либо запросы которые парсер может легко перезаписать. Надеюсь, что через год проект удивит тем что будут доступны сложные подзапросы.

Для работы с пространственными данными [8] в запросах доступны функции [9] distance, within, intersects, latitude/longitude. Работа с геоданными давно была в Elasticsearch [10], на основе которого создана эта распределенная база данных.

Есть плагин доступа к данным для Grafana [11]. Можно рисовать графики для данных мониторинга и телеметрии, хранящихся в CrateDB.
CrateDB: снаружи как PostgreSQL, а внутри Elasticsearch - 2
Необходимо настроить параметры подключения и указать запросы для выборки данных.
CrateDB: снаружи как PostgreSQL, а внутри Elasticsearch - 3

Загрузку и старт CrateDB для экспериментов можно сделать так:

java -jar groovy-grape-aether-2.4.5.1.jar [12] https://raw.githubusercontent.com/igor-suhorukov/crate-io-installer/master/crate-io.groovy [13]

Для запуска CrateDB 1.0.4 использовал свой Groovy скрипт [14], который автоматически устанавливает базу данных в домашнюю директорию пользователя:

@Grab(group='org.codehaus.plexus', module='plexus-archiver', version='2.10.2')
import org.codehaus.plexus.archiver.tar.TarGZipUnArchiver
import com.github.igorsuhorukov.smreed.dropship.MavenClassLoader;

@Grab(group='org.codehaus.plexus', module='plexus-container-default', version='1.6')
import org.codehaus.plexus.logging.console.ConsoleLogger;

def artifact = 'crate'
def version = '1.0.4'

def userHome= System.getProperty('user.home')
def destDir = new File("$userHome/.crate-io")

def crateIoDir= new File(destDir, "$artifact-$version");
if(!crateIoDir.exists()){
	destDir.mkdirs()
	String sourceFile = MavenClassLoader.using("https://dl.bintray.com/crate/crate/").getArtifactUrlsCollection("io.crate:$artifact:tar.gz:$version", null).get(0).getFile()
	final TarGZipUnArchiver unArchiver = new TarGZipUnArchiver()
	unArchiver.setSourceFile(new File(sourceFile))
	unArchiver.enableLogging(new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG,"Logger"))
	unArchiver.setDestDirectory(destDir)
	unArchiver.extract()
}

def proc = "$crateIoDir.absolutePath/bin/crate".execute()

proc.consumeProcessOutput(System.out, System.err)
proc.waitFor()

Либо запустить базу в Docker контейнере [15] или десятком других способов [16].

Заключение

При использовании CrateDB [17] в своем проекте, надо помнить что прежде всего это распределенная база данных на основе Elasticsearch, поэтому полноценного ACID [18] не будет. Но если важна горизонтальная масштабируемость, полнотекстовый поиск и возможность выполнять SQL запросы — это отличный кандидат для хранения данных проекта. Радует то что проект развивается семимильными шагами и доступен для использования под лицензией Apache 2.0.

Автор: igor_suhorukov

Источник [19]


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

Путь до страницы источника: https://www.pvsm.ru/java/249173

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

[1] github: https://github.com/crate/crate

[2] Руслан: https://github.com/kovrus

[3] «JOIN the dark side of the SQL»: https://habrahabr.ru/post/274315/

[4] эмуляции wire протокола: https://crate.io/docs/reference/protocols/postgres.html

[5] Left, Right и Full Outer Join: https://crate.io/docs/reference/sql/joins.html#left-outer-joins

[6] странный синтаксис: https://crate.io/docs/reference/sql/scalar.html#conditional-functions-and-expressions

[7] Поддерживаются: https://crate.io/docs/reference/sql/subselects.html

[8] пространственными данными: https://crate.io/docs/reference/sql/data_types.html#geo-point

[9] функции: https://crate.io/docs/reference/sql/scalar.html#geo-functions

[10] Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

[11] Grafana: https://grafana.net/plugins/crate-datasource

[12] groovy-grape-aether-2.4.5.1.jar: https://repo1.maven.org/maven2/com/github/igor-suhorukov/groovy-grape-aether/2.4.5.4/groovy-grape-aether-2.4.5.4.jar

[13] https://raw.githubusercontent.com/igor-suhorukov/crate-io-installer/master/crate-io.groovy: https://raw.githubusercontent.com/igor-suhorukov/crate-io-installer/master/crate-io.groovy

[14] Groovy скрипт: https://github.com/igor-suhorukov/crate-io-installer/blob/master/crate-io.groovy

[15] Docker контейнере: https://crate.io/docs/install/containers/docker/

[16] других способов: https://crate.io/download/

[17] CrateDB: https://crate.io

[18] ACID: https://ru.wikipedia.org/wiki/ACID

[19] Источник: https://habrahabr.ru/post/323742/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best