FastNetMon

Показаны сообщения с ярлыком MemcacheDB. Показать все сообщения
Показаны сообщения с ярлыком MemcacheDB. Показать все сообщения

воскресенье, 15 марта 2009 г.

MySQL vs MemcacheDB

MemcacheDB мы протестировали ранее и получили результаты 14 000 / 18 000 записей в секунду соотвественно для записи / чтения.

Вот тестовый скрипт для проверки скорости записи, который по мере проведения тестов будет модифицироваться:

#!/usr/bin/perl

use strict;
use warnings;

use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; $dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $_, "$_ value");
}



Для проверки скорости чтения будет следующий скрипт:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; #$dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
#$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $), "$_ value");
my $sth = $dbh->prepare("SELECT value_ FROM test_table WHERE key_=?");
$sth->execute($_);
my $result = $sth->fetchrow_hashref();

#print Dumper($result);
}



Тест1.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255)) ENGINE = MYISAM;

При записи имеем:
time ./work_db_mysql.pl
real 2m4.629s
user 0m6.640s
sys 0m5.608s

Т.е. около 16 000 записей / секунду.

При чтении имеем:
.... жду уже 10 минут, а скрипт даже не добрался до цифры "1" в файле (там данные упорядочены по алфавиту -- 01234567890abcd...z), что говорит о том, что ещё ждать десятки минут. Что же, MySQL просто ужасен, если не использовать индексы.


Тест2.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255), index(key_)) ENGINE = MYISAM; (предварительно убиваем старую таблицу -- drop table test_table;)

Тест на скорость записи данных:
real 3m3.763s
user 0m10.985s
sys 0m9.669s

Т.е. ~10 500 записей / секунду

Тест на чтение данных:
time ./work_db_mysql_read.pl

real 6m17.771s
user 0m19.949s
sys 0m8.509s

Т.е. около 3 000 чтений / секунду, что подтверждает явное преимущество MemcacheDB.

Тест 3.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ char(255), value_ char(255), index(key_)) ENGINE = MYISAM; (т.е. fixed length char вместо varchar)

Запись:
real 3m15.876s
user 0m6.944s
sys 0m5.820s

~ 10 000 записей в секунду

Чтение:

real 6m11.984s
user 0m20.137s
sys 0m8.385s

Т.е. около ~3200 записей / секунду.

Ну выводы... MySQL слил на данном типе данных =)

суббота, 14 марта 2009 г.

Работа с MemcachDB из Perl Cache::Memcached::Fast

