Рекомендации по настройке MySQL

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
Строка 41: Строка 41:
max_connections=1000
max_connections=1000
#
#
 +
memlock
table_cache=4096
table_cache=4096
-
thread_cache_size=384
+
thread_cache_size=300
-
thread_concurrency=12
+
thread_concurrency=2
</pre>
</pre>
Опции:
Опции:
* '''datadir''' - каталог для хранения БД, лучше если это будет отдельный диск (RAID); высокие требования по надёжности и скорости.
* '''datadir''' - каталог для хранения БД, лучше если это будет отдельный диск (RAID); высокие требования по надёжности и скорости.
-
* '''tmpdir''' - каталог для хранения временных файлов, лучше сделать отдельным быстрым диском; невысокие требования по надёжности, высокие по скорости.
+
* '''tmpdir''' - каталог для хранения временных файлов, лучше сделать отдельным быстрым диском; невысокие требования по надёжности, высокие по скорости; можно использовать RAM диск.
* '''socket''' - файловый сокет, возможность подключения консольным клиентом.
* '''socket''' - файловый сокет, возможность подключения консольным клиентом.
* '''user''' - пользователь ОС, под которым запускается БД.
* '''user''' - пользователь ОС, под которым запускается БД.
Строка 58: Строка 59:
* '''max_allowed_packet''' - максимальный размер пакета с запросом, принимаемого сервером.
* '''max_allowed_packet''' - максимальный размер пакета с запросом, принимаемого сервером.
* '''max_connections''' - ограничение на максимальное число соединений с БД.
* '''max_connections''' - ограничение на максимальное число соединений с БД.
 +
* '''memlock''' - запрет на перенос процесса mysqld в свап.
* '''table_cache''' - максимальное количество описаний структур открытых таблиц в кэше.
* '''table_cache''' - максимальное количество описаний структур открытых таблиц в кэше.
 +
* '''thread_cache_size''' - размер кэша потоков для предотвращения их повторного создания.
 +
* '''thread_concurrency''' - число одновременно работающих потоков, рекомендуется ставить 2 * '''количество CPU''' + количество дисков.
Запрещается установка опции '''skip-networking''', т.к. Java приложение подключается к серверу с использованием TCP протокола, а не через файловый сокет.
Запрещается установка опции '''skip-networking''', т.к. Java приложение подключается к серверу с использованием TCP протокола, а не через файловый сокет.
Строка 66: Строка 70:
innodb_file_per_table
innodb_file_per_table
#
#
-
innodb_log_group_home_dir = /storage/mysql/
+
innodb_log_group_home_dir = /var/lib/mysql/
innodb_buffer_pool_size = 1G
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 16M
innodb_additional_mem_pool_size = 16M
-
innodb_log_buffer_size = 8M
+
#
-
innodb_log_file_size = 128M
+
innodb_log_files_in_group = 2
innodb_log_files_in_group = 2
-
innodb_max_dirty_pages_pct = 90
+
innodb_log_file_size = 128M
 +
