Быстрый и простой способ шардирования mysql с помощью...

44
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD Эсен Сагынов 22 апреля 2013 г.

Upload: cubrid

Post on 21-May-2015

1.446 views

Category:

Technology


7 download

DESCRIPTION

Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва.

TRANSCRIPT

Page 1: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Быстрый и простой способ шардирования MySQLс помощью CUBRID SHARD

Эсен Сагынов22 апреля 2013 г.

Page 2: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

2

План на сегодня

1. Об NHN2. Шардирование в производственных средах3. Почему CUBRID SHARD4. Как шардировать базы данных MySQL5. Демо6. CUBRID SHARD в Ndrive

Page 3: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Обо мне3

• Эсен Сагынов (NHN Corp.)

– @CUBRID– fb.com/cubrid

[email protected]

Page 4: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

30,000+Веб серверов

Япония

США

Корея

Китай 150+ Веб сервисов

Об NHN

Вьетнам

Сингапур

Page 5: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Шардирование в производстве

• Использует реляционное СУБД с шардированием• Данные хранятся в виде ключ-значение

• Использует реляционное СУБД с шардированием• Шардирование и репликация абстрагированы с помощью Gizzard

• Использует реляционное СУБД с шардированием• Использование Hbase ограничено

• Использует реляционное СУБД с шардированием• Кэширование данных различными путями

• Использует реляционное СУБД с шардированием• ACID – главная причина выбора реляционного СУБД

• Использует реляционное СУБД с шардированием• Легче всего реализовать. Больше всего подходит их нуждам.

• Использует реляционное СУБД с шардированием и высокой доступностью

• Главная причина - согласованность и связь между данными

Page 6: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Существующие решения шардирования

Название Тип Требования Интерфейс

СУБД Другие

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 Любой

Page 7: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Категории решений шардирования

• Библиотека• Хранилище• Тяжеловесное промежуточное ПО• Легковесное промежуточное ПО

Page 8: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

8

Библиотеки и хранилища

Библиотеки• Hibernate Shards• HiveDB

Недостатки• Требует библиотеку Hibernate/Java• Конфигурация с помощью многих XML

файлов• Не для действующих сервисов

Хранилища• Spider for MySQL

Недостатки• Требует изменения

хранилища• Не для действующих

сервисов

Page 9: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

9

Тяжеловесные промежуточные ПО

dbShards Gizzard• Требует изменения кода

приложения• Необходимо установить агентов на

каждый сервер СУБД• Не для действующих сервисов

• Неактивный

Page 10: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

10

Легковесное промежуточное ПО

• Spock Proxy– Активный проект– Легковесный– Гибкий– Легко

настраиваемый– Не требует

изменения кода приложения

Page 11: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

11

Spock Proxy

Spock ProxyХранилище для конфигураций шардирования

База данных MySQL

Правила шардирования По модулюОпределение ключа шарда Полный разбор SQLПреимущества Не требует изменения кода программыНедостатки • Деградация производительности:

• Дополнительный разбор SQL• Слияние результатов

• Поддерживает не весь SQL синтаксис MySQL

• Однопоточный

Блог: http://www.cubrid.org/blog/dev-platform/database-sharding-platform-at-nhn/

Page 12: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

12

Производительность Spock Proxy

• Однопоточный• Разбирает и переписывает SQL

1 5 10 20 30 50 70 100 200 4000

50000100000150000200000250000300000350000400000450000500000

Шардинг на уровне приложенияSpock ProxyCUBRID SHARD

Параллельные клиенты

Время выполнения

Page 13: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Spock Proxy

Активный проект Легковесный Гибкий Легко настраиваемый Не требует изменения кода программы✕Ведет к деградации производительности

Page 14: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

14

Легковесное и легко настраиваемоепромежуточное ПО для шардирования MySQL

CUBRID SHARD

Page 15: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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/

Page 16: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Факты о CUBRID

