- PVSM.RU - https://www.pvsm.ru -
С моей прошлой публикации о распределенной базе данных CrateDB прошло около года. Проект на основе Elasticsearch и PrestoDB написан на Java. Он за это время активно развивался и обрастал новым функционалом в github [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 для экспериментов можно сделать так:
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
Нажмите здесь для печати.