«1С-Битрикс: Сайт медицинской организации»

Веб-кластер в "облаке" Scalaxy за 1 час

Веб-кластер в "облаке" Scalaxy за 1 час

В 10-ой версии платформы "1С-Битрикс: Управление сайтом" появился модуль "Веб-кластер". Он позволяет развернуть любой (новый или уже работающий) проект, реализованный на CMS "1С-Битрикс" на нескольких взаимозаменяемых физических или виртуальных серверах. Тем самым решаются две очень важные для любого онлайн-бизнеса задачи:
  1. При росте нагрузки на сайт его можно практически неограниченно масштабировать, обеспечивая нужную производительность.
  2. Сайт максимально доступен для посетителей. В случае выхода из строя одного или нескольких серверов веб-кластера система продолжает беспрерывно обслуживать клиентов на остальных работающих машинах.
Мы написали подробное руководство по настройке веб-кластера. Появляются первые крупные реализованные проекты, работающие на веб-кластере "1С-Битрикс". Но, тем не менее, 42 страницы руководства осилят, к сожалению, не все, да и любому разработчику всегда интереснее попробовать любые новые фичи самостоятельно, на практике. "Пощупать" вживую... smile:)

Именно поэтому мы решили подробно описать процесс запуска веб-кластера на виртуальных машинах в "облаке" Скалакси. Наш эксперимент может повторить любой желающий.

Итак: для того, чтобы получить собранный работающий веб-кластер, нам понадобится 1-3 часа свободного времени (зависит от квалификации и наличия навыков администрирования)... и все! Полнофункциональная демо-версия "1С-Битрикс: Управление сайтом" работает бесплатно в течение 30 дней, "Оверсан-Скалакси" при регистрации дает 250 рублей - этой суммы вполне достаточно для выполнения всех работ.

Так что, на первом этапе - никаких первоначальных вложений. Решение о покупке (как хостинга, так и лицензии) можно принять позже, сначала все попробовав и оценив на практике.

* * *

Наш первый шаг - заходим на сайт www.scalaxy.ru, выбираем "Сервер Битрикс" и нажимаем кнопку "Заказать".



"Сервер Битрикс" - это специально подготовленный техническими специалистами "Оверсан-Скалакси" образ виртуальной машины, основанный на бесплатном продукте "1С-Битрикс: Веб-окружение".

В такой виртуальной машине уже сконфигурированы и оптимально настроены MySQL, Apache, PHP и другое ПО, необходимое для работы сайтов, разработанных на платформе "1С-Битрикс".

После заказа сервера мы попадаем на простую форму регистрации: логин (e-mail), пароль и капча.

Заполняем поля, ссылка на подтверждение регистрации приходит на указанный нами e-mail.

Следующий шаг - заполнение регистрационных данных. Если вы планируете стать постоянным клиентом "Скалакси", заполните их. Мы же в своих тестах пока пропустим этот шаг и сразу перейдем в панель управления.

Приступаем непосредственно к созданию нового сервера. Эта процедура достаточно простая, всего два шага. Первый - выбор операционной системы и задание пароля root'а:



Второй шаг - настройка параметров сервера.

Мы выбрали простую конфигурацию:
  • 512 Мб RAM (без возможности масштабирования "на лету", жестко зафиксировав этот параметр)
  • 1 Гб swap
  • внешний канал - 5 Мбит с возможностью расширения до 30 Мбит
  • купили внешний IP-адрес
Такая конфигурация стоит около 500 руб./мес.

Для реального "живого" проекта, конечно же, параметры могут быть иными.

Здесь же, на втором шаге создания сервера при необходимости можно добавить диски и разделы (корневой раздел создается по умолчанию).

Задаем имя для нашего сервера. Например, www1.

Ждем запуска виртуальной машины - она стартует несколько секунд.

Когда все готово (сервер "зеленый", в логе операций написано, что "сервер запущен" ), мы можем открыть полученный IP-адрес в браузере и увидеть стандартный, привычный для многих интерфейс виртуальной машины "1С-Битрикс":



Выбираем новую установку, из списка доступных для установки продуктов выбираем "Управление сайтом" - редакцию "Бизнес веб-кластер".

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

Пора приступать к созданию второго сервера.

Можно было бы просто повторить всю процедуру еще раз, но это - неинтересно. У "Скалакси" есть замечательная возможность - клонирование виртуальных машин. Воспользуемся ей:



