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

Post on 21-May-2015

1.446 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

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

esen@cubrid.org

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 очень легко!

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

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

esen@cubrid.org

top related