27 Фев

Check syntax my.cnf

У httpd есть замечательный параметр в init-скрипте configtest.
У nginx’а есть еще более замечательный nginx -t (да и nginx -s reload все расскажет без даунтайма).
А вот mysql подобным инструментом обделили.

Но способ есть. Вносим лбые изменения в my.cnf и без каких-либо рестартов и логов проверяем:

 # /usr/sbin/mysqld --help

[ERROR] /usr/sbin/mysqld: unknown variable 'mysql_blabla=1'
[Warning] The syntax '--log-slow-queries' is deprecated and will be removed in a future release.
Please use '--slow-query-log'/'--slow-query-log-file' instead.
16 Авг

Балансируем в nginx

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

Сперва теория.
В данном конкретном случае я разберу вопрос балансировки нагрузки за счет распределения проксирования запросов между несколькими бекендами, расположенными физически на различных серверах, ДЦ или странах (здесь это не имеет значения).
Схема предельно проста, как-то так:

Запросы от посетителей Nginx проксирует бекендам (apache, fpm, fastcgi, etc…) случайным или конкретно определенным образом, распределяя этим самым все запросы между несколькими серверами.
Допустим, у нас есть 3 бекенда, между которыми нам необходимо распределить нагрузку и перебрасывать все запросы. Назовем эти сервера, допустим, backend1.srv.net, backend2.srv.net и backend3.srv.net соответственно (можно и просто IP-адреса указать). Теперь лезем в любимый nginx.conf и описываем эти сервера следующим образом:

upstream backendCloud {
  server backend1.srv.net;
  server backend2.srv.net;
  server backend3.srv.net;
}

Этим самым мы дали имя нашему апстриму из трех серверов backendCloud. Самое главное, что теперь мы без проблем можем использовать это имя в параметре proxy_pass, чтобы перебрасывать все запросы туда. Работает это по принципу round-robin — nginx будет перемешивать случайным образом список серверов в апстриме каждый раз при запросе к нему, отсылая все запросы на них случайным образом.
В конфиге это будет выглядить примерно так:

server {
  listen x.x.x.x:80;
  location / {
    proxy_pass http://backendCloud;
  }
}

На этом, пожалуй, можно и остановиться (что многие и делают, почему-то), но не все так радужно.
Дело в том, что в такой схеме есть немало минусов — конечно, все зависит от конкретного проекта, но я рассмотрю пару частых случаев.
Допустим, в клиентском проекте существует система авторизации, что подразумевает работу сессий. Что произойдет в этом случае? А произойдет то, что сперва вы авторизуетесь на первом бекенде, который создаст у себя все необходимые сессии, а затем следующим запросом nginx перебросит вас на другой бекенд, который про ваши сессии ничего не знает. И вам придется авторизовываться снова. Бред? Бред! Но Nginx имеет возможность привязывать клиентов по их ip-адресам (ну ладно, по ip-хешам) к определенному бекенду до окончания сессии. Делается это очень просто одним параметром ip_hash:

upstream backendCloud {
  ip_hash;
  server backend1.srv.net;
  server backend2.srv.net;
  server backend3.srv.net;
}

В моем недавнем случае бекенды были не одинаковыми серверами и очень сильно отличалиь друг от друга в плане системных ресурсов. Опытным путем было решено, что нет смысла пытаться распределять между ними нагрузку равномерно, иначе один сервер буден задействован на долю возможностей, а другой, наоборот, будет пыхтеть на пределе своих сил. Курение доков обрадовали — в описании апстрима можно указывать своего рода «вес» бекендам. То есть, указывать nginx’у, на какие бекенды запросы можно отправлять чаще, а на какие реже, а какие вообще временно исключить из апстрима (например, на момент тестирования и прочих проверок). Пример:

upstream backendCloud {
  ip_hash;
  server backend1.srv.net;
  server backend2.srv.net weight=3;
  server backend3.srv.net down;
  server backend4.srv.net weight=2;
}

И что мы наделали? Третий бекенд мы временно исключили из апстрима (можно, конечно, просто удалить всю его строку, но это лучше делать только если вы и не собираетесь его возвращать больше в строй), на первый бекенд nginx спроксирует первого посетителя, затем на второй бекенд 3 посетителей и на четвертый двоих. После этого — сначала и так постоянно по кругу.