После того, как мы выбрали нужный сервер (он, правда, у нас пока только один), его необходимо выключить, а затем в меню "Еще действия" кликнуть на пункт "Клонировать".

Новый сервер называем, например, www2.

Хоть это и не очень необходимо, но просто для удобства - покупаем еще один IP в панели управления в разделе "IP & DNS" и привязываем его к новому серверу.

Включаем оба сервера.


Теперь у нас есть два независимых друг от друга сервера/сайта, никак не объединенные друг с другом. Начнем делать из них один кластер.

Предварительная подготовка

Для синхронизации файлов мы будем использовать утилиту csync2. Для ее работы требуются фиксированные имена (hostname) у всех серверов, которые участвуют в синхронизации.

Для двух наших виртуальных машин в Scalaxy были выделены внутренние IP-адреса: 10.1.1.1 и 10.1.1.2. Будем использовать именно их.

На первом сервере зададим hostname:

Код
# hostname www1.local

На втором:

Код
# hostname www2.local

На каждом сервере в файле /etc/hosts пропишем:

Код
10.1.1.1 www1.local
10.1.1.2 www2.local

Теперь мы можем использовать не только внутренние IP, но и имена www1.local и www2.local. При работе с этими адресами весь трафик будет идти по внутренним интерфейсам, что дает ряд преимуществ:
  • более высокая скорость передачи данных между серверами
  • в общем случае (не только в "Скалакси", а, например, еще в Amazon и других подобных сервисах) внутренний траффик не тарифицируется.

Настраиваем централизованный кэш

Для кэша мы будем использовать пул серверов memcached. (Подробно о кластерном кэшировании в платформе "1С-Битрикс" можно прочитать в блоге у моего коллеги - Александра Сербула.)

Параметры запуска демона memcached на каждой виртуальной машине можно задать в файле /etc/sysconfig/memcached. Мы оставим их такими, как они заданы по умолчанию.

На каждом сервере необходимо выполнить команды:

Код
# service memcached start
# chkconfig memcached on
Первая из них запускает сервер memcached. Вторая - указывает на то, что этот демон должен запускаться при старте виртуальной машины (например, после перезагрузки).

В административном интерфейсе "1С-Битрикс" в разделе "Настройки" - "Веб-кластер" - "Memcached" добавляем оба сервера:



После того, как оба сервера добавлены, в контекстном меню выбираем "начать использовать".



После этого вся система кэширования начинает использовать для хранения и получения данных не файловую систему сервера, а весь пул серверов memcached. В нашем случае их два, но на практике можно использовать любое количество.

Firewall


Мы запустили сервисы memcached на машинах, и они у нас "открыты всем ветрам". На порт memcached - 11211 - может обратиться кто угодно и откуда угодно. Что, конечно же, неправильно.

Добавим несколько правил в iptables, которые будут разрешать коннекты к нужным сервисам только с наших собственных IP (при чем - с внутренних интерфейсов), и ни с каких других.

На первом сервере (www1, 10.1.1.1):

Код
# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.1 --dport 3306 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.2 --dport 3306 -j ACCEPT
# iptables -A INPUT -p tcp --dport 3306 -j DROP

# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.1 --dport 11211 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p tcp --dport 11211 -j DROP

# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.1 --dport 30865 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.1 -s 10.1.1.2 --dport 30865 -j ACCEPT
# iptables -A INPUT -p tcp --dport 30865 -j DROP

На втором (www2, 10.1.1.2):

Код
# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.1 --dport 3306 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.2 --dport 3306 -j ACCEPT
# iptables -A INPUT -p tcp --dport 3306 -j DROP

# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.1 --dport 11211 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p tcp --dport 11211 -j DROP

# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.1 --dport 30865 -j ACCEPT
# iptables -A INPUT -p tcp -d 10.1.1.2 -s 10.1.1.2 --dport 30865 -j ACCEPT
# iptables -A INPUT -p tcp --dport 30865 -j DROP

Что мы сделали?

Разрешили соединения на порты 3306 (MySQL), 11211 (memcached), 30865 (csync2) только с локальных машин. С других адресов - запретили.

Обратите внимание, такие команды для iptables - только пример. На "живом" проекте вся конфигурация файрволла может быть иной.

Синхронизация файлов


Подробно о способах хранения контента и вариантах синхронизации данных можно прочитать здесь.