В документации сказано, что MemcacheDB поддерживает протокол обмена своего старшего брата -- Memcached`а. Но, как следовало ожидать, функции поддерживаются далеко не все:
* get(also mutiple get)
* set, add, replace
* append/prepend
* incr, decr
* delete
* stats

Далее нам это надо будет учитывать при использовании модуля Cache::Memcached::Fast (который вам предстоит поставить с CPAN).

Вот простейший пример работы с MemcacheDB:

#!/usr/bin/perl

use strict;
use warnings;

use Cache::Memcached::Fast;

my $memd = new Cache::Memcached::Fast( {
servers => [ { address => 'localhost:7777' } ],
} );

$memd->set("some_key", "some data");
print $memd->get("some_key");



А сейчас давайте попробуем внести 2 миллиона записей в базу (2 млн уникальных ключей, значения поставим равными ключам + некий набор символов, суммарный размер ключей -- 33 102 046 байт (ок 32 мегайбайт), данных чуть больше). Платформа для теста: 4 * Intel(R) Xeon(R) CPU E5420 @ 2.50GHz + 8Гб памяти + SATA винты в RAID1 + Centos5. Перед началом теста БД занимала 28 мегабайт.

Итого время добавления 2 млн записей следующее:
time ./work_db.pl
real 2m35.559s
user 0m6.060s
sys 0m13.745s

Т.е. ~14 000 записей в секунду скорость записи.

Протестируем скорость чтения, просто получим ключи, которые возьмем из файла:

time ./work_db.pl
some data
real 1m46.386s
user 0m9.637s
sys 0m23.029s

Т.е. скорость чтения около ~18 000 записей / в секунду

Кстати, а статистику работу MemcacheDB можно посмотреть опять же Телнетом:

telnet localhost 7777
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 7673
STAT uptime 859
STAT time 1236987371
STAT version 1.2.0
STAT pointer_size 64
STAT rusage_user 3.684439
STAT rusage_system 19.183083
STAT ibuffer_size 512
STAT curr_connections 5
STAT total_connections 256615
STAT connection_structures 9
STAT cmd_get 4
STAT cmd_set 14623
STAT get_hits 4
STAT get_misses 0
STAT bytes_read 14110820
STAT bytes_written 6402248
STAT threads 4
END


Итого, мы получили ~18 000 записей / секунду при чтении, а при записи ~14 000 записей / секунду.

Errata: немного переклинило и считал минуты по 30 секунд, исправил, значения стали меньше :)

Запуск MemcacheDB

С установкой мы разобрались, теперь дело за использованием.

Вот пример простенького скрипта для запуска MemcacheDB в Single режиме (без репликаций):

#!/bin/sh

PATH=/opt/memcacnedb120
$PATH/bin/memcachedb -p7777 -d -r -H $PATH/db -N -u root > $PATH/debug.log 2>&1


-p -- используемый порт
-d -- режим демона
-r -- эээ, "maximize core file limit", у кого есть идеи для адекватного перевода, прошу в комменты
-H -- путь к папке с базой данных
-v -- включить отладочные сообщения (используйте в целях отладки)
-N -- включить параметр "DB_TXN_NOSYNC", дающий сильный прирост производительности

Соответственно, в продакшн режиме -u root замените на юзера, от имени которого будет работать ваша БД.

Теперь для проверки БД заюзаем Телнет: telnet localhost 7777, в ответ мы должны увидеть нечто подобное:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


Вот и всё, MemcachedDB готова к работе :)

Попробуем поместить данные в БД:
set test 0 0 4
1234
STORED


После этого отключаем telnet сессию (CTRL + ] и следом quit) и подключаемся заново, чтобы получить наши тестовые данные:

get test<и тыкаем энтер>
VALUE test 0 4
1234
END


Вот так всё просто, так что в случае необходимости можно сходу реализовать протокол к MemcacheDB для не поддерживаемого языка =)

пятница, 13 марта 2009 г.

Сборка и установка MemcacheDB

Что это?

"Memcachedb is a distributed key-value storage system designed for persistent."
(с) пдфка с презентацией этой бд, которую я настоятельно рекомендую пролистать всем: http://memcachedb.org/memcachedb-guide-1.0.pdf


Зачем?

MemcacheDB -- очень быстрая не реляционная БД (основана на ключах), имеющая поддержку транзакций, репликаций, а также имеющая универсальный АПИ (как раз от Memcached`а). Эта БД нужна там, где скорости MySQL / PostgreSQL недостаточно, а их функций предостаточно. По заявлениям разработчиков, скорость записи в MemcacheDB может достигать 20 000 записей в секунду, а чтения -- до 50 000 записей / секунду (на машинке Dell 2950III); не правда ли, неплохо?

+ искаропки мы получаем такую фичу как горячие бэкапы БД.

Кто авторы и где офсайт?

Официальный сайт этой БД: http://memcachedb.org/

Как поставить?

Ставить мы будем стабильную 1.2.0 версию вот отсюда: http://code.google.com/p/memcachedb/downloads/list

Итак, мануал по установке вот тута: http://memcachedb.googlecode.com/svn/trunk/INSTALL

Мануал в целом отличный, но от меня будут следующие правки к нему (диффы, надеюсь, все читать умеют? Для тех, кто не умеет: с минусом строка, которую удаляем, с плюсом -- та, которую добавляем):

BDB:
-$../dist/configure
+$../dist/configure --prefix=/opt/bdb47


libevent:
-$./configure
+$./configure --prefix=/opt/livevent13e


По поводу .so:
Вот это:
Load .so file by add two line in /etc/ld.so.conf:

/usr/local/lib
/usr/local/BerkeleyDB.4.7/lib


Заменяем на:
/opt/livevent13e/lib
/opt/bdb47/lib


MemcachDB:
-$./configure --enable-threads
+$./configure --enable-threads --prefix=/opt/memcacnedb120 --with-libevent=/opt/livevent13e --with-bdb=/opt/bdb47

Правки обусловлены тем, что я не привык засорять систему мусором, поэтому ставлю все, собранное из сорцов, в /opt.

Ну вот и всё, пробуем запустить собраный бинарик: /opt/memcacnedb120/bin/memcachedb -h. О запуске в "продакшен" режиме и о работе с этой БД расскажу в следующих статьях :)