Реляционное СУБД ПО с открытым кодом (www.cubrid.org) Оптимизирован для веб сервисов Высокая производительность Поддержка больших баз данных Высокая доступность Шардирование баз данных Более 90% совместимости с синтаксисом MySQL, а также

аналитические функции Oracle ACID транзакции Онлайн резервное копирование Разрабатывается NHN Corp.

Page 17: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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

сервер

Единое представление базы данных

или

Page 18: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Шардированная среда

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

……

Page 19: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Установить CUBRID SHARD очень легко!

Page 21: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Настройка очень легкая и интуитивная!

Page 22: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

23

Шаги конфигурирования

1. Создать шарды2. Добавить пользователей в шарды3. Создать единую схему в шардах4. Настроить CUBRID SHARD

– Информацию о единой шардированной базе данных, к которой подключается клиент

– Информацию о подключениях к шардам– Правила шардирования

5. Запустить CUBRID SHARD6. Изменить код программы

– URL подключения– SQL подсказки шард #0 шард #1 шард #2 шард #N

CUBRID SHARD

Клиентское приложение

Page 23: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

# 1. Создать шарды

• Хост 1..N:

$> mysql –ushard -ppassword –hnode1mysql> CREATE DATABASE sharddb;

Page 24: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

# 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’

Page 25: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

# 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:

Page 26: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

# 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

Page 27: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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

Page 28: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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

Page 29: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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

Page 30: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Пользовательская библиотека

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

Page 31: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

# 5. Запустить CUBRID SHARD

$> cubrid shard start@ cubrid shard start ++cubrid shard start: success

Page 32: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

пользователь пароль

# 6. URL подключения

connectionURL ="jdbc:cubrid:node1:45511:sharddb:shard:shard123:

?althosts=node2:port2,node3:port3

&loadBalance=true";

название шард базы

порт CUBRID SHARD

Список альтернативных хостов для отказоустойчи-вости науровне API

балансировканагрузки науровне API

хост

Page 33: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Шардированные запросы

SELECT name FROM student WHERE student_no = /*+ shard_key */ ?;

SQL подсказкаключевая шардированная колонка

• связанная переменная

• фиксированное значение

Page 34: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Типы SQL подсказок

SQL подсказки Описание

/*+ shard_key */ Подсказка, которая указывает на: - связанную переменную - или фиксированное значениеключевой шардированной колонки.

/*+ shard_val(value) */

Подсказка для явного указания значения ключевой шардированной колонки, на случай если в запросе не указана сама ключевая колонка.

/*+ shard_id(shard_id) */

Подсказка для непосредственно указания шард ID, на котором должен обрабатываться этот запрос.

Page 35: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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. Выполнение запросаКлиентское приложение

Page 36: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

MySQL Sharding DEMO

Требования:

• 1ГБ свободного RAM• 3ГБ свободного места для 2 VM• VirtualBox• Vagrant

Page 37: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

39

MySQL Sharding DEMO

https://github.com/kadishmal/cubrid-shard-demo

Page 38: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

CUBRID SHARD

• Легко– Конфигурация без хлопот!– Без сюрпризов

• Надежный– Высокая производительность– Нет SPOF

• Open source– Разрабатывается NHN Corp.

Page 39: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

Недостатки CUBRID SHARD

Необходимо вставлять SQL подсказку во все запросы

Пока нет автоматической балансировки данныхЧто требует тщательного планирования стратегии

шардирования.Нет графического инструмента для

мониторинга. Только инструменты для командной строки.

Page 40: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

43

CUBRID SHARD лучше всего подойдет…

• для действующих Веб сервисов• с быстрорастущим объемом данных,• которым необходим стабильное решение• с возможностью легкой настройки• в рамках ограниченного времени

Page 41: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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 нагрузки на шард

Page 42: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

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

Page 43: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

CUBRID SHARD Next

Балансировка данныхМониторинг шардовФункции агрегации

Page 44: Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 RIT++, Москва

47

Спасибо!

• Сагынов Эсен (NHN Corp.)

– @CUBRID– fb.com/cubrid

[email protected]