Мы же на практике будем использовать достаточно простую схему: на каждой виртуальной машине мы будем использовать локальное хранилище, а для синхронизации файлов на наших двух серверах мы будем использовать утилиту csync2.

К сожалению, ее нет в стандартных репозиториях CentOS (именно эта система используется в качестве основы виртуальной машины "1С-Битрикс" ). Поэтому стандартный путь установки ("yum install" ) не подойдет.

Можно устанавливать csync2 по-разному (например, собрав из исходников). Мы поставим эту утилиту следующим образом.

1. Устанавливаем необходимые доступные пакеты (библиотеки rsync используются в csync2, из xinetd будет запускаться серверная часть csync2):

Код
# yum install rsync librsync-devel xinetd
 
2. Устанавливаем libtasn1 - библиотеку для работы с X.509 (требуется для csync2):

Код
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/libtasn1-1.1-1.el5/libtasn1-1.1-1.el5.x86_64.rpm 
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/libtasn1-1.1-1.el5/libtasn1-devel-1.1-1.el5.x86_64.rpm 
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/libtasn1-1.1-1.el5/libtasn1-tools-1.1-1.el5.x86_64.rpm 
# rpm -ihv libtasn1-1.1-1.el5.x86_64.rpm libtasn1-devel-1.1-1.el5.x86_64.rpm libtasn1-tools-1.1-1.el5.x86_64.rpm

3. Устанавливаем sqlite (2-ой версии) - именно эта версия используется в csync2:

Код
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/sqlite2-2.8.17-1.el5/sqlite2-2.8.17-1.el5.x86_64.rpm 
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/sqlite2-2.8.17-1.el5/sqlite2-devel-2.8.17-1.el5.x86_64.rpm 
# rpm -ihv sqlite2-2.8.17-1.el5.x86_64.rpm sqlite2-devel-2.8.17-1.el5.x86_64.rpm

4. Устанавливаем непосредственно csync2:

Код
# wget http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/x86_64/csync2-1.34-4.el5/csync2-1.34-4.el5.x86_64.rpm 
# rpm -ihv csync2-1.34-4.el5.x86_64.rpm
csync2 установлен. Приступаем к его настройке.

Необходимо сгенерировать файл ключей. На машине www1 выполняем:

Код
# csync2 -k /etc/csync2/csync2.cluster.key

...и копируем полученный файл на машину www2.

Создаем одинаковые конфигурационные файлы - /etc/csync2/csync2.cfg - на обоих серверах:

Код
group cluster {
  host www1.local www2.local;

  key /etc/csync2/csync2.cluster.key;

  include /home/bitrix/www;

  exclude /home/bitrix/www/bitrix/cache;
  exclude /home/bitrix/www/bitrix/managed_cache;
  exclude /home/bitrix/www/bitrix/php_interface/dbconn.php;

  auto younger;
}
Будем синхронизировать полностью всю директорию с нашим веб-проектом за исключением директорий с файлами кэша (они уже не используются, кэш перенесен в memcached) и файла конфигурации (параметры подключения к базе и т.п.)

Теперь построим локальную базу всех файлов проекта, с которой работает csync2.

Если данные на серверах идентичны, можно использовать команду:

Код
# csync2 -cIr /

Мы выполняем именно ее, так как второй сервер клонирован из первого.

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

Код
# csync2 -cr /

Эта команда будет работать дольше, и при первом запуске синхронизации будут проверены на актуальность все данные (что тоже для первого раза будет работать достаточно долго, несколько минут).

