NoSQL
22 February 2011

Некоторые тонкости Update & Insert в Handler Socket

В продолжение статьи Первый опыт работы с Handler Socket & php_handlersocket некоторые особенности Update & Insert

Некоторое время было потрачено на использование UPDATE & INSERT.
все тестировалось на простой таблице
CREATE TABLE `test`.`test` (
    `keyid` varchar(45),
    `value` varchar(45),
PRIMARY KEY (`keyid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251


Простой пример
$port = 9998;
$hs = new HandlerSocket($host, $port);
$retval = $hs->executeInsert(0, array( '112233090', '12212212'));
var_dump($retval);

* This source code was highlighted with Source Code Highlighter.

выдавал bool(false);


Оказывется, ларчик открывался просто:
Если мы посмотрим SHOW PROCESSLIST
show processlist handlersocket
то строчка 17 колонки State в режиме mode отличается от всех предыдущих строк:
mode=rd
mode=wr

Как упоминалось в статье Первый опыт работы с Handler Socket & php_handlersocket при запуске HandlerSocket стартует 16 читающих тредов и один пишущий. Эти данные устанавливаются в my.cnf
loose_handlersocket_threads = 16
# the number of worker threads (for read requests)

loose_handlersocket_threads_wr = 1
# the number of worker threads (for write requests)

так вот, читающие треды (потоки) забиндены на порт 9998, а пишущий на порт 9999. По этому, если Вы собираетесь производить операции INSERT/UPDATE/DELETE Вы должны открыть индекс на 9999 порту
$host = 'localhost';
$port = 9998;
$port_wr = 9999;

$hs = new HandlerSocket($host, $port_ wr);


* This source code was highlighted with Source Code Highlighter.


Аналогично и с нативным протоколом: telnet akalend.local 9998
tеlnet: connect to address fe80::217:f2ff:feee:3a60: Connection refused
Trying 192.168.1.10...
Connected to akalend.local.
Escape character is '^]'.
P 0 test test PRIMARY keyid,value
0 1
0 = 1 123123
0 2 123123 asdasdasd
0 = 1 123123 0 0 D
2 1 readonly

с операциями INSERT/UPDATE получаем ошибку readonly

telnet akalend.local 9999
Trying fe80::217:f2ff:feee:3a60...
telnet: connect to address fe80::217:f2ff:feee:3a60: Connection refused
Trying 192.168.1.10...
Connected to akalend.local.
Escape character is '^]'.
P 0 test test PRIMARY keyid,value
0 1
0 = 1 123123 1 0 D
0 1 1
0 + 2 1111 12345
0 1
Здесь как видно все проходит отлично.

Теперь код из листинга 1 даст положительный результат:
bool(true)


В заключение небольшое тестирование MacX 2Gb 2.3 GHz CoreDuo, ни что специально не затачивалось (установки дефолтные).

Осуществлялась запись/чтение 100 000 записей по 32 байта в memcache,redis,memcacheDb, hs,Totyo Tyrant
в одном потоке, одной коннекции, нативный протокол.

Результаты:
noSql set get
HS 33,4 24,6*/26,3**
Mc 16,7 15,6
McDb 21,4 17,5
redis 19,4 19,6
TokyoTr 22,1 22,8


Время в сек, производилось в среднем по 3-5 замеров.
* — на читающий порт
** — на пишущий порт
что еще хотелось бы сравнить: membase & tarantool

+6
2.7k 16
Comments 7
Top of the day