PHP+Memcached - hi-load

kvn

programmer
PHP+Memcached - hi-load

Привет,

Есть два клиента для пыха:
1. php-memcache: http://www.php.net/manual/en/book.memcache.php
2. php-memcached: http://www.php.net/manual/en/book.memcached.php

К сравнению клиентов хотел бы попросить прояснить такой момент - это обработка файловеров:
В “старом” php-memcache - есть встроенный механизм обработки отваливания половины кеша.
В php-memcached я такого не нашел.

Пример:
Имеем два memcached-сервера (srv1, srv2).

php-memcache - рапределяет ключи по серверам 50%/50% или в зависимости от веса сервера, но в любом случае получаем объем кеша равный сумме памяти выделенной на обоих серверах.
При падении srv2, то в первый раз переменные, которые были на srv2 не доступны, беруться из источника, но сам модуль уже видит, что srv2 недоступен и сохранение и последующий get происходит уже только с srv1.
Т.е. оставшийся сервер “подхватывает” кеш того, кто “упал”.

php-memcached - рапределяет ключи по серверам 50%/50% или в зависимости от веса сервера, но в любом случае получаем объем кеша равный сумме памяти выделенной на обоих серверах.
При падении srv2, модуль не меняет алгоритм распределения переменных по серверам, и тем самым получаем половина переменных в кеше (на srv1), а половина - без кеша (srv2 down), и будут без кеша, пока не поднимется srv2.

Вопрос: это такое различие в идеологии, или я где-то чего-то не досмотрел? и в php-memcached можно реализовать failover?
Задача - получить большой кеш, который можно расширять путем введения новых memcached-серверов.
Кто как делает?

Далее:
У memcached-сервера есть два режима работы: сингл и репликация.
Репликация очень приятная вещь в плане возможности получения и сохранения конкретного значения _на любой из серверов_. Либо сохранил на один, получаешь с другого. Также можно частично решить вопрос отказоустойчивости.
Т.е. по сути я могу сделать группы кеш-серверов:
с1 - репликация на с2
с3 - репликация на с4

с1 и с2 в группе (они хранят одни данные), размер кеша определяется одним сервером.
с3 и с4 в группе (они хранят одни данные), размер кеша определяется одним сервером.

Но с1 и с3 - можно использовать как рапределение кеша, в котором объем кеша равен сумме.

Вопрос: как эту структуру указать модулю php? либо первому либо второму?
Не нашел.

Может есть где-то статейки, или примеры, или кто-то сам такое строил...
Буду благодарен.
Спасибо!
 

fisher

накатила суть
>>оставшийся сервер “подхватывает” кеш того, кто “упал”
это бред каких-то умников, которые в продакшене с мемкешами толком не работали. дело модуля - сделать то, что от него просят. он вообще не должен умничать. роутинг должет быть внутри приложения. а про падения мемкешей - это вообще миф. я глянул наши кеши - сервисы живы по полгода, аптайм тачек - по два с половиной. ну раз в полгода мы рестартуем кеши для профилактики. короче - не забивайте себе голову ерундой. failover для мемкешей в модуле, или в коде - скорее всего вам не нужен.
 

fixxxer

К.О.
Партнер клуба
эта штука (а точнее, libmemcached, к которому он суть враппер) для любителей острых ощущений.

задача 1: найти билд либы, который не валится в очередном фигпойми каком месте

задача 2: отследить несовместимые изменения api при отличиях версий в revision :)

а вообще слушай фишера!
 

Dovg

Продвинутый новичок
fixxxer
>эта штука (а точнее, libmemcached, к которому он суть враппер) для любителей острых ощущений.

А можно подробнее? Какие именно ощущения доставляет libmemcached?
Мы сейчас в серьез думаем о начале ее тестирования в нашем приложении. Может не стоит на начинать ;)
 

kvn

programmer
fisher
Спасибо.

Доп. вопрос: используете репликацию? или тоже не заморачиваться?


fixxxer
>> эта штука (а точнее, libmemcached, к которому он суть враппер) для любителей острых ощущений.

тоже интересует. Можно подробнее?
 

kvn

programmer
fisher
Какую из двух библиотек вы пользуете?

1. php-memcache: http://www.php.net/manual/en/book.memcache.php
2. php-memcached: http://www.php.net/manual/en/book.memcached.php
 

fisher

накатила суть
http://pecl.php.net/package/memcache
но у нас какой-то форк чуть ли не с 2004 года :) потому что всё что там потом надобавляли - какая-то муть. форк не в том смысле, что мы сами что-то дописывали по мемкешу - просто у нас этот экстеншен многострадален - туда долгое время пихали API ко всему c memcache-like протоколами, пока не перешли на протобуфы.

фиксер - ты разрушил мои идеалы! я думал - кроу, там, дриззл... расскажи подробнее про свой опыт с либмемкешед плз.
 

fixxxer

К.О.
Партнер клуба
начнем с того, что между версиями 0.1.28 и 0.1.29 (или типа того, не помню) менять вообще нафиг весь апи либы это не очень умно :) это раз.

вот такой тест пришлось сделать на постоянно проявляющуюся регрессию с cas - это два (чтение cas-ответа там было сломано перманенто то там то здесь)