Работа csync2 на каждом хосте состоит из двух частей - серверной и клиентской. Для запуска серверной части необходимо закомментировать (символом #) в файле /etc/xinetd.d/csync2 строку "disable = yes", перезапустить сервис xinetd и разрешить его запуск при загрузке системы:

Код
# service xinetd restart 
# chkconfig xinetd on

Клиентская часть - запуск csync2 с ключом "-x".

Можно определить (в зависимости от объема данных) необходимую частоту обновлений и прописать запуск csync2, например, через cron. Строка в /etc/crontab:

Код
*/5 * * * * root /usr/sbin/csync2 -x >/dev/null 2>&1
  
...означает запуск csync2 каждые 5 минут.

Что мы получили в итоге? На каждом сервере используется локальное хранилище (локальные диски). При этом все изменения (создание, удаление, редактирования файлов) на каждом сервере с достаточно высокой частотой синхронизируются на втором сервере.

На "живом" сайте может использоваться любое количество серверов, а не только два (как в нашем примере).

Переходим к MySQL

Механизм репликации в MySQL существует достаточно давно и используется на многих проектах.

Что дает поддержка этого механизма в веб-кластере "1С-Битрикс"?
  • Во-первых, возможность гибкого распределения нагрузки между разными серверами, участвующими в репликации (для каждого сервера можно задать "вес" ).
  • Во-вторых, вся нагрузка распределяется "по-умному" (запросы на запись - на master, запросы на чтение - на slave; если произошло важное изменения данных, а slave "отстает" (такое бывает, это - вполне штатная ситуация), запросы на чтение тоже будут идти на master; если отставание slave слишком велико, он временно отключается из схемы балансировки нагрузки).
  • В-третьих, поддержка репликации реализована на уровне API платформы "1С-Битрикс". Это значит, что разработчикам не требуется переделывать приложения или использовать какую-то новую сложную логику.
Подробнее об этом - здесь.

С теорией - ознакомились. Приступаем к практической реализации.

Комментируем в файле /etc/my.cnf строку:

Код
#bind-address          = 127.0.0.1
Иначе демон mysqld не разрешает коннекты снаружи.

Перезапускаем mysqld:

Код
# service mysqld restart

Создаем на обоих серверах в MySQL новых пользователей, которым будут разрешены соединения снаружи. В консоли mysql выполняем:

Код
mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> INSERT INTO `user` VALUES ('10.1.1.%','root',PASSWORD('TutNashSekretnyjParol'),'Y','Y','Y','Y','Y','Y','Y','
Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
Query OK, 1 row affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

В реальном проекте можно использовать меньший набор привилегий, но для тестов мы дадим их все.

На обоих серверах изменяем параметры соединения с базой - в файле /home/bitrix/www/bitrix/php_interface/dbconn.php указываем первый сервер:

Код
$DBType = "mysql";
$DBHost = "10.1.1.1";
$DBLogin = "root";
$DBPassword = "TutNashSekretnyjParol";
$DBName = "sitemanager0";

В административном интерфейсе "1С-Битрикс" в разделе "Настройки" - "Веб-кластер" - "Репликация" добавляем новый сервер через мастер подключения.

Он проверяет корректность всех настроек, необходимых для правильной работы MySQL в режими репликации. При первом запуске мы видим ряд замечаний:



Исправляем их все и повторно подключаем второй сервер. Все проверки проходят. Задаем параметры подключения:



В контекстном меню для второго сервера выбираем "Начать использование".

Новый мастер автоматически перенесет все данные из первой базы во вторую. В момент переноса будет остановлена публичная часть сайта:



После того, как перенос закончен, все запросы, создаваемые скриптами сайта, распределяются между двумя серверами (на "живом" проекте их может быть любое количество). Критерии распределения нагрузки можно задать для каждого сервера отдельно:



И что теперь?

Наш веб-кластер практически готов.

Последний шаг - нам нужно добиться того, чтобы все обращения посетителей на наш сайт распределялись между двумя серверами.

Самый простой и "дешевый" способ решить эту задачу - использовать механизм round robin DNS.

Для одного адреса (например, www.site.ru) можно прописать несколько IN A записей:

Код
www  IN A  xx.xx.xx.1 
www  IN A  xx.xx.xx.2

В этом случае DNS сервер в ответ на запрос разрешения имени в IP-адрес будет выдавать не один адрес, а весь список:

Код
# host www.site.ru
www.site.ru has address xx.xx.xx.1  
www.site.ru has address xx.xx.xx.2 

При этом с каждым новым запросом последовательность адресов в списке в ответе будет меняться. Таким образом клиентские запросы будут распределяться между разными адресами и будут попадать на разные серверы.

Использование round robin DNS - самый простой способ балансировки нагрузки, не требующий никаких дополнительных средств, однако он обладает целым рядом недостатков:

  • нет четкого критерия выбора IP из списка клиентом (может выбираться первый элемент, может кэшироваться последнее выбранное значение, возможны иные варианты) - все зависит от реализации конкретного клиента;
  • нет механизмов определения доступности узлов и возможности задания их "весов" - в случае аварии на одном или нескольких узлах кластера нагрузка будет продолжать распределяться между рабочими и вышедшими из строя нодами;
  • длительное время кэширования ответов DNS - в случае аварии и изменении тех или иных записей в DNS потребуется некоторое время (зависит от настроек DNS) для обновления данных на всех клиентах.
Если же мы все-таки останавливаемся на этом способе балансировки нагрузки, необходимо решить еще одну задачу: сессия каждого пользователя должна быть "прозрачной" для каждого сервера. Если клиент, например, авторизовался на одном сервере, а следующий его запрос попал на другой сервер, то он должен "знать" о том, что клиент уже авторизован.

Для этого можно использовать централизованное хранилище для данных сессий. В нашем случае - база данных. Включается хранение данных сессий в базе в разделе "Настройки" - "Веб-кластер" - "Сессии":



Если же мы хотим распределять нагрузку между узлами кластера "по-взрослому", мы можем, например, добавить еще одну виртуальную машину в панели управления "Скалакси", выбрать любой (знакомый и удобный для нас) дистрибутив Linux и установить один-единственный сервис - nginx. Например:

Код
# yum install nginx

Именно он хорошо и эффективно может выполнять роль балансировщика (а именно - для этих целей используется модуль ngx_http_upstream).

Если балансировка будет осуществляться средствами nginx, то в "Скалакси" можно использовать только один реальный (внешний) IP. Он должен быть привязан к серверу-балансировщику. А все обращения к нодам кластера будут осуществляться по внутренним адресам.

В простейшем примере конфигурационный файл nginx /etc/nginx/nginx.conf (помимо стандартных директив, определяющих, например, пути и формат log-файлов и т.п.) может быть таким:

Код
http { 
    upstream backend {
        ip_hash; 
     server www1.local; 
     server www2.local; 
    } 

    server { 
     listen   80; 
     server_name  load_balancer; 

     location / { 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $host:80; 

      proxy_pass  http://backend; 
     } 

    } 
}

В секции "upstream" задаются адреса серверов, между которыми будет распределяться нагрузка.

В DNS имя сайта указывается на тот IP, на котором работает сервер с nginx, распределяющем нагрузку.

Обратите внимание: мы указали директиву ip_hash. Она означает, что распределение между серверами будет основано на IP-адресах посетителей. Это будет гарантировать то, что все обращения от одного клиента будут попадать на один и тот же сервер.

Чем это может быть полезно? Например, тем, что в такой конфигурации можно отключить хранение сессий в базе (мы включили эту опцию при балансировании нагрузки с помощью DNS) и тем самым - снизить нагрузку на базу.

Итог


Мы с вами запустили наш веб-сайт на кластере из двух машин.

Что дает нам это на практике? Кластер только ради самого кластера не очень интересен. Важно понимать, какие практические задачи мы можем решить...

1. Хоть мы и собрали наш кластер только из двух машин, на самом деле мы научились "горизонтально" масштабировать наш проект на любое количество серверов.

В Scalaxy есть возможность "вертикального" масштабирования виртуальной машины до 64 слотов (32 Гб оперативной памяти), но и этого может оказаться мало для крупного серьезного проекта.

Если возможности "вертикального" масштабирования себя исчерпали, мы теперь можно просто добавлять к проекту нужное нам количество новых серверов. При чем можем размещать на них именно те ресурсы которые нам нужны: становится "узким" местом работа с базой - добавляем сервер под MySQL, не хватает application server'ов - добавляем машины под Apache+PHP. Необязательно на каждой машине дублировать всю конфигурацию.

2. Мы свели к минимуму вероятность (и время) простоя нашего сайта из-за какого-либо сбоя.

Если выходит из строя одна (или несколько) машин веб-кластера, все продолжает работать на оставшихся работающих серверах.

Некоторым "узким" местом остается выход из строя узла, на котором запущен master MySQL. В этом случае потребуется вручную перевести один из slave'ов в режим master и изменить параметры подключения к базе в файле dbconn.php. Однако даже в этом случае время "простоя" проекта будет сведено к минимуму (все операции можно выполнить в считанные минуты, что на порядки быстрее, например, восстановления из бэкапа). И даже эти операции можно автоматизировать (об этом постараемся подробнее написать в одном из следующих постов).

3. Любой толковый системный администратор знает, насколько важно регулярно создавать резервные копии всех данных. При этом важно помнить о массе нюансов: бэкапы должны быть максимально "свежими" (никому не хочется потерять результаты работы даже за несколько часов, например, если речь идет о заказах в интернет-магазине); резервные копии файлов и базы должны быть "синхроннными" и т.п.

В веб-кластере мы можем добавить в конфигурацию еще одну машину (достаточно слабой конфигурации) - бэкап-сервер. Реплицировать на него все данные (файлы, базу) так же, как на другие машины кластера. Но не включать его при этом в балансировку нагрузки.

Таким образом мы получим максимально актуальный бэкап всего веб-проекта.

* * *

Резюмируя, скажу еще об одной важной особенности веб-кластера "1С-Битрикс".

В нашем примере мы построили надежную производительную кластерную систему без использования дорогостоящих решений типа Oracle RAC (Real Application Cluster). Наше решение получилось дешевым за счет использования свободного ПО (Apache, PHP, MySQL), но при этом - эффективным. И, что не менее важно, вся конфигурация веб-системы получилась достаточно простой, и ее администрирование не требует специальных узкоспециализированных навыков.
2
Дудка Виталий
20.06.2011 21:05:12
Многое конечно непонятно пока сам не попробуешь, но читается как художественная литература.
Александр, спасибо за подробное описание.

В очередной раз убедился что платформу правильно выбрал smile:)
Ответить Ссылка 2
1
Владимир
21.06.2011 07:08:24
Сразу видно хороший продукт, чтобы завести сайт нам нужен кластер из двух машин с 16 ядрами на каждой.
Ответить Ссылка 1
1
Демидов Александр
21.06.2011 15:19:44
Владимир, "чтобы завести сайт нам нужен кластер" и "продукт на уровне самой платформы поддерживает кластеризацию" - чувствуете разницу?

Чтобы "завести сайт", хватит нормального хостинга за 300 рублей. Или вирт. машины/VPS с 512 Мб RAM (для вполне комфортной работы, а минимум - 256).

А вот когда вам понадобится отказоустойчивость и производительность под миллионы хитов - пожалуйста, вот поддержка кластера "прямо из коробки".
Ответить Родитель Ссылка 1
0
Долганин Антон
22.06.2011 17:08:17
Если хомячка не слышит больше никто кроме других хомячков, хомячок идет в тыл врага, взяв на вооружение искрометный юмор.
Ответить Родитель Ссылка 0
1
Михаил
21.06.2011 07:55:54
Что будет есть упадёт mysql-мастер/cktqd (т.е. просто погасить виртуалку сервера), на уровне кода поддерживает автоматическое определение доступности mysql серверов и выбор работающего?
Как будет после этого происходить синхронизация?

Используется ли репликация в memcached ?
Ответить Ссылка 1
2
Демидов Александр
21.06.2011 15:28:56
Если упадет slave, проект автоматически продолжит работу. Да, доступность MySQL slave'ов определяется автоматически на уровне кода.

Если упадет master, потребуется некоторое количество ручных операций (в посте все описано).

Репликация в memcached... А зачем? В memcached у нас хранятся не критичные (возобновляемые) данные. Дублировать их между разными серверами memcached нет необходимости. Лучше использовать весь объем доступной (суммарной) памяти на всех серверах.
Ответить Родитель Ссылка 2
0
Михаил
22.06.2011 06:32:58
Да, почитал документацию, плохо что мастер не переноситься автоматом, появляется точка отказа, и есть только холодный резерв. И так уже не мало логики перенесено в код, почему-бы не добавить и такую возможность?

Да хотя бы для сессий,  зареплицировал два memcache на разных серверах, и у вас теряющиеся в случае падения одного из серверов сессии. Чтобы у посетителя не складывалось впечатление - "Ложечки нашлись, но осадок остался".
Ответить Родитель Ссылка 0
1
Демидов Александр
22.06.2011 13:10:47
1. Про возможность восстановления системы после падения мастера - думаем. В том или ином виде - наверняка реализуем в будущем.

2. Сейчас пока сессии хранятся или на файловой системе, или в базе. Не в memcached. Там - только кэш.
Ответить Родитель Ссылка 1
0
Долганин Антон
22.06.2011 17:11:18
Александр, а касаемо посещаемости. Есть какие-то отчеты, тестирования, чтобы показать как спадает нагрузка (говоря простым языком, сайт начинает быстрее работать) при кластеризации? 
Все же это вторая важная составляющая веб-кластера, если не ошибаюсь smile:) 
Ответить Ссылка 0
0
Демидов Александр
22.06.2011 17:32:45
В конкретных цифрах пока нет.

