Комментарии 57
Развиваемся! И даже чувствуется задел на будущее. А ведь уже скоро настанет тот день, когда понадобится подключать третий сервер. Интересно, какое будет у него название?
Edgar Hoover
НЛО прилетело и опубликовало эту надпись здесь
Sega
офигенное название, что-нибудь так-же назову, можно?)
Предлагаю Chucky.
Билл, Стив, Линус (Билли, Стиви, Линуська(?) )
Back-end Сервер баз данных — «Анатолий Вассерман»
сделайте конкурс на имя нового сервака
А можно поинтересоваться (не совсем по теме, но все же): применяется ли на Хабре кеширование страниц (например, текста топиков) и эффективно ли оно, если применяется? Или тут его не применить из-за обновления комментариев и прямого эфра?
А можно узнать механизм smartSet/smartGet?
Если говорить именно о механизме, то «умные» запросы к memcached позволяют избежать ситуации, когда данные устарели в кеше и приходит несколько запросов, последовательно пытающихся получить данные и записать их в кеш. Если данные устарели, то лишь первый запрос пойдет их обновлять, а остальные запросы будут получать устаревшие данные, пока ушедший за обновлением запрос не отработает :) Поэтому smartSet/smartGet используется не всюду, а лишь там, где не критично получать «немного старые данные».
ЗЫ Juks, молодец! Этого нам не хватало очень сильно.
ЗЫ Juks, молодец! Этого нам не хватало очень сильно.
Хабратипограф не даст бездумно скопипастить Хабракод :)
if(! is_array($connections)) throw new Exception('connectFree: передан некорректный массив соединений');
некорректный или не массив? :)
На следующем этапе перестанете изгаляться и поставите нормальный load-balancer.
Случится это при запуске мегахабра, никак не раньше :) При данных задачах «нормальный load-balancer», пожалуй, избыточен.
не один нормальный MySQL load-balancer, боюсь, за несколько часов не поставить. У них у большинства имеются свои ограничения на программную часть, как минимум, скорее всего придётся писать свой межсерверный join
// Поиск минимального значения
if((!$minLoad && $status >=) || ($status > && $status < $minLoad))
И эта строчка работает? :)
if((!$minLoad && $status >=) || ($status > && $status < $minLoad))
И эта строчка работает? :)
Fowler Refactoring — код подошел бы для книжного примера.
интересно
«Сохренение значения» порадовало )
«Сохренение значения» порадовало )
Очень интересно. Потом на свежую голову вчитаюсь в код получше.
«проверяем статус репликации»
Смотрите отставание от мастера?
Смотрите отставание от мастера?
Отставание пока нет, надо конечно, но пока только статус. В деле существенное отставание бывает только когда слейв догоняет мастера после восстановления репликации
уже есть :-)
Извини, туплю. Что ты имеешь в виду под «статусом»? Какую цифру?
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.3
Master_User: replication
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: clyde-relay-bin.000011
Read_Master_Log_Pos: 698473286
Relay_Log_File: bonnie-relay-bin.000022
Relay_Log_Pos: 698473429
Relay_Master_Log_File: clyde-relay-bin.000011
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: superhabr
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 698473286
Relay_Log_Space: 698473429
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.3
Master_User: replication
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: clyde-relay-bin.000011
Read_Master_Log_Pos: 698473286
Relay_Log_File: bonnie-relay-bin.000022
Relay_Log_Pos: 698473429
Relay_Master_Log_File: clyde-relay-bin.000011
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: superhabr
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 698473286
Relay_Log_Space: 698473429
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
«При каждой инициализации средств работы с базой данных»
Один раз на запрос? Чаще? Реже?
Один раз на запрос? Чаще? Реже?
НЛО прилетело и опубликовало эту надпись здесь
можешь написать более точное описание серверов, железа так сказать, мне нужно начальству показать что нужно чтоб миллион запросов обрабатывать. спасибо.
Скажите, %juks%, а может быть имело смысл вынести такую логику по коннекту к определенному DB серверу и выбору менее загруженного, скажем в отдельный скрипт, и запускать его по крону, чтобы он обновлял статистику в memcached актуальными данными. Ну и поставить интервал запуска скрипта в соответствии с Вашим $cacheTime = 35;. А в рабочих скриптах уже просто выгребать данные из кеша. В которых бы лежали статистика по каждому из серверов. Что Вы думаете по данному поводу?
Я думаю, что это уже на любителя. Я стараюсь делать меньше крон-задач, меньше нагромождения.
Текущая реализация схожа по работоспособности с тем, что вы предлагаете, просто действует «on demand». Как-нибудь, может напишу про smartGet и smartSet, там всё элементарно, но в действительности спасает от лишних запросов к базе.
Если не кешировать запросы вообще, то это добавляет по 20% нагрузки CPU на каждый сервер. С кешированием дополнительная нагрузка незаметна. Как получить отдельно число работающих тредов без сбора всей статистики целиком я так и не нашёл.
Текущая реализация схожа по работоспособности с тем, что вы предлагаете, просто действует «on demand». Как-нибудь, может напишу про smartGet и smartSet, там всё элементарно, но в действительности спасает от лишних запросов к базе.
Если не кешировать запросы вообще, то это добавляет по 20% нагрузки CPU на каждый сервер. С кешированием дополнительная нагрузка незаметна. Как получить отдельно число работающих тредов без сбора всей статистики целиком я так и не нашёл.
Кстати, вспомнил.
У крона ведь дискретность одна минута, у Memcached — секунда. Даже при периоде в 5 секунд, время от времени имеет место некоторая «раскачка» нагрузки от сервера к серверу.
Так что если выносить, то надо делать отдельный демон.
У крона ведь дискретность одна минута, у Memcached — секунда. Даже при периоде в 5 секунд, время от времени имеет место некоторая «раскачка» нагрузки от сервера к серверу.
Так что если выносить, то надо делать отдельный демон.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Баланс