Какую распределенную базу данных выбрать для проекта на Spring Boot 2?
Необходимо адаптировать существующий проект на Spring Boot 2 c Spring Data JPA 2 (PostgreSQL) под новую архитектуру:
В систему гибко добавляются рабочие места с предустановленным и сконфигурированным ПО (одна и таже программа).
Рабочих мест не более нескольких десятков. С каждого рабочего места за день в распределенную базу данных поступает около 1 миллиона записей (различных сущностей в терминах JPA). База данных должна хранить основную массу данных на диске и может достигать нескольких Тб. Кэш в памяти IMDG(in memory data grid) для каждого рабочего места должен быть способен запросить актуальную информацию у каждого узла (кластера) системы. Возможно, по таймауту данные сбрасываются на диск. Сама база на диске должна бекапиться, чтобы можно было ее развернуть в случае сбоя системы.
Должна быть совместимость с Spring Data 2/JPA/Spring boot 2. Предполагается работа на Windows/Linux.
Из общей массы распределенных баз я выбрал Redis, Apache Ignite и Hazelcast как наиболее популярные и простые в освоении.
Но, насколько я понял, только Ignite имеет возможность сохранять данные на диск( Ignite Persistence) и подходит под вышеуказанные требования. Пробовал добавить сохранение сущностей на Redis - оно работает, но только как in-memory кэш. Мне же нужно, чтобы данные читались из персистентной базы(на диске) и, возможно, какой то объем хранился в оперативной памяти (для часто используемых элементов, или для последних добавленных).
1) возможно ли использование Redis с поставщиком персистентности в виде PostgreSQL? Или есть еще какие то способы заставить редис работать как описано (сбрасывать накопленные данные из оперативки на диск).
Также пробовал использовать Ignite, но последняя версия на данный момент это 2.6, в которой используется Spring Data 1, а мой проект работает на Spring Data 2, поддержка для которого будет добавлена в версии 2.7.
Я скачал nightly build 2.7, но не знаю как установить его в локальный maven репозиторий.
2) Кто нибудь знает как подсунуть скачанный Ignite в проект?
И наконец, оптимальный ли способ организации взаимодействия узлов системы выбран? Какую систему следует использовать в данном случае? Как настроить распределенную базу данных?
Зачем вам распределенная БД для 10 компьютеров и при такой маленькой нагрузке?
Redis умеет персистировать на HDD также как и Ignite https://redis.io/topics/persistence это решается настройками.
Но Ignite при запуске приложения будет прогревать кэши, а это может занять много времени при старте приложения. При этом Ignite делать бэкапы на соседних нодах для отказаустойчивости и все это хранится в ОЗУ.
Представляете какую инфраструктуру держать нужно и насколько ее непросто профилировать, отлавливать ошибки и др. по сравнению с реляционной СУБД.
Я уже молчу про консистентность данных в кэшах, посмотрите как сложно делаются простые вещи: https://www.youtube.com/watch?v=YQGmJt_UP0E
При этом зачем привязываться к JPA. Нужно посмотреть, как часто он для ignite поддерживается. И не отомрет ли совсем. У Ignite и так неплохой API на Java.
Так что вы предлагаете? Использовать простую реляционную БД, например - PostgreSQL который уже используется? Т.е. нужно настроить репликацию на каждом рабочем месте ... но если я правильно понимаю, возможна конфигурация Master-Slave (только одно место пишет в базу) и Мульти-мастер (тут пишут про множество проблем, которые придется решить самостоятельно в своем ПО, транзакции, согласованность работы и прочее). Или есть другие варианты?
Насчет Ignite - сейчас пытаюсь использовать версию 2.7, но, опять же если я правильно все понял, для сохранения в базе сущностей с JPA 2 нужна зависимость от Hibernate-OGM (поддержка JPA для NoSQL решений). Конкретно для Ignite текущая поддерживаемая версия - 5.3.1, в которой зависимость на ignite версии 2.4. А это опять же, Spring Boot 1. Текущий проект на 2-м буте. Т.е. либо откатываться обратно на первый, либо ждать пока выпустять 2.7 и hibernate-OGM под него. Можно и без hibernate-OGM, но тогда с JPA 2 не получится, если я ничего не путаю. Опять же, все заточено под репозитории Spring Data, поэтому переписывать не очень хочется, если есть какие то варианты..
Неплохой api на java - имеется ввиду SqlQuery? В идеале нужно, чтобы приложение писало в базу Postgresql (либо Ignite PDS) и держало в кеше на каждом рабочем месте наиболее часто используемые данные в ограниченном объеме. Как это сделать мне не понятно. Может посоветуете куда копать?
Был еще проект PostgreSQL XL - там вроде бы возможны конфгурации мульти-мастер, чтобы каждое рабочее место писало в базу и каждое могло сразу прочитать эти данные. Но работает только на Linux, поэтому не рассматривается. Спасибо)
Да использовать PosgreSQL. Зачем вам Apache Ignite? Его нет смысла использовать при вашей нагрузке. С такой нагрузкой легко справится PosgreSQL.
Посмотрите видео, в нем объясняется как человек пытался сделать обычный счетчик, и какой кровью ему это далось.
У вас не получится взять SpringData для PosgreSql и перенастроить его на Ignite. Это даже не всегда выходит когда переход осуществляется с реляционной на реляционную БД. Это совершенно две разные вещи.
Даже если вздумаете переходить на Ignite смысла привязываться к Hibernate OGM нет, если он так отстает от версии Ignite. Или вынуждены будете использовать старую версию Ignite.
Насколько помню в Ignite можно работать только с горячими данными, остальные сбрасываются на диск. Это надо смотреть настройки игнайта и читать документацию, не подскажу.
PostgreSQL XL предоставляет шардинг и репликацию. Это если вам нужно горизонтальное масштабирование. Но нужно ли вам оно? Здесь нужно смотреть как растет нагрузка. Какой у вас SLA. Какие ресурсы и др.
То есть не совсем понятно, какая у вас проблема и какую задачу вы решаете, и почему вы пытаетесь ее решить IMDG решениями.
PostgreSQL XL и BDR не подходят, т.к. работают только на Linux, а нужна также поддержка Windows.
А что посоветуете насчет репликации, какие средства использовать в случае, когда предполагается конфигурация мульти-мастер. Задача состоит в том, чтобы с нескольких десятков рабочих мест данные писались в базу, при этом нужна возможность читать данные из базы на каждом месте. Я так понимаю, что в случае централизованной БД лучше сделать 1 активный мастер, в который будут писать/читать все рабочие места и 1 пассивный мастер, в который данные будут реплицироваться, чтобы можно было в случае сбоя перейти на него. Или стоит посмотреть в сторону готовых мульти-мастер решений для репликации?
whoami?root root_toor, а зачем вам мультимастер? =) Одной синхронной реплики недостаточно? При этом на серверах есть рейдмассивы. По поводу мультимастера лучше у DBA по posgresql спросить, как оно на практике работает.