Главная > Java - язык и технологии, Open Source, Высокопроизводительная архитектура, Разное, СУБД > HA-JDBC — строим отказоустойчивый кластер на основе Java и драйвера JDBC

HA-JDBC — строим отказоустойчивый кластер на основе Java и драйвера JDBC

21 января 2008

ha-jdbc.pngПриветствуем наших читателей. Язык Java достаточно популярный, в частности, в корпоративной среде, хотя, конечно, там с ним конкурирует технология .NET/С# от Microsoft. Очень много, на мой взгляд, для популяризации Java, в частности, применительно к веб-сервисам и приложениям, сделала организация Apache Fundation, поддерживая целый стек технологий на основе Apache Tomcat и другие разработки (Ant, Maven, Geronimo). Но это нас заведёт немного не туда. Сегодня я хотел рассказать вам об интересном продукте, помогающем создавать высоконагруженные проекты, строить кластерную архитектуру баз данных и обеспечивать отказоустойчивый уровень абстракции для доступа к СУБД. Все это работает на основе стандартного драйвера JDBC, предназначенного для унификации доступа к различным СУБД из Java приложений. Кстати, одним из типичных применений этого пакета является совместно с сервером Apache Tomcat предоставление доступа к кластеру баз данных для веб-приложений.

Проект имеет название HA-JDBC, которое, наверное, даже не стоит расшифровывать - и так ясно. Мы можем использовать любую СУБД, которая поддерживает доступ через JDBC, например, MySQL (по сути, получится некий аналог MySQL Proxy), PostgreSQL и другие (включая достаточно экзотические, вроде Apache Derby, Firebird, Ingres и другие, по сути любую стандартную СУБД, поддерживающую SQL 92). Высокая доступность означает, что в конфигурации кластера может произойти сбой или полное отключение любого узла, но выполнение текущей транзакции не будет прервано. Эта возможность является одной из базовой для проекта, но для обеспечения других (например, выстраивание пула коннектов к базе) необходимо дополнительное ПО.

В HA-JDBC применяется несколько стратегий балансирования нагрузки внутри кластера, и вы можете задавать подходящий алгоритм в конфигурационных файлах, таким образом приближая систему к оптимальным для вас требованиям.  Так как мы вручную можем задать доступность каждому узлу, то все алгоритмы потом будут использовать эти значения для определения пути маршрутизации запроса. В режиме "simple" все запросы будут просто перенаправляться в наиболее доступную и мощную ноду (исходя из наших указаний), в режиме "random" нода будет выбираться случайным образом, алгоритм "round-robin" будет посылать нодам разное количество запросов, исходя из их параметров, таким образом самая мощная нода обработает наибольшее количество запросов,  а "load" будет выбирать в каждый момент наименее загруженный узел.

Для синхронизации содержимого различных нод кластера HA-JDBC применяет три варианта синхронизации - полную, построчно-разностную и пассивную, перекладывая это на саму СУБД.

Кстати, следует заметить, что только с версии 2.0 поддерживаются автоинкрементные поля в базах (например, в MySQL это AUTO_INCREMET тип).

HA-JDBC совместима с всеми версиями JDBC вплоть до версии 4.0 и может работать с Java 1.6. Для управления кластером используется консоль JMX, поэтому вы можете применять любое приложение, в зависимости от предпочтений, например, Eclipse-JMXEJTools JMX Browser и другие. Но при использовании Tomcat 5.0 вы должны обновить его для поддержки версии JMX 1.2 (компонент MX4J до версии 2.0 или выше).

К сожалению, очень желаемой функции построения кластера на основе разных баз данных одновременно (пусть в усечённом варианте), увы, нет, поэтому вы должны использовать только один типа СУБД в кластере для каждого узла.  Кроме этого, в кластере используется только "mirror"-подход, так что все данные зеркалируются по всех нодах, в отличие от другого аналогичного продукта, Sequoia (о которой мы расскажем отдельно), где можно использовать и разделение (partitioning) так и комбинацию, а HA-JDBC использует только репликацию данных.

Ещё одним недостатком проекта (хотя я бы сказал, что это просто особенность выбранного подхода) является отсутствие лога для восстановления сбойной ноды (для этого используется полная синхронизация/репликация).

Исходя из этого такое решение будет более быстрым на частых операциях чтения, особенно в случае нагрузки, но операции записи/обновления будут происходить медленнее, чем в случае использования одной базы и JDBC. Хотя типично в веб-приложениях играет роль именно чтение, так как информация с базы данных используется для формирования страниц, а обновления данных значительно меньше. Но вы должны чётко знать архитектуру своего приложения, прежде чем выбрать в качестве основы именно HA-JDBC - в основном, это решение даст именно высокую доступность и отказоустойчивость, но не сверхвысокую производительность.

ha-jdbc_2.png

И касательно пула коннектов. Как ни странно, этой возможности нет в HA-JDBC, поэтому если это для вас критическая возможность,нужно использовать сторонние проекты, которые будут надстраиваться над драйвером HA-JDBC, и предоставлять приложению пул, с другой стороны основываясь на JDBC. Например, обратите внимание на следующие проекты: c3p0, Proxool, но думается, лучше всего использовать компонент DBCP, который является частью проекта Apache Jakarta.

Кеширования результатов на этом уровне так же нет, поэтому ваше приложение должно само об этом позаботится, либо использовать промежуточные среды для обеспечения нужных функций. По сути мы получаем мощную низкоуровневую поддержку, на уровне непосредственно доступа и исполнения запросов, а все что не  входит в этот набор, должно обеспечиваться более высокими уровнями абстракции. В принципе, это логично и оправданно, ведь HA-JDBC не является полной заменой уровня доступа к базе данных, а только самой нижней его части, замена именно драйвера JDBC.

На этом все, в принципе, сфера  применения этого проекта достаточно большая, несмотря на то, что многих функций нету, это не ограничение, а особенность - он предназначен для одной функции, и успешно её выполняет. Так что если вам нужен отказоустойчивый кластер высокой доступности для Java приложений, скорее всего вы остановитесь на проекте HA-JDBC.

  1. 25 января 2008 в 01:30 | #1

    А откуда у автора такие познания? както, помнится, автор писал что в java не особо… небось статья переведенная?
    хотя в любом случае — СУПЕР, интересный блог! Всегда перед сном просматриваю …

  2. 25 января 2008 в 01:39 | #2

    хех, в Java как языке нету, конечно, и даже Hello world! не напишу, но в java как технологии немного есть, так же как в руби, дот нете и остальных 🙂
    А в статье про саму java нет ведь ничего 🙂

    И кстати, на этом сайте не было ещё никогда именно переводных статей, у нас формат другой — эксклюзивный материал ведущих. Хотя есть парочка материалов, даже переводы который стоят ого-го сколько, а оригиналы и подавно 🙂

    Спасибо, читайте 😉 и приятный снов 😉

Комментирование отключено.