Когда собирали тестовый кластер, получали примерно в 1.5 раза бОльшую суммарную производительность при добавлении аналогичного сервера.

В планах - сделать полноценные нагрузочные тесты. Как будут готовы, цифры обязательно покажем.
Ответить Родитель Ссылка 0
0
Кисляков Антон
25.06.2011 22:15:06
В зависимости от характера нагрузки на сайт. У нас на одном действующем веб-кластере бОльшая нагрузка на чтение, при подключении второй ноды производительность увеличилась минимум в два раза.
Ответить Родитель Ссылка 0
0
artickl
04.07.2011 07:41:19
А зачем так сложно с csync2? Особенно если используется CentOS в которой его нет в репах + зависимостей немерено (xinetd, sqllite и rsync) если можно просто обойтись ssh+rsync? Зачем так сложно и громоздко?
Ответить Ссылка 0
0
Демидов Александр
04.07.2011 11:33:44
Есть несколько причин, по которым csync2 удобнее.

1. Удобство добавления хостов. Что мы делаем со схемой ssh+rsync, если у нас становится 3, 5, N машин?

2. Больше гибкости при разрешении конфликтов (изменение одних и тех же файлов на разных нодах).

3. Актуализация данных при удалении файлов/директорий.
Ответить Родитель Ссылка 0
0
artickl
04.07.2011 14:31:48
1. Просто добавляем еще один хост в $HOSTS
=========================
#!/bin/sh

