FreeBSD mysql оптимизация

Дата | 08.08.2015

В хозяйстве серверов у администратора всегда найдется сервер с повышенной нагрузкой на базу данных.
Расскажу, как я оптимизировал сервер баз данных, под управлением системы FreeBSD 10.1 .
Так как операционная память стоит дешево, то будит реализовывать большой кэш данных базы в памяти.
Нагруженная база обслуживает онлайн 150-300 человек и в сутки около 300 тыс. человек пользуется сервисом.
Отмечу, что софт mysql сервера это одно оптимизировать, но нельзя забывать и про саму базу и ее транзакции, их тоже нужно оптимизировать.
Установим mysql.

# cd /usr/ports/databases/mysql55-server/ && make install clean

Копируем конфигурационный файл, рассчитанный под средние нагрузки.
есть уже специально сконфигурированные файлы под определенные нагрузки сервера.
my-small.cnf — минимальные нагрузки, по умолчанию они используются.
my-medium.cnf — Настройки рассчитаные для средней нагрузки.
my-large.cnf — нагрузки, рассчитанные на большую нагрузку.
my-huge.cnf — Огромные нагрузки!
my-innodb-heavy-4G.cnf — для структуры innodb базы, большей 4Г.

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf

Оповестим систему, что мы хотим запускать сервис, mysql.

# echo 'mysql_enable="YES"' >> /etc/rc.conf

Запускаем mysql.

# service mysql-server start

В целях безопасности делаем пароль пользователю root.

# mysqladmin -u root password
После вводим два раза новый пароль.

Теперь обезопасим наш mysql сервис.
Запускаем скрипт.

# mysql_secure_installation
Вводим пароль и отвечаем на вопросы.
В первом вопросе вас просят сменить пароль root, зачем? Мы его только сделали, отвечаем, Нет (N)
На остальные 3-4 вопроса я отвечаю Да (Y)

Останавливаем mysql сервер для оптимизации.

# service mysql-server stop

Оптимизируем.

