0
HandlerSocketилиУскоряем MySQLв десятки раз<br />Александр Календарев<br />
План<br />Кратко об HandlerSoket<br />HandlerSoket изнутри<br />Инсталляция<br />HandlerSoket Протокол<br />Использование ...
Что может дать ускорение<br />Отсутствиеразбора SQL запроса<br />Выполнение несколько операций в одном запросе<br />Снижен...
Интерфейс  Handler<br />HANDLER tbl_name OPEN [ [AS] alias]<br />HANDLER tbl_name READ index_name { = | <= | >= | < | > } ...
HandlerSoket<br />Плагин к MySQL<br />Предоставляет NoSQLинтерфейс <br />к таблицам данных MySQL<br />Автор: Akira Higuchi...
Возможности<br />Представляет доступ к данным по индексу<br />Операциис данными: = < и ><br />Top и  Limit<br />
Где<br />Плагин к MySQL5.2.5<br />https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL<br />PerconaServer 5.1<br />ht...
Applications<br />Libmysql<br />libhsclient<br />Listener for libmysql<br />SQL Layer<br />Handlersocket Plugin<br />Handl...
Сетевое взаимодействие<br />
Потоковая модель<br />Небольшое кол-во потоков<br />Несколько коннекций на один поток epollмодель<br />Небольшое потреблен...
Структура читающего потока<br />reads requests from many clients<br />locks the DB, gets a read view<br />locks/unlocks (1...
Структура пишущего потока<br />reads requests from many clients<br />Locks DB, begins a transaction<br />locks/unlocks (1/...
Инсталляция<br />./configure<br />	--with-mysql-source=...<br />	--with-mysql-bindir=...<br />  --with-mysql-plugindir=......
Инсталляция<br />./mysql_config --variable=pkglibdir <br />/usr/local/mysql/lib<br />mysql_config --plugindir<br />/usr/lo...
Инсталляция<br />$ make<br />  $ sudo make install<br />$ vi my.conf<br />
Инсталляция<br />[mysqld]<br /> # the port number to bind to (and for write)<br />loose_handlersocket_port = 9998<br />loo...
Инсталляция<br />mysql> install plugin handlersocket soname 'handlersocket.so';<br />
Проверка:show processlist<br /> mode=rd<br /> mode=wr<br />
Проверка:show processlist<br />5 conns, 0 active<br />
Протокол<br />Teкстовый<br />telnet localhost 9998<br />Соединение persisten<br />
Почему следует знать Протокол?<br />Если что-то на получается –то проверяем используя telnet<br />Зная Протокол – лучше  о...
Последовательность выполнения<br />Создать Индекс<br />Выполнить операцию<br />
Операции<br />=<br />>, >=<br /><, <=<br />+           INSERT<br />=		      UPDATE<br />SELECT<br />
Пример<br />CREATE  TABLE `test`.`test` (<br />  `keyid` VARCHAR(45),<br />  `value` VARCHAR(45),<br />  `code` INT NULL ,...
Создание индекса<br />P <indexid> <dbname> <tablename> <indexname> <columns><br />Разделитель tab<br />P 0 test test PRIMA...
Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 1 test test code keyid,code<br />SELECT...
Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 1 test test code keyid,code<br />SELECT...
Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 2 test test code keyid,code,code2<br />...
Формат ответа<br /> <errorcode> <numcols> <r1> ...<rn><br />0 - успех<br />Разделитель tab<br />P	0	test	test	PRIMARY	code...
Формат ответа<br /> <errorcode> <numcols> <r1> ...<rn><br />P	1	test	test	code	code,code2,keyid<br />0	1<br />1 >  1	90	10...
Вставка<br /> <indexid> '+' <vlen> <v1> ... <vn><br />Пишем в пишущий порт  telnet localhost 9999<br />0 1 - успех<br />Ра...
Удаление / Обновление<br /> <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk><br />0 1- успех<br />...
Обновление / Удаление<br /> <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk><br />0 1 <numcols><br...
Клиентские библиотеки<br />libhsclient<br />Net::HandlerSocket<br />http://openpear.org/package/Net_HandlerSocket<br />htt...
Клиентские библиотеки<br />https://github.com/kryton/java-handlersocket-client<br />http://pypi.python.org/pypi/python-han...
Примеры использования<br />Формированиефронтэнда 	 (список товаров)   PHP + HS<br />Поиск товаров по характеристикам PHP +...
Формирование фронтэнда<br />Список товаров:<br />$hs->openIndex(0, $dbname, 'good', 'PRIMARY', 'id,title,price,count');<br...
Поиск товара<br />Поиск по индексу модели (Sphinx)<br />Поиск индексу характеристики(Sphinx)<br />Выборка товара по idHand...
Автокомплит ( ngx_hsjson )<br />JS формирует HTTP запросGET /autocomplete/sie[mens]<br />Модуль nginxформирует запрос P 0 ...
Модуль ngx_handlersocket_json<br />https://github.com/akalend/ngx_http_handlersocket_json_module<br />location ~ /cities/(...
Аналог InnoDb-memcached<br />MySQL 5.6.2 – экспериментальная (12.04)<br />Используется InnoDb-API<br />MemcachedПротокол<b...
Структура InnoDb-memcached<br />
Сравнение с аналогами noSQL<br />
Сравнение с NoSQL<br />
Чтение 9998/9999 port 100K по 32B<br />
Ссылки<br />http://yoshinorimatsunobu.blogspot.com/search/label/handlersocket<br />http://www.slideshare.net/akirahiguchi/...
HandlerSocket<br /><ul><li>Эффективная технология
Ускоряет обращение к MySQL 	    более чем в десятки раз
Upcoming SlideShare
Loading in...5
×

Ускоряем MySQL в десятки раз с использованием HandlerSocket

8,069

Published on

Published in: Technology, Education
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,069
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
65
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Transcript of "Ускоряем MySQL в десятки раз с использованием HandlerSocket"

    1. 1. HandlerSocketилиУскоряем MySQLв десятки раз<br />Александр Календарев<br />
    2. 2. План<br />Кратко об HandlerSoket<br />HandlerSoket изнутри<br />Инсталляция<br />HandlerSoket Протокол<br />Использование HandlerSoket<br />
    3. 3. Что может дать ускорение<br />Отсутствиеразбора SQL запроса<br />Выполнение несколько операций в одном запросе<br />Снижение сетевого трафика за счет протокола<br />
    4. 4. Интерфейс Handler<br />HANDLER tbl_name OPEN [ [AS] alias]<br />HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)<br />[ WHERE where_condition ] [LIMIT ... ]<br />HANDLER tbl_name CLOSE<br />
    5. 5. HandlerSoket<br />Плагин к MySQL<br />Предоставляет NoSQLинтерфейс <br />к таблицам данных MySQL<br />Автор: Akira Higuchi<br />
    6. 6. Возможности<br />Представляет доступ к данным по индексу<br />Операциис данными: = < и ><br />Top и Limit<br />
    7. 7. Где<br />Плагин к MySQL5.2.5<br />https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL<br />PerconaServer 5.1<br />http://www.percona.com/downloads/Percona-Server-5.1/LATEST/<br />
    8. 8. Applications<br />Libmysql<br />libhsclient<br />Listener for libmysql<br />SQL Layer<br />Handlersocket Plugin<br />Handler Interface<br />InnoDb<br />MyISAM<br />Other storage engines …<br />Структура HandlerSocket<br />client app<br />mysqld<br />
    9. 9. Сетевое взаимодействие<br />
    10. 10. Потоковая модель<br />Небольшое кол-во потоков<br />Несколько коннекций на один поток epollмодель<br />Небольшое потребление памяти на один поток<br />
    11. 11. Структура читающего потока<br />reads requests from many clients<br />locks the DB, gets a read view<br />locks/unlocks (1/#conns)<br />executes many requests<br />unlocks the DB<br />returns responses to clients<br />
    12. 12. Структура пишущего потока<br />reads requests from many clients<br />Locks DB, begins a transaction<br />locks/unlocks (1/#conns)<br />executes many requests<br />commits, and unlocks the DB<br />returns responses to clients<br />
    13. 13. Инсталляция<br />./configure<br /> --with-mysql-source=...<br /> --with-mysql-bindir=...<br /> --with-mysql-plugindir=...<br />
    14. 14. Инсталляция<br />./mysql_config --variable=pkglibdir <br />/usr/local/mysql/lib<br />mysql_config --plugindir<br />/usr/local/mysql/lib/plugin<br />--with-mysql-bindir<br /> --with-mysql-plugindir<br />
    15. 15. Инсталляция<br />$ make<br /> $ sudo make install<br />$ vi my.conf<br />
    16. 16. Инсталляция<br />[mysqld]<br /> # the port number to bind to (and for write)<br />loose_handlersocket_port = 9998<br />loose_handlersocket_port_wr = 9999<br /> # the number of worker threads <br />loose_handlersocket_threads = 16<br />loose_handlersocket_threads_wr = 1<br />#to allow handlersocket accept connections<br />open_files_limit = 65535<br />
    17. 17. Инсталляция<br />mysql> install plugin handlersocket soname 'handlersocket.so';<br />
    18. 18. Проверка:show processlist<br /> mode=rd<br /> mode=wr<br />
    19. 19. Проверка:show processlist<br />5 conns, 0 active<br />
    20. 20. Протокол<br />Teкстовый<br />telnet localhost 9998<br />Соединение persisten<br />
    21. 21. Почему следует знать Протокол?<br />Если что-то на получается –то проверяем используя telnet<br />Зная Протокол – лучше оптимизиация<br />Написание тестов и патчей<br />
    22. 22. Последовательность выполнения<br />Создать Индекс<br />Выполнить операцию<br />
    23. 23. Операции<br />=<br />>, >=<br /><, <=<br />+ INSERT<br />= UPDATE<br />SELECT<br />
    24. 24. Пример<br />CREATE TABLE `test`.`test` (<br /> `keyid` VARCHAR(45),<br /> `value` VARCHAR(45),<br /> `code` INT NULL ,<br /> `code2` varchar(32) ,<br /> PRIMARY KEY (`keyid`) ,<br /> INDEX `code` (`code` ASC) <br /> INDEX `code2` (`code`, `code2`) <br />)<br />
    25. 25. Создание индекса<br />P <indexid> <dbname> <tablename> <indexname> <columns><br />Разделитель tab<br />P 0 test test PRIMARY keyid,value<br />P 1 test test code keyid,code<br />P 3 test test code2 keyid,code,code2<br />
    26. 26. Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 1 test test code keyid,code<br />SELECT keyid,value FROM test.test<br />WHERE code = ‘000123’<br />>1 = 1 000123 <br />
    27. 27. Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 1 test test code keyid,code<br />SELECT keyid,code FROM test.test<br />WHERE code = 10 LIMIT 10<br />>1 = 1 10 10<br />
    28. 28. Простая выборка<br /><indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <br />>P 2 test test code keyid,code,code2<br />SELECT keyid,code,code2 FROM test.test<br />WHERE code = 10 AND code2=‘a’ LIMIT 10<br />>2 = 2 10 a 10<br />
    29. 29. Формат ответа<br /> <errorcode> <numcols> <r1> ...<rn><br />0 - успех<br />Разделитель tab<br />P 0 test test PRIMARY code,code2,keyid<br />0 1<br />0 = 1 100012<br />0 3 67 c 100012<br />
    30. 30. Формат ответа<br /> <errorcode> <numcols> <r1> ...<rn><br />P 1 test test code code,code2,keyid<br />0 1<br />1 > 1 90 10<br />1 3 100200 91 a 100258 91 a 10027…<br />10 групп по 3<br />
    31. 31. Вставка<br /> <indexid> '+' <vlen> <v1> ... <vn><br />Пишем в пишущий порт telnet localhost 9999<br />0 1 - успех<br />Разделитель tab<br />P 0 test test PRIMARY code,code2,keyid<br />0 1<br />0 + 3 1 f 102113 <br />0 1<br />
    32. 32. Удаление / Обновление<br /> <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk><br />0 1- успех<br />Модификатор U – update, D – delete<br />P 0 test test PRIMARY code,code2,keyid<br />0 1<br />0 = 1 100001 1 0 D <br />0 1 1<br />
    33. 33. Обновление / Удаление<br /> <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk><br />0 1 <numcols><br />Модификатор U – update, D – delete<br />P 0 test test PRIMARY code,keyid<br />0 1<br />0 = 1 100003 1 0 U zzzzzzz 100003<br />0 1 1<br />0 = 1 100003<br />0 2 zzzzzzz 100003<br />
    34. 34. Клиентские библиотеки<br />libhsclient<br />Net::HandlerSocket<br />http://openpear.org/package/Net_HandlerSocket<br />http://github.com/tz-lom/HSPHP<br /> http://code.google.com/p/php-handlersocket/<br />
    35. 35. Клиентские библиотеки<br />https://github.com/kryton/java-handlersocket-client<br />http://pypi.python.org/pypi/python-handler-socket<br /> http://packages.python.org/python-handler-socket/<br /> https://github.com/winebarrel/ruby-handlersocket<br /> https://github.com/miyucy/handlersocket<br /> https://github.com/igrigorik/em-handlersocket<br /> https://github.com/quake/active_record_handlersocket<br />https://github.com/koichik/node-handlersocket<br />
    36. 36. Примеры использования<br />Формированиефронтэнда (список товаров) PHP + HS<br />Поиск товаров по характеристикам PHP + Sphinx + HS<br />Автокомплит(список товаров) JS + nginx + HS<br />
    37. 37. Формирование фронтэнда<br />Список товаров:<br />$hs->openIndex(0, $dbname, 'good', 'PRIMARY', 'id,title,price,count');<br />$hs->openIndex(1, $dbname, 'description', 'PRIMARY', 'good_id,description');<br />$priceItems= $hs->executeSingle(0, '=', array('1'),20);<br />foreach( $priceItemsas &$item ) {<br />$item[’6'] = $hs->executeSingle(1, '=', array($item['0'], $lang_id));<br />}<br />
    38. 38. Поиск товара<br />Поиск по индексу модели (Sphinx)<br />Поиск индексу характеристики(Sphinx)<br />Выборка товара по idHandlerSocket (см. формирование фронтэнда)<br />$pricItems= $sphinx->Query( $q);<br />foreach ( $pricItemsIdas$id ) {<br /> $item[] = $hs->executeSingle(1, '=', array($id));<br />}<br />
    39. 39. Автокомплит ( ngx_hsjson )<br />JS формирует HTTP запросGET /autocomplete/sie[mens]<br />Модуль nginxформирует запрос P 0 shop brands name,id 0 >= 1 1 sie 10<br />HS возвращает результат0 2 siemens 32<br />Модуль nginxформирует ответJSON {“name”: “Siemens”, “id”: 32}<br />
    40. 40. Модуль ngx_handlersocket_json<br />https://github.com/akalend/ngx_http_handlersocket_json_module<br />location ~ /cities/(.+)/$ {<br />hs_json; # enable module<br />hs_json_host 127.0.0.1;# IP хоста<br />hs_json_port 9998; #порт<br />hs_json_db test; #БД<br />hs_json_table city; #имя таблицы<br />hs_json_index name; #имя индекса<br />hs_json_fieldsname,id; # список полей<br />hs_json_op "=”; #операция<br />hs_json_limit 10; # аналог limit MySQL<br />hs_request$1; # запрос<br />}<br />
    41. 41. Аналог InnoDb-memcached<br />MySQL 5.6.2 – экспериментальная (12.04)<br />Используется InnoDb-API<br />MemcachedПротокол<br />Настройка через таблицы <br />conteyners, config_options, cache_policies<br />
    42. 42. Структура InnoDb-memcached<br />
    43. 43. Сравнение с аналогами noSQL<br />
    44. 44. Сравнение с NoSQL<br />
    45. 45. Чтение 9998/9999 port 100K по 32B<br />
    46. 46. Ссылки<br />http://yoshinorimatsunobu.blogspot.com/search/label/handlersocket<br />http://www.slideshare.net/akirahiguchi/handlersocket-plugin-for-mysql-4664154<br />http://www.percona.com/docs/wiki/percona-server%3Afeatures%3Aspecial%3Ahandlersocket<br />http://habrahabr.ru/blogs/nosql/113040/<br />http://l-o-n-g.livejournal.com/153756.html<br />
    47. 47. HandlerSocket<br /><ul><li>Эффективная технология
    48. 48. Ускоряет обращение к MySQL более чем в десятки раз
    49. 49. Есть клиенты на многих языках</li></li></ul><li>АлександрКалендарев<br />akalend@mail.ru<br /> @akalend http://githab.com/akalend<br />http://akalend.habrahabr.ru/blog<br />
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×