Участник:Rain/Заметки/Onyx: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
(Новая страница: «test»)
 
(save)
Строка 1: Строка 1:
test
Заметки по серверам для carid.com:
 
== Что хотелось бы сделать ==
 
=== Кодировки MySQL ===
 
Навести порядок с кодировками базы. Сейчас в настройках на большинстве серверов указан (или не указан, а используется старое дефолтное значение) latin1. При этом в коде явно указывается использовать юникод через <source lang=mysql>SET NAMES 'utf8'</source> (иначе бы не получалось сохранять всякие там "®" и прочие юникодные символы) - хотя кое-где стоит <source lang=mysql>SET NAMES 'latin1'</source> (но такие места не должны вызвать проблем). Т.е., реально настройки указываются одни, база в свойствах таблиц указывает latin1, а реально данные хранятся другие.<br>По-идее, в настройках сервера можно сходу указать правильные параметры подключения - это не должно сломать текущую логику работы; кодировка все равно задается через set names (но не уверен, что происходит при репликации). Для перехода на правильные настройки можно использовать следующий алгоритм:
** Прописать правильные настройки на Master-сервере
** Перевести slave-алиасы на мастер-сервер
** STOP SLAVE; на слейв-сервере
** Одновременно перезапускаем Master-сервер
** Заливаем дамп напрямую с Slave-сервера на Master-сервер, заменяя в потоке charset в дампе на юникодный и проверив, что льется юникодный поток.
** Снимаем уже правильный дамп с Master-сервера
** Настраиваем Slave-сервера на работу с юникодом
** Восстанавливаем работу Slave'ов
** Переключаем slave сайта на восстановленные слейвы.
 
=== InnoDB ===
 
Перевод базы на InnoDB. Считаю, что это решит текущую проблему с локами базы при смешной нагрузке. На данный момент сменить тип движка нельзя для следующих таблиц:
 
<pre>
Используется FULLTEXT:
 
xcart_categories_index
xcart_extra_field_values
xcart_make_model
xcart_order_details
xcart_order_messages
xcart_products
xcart_users_map
 
Ошибка при конвертации:
 
"ERROR 1075 (42000) at line 1: Incorrect table definition; there can be only one auto column and it must be defined as a key" в xcart_counters
 
</pre>
 
: с ошибкой разобраться, для остальных таблиц потенциально можно вынести поиск в отдельную маленькую таблицу, оставив ее в MyISAM (требует правки кода).
: Само по себе изменение должно пройти гладко; на время конвертации можно переключить Slave-сервера на мастер (т.к. мастер мощный, а слейв могут долго работать с таблицей; как следствие - отставание репликации). Помимо ликвидации табличных локов, это позволит держать всю базу в оперативной памяти, т.е., будет не особо важно, насколько быстрый диск (остальные параметры на тему сброса данных на диск можно потюнить).
: Момент, необходимый для рассмотрения - держать ли все таблицы в одном ibdata-файле или нет. С одной стороны работа с таблицами, разделенными по файлам проще (нагляднее, проще для восстановления, наглядно видно занимаемое и свободное место, можно мигрировать с диска на диск на ходу (а надо ли, если замена диска все равно подразумевает отключение сервера?) и т.п.), с другой - в случае использования одного файла можно указать в качестве файла полностью FIO Drive - без таблицы разделов (привет выравниванию) и без файловой системы (привет фрагментации).
 
: До этого момента рассматривать варианты, вроде перехода на MySQL-кластер или Percona-сервер - бред, так как первое, фактически - мультимастер-сервер с синхронной репликацией (и не самым хорошим движком), второе хорошо прежде всего XtraDB.
 
: После решения проблем подобных миграций при недостатке производительности (но не ранее) можно рассматривать переход на другие базы - на данный момент это MariaDB+XtraDB или Percona Server.
 
=== Memcached ===
 
Убрать единый сервер Memcached и создать собственный Memcached на каждом веб-сервере. Плюсы:
 
* Убираем единую точку отказа
* Убираем оверхед при перегонке мелких данных по сети.
 
Недостаток такого варианта - выделение памяти на каждом сервере. На деле из 36 Гб на веб-серверах используется 2-3 Гб. Memcached за долгое время набрал данных лишь на 8 Гб (на данный момент - 13), из них многое - из-за постоянных тестов. Эффективность кэша на момент 8 Гб - порядка 80 процентов, что мало. Итого, если выделить даже по 16 Гб на каждом сервере - этого с головой хватит и для веб-сервера, и для memcached.
 
Варианты реализации:
 
* Репликация данных: не затрагивает приложение, но repcached на данный момент умеет работать только в режиме master<->master или мастер с несколькими клиентами (кстати, пробовал репликацию цепочкой - не взлетело, да и не является отказоустойчивым). Для наших трех серверов не подходит. Из того, что протестировал между двумя серверами - плюс в том, что при восстановлении сервера реплицируются все данные, т.е., снова разогревать кэш не придется.
* Использовать средства приложения: Богдан говорит, что приложение при легкой правке кода может принимать массив серверов, при этом можно указывать их вес (т.е., для 127.0.0.1 указать максимальный приоритет, для других узлов - меньший).
 
