MyHub: введение
MyHub — это высокопроизводительный проект промежуточного программного обеспечения агента MySQL, разработанный на Golang. MyHub предназначен для упрощения операции субсегментации MySQL и выполнения основных функций разделения чтения и записи.
По сравнению с другими промежуточными программами баз данных, MyHub обладает наиболее мощной функцией имитации MySQL в максимальной степени. Соединение с Myhub с помощью инструментов управления похоже на соединение с MySQL.
MyHub может автоматически отключать неисправную базу данных узла, а также автоматически обнаруживать и включать узел после перезапуска базы данных отказавшего узла.
Пожалуйста, получите последнюю версию установочного пакета RPM со страницы релизов.
Основы:
- соответствует собственному протоколу MySQL и поддерживает кросс-языки;
- поддерживает пул соединений MySQL, нет необходимости каждый раз создавать новое соединение;
- поддерживает несколько «Slave», балансировку нагрузки между «Slave»;
- поддерживает разделение чтения и записи (необходимо настроить автоматическую синхронизацию данных мастер-ведомого MySQL);
- поддерживает конфигурацию мультиарендности;
- поддерживает горячую загрузку файла конфигурации (только для режима установки RPM, измените файл конфигурации, чтобы он вступил в силу с помощью команды «myhub reload»);
- поддерживает функцию «Prepare»;
- поддерживает максимальный лимит подключений к серверной БД;
- поддерживает вывод журнала SQL и медленного журнала;
- поддерживает белый список IP-адресов клиентов;
- поддерживает механизм чёрного списка SQL;
- поддерживает настройки кодировки;
- поддерживает last_insert_id;
- поддерживает команду MySQL: show databases, show tables.
Фрагментация:
- поддерживает сегментацию по хешу и диапазону с использованием целых чисел;
- поддерживает фрагментацию по дате с использованием года, месяца и дня;
- поддерживает кросс-узловые подтаблицы, подтаблицы могут быть распределены по разным узлам;
- поддерживает выполнение агрегатных функций count, sum, max и min на кросс-узлах;
- поддерживает операцию соединения одной подтаблицы с другой отдельной таблицей и на одном и том же узле базы данных;
- поддерживает операции cross-node: (order by, group by, limit);
- поддерживает распределённые транзакции (низкий XA);
- поддерживает прямой прокси и переадресацию базы данных;
- поддерживает (вставку, удаление, обновление, замену) в таблицы нескольких узлов;
- поддерживает автоматическое создание подтаблиц на нескольких узлах;
- поддерживает первичный ключ ID с автоинкрементом, также поддерживает распределённый уникальный идентификатор Twitter Snowflake, просто измените тип поля AUTO_INCREMENT на «bigint».
Установка:
RPM-установка:
- загрузка и установка:
- запуск службы: service myhub start.
Сборка и установка:
- установите Golang и Git;
- установка на Linux (build_linux.sh):
- dir=
pwd
;
- git clone https://github.com/sgoby/myhub src/github.com/sgoby/myhub;
- export GOPATH=$dir;
- echo $GOPATH;
- go build -o bin/myhub src/github.com/sgoby/myhub/cmd/myhub/main.go;
- echo Congratulations. Build success!;
- установка в Windows (build_windows.bat):
- git clone https://://github.com/sgoby/myhub src/github.com/sgoby/myhub;
- set dir=%cd%;
- set GOPATH=%GOPATH%;%dir%;
- go build -o bin/myhub.exe src/github.com/sgoby/myhub/cmd/myhub/main.go;
- echo Congratulations. Build success!.
Конфигурация MyHub
Основы:
- аргументы запуска:
- -cnf путь к конфигурационному файлу, по умолчанию: conf/myhub.xml, например: myhub.exe -cnf conf/myhub.xml;
- serveListen — хост и порт слушателя MyHub, по умолчанию 8520;
- workerProcesses — количество рабочих процессов, по умолчанию 0 означает использование количества ядер ЦП;
- maxConnections — максимальное количество подключённых клиентов Myhub, по умолчанию 2048.
Журнал:
- logPath — каталог вывода журнала. По умолчанию: logs;
- logLevel — уровень журнала. Пользователи:
<users>
<!-- db1,db2,ip1,ip2 * означает любую базу данных или IP -->
<user name="root" passwrod="123456" charset="utf-8" db="db1" ip="*"/>
</users>
Описание:
- 'name' представляет имя пользователя клиента для подключения к Myhub.
- 'passwrod' представляет пароль клиента для подключения к Myhub.
- 'charset' представляет кодировку клиента для подключения к Myhub. По умолчанию: UTF-8.
- 'db' представляет схему базы данных, которую может использовать пользователь, несколько значений разделяются ','. Например: 'db1', 'db2', '*' представляет все. По умолчанию: *.
- 'ip' представляет разрешённый IP-адрес клиента для подключения к Myhub, поддерживает любое соответствие шаблону '', несколько значений разделены ','; например: '192.168.1.20', '192.168.2.', по умолчанию: '127.0.0.1'.
Узлы:
Добавить узел Mysql на Myhub.
<node>
<hosts>
<!-- только для записи (master) --->
<host type="write" name="host_1" address="127.0.0.1:3306" user="root" password="123456">
<!-- только для чтения (slave) --->
<!-- <host type="read" name="host_1_1" address = "192.168.31.231:3306" user = "root" password = "123456" weight="1"/> -->
</host>
<host type="write" name="host_2" address="192.168.31.231:3306" user="root" password="123456"/>
</hosts>
<dataBases>
<dataBase name="test" host="host_1" maxOpenConns="16" maxIdleConns="4" maxIdleTime="30"/>
<dataBase name="shard_01" host="host_1" maxOpenConns="16" maxIdleConns="4" maxIdleTime="30"/>
<dataBase name="shard_02" host="host_1" maxOpenConns="16" maxIdleConns="4" maxIdleTime="30"/>
<dataBase name="lb_ss" host="host_1" maxOpenConns="16" maxIdleConns="4" maxIdleTime="30"/>
<dataBase name="lb_livegame" host="host_2" maxOpenConns="16" maxIdleConns="4" maxIdleTime="30"/>
</dataBases>
</node>
Описание:
- 'host' представляет конфигурацию хоста бэкэнда mysql.
- 'host -> type' представляет тип узла. Значение: [запись | чтение].
- 'host -> name' представляет имя хоста бэкэнд mysql.
- 'host -> address' представляет адрес хоста бэкенд mysql.
- 'host -> user' представляет учётную запись пользователя бэкэнд mysql.
- 'host -> password' представляет пароль учётной записи бэкэнд mysql.
- 'host -> weight' представляет вес хоста-ведомого.
- 'dataBase' представляет конфигурацию базы данных бэкэнд mysql.
- 'dataBase -> name' представляет название базы данных.
- 'dataBase -> host' представляет имя узла, где расположена база данных, Ссылка: 'host -> name'.
- 'dataBase -> maxOpenConns' представляет максимальное количество соединений в базе данных, по умолчанию: 16.
- 'dataBase -> maxIdleConns' представляет максимально допустимое количество незанятых соединений в базе данных, по умолчанию: 4.
- 'dataBase -> maxIdleTime' представляет максимальное время простоя соединения с базой данных (в секундах), по умолчанию: 60.
Схема:
Добавьте схему базы данных в Myhub.
<schema>
<dataBase name="db1" proxyDataBase="lb_ss" blacklistSql="blacklist/db1.sql">
<!-- правило: хеш | диапазон | дата_месяц | дата_день -->
<table name="dealer_info" ruleKey="id" rule="rang_1" createSql="dealer_info.sql"/>
<table name="cash_record" ruleKey="add_time" rule="rang_2" createSql="cash_record.sql"/>
<table name="api_log" ruleKey="id" rule="hash_1" createSql="api_log.sql"/>
</dataBase>
<!-- прямой прокси -->
<dataBase name="test_1" proxyDataBase="test"/>
</schema>
Описание:
- 'dataBase' представляет конфигурацию схемы базы данных.
- 'dataBase -> name' представляет имя схемы базы данных.
- 'dataBase -> proxyDataBase' представляет имя базы данных узла, которая является проксируемой, используется для прямого прокси.
- 'dataBase -> blacklistSql' представляет оператор SQL чёрного списка, значение может быть путём к файлу SQL или оператором SQL, например: delete from user where id = ?.
- 'table' представляет конфигурацию таблицы схемы.
- 'table -> name' представляет имя таблицы, оно должно быть уникальным.
- 'table -> ruleKey' представляет ключ правила сегментации, это должно быть имя поля в таблице. Правило представляет собой правило сегментации.
Таблица -> createSql представляет автоматическое создание инструкции create для подтаблицы, значением может быть путь к файлу SQL или инструкция SQL.
Правило сегментации:
Myhub поддерживает три типа правил фрагментации:
-
Хеш. Это правило использует операцию по модулю. Этот алгоритм позволяет разделить соседние данные на один и тот же срез в соответствии со значением «rowLimit» в конфигурации, что снижает сложность управления транзакциями.
-
Диапазон. Алгоритм этого правила заключается в разделении таблицы в зависимости от диапазона значения поля ключа правила. Например: start <= диапазон < end.
-
Дата (год, месяц, день). Это правило можно сегментировать по (году, месяцу, дню) и оно поддерживает несколько циклов дат, например: rowLimit = «7d» означает, что каждый 7-дневный период является сегментом, start <= дата < end.
<rules>
<rule name="rang_1" ruleType="range" format="%04d">
<!-- tableRowLimit : 2d,m,y,h-->
<shard nodeDataBase="test" rowLimit="10000" between="1-8" />
<shard nodeDataBase="shard_01" rowLimit="10000" between="8-10" />
</rule>
<rule name="rang_2" ruleType="date" format="ym">
<!-- tableRowLimit : 2d,m,y,h-->
<shard nodeDataBase="test" rowLimit="1m" between="201801-201901" />
</rule>
<!-- 'maxLen' представляет количество сегментов хеширования всего, по умолчанию 1024 -->
<rule name="hash_1" ruleType="hash" format="%04d" maxLen = "12">
<!-- 'rowLimit' представляет непрерывное количество строк каждой таблицы, разделённой 'ruleKey', по умолчанию 1;
'between' представляет диапазон значений хеш-модуля. например:'between="0-3",ruleKey's значение равно 10,
а 'maxlen'= 10, 10%3 = 1, это означает в диапазоне 0–3 -->
<shard nodeDataBase="test" rowLimit="2" between="0-6" />
<shard nodeDataBase="shard_01" rowLimit="2" between="6-12" />
</rule>
</rules>
Описание:
-
Rule представляет конфигурацию правила.
-
Name представляет имя правила, которое должно быть уникальным.
-
ruleType представляет тип правила. Значение: [range|hash|date].
-
Format представляет суффикс формата подтаблицы при автоматическом создании.
- Если ruleType равен [range|hash], используется формат %d, например, format = "%04d", будет создана таблица с именем tablename_0001.
- Если ruleType равно date, используется формат в [y|m|d], он представляет [год|месяц|день]. Например, format = "ym" будет создана таблица с именем tablename_201805.
-
MaxLen представляет значение модуля, настраивается только при ruleType = "hash".
-
Shard представляет конфигурацию сегмента.
-
Shard -> nodeDatabase представляет связанное имя базы данных узла, значение должно находиться в конфигурации базы данных узлов.
-
Shard -> rowLimit представляет максимальное количество строк на таблицу, его значение следующее:
- Если ruleType = range, представляет количество строк на подтаблицу, тип значения — число. Например, rowLimit = "100000" представляет максимальное количество строк на одну таблицу — 100 000.
- Если ruleType = date, представляет количество строк за определённый период времени, значение представляет собой комбинацию чисел и [y|m|d]. Например, rowLimit = "1ym" представляет данные за один месяц на сегмент.
- Если ruleType = hash, представляет разделение каждой подтаблицы остатком от деления по модулю, тип значения — число. Например, rowLimit = "2" представляет 10 % 0 и 10 % 1 будут сохранены в одной таблице.
-
Shard -> between представляет диапазон значений правила фрагментации.
Комментарии ( 0 )