SepMySQL

Набор утилит для управления сервисами MySQL, а также диспетчеризации запросов к базе данных. Доступный функционал:

  1. возможность запустить неограниченное число MySQL подобных сервисов баз данных в рамках одного сервера без конфликтов пакетов
  2. на текущий момент доступны такие MySQL подобные сервисы для запуска: MySQL 4.1, MySQL 5.0, MySQL 5.1, MySQL 5.5, MySQL 5.6, MySQL 5.7, MariaDB 5.5, MariaDB 10.0, MariaDB 10.1, Percona 5.5, Percona 5.6
  3. позволяет управлять уже установленными пакетами MySQL
  4. возможность запустить сервис MySQL в LVE контейнере или с ограничением сервиса по CPU и памяти
  5. диспетчеризация запросов на основании владельца процесса обращающегося к MySQL
  6. диспетчеризация запроса на основании пользователя базы данных, к которому обращаются
  7. диспетчеризация запроса на основании доступности базы данных, т.е возможно создать цепочки MySQL серверов (на разных IP), которые будет перебирать диспетчер в случае недоступности текущего
  8. диспетчеризация запроса на основании типа запроса (т.е запросы на запись отправляются на один Master, запросы на чтение отправляются на Slave)

Схемы работы

1. Один сервер без диспетчера.

На одном сервере работают разные версии MySQL, доступ к каждому сервису приложения и клиенты осуществляют через разные порты или сокеты.

2. Один сервер с диспетчером.

На одном сервере работают разные версии MySQL, доступ к каждому сервису приложения и клиенты осуществляют через стандартный сокет, диспетчер распределяет запросы по MySQL сервисам.

3. Облачный MySQL

Диспетчер установлен на отдельном сервере (server 1) с одним внешним портом(сокетом), на server 2 развернуты несколько версий сервисов MySQL. На server 3 настроен MySQL в режиме slave c mysql native на server 2. На server 4 усановлен MySQL в режиме Master-Master с server 2. И есть доступ к некому MySQL из сети (другой сервер или другое облако MySQL)

Итого:

server1: диспетчер запросов - - 192.168.0.50
server2: mysql native (master для MySQL c server 3) socket1 mysql1 192.168.0.51:3306
server2: MySQL 5.5 (master для MySQL с server 3) socket2 mysql2 192.168.0.51:3307
server2: MariaDB 5.5 socket3 mysql3 192.168.0.51:3308
server3: mysql (slave для mysql native с server 2) socketA mysql4 192.168.0.52:3306
server4: mysql (master для MySQL 5.5 с server 2) socketB mysql5 192.168.0.53:3306
net: mysql из другого облака socketC mysql6 192.169.0.2:3306

Диспетчер настроен, так, что:

  1. Запросы к пользователям начинающимся на account1_* c IP=192.168.0.100 переводятся на mysql1, запросы select идут на mysql4(server3 slave), остальные запросы направляются к mysql1(server2)
  2. Запросы к пользователю user1 с IP: 192.168.0.101 направляются к mysql2(server2), если mysql2 недоступен, то запрос будет направлен на mysql5(server4)
  3. Все пользователи с IP (и не попавшие в правило 1 и 2): 192.168.0.100, 192.168.0.101, 192.168.0.102 отправляют запросы на mysql3
  4. Пользователи с оставшихся IP направляются на mysql6 (т.е в другое облако)

Правила для диспетчера выглядят так:

<?xml version="1.0"?>
<rules>
  <conds>
    <cond name="default">
      <if>default</if>
    </cond>
  </conds>
  <chains>
    <chain name="account1_chain" cond="default">
      <socket>192.168.0.51:3306</socket>
      <socket slave="yes">192.168.0.52:3306</socket>
    </chain>
    <chain name="user1_chain" cond="default">
      <socket>192.168.0.51:3307</socket>
      <socket>192.168.0.53:3306</socket>
    </chain>
    <chain name="local_chain" cond="default">
      <socket>192.168.0.51:3308</socket>
    </chain>
    <chain name="cloud_chain" cond="default">
      <socket>192.169.0.2:3306</socket>
    </chain>
  </chains>
  <ips>
    <ip name="192.168.0.100">
      <user name="account1_*" chain="account1_chain"/>
      <user name="*" chain="local_chain"/>
    </ip>
    <ip name="192.168.0.101">
      <user name="user1" chain="user1_chain"/>
      <user name="*" chain="local_chain"/>
    </ip>
    <ip name="192.168.0.102">
      <user name="*" chain="local_chain"/>
    </ip>
    <ip name="*">
      <user name="*" chain="cloud_chain"/>
    </ip>
  </ips>
</rules>