== Разное ==

Версия 13:20, 27 февраля 2012

Заметки по серверам для carid.com:

Что хотелось бы сделать

Кодировки MySQL

Навести порядок с кодировками базы. Сейчас в настройках на большинстве серверов указан (или не указан, а используется старое дефолтное значение) latin1. При этом в коде явно указывается использовать юникод через

SET NAMES 'utf8'

(иначе бы не получалось сохранять всякие там "®" и прочие юникодные символы) - хотя кое-где стоит

SET NAMES 'latin1'

(но такие места не должны вызвать проблем). Т.е., реально настройки указываются одни, база в свойствах таблиц указывает latin1, а реально данные хранятся другие.
По-идее, в настройках сервера можно сходу указать правильные параметры подключения - это не должно сломать текущую логику работы; кодировка все равно задается через set names (но не уверен, что происходит при репликации). Для перехода на правильные настройки можно использовать следующий алгоритм:

    • Прописать правильные настройки на Master-сервере
    • Перевести slave-алиасы на мастер-сервер
    • STOP SLAVE; на слейв-сервере
    • Одновременно перезапускаем Master-сервер
    • Заливаем дамп напрямую с Slave-сервера на Master-сервер, заменяя в потоке charset в дампе на юникодный и проверив, что льется юникодный поток.
    • Снимаем уже правильный дамп с Master-сервера
    • Настраиваем Slave-сервера на работу с юникодом
    • Восстанавливаем работу Slave'ов
    • Переключаем slave сайта на восстановленные слейвы.

InnoDB

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

Используется FULLTEXT:

xcart_categories_index
xcart_extra_field_values
xcart_make_model
xcart_order_details
xcart_order_messages
xcart_products
xcart_users_map

Ошибка при конвертации:

"ERROR 1075 (42000) at line 1: Incorrect table definition; there can be only one auto column and it must be defined as a key" в xcart_counters

с ошибкой разобраться, для остальных таблиц потенциально можно вынести поиск в отдельную маленькую таблицу, оставив ее в MyISAM (требует правки кода).
Само по себе изменение должно пройти гладко; на время конвертации можно переключить Slave-сервера на мастер (т.к. мастер мощный, а слейв могут долго работать с таблицей; как следствие - отставание репликации). Помимо ликвидации табличных локов, это позволит держать всю базу в оперативной памяти, т.е., будет не особо важно, насколько быстрый диск (остальные параметры на тему сброса данных на диск можно потюнить).
Момент, необходимый для рассмотрения - держать ли все таблицы в одном ibdata-файле или нет. С одной стороны работа с таблицами, разделенными по файлам проще (нагляднее, проще для восстановления, наглядно видно занимаемое и свободное место, можно мигрировать с диска на диск на ходу (а надо ли, если замена диска все равно подразумевает отключение сервера?) и т.п.), с другой - в случае использования одного файла можно указать в качестве файла полностью FIO Drive - без таблицы разделов (привет выравниванию) и без файловой системы (привет фрагментации).
До этого момента рассматривать варианты, вроде перехода на MySQL-кластер или Percona-сервер - бред, так как первое, фактически - мультимастер-сервер с синхронной репликацией (и не самым хорошим движком), второе хорошо прежде всего XtraDB.
После решения проблем подобных миграций при недостатке производительности (но не ранее) можно рассматривать переход на другие базы - на данный момент это MariaDB+XtraDB или Percona Server.

Memcached

Убрать единый сервер Memcached и создать собственный Memcached на каждом веб-сервере. Плюсы:

  • Убираем единую точку отказа
  • Убираем оверхед при перегонке мелких данных по сети.

Недостаток такого варианта - выделение памяти на каждом сервере. На деле из 36 Гб на веб-серверах используется 2-3 Гб. Memcached за долгое время набрал данных лишь на 8 Гб (на данный момент - 13), из них многое - из-за постоянных тестов. Эффективность кэша на момент 8 Гб - порядка 80 процентов, что мало. Итого, если выделить даже по 16 Гб на каждом сервере - этого с головой хватит и для веб-сервера, и для memcached.

Варианты реализации:

  • Репликация данных: не затрагивает приложение, но repcached на данный момент умеет работать только в режиме master<->master или мастер с несколькими клиентами (кстати, пробовал репликацию цепочкой - не взлетело, да и не является отказоустойчивым). Для наших трех серверов не подходит. Из того, что протестировал между двумя серверами - плюс в том, что при восстановлении сервера реплицируются все данные, т.е., снова разогревать кэш не придется.
  • Использовать средства приложения: Богдан говорит, что приложение при легкой правке кода может принимать массив серверов, при этом можно указывать их вес (т.е., для 127.0.0.1 указать максимальный приоритет, для других узлов - меньший).

Разное