Во всей этой схеме есть один нюанс, который обязательно стоит учесть — представим, что внезапно один из бекендов упал и более недоступен. Если nginx не смог до него достучаться, он отправит запрос на обработку следующему бекенду. Небольшая задержка — ничего страшного, но проблема в том, что она будет до тех пор, пока не станет доступен упавший сервер, поскольку nginx по составленным правилам постоянно будет пытаться его проверять, что в итоге при большой посещаемости просто будет раздражать как клиентов, так и сам балансировщик, загружая его ненужными постоянными проверками. Обходится эта проблема очень просто и красиво. При помощи директивы max_fails можно указать максимально-допустимое количество неудачных попыток подключения к бекенду, после чего он будет считаться нерабочим и запросы к нему прекратятся. По умолчанию значение этого параметра равно единице, то есть после одной неудачной попытки Nginx на определённое время прекратит попытки новых подключений с нерабочему серверу. Это время определяется параметром fail_timeout, по умолчанию значение которого равно 10 секундам.

upstream backendCloud {
  ip_hash;
  server backend1.srv.net max_fails=3 fail_timeout=120;
  server backend2.srv.net weight=3;
  server backend3.srv.net down;
  server backend4.srv.net weight=2;
  server backend5.srv.net backup;
}

Попутно я указал пятый бекенд — в моем случае это был просто самый слабый сервер. Директивой backup я указывал nginx’у, что на него он может отправлять запросы исключительно в том случае, если все остальные бекенды оказались недоступны. Этим самым, просто сделал пятый бекенд резервным.

30 Май

Сравнение Android и iOS

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

В первую очередь, эти две Операционные системы различаются своей идеологией и политикой установки и распространения. iOS изначально создана закрытой системой, в то время как Android — открытая бесплатная система, где каждый, кто ставит ее на свои устройства, может вносить в нее любые изменения и подстраивать под свои устройства, цели и задачи.

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

iOS — закрытая операционная система, полные права на которую имеет только производитель. Он же вам и предоставляет конечный продукт, проверяя досконально всю систему перед выпуском релиза или записи ее на устройство. Зато iOS существует только на устройствах компании Apple, и нигде больше. Но и здесь есть свои преимущества — система полностью «вылизана» и работает идеально на данном устройстве. Особенно если учесть, что сами устройства выпускает тоже только Apple и знает, как и что на нем должно работать.

Что же касается приложений для обеих платформ — на сегодняшний день приложений для iOS существует на порядок больше, чем для Android. Но и второй тут не отстает — приложений уже много сотен тысяч и цифра увеличивается постоянно. Я думаю, не за горами день, когда их численность сравняется — тут речь уже буквально о паре десятков тысяч приложений, если не меньше.
Apple очень строго следит за теми приложениями, которые разработчики стремятся поместить в AppStore, благодаря чему приложения обычно очень стабильно работают и безопасны для владельцев Apple-девайсов.
В Android-market все приложения тоже проходят определенного рода проверку, но все чаще и чаще можно встретить совершенно бесполезные приложения, цель которых — распространения спама с рекламой или, того хуже, сбор приватных данных с вашего телефона. Тут стоит вспомнить, что большинство пользователей хранят на телефонах данные своих кредитных карточек для оплаты тех или иных приложений и эти данные необходимо хранить самым тщательным образом.

В Android’е приложения гораздо чаще могу зависнуть, упасть, заглючить или вовсе не запуститься. Связано это не столько с политикой проверки приложений, сколько как раз с открытостью самой платформы. Объясню немного подробней. Поскольку iOS существует только для конкретных девайсов, которых весьма малое количество (iPhone, iPad, iPod Touch), то автоматически отпадает такое явление «зоопарка», как в случае с Android-устройствами. Это относится к вопросу самой платформы и ее обновлениям — железо у каждого устройства свое и девайсов с Android’ом на рынке существует такое количество, что лично я не рискну дать им хоть примерную цифру. Думаю, не ошибусь, если скажу, что их тысячи. А любой должен понимать, что пока не существует такого программного обеспечения, которое может одинаково стабильно работать на любом аппарате.
Что касается обновлений — тут есть некая печаль со стороны Android-устройств. Никто вам не гарантирует, что новый релиз Android’а не просто будет работать на вашем телефоне, а будет ли для него вообще выпущен! Вышел новый релиз андройда — про старый можно забыть — никто не станет его далее сопровождать и развивать для вашего телефона, а новый релиз на нем может просто не работать по ряду причин — начиная от производительности железа и заканчивая прихотью разработчиков. Не нравится — покупайте новый телефон с более мощным железом. Или ищите на просторах интернета альтернативные прошивки для вашего устройства, что убьет гарантию сервисного обслуживания вашего телефона на корню и принесет с собой еще пучек проблем.

Поговорим о финансовой стороне дела.