# cat /etc/my.cnf
[client]
port		= 3306
socket		= /tmp/mysql.sock
# Правим mysqld раздел.
[mysqld]
# Говорим mysql, что бы он только обслуживал запросы внутри сервера, но и снаружи не принимал запросы.
# Дополнительно можно порт 3306 закрыть в фаерволе.
bind-address    = 127.0.0.1
# порт
port		= 3306
# на нагруженных системах сетевые сервисы лучше переводить на сокетовый механизм.
socket		= /tmp/mysql.sock
# Оповещаем mysql не использовать внешние блокировки при работе.
skip-external-locking
# определяем максимальное количество параллельных соединений к базе данных.
# Если в логе mysql видим такие сообщения too many connections, то увеличиваем параметр на порядок!
max_connections = 42
# Определяем размер буфера выделяемого под индексы.
key_buffer_size = 16549M
# Разрешаем загружаемый объем данных в базу данных за один запрос.
max_allowed_packet = 180M
# Определяем количество кэшируемых таблиц от баз данных.
table_open_cache = 770
# определяем размер буфера сортировки для потока данных.
sort_buffer_size = 9M
# буфер под чтение таблиц.
read_buffer_size = 6M
# Сортировка запросов имеющие индексы.
read_rnd_buffer_size = 10M
# Максимальный размер таблицы, хранящейся в памяти.
max_heap_table_size=82M
# Определяем объем кэш под временные таблицы.
tmp_table_size=82M
# Максимальное количество открытых таблиц в кэше.
table_cache = 770
# буфер для структур таблиц (.frm) файлов. Чем больше их в системе, тем больше значение.
table_definition_cache = 770
# Определяем общий объем MyISAM таблиц для сортировки, создания индексов.
myisam_sort_buffer_size = 13800M
# Общий объем кэша.
query_cache_size= 3900M
# Устанавливает тип кэширования. Есть следующие значения:
# 0 Не кэшировать.
# 1 Кэшировать все запросы, за исключением, начинающихся с (SELECT S_NO_CACHE).
# 2 Кэшируем только результаты, которые начинаются с (SELECT SQL_CACHE).
query_cache_type = 1
# Определяем максимальный размер кэшируемого запроса.
query_cache_limit= 125M
# Минимальный размер блока находящего в кэше.
query_cache_min_res_unit= 28
# Число кэшируемых потоков.
thread_cache_size = 55
# Количество потоков, я указал равное количество ядер процессора.
thread_concurrency = 12
# для криворуких архитекторов баз данных, ограничение на количество строк.
max_join_size = 80000000
# Определяем количество байт из начала полей типа TEXT или BLOB использовать при сортировке.
max_sort_length=624
# По умолчания используется один пул инстантов.
# Оптимизация размера памяти для таблиц innodb, лоя хранения данных и индексов.
innodb_buffer_pool_size = 4096M
# Определяем количество инстантов, в нашем случае 4-ре инстанта по 1 гигабайту.
innodb_buffer_pool_instances = 4
# Я использую серверные ссд диски фирмы интел 3500, выносливые диски.
# С этим параметром осторожнее, это количество потоков обработки данных на диске.
innodb_write_io_threads = 8
# Количество потоков на диске под чтение, максимум 8.
innodb_read_io_threads = 8
# Количество рабочих тредов InnoDB. 
# Определяется так, количества ядер процессора*2 + количество физических блочных устройств.
innodb_thread_concurrency = 12
# Не помню, что-то с размером индексного файла innodb.
innodb_data_file_path = ibdata1:50M:autoextend
# оповещаем сервер, что мы не хотим использовать сеть, говорим использовать только сокеты.
skip-networking
# Говорим серверу подключенные адреса не резолвить, типа использовать подключения к базе данных через локальный ип адрес 127.0.0.1
skip-name-resolve
# Этот параметр говорит, сколько в связке серверов.
server-id = 1
#slow_query_log = 1
#slow_query_log_file = /mnt/backLOG/log/mysql/mysqld-slow-query.log
# Определяем временной лимит секунда, для отслеживания тяжелых запросов.
long_query_time = 1
# Лог ошибок мускула.
log_error = /mnt/backLOG/log/mysql/mysql-errors.log
# размещения лога тяжелых запросов.
log_slow_queries = /mnt/backLOG/log/mysql/mysqld-slow-query.log
#log-queries-not-using-indexes
#
[mysqldump]
quick
#
[mysql]
no-auto-rehash
#
[myisamchk]
# данные при проверки базы данных.
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
#
[mysqlhotcopy]
interactive-timeout

Запускаем сервер mysql.

# service mysql-server start

3 thoughts on “FreeBSD mysql оптимизация

  1. user

    Если говорить про мускул, то добавь в /etc/make.conf что-то подобное
    .if ${.CURDIR:M*/databases/mysql51-*}
    BATCH=yes
    WITH_CHARSET=utf8
    WITH_COLLATION=utf8_general_ci
    WITH_XCHARSET=»cp1251 koi8r»
    BUILD_OPTIMIZED=yes
    BUILD_STATIC=yes
    .endif
    А лучше всего переходи на марию. Для нее надо что-то подобное
    .if ${.CURDIR:M*/databases/mariadb-server}
    BATCH=yes
    WITH_CHARSET=utf8
    WITH_COLLATION=utf8_general_ci
    OPTIONS_UNSET=ARCHIVE
    OPTIONS_SET=ARIADB
    OPTIONS_UNSET=BLACKHOLE
    OPTIONS_UNSET=FEDERATED
    OPTIONS_UNSET=FEDX
    OPTIONS_SET=HANDLERSOCKET
    OPTIONS_UNSET=INNODB
    OPTIONS_SET=MAXKEY
    OPTIONS_SET=OPENSSL
    OPTIONS_UNSET=OQGRAPH
    OPTIONS_SET=PARTITION
    OPTIONS_UNSET=PBXT
    OPTIONS_UNSET=SPHINX
    OPTIONS_UNSET=SSL
    OPTIONS_UNSET=STATIC
    OPTIONS_SET=XTRADB
    .endif

  2. doorsfan

    а чё в вашей фряхе конфиг софтины из портов лежит в cat /etc/my.cnf?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *