Successfully reported this slideshow.

hl++ Rubtsov

2,726 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

hl++ Rubtsov

  1. 1. Архитектура MySQL Cluster Григорий Рубцов MySQL AB / Sun Microsystems
  2. 2. План доклада <ul><li>Архитектура </li></ul><ul><li>Отказоустойчивость </li></ul><ul><li>Производительность </li></ul><ul><ul><li>плюсы </li></ul></ul><ul><ul><li>минусы </li></ul></ul><ul><li>Практика </li></ul>
  3. 3. Приобретение MySQL компанией Sun <ul><li>Сделка завершилась в 2008 году </li></ul><ul><li>Sun и MySQL совместными усилиями сделают продукты и услуги ближе к заказчику. </li></ul><ul><ul><li>Корпоративная поддержка 24x7x3 6 5 географически ближе </li></ul></ul><ul><ul><li>Больше поддерживаемых платформ </li></ul></ul><ul><ul><li>Профессиональные услуги и обучение в России </li></ul></ul><ul><li>Обе компании твердо стоят на позициях Open Source </li></ul>Миссия Sun/MySQL: Сделать доступную каждому высококлассную СУБД .
  4. 4. Архитектура сервера MySQL
  5. 5. Общая архитектура кластера
  6. 6. Особенности архитектуры: <ul><li>Избыточность </li></ul><ul><ul><li>Данных NoOfReplicas (min: 2) </li></ul></ul><ul><ul><li>SQL- нод </li></ul></ul><ul><ul><li>mgm- нод (управляющих нод) </li></ul></ul><ul><li>Разбиение данных </li></ul><ul><ul><li>число долей равно числу дата-нод </li></ul></ul><ul><ul><li>критерий разбиения – первичный хэш-индекс таблицы </li></ul></ul><ul><li>“ Shared nothing”, общая только сеть </li></ul><ul><li>Транзакционность ( READ_COMMITTED ) </li></ul>
  7. 7. Лицензия <ul><li>Две формы издания </li></ul><ul><ul><li>Community, 100% GPL </li></ul></ul><ul><ul><li>Enterprise, коммерческий продукт с поддержкой ( MySQL Cluster Carrier Grade Edition) </li></ul></ul><ul><li>Исходный код общий </li></ul><ul><li>MySQL Cluster 6.2 можно скачать, 6.2 - это версия ndb (не связана с MySQL 6 ) </li></ul>
  8. 8. Открытый NDB API <ul><li>Позволяет обойти SQL- сервер или самому им быть </li></ul><ul><li>http://dev.mysql.com/doc/ndbapi/en/ </li></ul>
  9. 9. NDB API ( пример) <ul><li>NdbOperation *myOperation </li></ul><ul><li>= myTransaction->getNdbOperation(myTable); </li></ul><ul><li>if (myOperation == NULL) </li></ul><ul><li>APIERROR(myTransaction->getNdbError()); </li></ul><ul><li>myOperation->insertTuple(); </li></ul><ul><li>myOperation->equal(&quot;ATTR1&quot;, i); </li></ul><ul><li>myOperation->setValue(&quot;ATTR2&quot;, i); </li></ul><ul><li>if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); </li></ul>
  10. 10. Хранение данных <ul><li>Фрагментация по первичному хэш-индексу </li></ul><ul><li>Хранение в памяти и на диске (с версии 5.1) </li></ul><ul><li>B-tree индексы – отдельные таблицы – также фрагментируются </li></ul><ul><li>До 48 дата-нод </li></ul><ul><li>Сеть должна быть быстрой (гигабит) </li></ul><ul><li>Все соединения между нодами без авторизации и без шифрования </li></ul>
  11. 11. 6 нод, NoOfReplicas=2
  12. 12. Отказоустойчивость <ul><li>Возможность резервирования всего </li></ul><ul><ul><li>отсутствие единой точки отказа </li></ul></ul><ul><li>Не забудьте про резервирование сети </li></ul><ul><ul><li>два свича, по 2 сетевых карты </li></ul></ul><ul><li>Географическая распределенность : </li></ul><ul><ul><li>репликация кластеров </li></ul></ul><ul><li>Автоматическое восстановление дата-ноды </li></ul>
  13. 14. Арбитраж <ul><li>Фрагментация кластера может привести к двум потенциально работоспособным частям . </li></ul><ul><li>« Split brain » - это плохо! </li></ul><ul><li>Для этого есть арбитр ( mgm или sql- нода) </li></ul><ul><ul><li>выборы арбитра только после того, как все алгоритмы арбитража отработали </li></ul></ul><ul><ul><li>ArbitratorRank=0 (never), 1 (high), 2 (low) </li></ul></ul><ul><ul><li>при равном ArbitrationRank, min(nodeid) </li></ul></ul>
  14. 15. Алгоритм арбитража <ul><li>Вижу ли я по крайней мере одну дата-ноду из каждой группы? </li></ul><ul><ul><li>нет – выключиться </li></ul></ul><ul><ul><li>да – продолжить алгоритм </li></ul></ul><ul><li>Есть ли среди отключившихся дата-нод по одной из ноде из каждой группы? </li></ul><ul><ul><li>нет – продолжить работу (вторая часть выключится по правилу 1) </li></ul></ul><ul><ul><li>да – продолжить алгоритм. </li></ul></ul><ul><li>Спросить арбитра. </li></ul><ul><ul><li>арбитр недоступен – выключиться. </li></ul></ul><ul><ul><li>арбитр доступен, узнать присутствую ли я в текущей конфигурации? </li></ul></ul><ul><ul><ul><li>нет – выключиться </li></ul></ul></ul><ul><ul><ul><li>да – продолжить работу </li></ul></ul></ul>
  15. 16. Производительность <ul><li>Дата-нода осуществляет выборку данных и поиск по btree- индексу в своем фрагменте </li></ul><ul><li>Условие WHERE может выполняться на дата-ноде </li></ul><ul><li>SET engine_condition_pushdown=1; </li></ul><ul><ul><li>только сравнения с константами </li></ul></ul><ul><ul><ul><li>age>27 OK </li></ul></ul></ul><ul><ul><ul><li>(age – 27) > 0 плохо </li></ul></ul></ul><ul><li>Используйте EXPLAIN EXTENDED + SHOW WARNINGS </li></ul>
  16. 17. Производительность <ul><li>Выполняются на SQL- ноде : </li></ul><ul><ul><li>WHERE, когда не работает pushdown </li></ul></ul><ul><ul><li>ORDER BY </li></ul></ul><ul><ul><li>JOIN </li></ul></ul><ul><ul><li>Подзапросы </li></ul></ul><ul><li>Простые запросы – быстро и эффективно </li></ul><ul><li>Не все составные запросы одинаково полезны </li></ul><ul><li>Нельзя вслепую заменить MyISAM на NDB </li></ul>
  17. 18. Практика применения <ul><li>Alcatel-Lucent </li></ul><ul><ul><li>60млн абонентов, аутентификация, управление данными </li></ul></ul><ul><li>neckermann.de </li></ul><ul><ul><li>500к уникальных посетителей в день </li></ul></ul><ul><li>Paggo </li></ul><ul><ul><li>25к транзакций в день, 25млн $/ мес, мобильные платежи </li></ul></ul><ul><li>M1 </li></ul><ul><ul><li>1млн абонентов мобильной связи, Сингапур </li></ul></ul><ul><li>здесь могла быть ваша реклама </li></ul>
  18. 19. Почта University of California Berkeley <ul><li>70,000 аккаунтов в 39 доменах </li></ul><ul><li>20,000 рассылок, 1.1 миллион подписчиков </li></ul><ul><li>4 миллиона сообщений в день </li></ul><ul><li>1 миллион принятых сообщений в день </li></ul><ul><li>120 поступающих сообщений в секунду </li></ul><ul><li>Акаунты, рассылки, greylisting и др. </li></ul><ul><li>http://www.mysql.com/customers/customer.php?id=497 </li></ul>
  19. 20. Конфигурация ( Berkeley ) <ul><li>10 машин с Cyrus (4 Гб ОЗУ) </li></ul><ul><li>На этих же машинах дата-ноды </li></ul><ul><ul><li>данные в памяти с бэкапом на диск </li></ul></ul><ul><li>sql- ноды на других машинах </li></ul><ul><li>MYSQL_ACCOUNT_QUERY = ${lookup mysql </li></ul><ul><li>{select a.* from calmail.account a, </li></ul><ul><li>calmail.domain d where a.domain_id=d.id and </li></ul><ul><li>a.localpart='${quote_mysql:$local_part}' and </li></ul><ul><li>d.name='${quote_mysql:$domain}' and </li></ul><ul><li>a.state='active';}} </li></ul><ul><li>cyrus: verify = false driver = manualroute transport = cyrus_lmtp route_data = ${extract{host}{MYSQL_ACCOUNT_QUERY}{$value}fail} </li></ul>
  20. 21. Конфигурация кластера ( Berkeley ) <ul><li>ndb_mgm> show </li></ul><ul><li>Connected to Management Server at: 192.168.1.15:1186 </li></ul><ul><li>Cluster Configuration </li></ul><ul><li>--------------------- </li></ul><ul><li>[ndbd(NDB)] 10 node(s) </li></ul><ul><li>id=1 @192.168.3.1 (Version: 5.0.30, Nodegroup: 0) </li></ul><ul><li>id=2 @192.168.3.2 (Version: 5.0.30, Nodegroup: 0) </li></ul><ul><li>id=3 @192.168.3.3 (Version: 5.0.30, Nodegroup: 1) </li></ul><ul><li>id=4 @192.168.3.4 (Version: 5.0.30, Nodegroup: 1, Master) </li></ul><ul><li>id=5 @192.168.3.5 (Version: 5.0.30, Nodegroup: 2) </li></ul><ul><li>id=6 @192.168.3.6 (Version: 5.0.30, Nodegroup: 2) </li></ul><ul><li>id=7 @192.168.3.7 (Version: 5.0.30, Nodegroup: 3) </li></ul><ul><li>id=8 @192.168.3.8 (Version: 5.0.30, Nodegroup: 3) </li></ul><ul><li>id=9 @192.168.3.9 (Version: 5.0.30, Nodegroup: 4) </li></ul><ul><li>id=10 @192.168.3.10 (Version: 5.0.30, Nodegroup: 4) </li></ul><ul><li>[ndb_mgmd(MGM)] 2 node(s) </li></ul><ul><li>id=41 @192.168.1.15 (Version: 5.0.30) </li></ul><ul><li>id=42 @192.168.1.70 (Version: 5.0.30) </li></ul>[mysqld(API)] 15 node(s) id=21 @192.168.1.15 (Version: 5.0.30) id=22 @192.168.1.70 (Version: 5.0.30) id=23 @192.168.1.20 (Version: 5.0.30) id=24 @192.168.1.65 (Version: 5.0.30) id=25 @192.168.1.75 (Version: 5.0.30) id=26 @192.168.1.85 (Version: 5.0.30) id=31 @192.168.2.20 (Version: 5.0.30) id=32 @192.168.2.22 (Version: 5.0.30) id=33 @192.168.2.24 (Version: 5.0.30) id=34 @192.168.2.29 (Version: 5.0.30) id=37 @192.168.1.93 (Version: 5.0.30) id=39 @192.168.1.80 (Version: 5.0.30) id=61 @192.168.2.10 (Version: 5.0.30) id=62 @192.168.2.12 (Version: 5.0.30) id=63 @192.168.2.14 (Version: 5.0.30)
  21. 22. Особенности ( Berkeley ) <ul><li>set ipn = inet_aton(in_ip_addr); </li></ul><ul><ul><li>4 байта, а не 15 </li></ul></ul><ul><li>не используем блобы </li></ul><ul><ul><li>они приводят к неявному созданию скрытой вспомогательной таблицы </li></ul></ul><ul><li>избегаем ENUM </li></ul><ul><ul><li>изменение ENUM – ALTER TABLE, что приводит к простою </li></ul></ul><ul><li>Не было незапланированного даунтайма за год работы </li></ul><ul><li>Может масштабироваться до нагрузок в 500 раз превышающих текущие </li></ul>
  22. 23. Заключение <ul><li>Кластером нельзя забивать гвозди! </li></ul><ul><li>Пишите: rgbeast@sqlinfo.ru, http://sqlinfo.ru/forum/ </li></ul>

×