Быстрый и простой способ шардирования mysql с помощью...
DESCRIPTION
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва.TRANSCRIPT
Быстрый и простой способ шардирования MySQLс помощью CUBRID SHARD
Эсен Сагынов22 апреля 2013 г.
2
План на сегодня
1. Об NHN2. Шардирование в производственных средах3. Почему CUBRID SHARD4. Как шардировать базы данных MySQL5. Демо6. CUBRID SHARD в Ndrive
Обо мне3
• Эсен Сагынов (NHN Corp.)
– @CUBRID– fb.com/cubrid
30,000+Веб серверов
Япония
США
Корея
Китай 150+ Веб сервисов
Об NHN
Вьетнам
Сингапур
Шардирование в производстве
• Использует реляционное СУБД с шардированием• Данные хранятся в виде ключ-значение
• Использует реляционное СУБД с шардированием• Шардирование и репликация абстрагированы с помощью Gizzard
• Использует реляционное СУБД с шардированием• Использование Hbase ограничено
• Использует реляционное СУБД с шардированием• Кэширование данных различными путями
• Использует реляционное СУБД с шардированием• ACID – главная причина выбора реляционного СУБД
• Использует реляционное СУБД с шардированием• Легче всего реализовать. Больше всего подходит их нуждам.
• Использует реляционное СУБД с шардированием и высокой доступностью
• Главная причина - согласованность и связь между данными
Существующие решения шардирования
Название Тип Требования Интерфейс
СУБД Другие
Hibernate shards Фреймворк, библиотекаСУБД с поддержкой Hibernate
- Hibernate- JVM Java
HiveDB Фреймворк, библиотека MySQL - Hibernate- JVM Java
dbShards Промежуточное ПО ибиблиотека MySQL Java, C, PHP,
Python, Ruby
Gizzard (Twitter) Промежуточное ПО Любая - JVM Java
Spider for MySQL Промежуточное ПО и хранилище для MySQL MySQL Любой
Spock Proxy Промежуточное ПО MySQL Любой
Shard-Query Промежуточное ПО MySQL PHP, RESTful API
CUBRID SHARD Промежуточное ПО - CUBRID- MySQL Любой
Категории решений шардирования
• Библиотека• Хранилище• Тяжеловесное промежуточное ПО• Легковесное промежуточное ПО
8
Библиотеки и хранилища
Библиотеки• Hibernate Shards• HiveDB
Недостатки• Требует библиотеку Hibernate/Java• Конфигурация с помощью многих XML
файлов• Не для действующих сервисов
Хранилища• Spider for MySQL
Недостатки• Требует изменения
хранилища• Не для действующих
сервисов
9
Тяжеловесные промежуточные ПО
dbShards Gizzard• Требует изменения кода
приложения• Необходимо установить агентов на
каждый сервер СУБД• Не для действующих сервисов
• Неактивный
10
Легковесное промежуточное ПО
• Spock Proxy– Активный проект– Легковесный– Гибкий– Легко
настраиваемый– Не требует
изменения кода приложения
11
Spock Proxy
Spock ProxyХранилище для конфигураций шардирования
База данных MySQL
Правила шардирования По модулюОпределение ключа шарда Полный разбор SQLПреимущества Не требует изменения кода программыНедостатки • Деградация производительности:
• Дополнительный разбор SQL• Слияние результатов
• Поддерживает не весь SQL синтаксис MySQL
• Однопоточный
Блог: http://www.cubrid.org/blog/dev-platform/database-sharding-platform-at-nhn/
12
Производительность Spock Proxy
• Однопоточный• Разбирает и переписывает SQL
1 5 10 20 30 50 70 100 200 4000
50000100000150000200000250000300000350000400000450000500000
Шардинг на уровне приложенияSpock ProxyCUBRID SHARD
Параллельные клиенты
Время выполнения
Spock Proxy
Активный проект Легковесный Гибкий Легко настраиваемый Не требует изменения кода программы✕Ведет к деградации производительности
14
Легковесное и легко настраиваемоепромежуточное ПО для шардирования MySQL
CUBRID SHARD
15
Spock Proxy и CUBRID SHARD
Spock Proxy CUBRID SHARD
Хранилище для конфигураций
База данных MySQL Конфигурационный файл
Правила шардирования
По модулю • По модулю• Хэш-функции пользователя
Определения ключа шарда
Полный разбор SQL Поиск SQL подсказки
Преимущества• Не требует изменения
программы
Недостатки• Деградация
производительности:• Дополнительный
разбор SQL• Слияние результатов
• Поддерживает только MySQL• Поддерживает не весь SQL
синтаксис MySQL• Однопоточный
Преимущества• Поддерживает CUBRID и MySQL• Полная поддержка MySQL синтаксиса• Высокая производительность
• Нет разбора SQL• Многопоточность• Пул соединения• Балансировка нагрузки
• Пользовательские правила шардирования• Легкость конфигураций
Недостатки• Требует изменения SQL запросов для
вставки SQL подсказок
Блог: http://www.cubrid.org/blog/dev-platform/database-sharding-platform-at-nhn/
Факты о CUBRID
Реляционное СУБД ПО с открытым кодом (www.cubrid.org) Оптимизирован для веб сервисов Высокая производительность Поддержка больших баз данных Высокая доступность Шардирование баз данных Более 90% совместимости с синтаксисом MySQL, а также
аналитические функции Oracle ACID транзакции Онлайн резервное копирование Разрабатывается NHN Corp.
SHARD Брокер
Архитектура CUBRID SHARD
APIC, JDBC, ADO.NET, OLEDB, ODBC,PHP, Perl, Python, Ruby, Node.js
BrokerCAS
CAS for MYSQL
CAS
…
Proxy
CAS for MYSQL
…
CUBRID
сервер
…
ШардыMySQL
сервер
CUBRID
сервер
…
MySQL
сервер
Единое представление базы данных
или
Шардированная среда
APIC, JDBC, ADO.NET, OLEDB, ODBC,PHP, Perl, Python, Ruby, Node.js
SHARD Брокер 1
…
ШардыMySQ
L серве
р 3
MySQL
сервер N
SHARD Брокер N
SHARD Брокер 2
…
MySQL
сервер 1
MySQL
сервер 2
……
Установить CUBRID SHARD очень легко!
Легкая установка
http://www.cubrid.org/downloads
apt-getyumchef ⭐VM
EC2 AMIcloud service
Страница в документации: http://www.cubrid.org/wiki_tutorials/entry/cubrid-installation-instructions
Настройка очень легкая и интуитивная!
23
Шаги конфигурирования
1. Создать шарды2. Добавить пользователей в шарды3. Создать единую схему в шардах4. Настроить CUBRID SHARD
– Информацию о единой шардированной базе данных, к которой подключается клиент
– Информацию о подключениях к шардам– Правила шардирования
5. Запустить CUBRID SHARD6. Изменить код программы
– URL подключения– SQL подсказки шард #0 шард #1 шард #2 шард #N
CUBRID SHARD
Клиентское приложение
# 1. Создать шарды
• Хост 1..N:
$> mysql –ushard -ppassword –hnode1mysql> CREATE DATABASE sharddb;
# 2. Добавить пользователей
• Хост 1..N:
$> mysql –ushard -ppassword –hnode1mysql> USE mysql;mysql> GRANT ALL PRIVILEGES ON sharddb@localhost TO shard@localhost IDENTIFIED BY ‘shard123’mysql> GRANT ALL PRIVILEGES ON sharddb@localhost TO shard@shardBrokerNode IDENTIFIED BY ‘shard123’
# 3. Создать единую схему
$> mysql –ushard -ppassword –hnode1mysql> USE sharddb;mysql> CREATE TABLE tbl_users (id BIGINT PRIMARY KEY, name VARCHAR(20), age SMALLINT)
$> mysql –ushard -ppassword –hnode2…
• Хост 1..N:
# 4. Легкая настройка
• shard.conf– Основной файл для конфигурации CUBRID SHARD.
• shard_connection.txt– Список шард ID (shard_id) с названиями баз
данных и хостов, к которым указывает тот или иной шард ID.
• shard_keys.txt– Список названий колонок шардированной
таблицы с их правилами шардирования.
Страница в документации: http://www.cubrid.org/manual/91/en/shard.html#configuration-and-setup
shard.conf
Задать:1. SHARD_DB_NAME2. SHARD_DB_USER3. SHARD_DB_PASSWORD4. APPL_SERVER
…SHARD_DB_NAME = sharddbSHARD_DB_USER = shardSHARD_DB_PASSWORD = shard123APPL_SERVER = CAS_MYSQL…
Страница в документации: http://www.cubrid.org/manual/91/en/shard.html#default-configuration-file-shard-conf
shard_connection.txt
Задать:1. Шард ID2. Настоящее имя базы данных на хосте3. Название удаленного/локального хоста
# shard-id real-db-name connection-info0 sharddb mysqlA:33061 sharddb mysqlB:33062 sharddb mysqlC:3306…
** Название хостов обязательно должно быть идентичным выводу команды hostname на каждом из хостов.
Страница в документации: http://www.cubrid.org/manual/91/en/shard.html#setting-shard-metadata
shard_keys.txt
Задать:1. Нижний предел шард ключа2. Верхний предел шард ключа3. Шард ID
[%student_no]# min max shard_id0 63 064 127 1128 191 2192 255 3
** По умолчанию правило шардирования - по модулю 256 (SHARD_KEY_MODULAR в shard.conf ).
Страница в документации: http://www.cubrid.org/manual/91/en/shard.html#setting-shard-metadata
Пользовательская библиотека
int fn_shard_key_udf(int type, void *val){ int mod = 2;
if (val == NULL) {
return ERROR_ON_ARGUMENT; }
switch(type) {
case SHARD_U_TYPE_INT:{ int ival; ival = (int) (*(int *)val); return ival % 2;} break;case SHARD_U_TYPE_STRING: return ERROR_ON_MAKE_SHARD_KEY;default: return ERROR_ON_ARGUMENT;
} return ERROR_ON_MAKE_SHARD_KEY;}
shard.conf1. SHARD_KEY_LIBRARY_NAME2. SHARD_KEY_FUNCTION_NAME
[%student_no]SHARD_KEY_LIBRARY_NAME=$CUBRID/conf/shard_key_udf.soSHARD_KEY_FUNCTION_NAME =fn_shard_key_udf
Страница в документации: http://www.cubrid.org/manual/91/en/shard.html#setting-user-defined-hash-function
# 5. Запустить CUBRID SHARD
$> cubrid shard start@ cubrid shard start ++cubrid shard start: success
пользователь пароль
# 6. URL подключения
connectionURL ="jdbc:cubrid:node1:45511:sharddb:shard:shard123:
?althosts=node2:port2,node3:port3
&loadBalance=true";
название шард базы
порт CUBRID SHARD
Список альтернативных хостов для отказоустойчи-вости науровне API
балансировканагрузки науровне API
хост
Шардированные запросы
SELECT name FROM student WHERE student_no = /*+ shard_key */ ?;
SQL подсказкаключевая шардированная колонка
• связанная переменная
• фиксированное значение
Типы SQL подсказок
SQL подсказки Описание
/*+ shard_key */ Подсказка, которая указывает на: - связанную переменную - или фиксированное значениеключевой шардированной колонки.
/*+ shard_val(value) */
Подсказка для явного указания значения ключевой шардированной колонки, на случай если в запросе не указана сама ключевая колонка.
/*+ shard_id(shard_id) */
Подсказка для непосредственно указания шард ID, на котором должен обрабатываться этот запрос.
String query = "SELECT name FROM student WHERE student_no = /*+ shard_key */ ?; ";PrepareStatement query_stmt = connection.prepareStatement(query);query_stmt.setInt(1,100);ResultSet rs = query_stmt.executeQuery();// получить результат
2. Поиск SQL подсказки3. Хеширование shard_key
для получения шард ID4. Передача запроса безизменения конечномушард серверу.
CUBRID
SHARD
шард #0 шард #1 шард #2 шард #3
key_columnrange
(hash result) shard_idmin max
student_no 0 63 0
student_no 64 127 1
student_no 128 191 2
student_no 192 255 3
Выборка шард сервера
1. Выполнение запросаКлиентское приложение
MySQL Sharding DEMO
Требования:
• 1ГБ свободного RAM• 3ГБ свободного места для 2 VM• VirtualBox• Vagrant
39
MySQL Sharding DEMO
https://github.com/kadishmal/cubrid-shard-demo
CUBRID SHARD
• Легко– Конфигурация без хлопот!– Без сюрпризов
• Надежный– Высокая производительность– Нет SPOF
• Open source– Разрабатывается NHN Corp.
Недостатки CUBRID SHARD
Необходимо вставлять SQL подсказку во все запросы
Пока нет автоматической балансировки данныхЧто требует тщательного планирования стратегии
шардирования.Нет графического инструмента для
мониторинга. Только инструменты для командной строки.
43
CUBRID SHARD лучше всего подойдет…
• для действующих Веб сервисов• с быстрорастущим объемом данных,• которым необходим стабильное решение• с возможностью легкой настройки• в рамках ограниченного времени
44
Облачное хранилище Ndrive
• Мета данные файлов пользователей• Шардирование по ID пользователя• 24 мастер шардов– Intel(R) Xeon(R) L5640 @ 2.27GHz * 8, 16G RAM, 820G HDD
• 10ТБ данных• Характеристика нагрузки:– 75~80% SELECT vs. 20~25% INSERT– Avg. ~3000 QPS/шард– Avg. ~5% CPU нагрузки на шард
45
Облачное хранилище Ndrive
• 1 SHARD Брокер• 4 Прокси на Брокер• 50 CAS на Прокси
• Нет деградации производительности после установки CUBRID SHARD
64 128 192 256 3200
10
20
30
40
50
60
70
80
90
0
2000
4000
6000
8000
10000
12000
14000
16000
Сравнение производительности SHARD vs. Broker
Broker - broker cpuShard - proxy CPUBroker - Mean Time(ms)Shard - Mean Time(ms)Broker - RPSShard - RPS
Vuser
RP
S
CUBRID SHARD Next
Балансировка данныхМониторинг шардовФункции агрегации
47
Спасибо!
• Сагынов Эсен (NHN Corp.)
– @CUBRID– fb.com/cubrid