innodb_log_buffer_size = 8M
innodb_lock_wait_timeout = 120
innodb_lock_wait_timeout = 120
#
#
innodb_thread_concurrency = 2
innodb_thread_concurrency = 2
innodb_flush_log_at_trx_commit = 2
innodb_flush_log_at_trx_commit = 2
-
##Khadimulin
+
innodb_flush_method = O_DIRECT
-
#innodb_flush_method = O_DIRECT
+
##
##
</pre>
</pre>
Строка 84: Строка 87:
Опции:
Опции:
* innodb_file_per_table - для возможности использования [[Database_backup | Backup базы с помощью snapshot'ов (Linux, LVM)]] в ОС LINUX.
* innodb_file_per_table - для возможности использования [[Database_backup | Backup базы с помощью snapshot'ов (Linux, LVM)]] в ОС LINUX.
-
* innodb_buffer_pool_size - он должен составлять порядка 70-80 % от общей памяти сервера, это размер буфера под все нужды.
+
* innodb_log_group_home_dir - путь к каталогу под журнал транзакций, лучше если это будет отдельный диск; высокие требования по скорости и надёжности, низкие по объёму.
-
* innodb_thread_concurrency - число потоков, рекомендуется ставить 2 * <количество CPU> + количество дисков.
+
* innodb_buffer_pool_size - размер буфера под все нужды, он должен составлять порядка 70-80 % от общей памяти сервера БД.
-
*
+
* innodb_additional_mem_pool_size - параметр можно не изменять, размер буфера под доп. цели.
-
</pre>
+
* innodb_log_files_in_group - количество файлов журналов транзакций в группе журналов; InnoDB производит запись в файлы по круговому способу; увеличение ускоряет запись но тормозит восстановление информации в случае сбоя.
-
 
+
* innodb_log_file_size - размер каждого файла журнала в группе журналов (указывается в мегабайтах).
-
innodb_flush_method = O_DIRECT
+
* innodb_log_buffer_size - размер буфера, который в InnoDB используется для записи информации файлов журналов на диск.
-
которая отключает двойную буферизацию (самим mysql и ОС).
+
* innodb_lock_wait_timeout - время простоя (в секундах), на протяжении которого транзакция InnoDB может ожидать прекращения блокировки прежде, чем будет произведен откат.
 +
* innodb_thread_concurrency - должно совпадать с '''thread_concurrency'''; число одновременно работающих потоков, рекомендуется ставить 2 * '''количество CPU''' + количество дисков.
 +
* innodb_flush_log_at_trx_commit - 2 отменяет сброс данных на диск при каждой транзакции, ускорение работы.
 +
* innodb_flush_method - O_DIRECT отключает двойную буферизацию (самим mysql и ОС).
== Секция mysqld - параметры MyIsam если используется (например, для некритичных таблиц) ==
== Секция mysqld - параметры MyIsam если используется (например, для некритичных таблиц) ==
<pre>
<pre>
-
key_buffer_size = 5G
+
key_buffer_size = 1G
-
read_buffer_size = 2M
+
myisam_recover
-
read_rnd_buffer_size = 16M
+
-
bulk_insert_buffer_size = 64M
+
-
myisam_sort_buffer_size = 1G
+
-
myisam_max_sort_file_size = 10G
+
myisam_repair_threads = 1
myisam_repair_threads = 1
-
myisam_recover
 
myisam_data_pointer_size = 6
myisam_data_pointer_size = 6
</pre>
</pre>
 +
Опции:
 +
* '''key_buffer_size''' - размер кэша для хранения индексов;
 +
* '''myisam_recover''' -восстановление битых таблиц при старте сервера.
 +
* myisam_repair_threads - число потоков восстановления.
 +
* myisam_data_pointer_size - возможность создания больших первичных ключей в таблицах.
 +
== Секция mysqld - параметры репликации, если используется ==
 +
<pre>
 +
server-id=1
 +
log-bin=/var/lib/mysql-binlog/mysql-bin
 +
expire_logs_days=3
 +
replicate-do-db=bgbilling
 +
relay-log-space-limit = 10G
 +
</pre>
 +
 +
Опции:
 +
* '''server-id''' - идентификатор сервера.
 +
* '''log-bin''' - место хранение bin-логов; лучше если это будет отдельный диск, высокие требования по скорости и надёжности, малые по объёму.
 +
* '''expire_logs_days''' - автоматическое удаление старых bin-логов.
 +
* '''replicate-do-db''' - реплицируемая БД.
 +
* '''relay-log-space-limit''' - ограничение на объём bin-логов.
== Секция mysqld_safe ==
== Секция mysqld_safe ==
Строка 121: Строка 142:
* '''log-error''' - файл для логирования ошибок.
* '''log-error''' - файл для логирования ошибок.
* '''pid-file''' - PID файл процесса.  
* '''pid-file''' - PID файл процесса.  
-
 
-
*********************************************************************
 
-
 
-
Внимательно проверяйте по документации все устанавливаемые опции в my.cnf, запрещается установка в параметре
 
-
Запрещается установка опции '''skip-networking''', т.к. Java приложение подключается к серверу с использованием TCP протокола, а не через файловый сокет.
 
-
 
-
Возможный вариант конфигурации:
 
-
 
-
 
-
sort_buffer_size=8M
 
-
join_buffer_size=8M
 
-
 
-
#x0.25
 
-
query_cache_size = 64M
 
-
query_cache_limit = 2M
 
-
query_cache_type = 1
 
-
memlock
 
-
tmp_table_size = 1G
 
-
max_heap_table_size = 512M
 
-
#x16
 
-
 
-
wait_timeout = 28800
 
-
 
-
 
-
# replication
 
-
server-id=1
 
-
replicate-same-server-id=0
 
-
log-bin=/var/lib/mysql-binlog/mysql-bin
 
-
expire_logs_days=3
 
-
replicate-do-db=bgbilling
 
-
relay-log-space-limit = 10G
 
-
relay-log=mysqld-relay-bin
 
-
 
-
 
-
 
-
# misc
 
-
default-character-set=cp1251
 
-
default-collation=cp1251_general_ci
 
-
 
-
[mysqld_safe]
 
-
log-error=/var/log/mysqld.log
 
-
pid-file=/var/run/mysqld/mysqld.pid
 
-
open-files-limit=32000
 
-
 
-
[mysql.server]
 
-
user=mysql
 
-
basedir=/var/lib
 
-
 
-
[client]
 
-
default-character-set=cp1251
 
-
</pre>
 
В качестве примера конфигурации вы также можете использовать примеры конфигурации MySQL ('''/usr/share/mysql/my-innodb-heavy-4G.cnf''').
В качестве примера конфигурации вы также можете использовать примеры конфигурации MySQL ('''/usr/share/mysql/my-innodb-heavy-4G.cnf''').
-
Ссылки с рекомендациями по настройке InnoDb базы:
+
Ссылки:  
-
* [http://maxq.ru/lib/53/ http://maxq.ru/lib/53/]
+
* [http://mysql.ru/docs/man/ http://mysql.ru/docs/man/] - общее руководство по администрированию.
-
* [http://www.mysql.ru/docs/man/InnoDB_start.html http://www.mysql.ru/docs/man/InnoDB_start.html]
+
* [http://mysql.ru/docs/man/InnoDB_start.html http://mysql.ru/docs/man/InnoDB_start.html] - параметры настройки InnoDb.
 +
* [http://mysql.ru/docs/man/Replication_Options.html http://mysql.ru/docs/man/Replication_Options.html] - параметры настройки репликации.
 +
* [http://maxq.ru/lib/53/ http://maxq.ru/lib/53/] - рекомендации по настройке InnoDb базы, MyIsam базы.
Если вы обновляете базу биллинга с MyIsam таблицами, вы можете произвести конвертацию в ОС LINUX по примерно такой методике:
Если вы обновляете базу биллинга с MyIsam таблицами, вы можете произвести конвертацию в ОС LINUX по примерно такой методике:
Строка 193: Строка 165:
Для транзакционной работы они не критичны. Достаточно, что в последующие месяцы эти таблицы также будут создаваться в формате InnoDb. Также можно предварительно отработать конвертацию таблиц на стороннем MySQL сервере.
Для транзакционной работы они не критичны. Достаточно, что в последующие месяцы эти таблицы также будут создаваться в формате InnoDb. Также можно предварительно отработать конвертацию таблиц на стороннем MySQL сервере.
-
== Пример конвертации. ==
+
== Пример конвертации ==
-
 
+
Задача сконвертировать базу, имеется два сервера с настроенной репликацией.
Задача сконвертировать базу, имеется два сервера с настроенной репликацией.
Решение:
Решение:

Версия 07:25, 17 ноября 2011

База MySQL данных должна быть настроена с поддержкой транзакций. Для биллинга версий от 5.2 и старше это требование обязательно, т.к. транзакции используются для отката результатов неудавшихся операций.

Рассмотрим рекомендуемую конфигурацию по фрагментам. Полная конфигурация получается объединением фрагментов.

Содержание

Секция mysqldump

[mysqldump]
max_allowed_packet=50M
default-character-set=cp1251

Опции:

  • max_allowed_packet - установка маскимально возможного размера пакета при снятии дампов утилитой mysqldump.
  • default-character-set - кодировка по-умолчанию при снятии дампов БД.

Секция client

[client]
default-character-set=cp1251

Опции:

  • default-character-set - кодировка по-умолчанию при подключении консольным клиентом.

Секция mysqld - общие параметры

[mysqld]
datadir=/var/lib/mysql
tmpdir = /tmp
socket=/var/lib/mysql/mysql.sock
user=mysql
log-slow-queries=/var/log/slowquery.log
#
default-storage-engine = innodb
default-character-set=cp1251
default-collation=cp1251_general_ci
sql-mode=
#
max_allowed_packet=50M
max_connections=1000
#
memlock
table_cache=4096
thread_cache_size=300
thread_concurrency=2

Опции:

  • datadir - каталог для хранения БД, лучше если это будет отдельный диск (RAID); высокие требования по надёжности и скорости.
  • tmpdir - каталог для хранения временных файлов, лучше сделать отдельным быстрым диском; невысокие требования по надёжности, высокие по скорости; можно использовать RAM диск.
  • socket - файловый сокет, возможность подключения консольным клиентом.
  • user - пользователь ОС, под которым запускается БД.
  • log-slow-queries - логирование запросов, выполняющихся длительное время.
  • default-storage-engine - тип хранилища таблиц по-умолчанию, InnoDB - транзакционный тип хранилища.
  • default-character-set - кодировка по-умолчанию для вновь создаваемых таблиц.
  • default-collation - collation (порядок букв, используется при сортировке) по-умолчнию для вновь создаваемых таблиц.
  • sql-mode - запрещается установка режимов STRICT_TRANS_TABLES и STRICT_ALL_TABLES, это приведёт к неработоспособности некоторых компонентов биллинговой системы.
  • max_allowed_packet - максимальный размер пакета с запросом, принимаемого сервером.
  • max_connections - ограничение на максимальное число соединений с БД.
  • memlock - запрет на перенос процесса mysqld в свап.
  • table_cache - максимальное количество описаний структур открытых таблиц в кэше.
  • thread_cache_size - размер кэша потоков для предотвращения их повторного создания.
  • thread_concurrency - число одновременно работающих потоков, рекомендуется ставить 2 * количество CPU + количество дисков.

Запрещается установка опции skip-networking, т.к. Java приложение подключается к серверу с использованием TCP протокола, а не через файловый сокет.

Секция mysqld - параметры InnoDB

innodb_file_per_table
#
innodb_log_group_home_dir = /var/lib/mysql/
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 16M
#
innodb_log_files_in_group = 2
innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
innodb_lock_wait_timeout = 120
#
innodb_thread_concurrency = 2
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
##

Опции:

  • innodb_file_per_table - для возможности использования Backup базы с помощью snapshot'ов (Linux, LVM) в ОС LINUX.
  • innodb_log_group_home_dir - путь к каталогу под журнал транзакций, лучше если это будет отдельный диск; высокие требования по скорости и надёжности, низкие по объёму.
  • innodb_buffer_pool_size - размер буфера под все нужды, он должен составлять порядка 70-80 % от общей памяти сервера БД.
  • innodb_additional_mem_pool_size - параметр можно не изменять, размер буфера под доп. цели.
  • innodb_log_files_in_group - количество файлов журналов транзакций в группе журналов; InnoDB производит запись в файлы по круговому способу; увеличение ускоряет запись но тормозит восстановление информации в случае сбоя.
  • innodb_log_file_size - размер каждого файла журнала в группе журналов (указывается в мегабайтах).
  • innodb_log_buffer_size - размер буфера, который в InnoDB используется для записи информации файлов журналов на диск.
  • innodb_lock_wait_timeout - время простоя (в секундах), на протяжении которого транзакция InnoDB может ожидать прекращения блокировки прежде, чем будет произведен откат.
  • innodb_thread_concurrency - должно совпадать с thread_concurrency; число одновременно работающих потоков, рекомендуется ставить 2 * количество CPU + количество дисков.
  • innodb_flush_log_at_trx_commit - 2 отменяет сброс данных на диск при каждой транзакции, ускорение работы.
  • innodb_flush_method - O_DIRECT отключает двойную буферизацию (самим mysql и ОС).

Секция mysqld - параметры MyIsam если используется (например, для некритичных таблиц)

key_buffer_size = 1G
myisam_recover
myisam_repair_threads = 1
myisam_data_pointer_size = 6

Опции:

  • key_buffer_size - размер кэша для хранения индексов;
  • myisam_recover -восстановление битых таблиц при старте сервера.
  • myisam_repair_threads - число потоков восстановления.
  • myisam_data_pointer_size - возможность создания больших первичных ключей в таблицах.

Секция mysqld - параметры репликации, если используется

server-id=1
log-bin=/var/lib/mysql-binlog/mysql-bin
expire_logs_days=3
replicate-do-db=bgbilling
relay-log-space-limit = 10G

Опции:

  • server-id - идентификатор сервера.
  • log-bin - место хранение bin-логов; лучше если это будет отдельный диск, высокие требования по скорости и надёжности, малые по объёму.
  • expire_logs_days - автоматическое удаление старых bin-логов.
  • replicate-do-db - реплицируемая БД.
  • relay-log-space-limit - ограничение на объём bin-логов.

Секция mysqld_safe

[mysqld_safe]
open-files-limit=32000
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Опции:

  • open-files-limit - лимит количества открытых файлов для ОС Linux.
  • log-error - файл для логирования ошибок.
  • pid-file - PID файл процесса.

В качестве примера конфигурации вы также можете использовать примеры конфигурации MySQL (/usr/share/mysql/my-innodb-heavy-4G.cnf).

Ссылки:

Если вы обновляете базу биллинга с MyIsam таблицами, вы можете произвести конвертацию в ОС LINUX по примерно такой методике:

mysql -u [USER_NAME] -p -e "SHOW TABLES IN bgbilling;" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;" > alter_table.sql

После этого можно посмотреть и почистить файл с перечнем таблиц для конвертации alter_table.sql.

mysql -u [USER_NAME] -p bgbilling < alter_table.sql

Конвертацию можно выполнять только после включения в my.cnf поддержки InnoDb. Следует учитывать, что конвертация больших таблиц может быть очень длительной, поэтому оптимальным будет исключить из конвертации помесячные таблицы с сессиями, наработками и т.п. Для транзакционной работы они не критичны. Достаточно, что в последующие месяцы эти таблицы также будут создаваться в формате InnoDb. Также можно предварительно отработать конвертацию таблиц на стороннем MySQL сервере.

Пример конвертации

Задача сконвертировать базу, имеется два сервера с настроенной репликацией. Решение:

  • 1. Включить поддержку InnoDb на slave-сервере.
  • 2. Включить поддержку InnoDb на master-сервере.
  • 3. Запустить скрипт конвертации в InnoDB для master-сервера.

Скрипт выгружает таблицы для конвертации (кроме помесячных) в файл и потаблично конвертирует, запрашивая подтверждение на выполнение операции. Использование скрипта на реальной базе показало, что есть объемные таблицы которые конвертируются более 1 минуты. Скрипт конвертирует только в master базе, а в slave изменения произойдут из-за настроенного реплицирования (см документацию по репликации).

Личные инструменты