Тут неоспоримые плюсы у Android-устройств — Apple-устройства обычно дороже, нежели устройства с Android’ом на борту. В России устройства от Apple стоят обычно в районе $1000 и выше, в то время как Andoid’офоны можно купить по цене от $100 до $1500 — на ваш вкус и выбор.
С приложениями дела не немного отличаются — для Android-устройств бесплатных приложений на порядок больше, чем платных, но эта разница день ото дня все менее очевидна из-за быстрого роста их числа.
Многие переживают, что купив Apple-девайс, придется и дальше раскошеливаться на любые приложения — но это все лишь преувеличения. Разработчики самых популярных приложений на сегодняшний день пишут свои программы сразу для обеих платформ. И для обеих платформ их ценовая политика в 99% случаев совершенно одинакова — либо бесплатное и для iOS и для Android, либо одинаковый ценник и там и там. И в iOS и в Android’е бесплатных приложений много-много десятков, а то и сотен тысяч — на любой вкус каждому потребителю.

Еще одна очень крупная и немаловажная сторона рынка мобильного контента — это, конечно же, музыка.
В AppStore уже очень давно музыкальная база имеет порядка более 200 миллионов музыкальных произведений. Которые вы можете выбрать на свой вкус и купить там же совершенно легально. Google тоже идет к этому, но по сей день для владельцев гуглофонов это проблема. Не скажу, что владельцы Android-телефонов сильно переживают по этому поводу, поскольку они, как и, вобщем-то, iOS-поклонники, без зазрения совести могут скачать любую музыку бесплатно и скопировать на свой девайс. В особенности это касается стран «левого» полушария.

Многие поклонники Android-девайсов любят касаться и, почему-то, радоваться тому факту, что для их устройств существует flash и работает весьма сносно. Не знаю, хорошо это или плохо, но немного подробней я этого вопроса тоже хотел бы коснуться.
Когда-то между Apple и Adobe возник определенный конфликт и на сегодняшний день для Apple-устройств Flash не существует — такова политика Apple. Не уверен, что это минус для Apple, а не для Adobe, но ничего не поделать, факт есть факт — на Apple-девайсах вы можете забыть про все то, что связано с adobe flash! Google тоже все это прекрасно понимает и уже давно тот же youtube можно использовать вообще без flash’а — там адекватно работает html5.

Далее. Для iOS-устройств сегодня существует огромное количество различных гаджетов и приспособлений. Начиная от отличных док-станций и заканчивая радиоуправляемыми игрушками и сумочек с чехлами и корпусами. Android пока этим похвастаться не сможет, поскольку пока ни один конкретный телефон из этого огромного «зоопарка» не выделился, а придумать аппаратное дополнение, которое бы подходило для любого телефона просто нереально.

Мое мнение.

Я использовал телефон от HTC с Android’ом чуть больше двух лет. Плюс, очень часто работал с другими телефонами с тем же андройдом — как с устревшими, так и с совсем новыми. Но в итоге я все-равно купил себе iPhone c iOS и менять свой выбор не намерен.
Не буду упрекать Google или сильно хвалить Apple, но мне гораздо больше нравится строгость приложений iOS’а, их стабильность, безопасность и надежность.
Да, в андройде есть весьма интересные и полезные виджеты, которые отсутствуют в iOS, но я пока как-то не страдал от их отсутствия и даже не задумывался об их существовании.
Многие гордятся тем, что любое устройство с Android’ом можно настроить, как душе угодно, начиная от его рабочего окружения и заканчивая иконками и обоями. Возможно, я уже вышел с того возраста, когда для меня это было хоть немного интересным, а возможно, что в iOS этого просто не нужно, поскольку в ней все изначально все работает прекрасно и радует глаз. Опять же — jailbreak+external-firmware решает и эту проблему, но лично я ей не заморачивался.
Флешем я не пользовался и на андройде, а заплатить $0.99 за отличную игру или программу — это, согласитесь, копейки.
Основной минус — это цена, конечно. Но тут достаточно посмотреть на последние модели Android-устройств, где, к примеру, Samsung Galaxy III стоит еще и дороже iPhone. А последние новинки лидера на рынке Android-телефонов HTC от Samsung’а не слишком отстает.

Выводы.

Если вы хотите выиграть в цене — Android-телефоны — ваш выбор, безусловно. То же относится и к выбору самого девайса — если любите выбирать все под себя, начиная от самого телефона и заканчивая различными украшательствами.
Если же вам нужен аппарат, включив который вы знаете, что у вас все будет работать сразу без дополнительных телодвижений и нервов — то iOS-устройства вам, однозначно, подойдут больше. Хоть и заплатить за это вам, скорее всего, потребует чуть-чуть больше.