Ускоряем MySQL в десятки раз с использованием HandlerSocket
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 7,591 views

 

Statistics

Views

Total Views
7,591
Views on SlideShare
6,686
Embed Views
905

Actions

Likes
10
Downloads
55
Comments
0

11 Embeds 905

http://lib.custis.ru 271
http://addconf.ru 268
http://www.addconf.ru 160
http://varyous-simbir.blogspot.com 123
http://varyous-simbir.blogspot.ru 72
http://wiki.office.custis.ru 4
http://test.addconf.ru 2
http://add4.addconf.ru 2
http://varyous-simbir.blogspot.it 1
http://varyous-simbir.blogspot.cz 1
http://varyous-simbir.blogspot.hk 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!
  • Найти ссылки!!!

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

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