PHP:
    public function testMemcachedCasWithLongValues() {
        $MC = $this->assembleTestMc();
        $value = array('s' => str_repeat('*', 100000))+range(1, 100000);
        $cas = null;
        $MC->add('value', $value);
        $MC->get('value', NULL, &$cas);
        $MC->set('value', 'from another process');
        $r = $MC->cas($cas, 'value', -1);
        $this->assertFalse($r);
        $MC->get('value', NULL, &$cas);
        $r = $MC->cas($cas, 'value', -1);
        $this->assertTrue($r);
    }
я помню, как перебирал эдак 6 билдов либы, пока не нашел, где оно не сломано и при этом не сломано и что-то еще :)

три - начинал новый проект, поставил последние версии всего, повалилась половина тестов на обычном чтении-записи при каких то там покрытых тестами условиях (да-да, я на эту хрень написал покрывающие все что только можно тесты! куда деваться). это была последня капля, я разбираться не стал и просто написал свой class Memcached, совместимый в нужных мне рамках, на основе pecl/memcache // memcache_pool. с тех пор у меня все хорошо :)

ну и немаловажное 4 - код pecl/memcache я понимаю. libmemcached я чото открыл испугался и закрыл ;)
 

Dovg

Продвинутый новичок
fixxxer
>начнем с того, что между версиями 0.1.28 и 0.1.29
если верить changelog, то это времена глубокой беты.
http://pecl.php.net/package/memcached

>я помню, как перебирал эдак 6 билдов либы, пока не нашел, где оно не сломано и при этом не сломано и что-то еще
Я правильно понял, что они ломали не pecl, а сам libmemcached?

Главный вопрос: как давно ты проводил эти эксперименты?
 

fixxxer

К.О.
Партнер клуба
> если верить changelog, то это времена глубокой беты.

Какая разница. Менять API библиотеки и при этом увеличить только последнее число в номере версии вида x.y.z - это не нормально.
А глубокая бета всегда, очень походе что под номерами версий libmemcached выпускаются найтли билды без тестироания вообще.

> Я правильно понял, что они ломали не pecl, а сам libmemcached?

Да.

> Главный вопрос: как давно ты проводил эти эксперименты?

Постоянно, не считая последних где-то 4 месяцев, когда просто выкинул ввиду полной неработоспособности очередной версии сей замечательной библиотеки.
 

fisher

накатила суть
fixxxer, а я всё-таки не понял, это криворукость авторов libmemcached или авторов экстеншена?
 

fixxxer

К.О.
Партнер клуба
именно libmemcached. У меня сложилось впечатление, что его не тестируют толком вообще нифига. Как только хочется что-то чуть менее тривиальное, чем get("a")/set("a"), вечно что-то вылезет.

Да, вспомнил почему я его в итоге вообще выкинул - в очередной билде даже обычный set() вообще не работал _совсем_. Судя по tcpdump-у, там похоже тупо где то \r\n не отправлялся =)
 

kvn

programmer
Мужики, вопрос: существует лимит на _количество_ итемов в кеше?
Облазил гугл, везде пишут про лимит в байтах одного итема, либо лимит на общую мемори..
Но нигде ни слова о том, какое максимальное кол-во итемов в кеше может быть?

У меня размер итемов небольшой, а количество большое, уперся в 65к, подозреваю, что больше в INT не влазит..

Кто как решает подобное?
 

kvn

programmer
Пересмотри архитектуру
Добрый день.
Можно как-то конкретнее?
1. Вопрос был в том, есть ли ограничение на кол-во итемов, хранимых в мемкеше?

2. Банально, прямо как пример из книжки с каунтерами по просмотрам видео.
Есть мильен видео, есть по ним счетчики в кеше..
Вот у меня примерно то же самое. Все прекрасно, хитов 95%, по времени на 1 сек, то хитов в 4-8 раз больше, чем мисов.
на определенном этапе, картинка кардинально меняется: мисов стает больше чем хитов (примерно процентов на 10%).
при этом по параметрам, все спокойно:

Used - 6.0 MBytes
Total - 512.0 MBytes
Current Items - 65287
Total Items - 627301

Хелп, не знаю кого за что хватать?
 

kvn

programmer
Вот, например текущий стат:
Array
(
[pid] => 2492
[uptime] => 1122507
[time] => 1292433622
[version] => 1.4.5
[pointer_size] => 32
[rusage_user] => 115.222759
[rusage_system] => 632.116790
[curr_connections] => 15
[total_connections] => 128683
[connection_structures] => 57
[cmd_get] => 6256572
[cmd_set] => 627685
[cmd_flush] => 0
[get_hits] => 5679783
[get_misses] => 576789
[delete_misses] => 0
[delete_hits] => 0
[incr_misses] => 955
[incr_hits] => 53313
[decr_misses] => 188
[decr_hits] => 2636
[cas_misses] => 0
[cas_hits] => 0
[cas_badval] => 0
[auth_cmds] => 0
[auth_errors] => 0
[bytes_read] => 1719730483
[bytes_written] => 20300020076
[limit_maxbytes] => 536870912
[accepting_conns] => 1
[listen_disabled_num] => 0
[threads] => 4
[conn_yields] => 0
[bytes] => 6295085
[curr_items] => 65366
[total_items] => 628731
[evictions] => 0
[reclaimed] => 221288
)
хелп?
 

HraKK

Мудак
Команда форума
Банально в лоб храни допустим по 1000 каунтов в итеме. Ну и заведи в мемкеше ключи для итемов.
 
Сверху