USER=sync1c
DIR="/var/www/bitrix"
EXCLUDE="cache/"
HOSTS=" host1 host2 host3 "
LOG="/tmp/log.sync"
MAIL=main@email.me
KEY="/etc/cluster.key"

rm $LOG

for HOST in $HOSTS; do
rsync --exclude=$EXCLUDE -avuzt -e "ssh -i $KEY" $DIR $USER@$HOST:$DIR 2>$LOG
done

if [ -s "$LOG" ]; then
cat $LOG | mail -s "AHTUNG!!!" $MAIL
fi
==========================
2. Решение конфликтов как-то не видно - просто перезаписывается файл последним 
rsync -u = csync2 auto younger

3. Не очень понял, что имелось в виду...

Такой скрипт так же в кроне повесить, делать будет тоже самое но без sqllite и остального + еще и емайл будет приходить, если что накрылось...

ИМХО не претендует на решение, просто не понял зачем так сложно было с установкой rpm'ок и зависимости такие тянуть за собой для простой задачи...

Хотя спасибо, буду знать что есть csync, для расширения кругозора.
Ответить Ссылка 0
0
Демидов Александр
04.07.2011 18:18:02
Конечно, возможны разные варианты. smile:)


3. Если мы удаляем файл на одном из хостов, как реплицировать эти изменения на остальные ноды?
Ответить Родитель Ссылка 0
0
Кисляков Антон
06.07.2011 19:46:48
Александр, возможно, маленькие поправки к тексту, чтобы у новичков не было конфузов.
disable=yes в конфигах /etc/xinetd.d/csync2 нужно закоментировать на всех нодах, иначе мастер не может отдать файлы слейвам, т.к. они попросту выключены.

Ответить Ссылка 0
0
Демидов Александр
07.07.2011 17:01:18
Хоть я и написал, что конфигурация - аналогичная на каждом сервере, наверное, действительно получилось не слишком очевидно.

Спасибо за замечание.
Ответить Родитель Ссылка 0
0
playnet
23.10.2011 12:00:32
Код
# vi /etc/yum.repos.d/freshrpms.repo
 
[freshrpms-cluster]
name=freshrpms cluster repo for csync2
baseurl=http://ftp.freshrpms.net/pub/freshrpms/redhat/testing/EL5/cluster/$basearch/
enabled=1
gpgcheck=0

Теперь yum install -y csync2. И не надо руками качать пакеты.Вопрос, как в 6 ставить, оно есть где-то штатно? Нет под рукой 6...
Ответить Ссылка 0
0
Демидов Александр
24.10.2011 12:00:14
Теперь можно еще проще - мы включили csync2 в новую вирт. машину и веб-окружение 3.0.
Ответить Родитель Ссылка 0

Цикл бесплатных семинаров
Формула компании: Что нужно хорошему бизнесу для роста?
Академия 1С-Битрикс: обучение, сертификация, онлайн-курсы