воскресенье, 25 декабря 2011 г.

MySQL - оптимизация сервера (часть 2)

Общие параметры конфигурационного файла my.cnf


max_connect_errors - максимальное кол-во ошибок, при достижении которого хост с которого они шли будет заблокирован и не сможет подключиться к серверу. Сбросить накопленное кол-во ошибок для всех хостов можно с помощью команды flush hosts.

binlog_cache_size - размер кэша, используемого для хранения SQL-операторов бинарного журнала регистраций во время транзакций. Этот кэш выделяется для каждого клиента, если сервер использует любой из транзакционных движков, например InnoBD и на сервере включена поддержка бинарного журнала регистраций.
При частом использовании объемных транзакций со множеством операторов, значение данной переменной рекомендуется увеличить. Связано это с тем что большая транзакция может выйти за пределы буфера и серверу придется сохранять часть данных на жесткий диск в временном файле, что снижает производительность. По умолчанию данный кэш равен 32768.

sort_buffer_size - размер буфера, выделяемого на поток при выполнении операций сортировки. Для ускорения операций ORDER BY, GROUP BY рекомендуется увеличить данное значение.
Если отсортированные данные не помещаются в текущий буфер сортировки, то данные начинают использовать жесткий диск. Если вы видите большое значение sort_merge_passes в выводите show global status, то надо задуматься об увеличении sort_buffer_size.
Максимальный объем буфера сортировки 4Гб.

join_buffer_size - размер буфера использующегося при операциях объединения таблиц (при этом объединение происходит без использования индексов). Данные объединения не очень хорошо сказываются на производительности сервера и увеличив join_buffer_size мы можем снизить влияние таких объединений на производительность.
Максимальное значение 4Гб.

thread_cache_size - регулирует кол-во потоков, которые сервер должен поместить в кэш для повторного использования. После отключения клиента, потоки не удаляются а помещаются в кэш, как только MySQL серверу понадобятся новые потоки, он берет их из кэша. Это значение может быть увеличено для повышения производительности, если у вас много новых подключений.

thread_concurrency - кол-во одновременно запускаемых потоков, для Linux систем это кол-во CPU * кол-во ядер в каждом CPU.

ft_min_word_len - минимальная длина слова для включения в индекс fulltext. При изменении данного значения, необходимо заново перестроить ваши fulltext индексы, это можно сделать с помощью команды repair table tbl_name quick или с помощью утилиты mysqlrepair, так mysqlrepair -u root -p --all-databases.

tmp_table_size - максимальный размер временных таблиц, расположенных в оперативной памяти. Если таблица не помещается в рамки указанного значения tmp_table_size, то для работы с ней начинает использоваться диск. Данное ограничение применяется для одной таблицы.

Параметры относящиеся к MyISAM


read_buffer_size - размер буфера, выделяемого потоком для каждой сканируемой таблицы. Используется во время полного сканирования таблиц. Максимальное значение 2Гб.

read_rnd_buffer_size - размер буфера, выделяемого для чтения строк после сортировки, что-бы избежать повторного поиска на диске. Увеличив размер данного буфера, вы значительно улучшите производительность order by. Данный буфер выделяется для каждого клиента.

bulk_insert_buffer_size - MyISAM использует специальный древовидный кэш, чтобы быстрее выполнять массивные insert'ы (такие как INSERT ... SELECT, INSERT ... VALUES (...), (...), ... и LOAD DATA INFILE). Эта переменная ограничивает размер древовидного кэша на каждый поток. При выставлении 0 значения, полностью его отключает. Для оптимальное производительности не устанавливайте его значение больше, чем значение key_buffer_size.
Этот буфер выделяется в момент обнаружения массивной вставки.

myisam_sort_buffer_size - выделяется на поток, используется данный буфер при сортировке MyISAM индексов во время восстановлении индексов, ремонте, оптимизации таблиц или изменении их структуры с помощью оператора alter table, а так же при выполнении load data infile в пустую таблицу.

myisam_max_sort_file_size - размер временного файла, использующегося при восстановлении индексов MyISAM, при использовании операторов repair table, alter table или load data infile. Если размер необходимого файла больше значения данной переменной, то для создания индекса будет использоваться кэш ключей, что значительно медленней.

myisam_repair_threads - указывает кол-во потоков при ремонте таблицы. Увеличение этого значения имеет смысл, если у вас несколько процессоров и большое кол-во оперативной памяти.

Параметры относящиеся к InnoDB


innodb_additional_mem_pool_size - дополнительный пул памяти, который используется InnoDB для хранения метаданных, чем больше у вас таблиц, тем большее значение innodb_additional_mem_pool_size надо выставлять. Если InnoDB потребуется больше памяти, чем указано в данном параметре, то она начнет выделять память из ОС, это происходит достаточно быстро, поэтому менять данный параметр в большинстве случаев не надо.

innodb_buffer_pool_size - InnoDB в отличие от MyISAM использует буферный пул для кэширования индексов и строковых данных. При достаточном объеме памяти увеличение буфера InnoDB может снизить загруженность диска при доступе к табличным и индексным данным. На отдельно стоящем выделенном Mysql сервере можно установить этот параметр в 80% от общего объема физической памяти сервера.

innodb_file_io_threads - кол-во файловых потоков ввода/вывода для использования асинхронных операций. Для *nix систем жестко задано значение в 4, увеличение не даст эффекта.

innodb_thread_concurrency - максимальное кол-во одновременно действующих потоков для InnoDB. Как только кол-во потоков достигает значения указанного в данном параметре, все дополнительные потоки помещаются в FIFO очередь.
Правильное значение для этого параметра сильно зависит от аппаратной конфигурации сервера и рабочей нагрузки. Рекомендуемое значение это значение в два раза большее кол-ва CPU ядер, плюс кол-во жестких дисков. Начиная с версии 5.1.12 можно вообще отключить данный параметр выставив его значение в 0, это разрешит InnoDB использовать то кол-во потоков, которое ей потребуется.

innodb_flush_log_at_trx_commit - крайне желательно выставлять значение в 1. Возможные значения в 0 и 2 могут снизить нагрузку на дисковую подсистему сервера, но этого делать не рекомендуется, так как перестанет соблюдаться ACID.

innodb_log_buffer_size - размер буфера для хранения информации о каждой транзакции. После выполнения транзакции данные о ней сбрасываются на диск. Для больших транзакций, выходящих за пределы этого буфера есть смысл увеличить значение данного параметра, чтобы во время выполнения транзакции данные не сбрасывались на диск по несколько раз подряд, из-за того что они не помещаются в буфер.
Возможное значение от 1 до 8Мб.

innodb_log_group_home_dir - движок InnoDB ведет свои собственные журналы, которые создаются во время запуска сервера, если их еще не существует. По умолчанию эти журналы создаются в каталоге данных, их имена начинаются с ib_, пример файлов


-rw-rw---- 1 mysql mysql 5.0M Dec 23 02:43 /var/lib/mysql/ib_logfile0
-rw-rw---- 1 mysql mysql 5.0M Oct 31 13:23 /var/lib/mysql/ib_logfile1

и данный параметр используется для установки пути к каталогу в котором InnoDB будет записывать свои регистрационные журналы.


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

Общий размер должен быть не больше 4Гб, по умолчанию 5Мб. Общий размер считается как произведение значений innodb_log_file_size и innodb_log_files_in_group.

innodb_log_files_in_group - общее кол-во файлов журналов в группе журналов. Значение в 2-3 будет хорошим.

innodb_max_dirty_pages_pct - максимальный процент так называемых грязных страниц в буферном пуле InnoDB. Если оно будет достигнуто, то сервер попытается их сбросить, чтобы не закончились все чистые страницы. Диапазон значения от 0 до 100, по умолчанию 90.

innodb_lock_wait_timeout - время в секундах на протяжении которого транзакция InnoDB может ожидать блокировку до того, как будет произведен ее откат. InnoDB автоматически обнаруживает взаимные блокировки транзакций (deadlocks) в своей таблице блокировок и выполняет их откат. Если вы используете команду lock tables или работаете с другими движками с транзакциями, отличными от InnoDB, то в случае взаимной блокировки InnoDB не сможет ее обнаружить. По умолчанию данный параметр равен 50.

innodb_data_file_path -  InnoDB по умолчанию хранит данные в одном или нескольких файлах с данными формирующими табличное пространство. Если у вас есть один логический диск для хранения данных, то размещение одного автоматически расширяющегося файла на нем будет достаточно.
При задании объема файла можно указывать суффикс в конце, например K (килобайты), M (мегабайты), G (гигабайты). Если вообще не указывать параметр innodb_data_file_path в конфиг.файле my.cnf, то по умолчанию создастся автоматически расширяющийся 10Мб файл данных с именем ibdata1

-rw-rw---- 1 mysql mysql 10M Dec 23 06:20 /var/lib/mysql/ibdata1

это тоже самое что и innodb_data_file_path = ibdata1:10M:autoextend

Синтаксис описания файла:

path:size
path:size:autoextended
path:size:autoextended:max:maxsize

autoextended - придает файлу свойство автоматического расширения, т.е. когда файл заполняется, InnoDB движок автоматически увеличивает его размер. По умолчанию при авторасширении файлы увеличиваются на 8Мб. Для того чтобы задать другое приращение, используется параметр innodb_autoextend_increment

maxsize - максимальный размер до которого может расширяться файл

Вышеуказанные атрибуты autoextended и maxsize могут быть использованы только для последнего файла данных в параметре innodb_data_file_path

Примеры:

innodb_data_file_path = ibdata1:50M;ibdata2:50M:autoextend - будет создан файл ibdata1 фиксированного размера в 50Мб и автоматически расширяющийся файл ibdata2 размером 50Мб

innodb_data_file_path=ibdata1:10M:autoextend:max:500M - будет создан единственный автоматически расширяющийся файл данных ibdata1 размером 10Мб, который сможет разрастись максимум до 500Мб

Ниже указан пример более интересного варианта, в каталогах /dr2 и /dr3 примонтированы два дополнительных жестких диска на считая основного. Таким образом мы разнесли наши файлы данных и файл-журналов на разные физические диски, что может дать ощутимый прирост производительности Mysql сервера. Кроме того это придает некую гибкость, например можно вынести файл-журналов на быстрый SSD-диск или поэкспериментировать со сменой файловой системы на дополнительных дисках.
Значение innodb_data_home_dir мы задали пустым для того чтобы иметь возможность использовать абсолютные пути в параметрах innodb_data_file_path и innodb_log_group_home_dir.

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend
innodb_log_group_home_dir = /dr3/iblogs

и помним что InnoDB заполняет файлы данных поочередно, начиная с первого файла данных

innodb_data_home_dir - общая часть пути к каталогу всех файлов данных InnoDB. Если он не указан, то будет использоваться путь по умолчанию, а если указать пустую строку в качестве его значения, то в innodb_data_file_path можно будет использовать абсолютные пути к файлам.

воскресенье, 18 декабря 2011 г.

Восстановление Adaptec RAID массива после отказа жесткого диска

Смотрим состояние логического устройства
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Degraded
   Size                                     : 2086902 MB
   Stripe-unit size                         : 256 KB
   Read-cache mode                          : Enabled
   MaxIQ preferred cache setting            : Enabled
   MaxIQ cache setting                      : Disabled
   Write-cache mode                         : Enabled (write-back)
   Write-cache setting                      : Enabled (write-back)
   Partitioned                              : Yes
   Protected by Hot-Spare                   : No
   Bootable                                 : Yes
   Failed stripes                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Missing



Command completed successfully.
в предпоследней строке видим что один из трех HDD вообще не отвечает, заменяем его.
Теперь выводим физические устройства
root@rescue ~ # arcconf getconfig 1 pd

Controllers found: 1
----------------------------------------------------------------------
Physical Device information
----------------------------------------------------------------------
      Device #0
         Device is a Hard drive
         State                              : Online
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,0(0:0)
         Reported Location                  : Connector 0, Device 0
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS3YTBB
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled
      Device #1
         Device is a Hard drive
         State                              : Online
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,1(1:0)
         Reported Location                  : Connector 0, Device 1
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS3WVC2
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled
      Device #2
         Device is a Hard drive
         State                              : Ready
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,2(2:0)
         Reported Location                  : Connector 0, Device 2
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS217GE
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled


Command completed successfully.
видим Device #2 c "State: Ready" это как раз новый HDD который поставили взамен сбойного
Запускаем следующую команду, после которой новый диск должен автоматически добавится в RAID массив и запустится процесс ребилда
arcconf rescan 1
Выводим состояние логического устройства
root@rescue ~ # arcconf getconfig 1 ld
...
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Rebuilding (0,2)             9VS217GE
...
Выводим статус и прогресс ребилда
root@rescue ~ # arcconf getstatus 1
Controllers found: 1
Logical device Task:
   Logical device                 : 0
   Task ID                        : 101
   Current operation              : Rebuild
   Status                         : In Progress
   Priority                       : High
   Percentage complete            : 0
 Если после запуска arcconf rescan 1 диск не добавился и массив не стал ребилдиться, то переводим новый HDD в hotspare состояние и ребилд массива начнется
arcconf setstate 1 device <channel_device> HSP
channel_device - это номер канала и id диска в этом канале. Узнать его можно выполнив команду
arcconf getconfig 1 pd
поле 
Reported Channel,Device(T:L)
После окончания ребилда диск становится в hotspare резерв
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Optimal
   Size                                     : 2086902 MB
   Stripe-unit size                         : 256 KB
   Read-cache mode                          : Enabled
   MaxIQ preferred cache setting            : Enabled
   MaxIQ cache setting                      : Disabled
   Write-cache mode                         : Enabled (write-back)
   Write-cache setting                      : Enabled (write-back)
   Partitioned                              : Yes
   Protected by Hot-Spare                   : No
   Bootable                                 : Yes
   Failed stripes                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Spare (0,2)             9VS217GE
Переводим из hotspare в ready
arcconf setstate 1 device <channel_device> RDY
Убеждаемся что массив и диски вернулись в нормальное состояние
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Optimal
   Size                                     : 2086902 MB
   Stripe-unit size                         : 256 KB
   Read-cache mode                          : Enabled
   MaxIQ preferred cache setting            : Enabled
   MaxIQ cache setting                      : Disabled
   Write-cache mode                         : Enabled (write-back)
   Write-cache setting                      : Enabled (write-back)
   Partitioned                              : Yes
   Protected by Hot-Spare                   : No
   Bootable                                 : Yes
   Failed stripes                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Present (0,2)             9VS217GE

четверг, 15 декабря 2011 г.

MySQL - файлы таблиц

MyISAM таблицы


MyISAM таблицы представляют собой файлы .frm, .MYD, .MYI. Например таблица с именем mytable будет выглядеть в виде файлов

mytable.frm - файл описания в котором хранится структура таблицы
mytable.MYD - файл данных в котором хранится содержимое таблицы
mytable.MYI - файл индексов, который содержит информацию обо всех индексах, представленных в данной таблице

Пример с сервера:

-rw-rw---- 1 mysql mysql    0 Dec 13 05:35 ofGroupProp.MYD
-rw-rw---- 1 mysql mysql 1.0K Dec 13 05:35 ofGroupProp.MYI
-rw-rw---- 1 mysql mysql 8.5K Dec 13 05:35 ofGroupProp.frm
-rw-rw---- 1 mysql mysql    0 Dec 13 05:35 ofGroupUser.MYD
-rw-rw---- 1 mysql mysql 1.0K Dec 13 05:35 ofGroupUser.MYI
-rw-rw---- 1 mysql mysql 8.5K Dec 13 05:35 ofGroupUser.frm
-rw-rw---- 1 mysql mysql   52 Dec 13 05:35 ofID.MYD
-rw-rw---- 1 mysql mysql 2.0K Dec 13 05:36 ofID.MYI
-rw-rw---- 1 mysql mysql 8.4K Dec 13 05:35 ofID.frm

InnoDB таблицы


Уникальной привязки каждой таблицы к определенным файлам нет, кроме файла описания .frm, размещенного в каталоге, к которому принадлежит таблица.
InnoDB можно настроить на представление содержимого баз данных с помощью табличных пространств двух типов

Общее табличное пространство


Тип табличного пространства который состоит из одного или нескольких больших файлов, расположенных в каталоге данных. Объем этих файлов равен сумме размеров индивидуальных файлов. При таком режиме единственным файлом, имеющим отношение к определенной таблице, является файл с расширением .frm.
Данный режим используется InnoDB движком по умолчанию.

Индивидуальное табличное пространство


Есть возможность настроить InnoDB таким образом, чтобы на одну таблицу приходилось по одному табличному пространству (с помощью параметра innodb_file_per_table = 1 в конфиг.файле my.cnf, перед включением данного параметра обязательно выполните бэкап всех текущих баз данных!). В таком случае каждой таблице InnoDB будет соответствовать по два файла в каталоге базы данных. Это файл .frm и файл .ibd, содержащие данные и индексы этой таблицы.

Пример с сервера:

-rw-rw---- 1 mysql mysql 8.5K Oct 31 13:35 bugreport.frm
-rw-rw---- 1 mysql mysql  96K Oct 31 13:36 bugreport.ibd
-rw-rw---- 1 mysql mysql 8.6K Oct 31 13:35 channels.frm
-rw-rw---- 1 mysql mysql  96K Oct 31 13:36 channels.ibd

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

Так же в независимости от используемого механизма хранения и его настроек в каталоге данных каждой базы данных есть файл db.opt, этот файл содержит стандартную кодировку и порядок сортировки.

среда, 14 декабря 2011 г.

Защита от хотлинка (аnti-leech, link protection) в Nginx

В виртуальный хост Nginx'а добавляем


root /var/www/site1.lan/;
valid_referers none blocked server_names;
if ($invalid_referer) {
return 403;
}



Примерно так будет выглядеть, если добавить в location
server {
server_name site1.lan;
listen 172.16.0.1;
...
...

location ~* ^.+\.(svg|mp3|ogg|mpe?g|zip|gz|bz2?|rar|jpg|png|gif|jpeg|flv)$ {
root /var/www/site1.lan/;
valid_referers none blocked server_names;
if ($invalid_referer) {
return 403;
}
}
...
...

понедельник, 12 декабря 2011 г.

MySQL - оптимизация сервера

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


Кэш-память таблиц

Используется для хранения информации об открытых таблицах. Ее объем можно регулировать с помощью параметра table_cache в конфиг.файле Mysql сервера (начиная с MySQL версии 5.1, данный параметр называется table_open_cache).
Table_cache это максимальное кол-во одновременно открытых файлов (таблиц), которое может себе позволить Mysql сервер (так же надо помнить о максимальном кол-ве открытых файловых дескрипторов накладываемых со стороны ОС). Если мы выставили параметр max_connections в 150, то желательно и table_cache подтянуть до такого же значения в 150.

Эффективность кэш-памяти таблиц можно наблюдать через opened_tables в show status.

mysql> show status like 'opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 0     |
+---------------+-------+
1 row in set (0.00 sec)

или так

tsyrenov:~# mysqladmin status -p
Enter password:
Uptime: 480602  Threads: 5  Questions: 107079  Slow queries: 0  Opens: 118  Flush tables: 1  Open tables: 4  Queries per second avg: 0.223

Если значение opened_tables небольшое в процессе работы Mysql сервера, то как правило это хороший признак, если наоборот, то требуется и дальше подбирать параметр table_cache (как правило просто в сторону увеличения). Вообщем увеличение размера кэш-памяти таблиц позволяет уменьшить кол-во операций открытия/закрытия таблиц, что положительно сказывается на производительности.

Неиспользуемые таблицы закрываются и удаляются из кэша в том случае, когда вся кэш-память переполнена и сервер пытается открыть новую таблицу, отсутствующую в этом кэше. Удаляется таблица не использованная дольше всех остальных таблиц.

Вручную очистить кэш можно с помощью команд mysqladmin refresh или flush_tables;


Ключевой буфер

Используется для хранения индексов. В работе MyISAM таблиц используется для выборок и сортировок, осуществляемых с применением индекса и для операций создания и модификации индекса. Регулируется с помощью параметра key_buffer_size (по умолчанию 8Мб, максимальное значение 4Гб). Чем больше значение, тем лучше, так как сервер сможет одновременно хранить больше индексных блоков в оперативной памяти, тем самым разгружая жесткие диски сервера, так как в процессе работы сервера, вероятность обнаружения ключевых значений в ОЗУ становится больше.
Если работа сервера упирается в производительность Mysql сервера и при этом у нас есть приличное кол-во свободной оперативной памяти, то мы первым делом увеличиваем key_buffer_size.

Для InnoDB таблиц данное значение регулируется с помощью innodb_buffer_pool_size.

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

В данном примере мы создадим кэш-память индекса ofUserFlag_sTime_idx, таблицы ofUserFlag, базы данных Polygon. Размер индекса будет в 10Мб.

mysql> set global ofUserFlag_sTime_idx.key_buffer_size = 10240*10240;
Query OK, 0 rows affected (0.01 sec)

(для автоматического создания данного кэша при запуске MySQL сервера, надо добавить в my.cnf ofUserFlag_sTime_idx.key_buffer_size = 10М)

Привязываем кэш-память индекса целевой таблице ofUserFlag

mysql> cache index ofUserFlag in ofUserFlag_sTime_idx;
+--------------------+--------------------+----------+----------+
| Table              | Op                 | Msg_type | Msg_text |
+--------------------+--------------------+----------+----------+
| polygon.ofUserFlag | assign_to_keycache | status   | OK       |
+--------------------+--------------------+----------+----------+
1 row in set (0.00 sec)

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

mysql> load index into cache ofUserFlag;
+--------------------+--------------+----------+----------+
| Table              | Op           | Msg_type | Msg_text |
+--------------------+--------------+----------+----------+
| polygon.ofUserFlag | preload_keys | status   | OK       |
+--------------------+--------------+----------+----------+
1 row in set (0.00 sec)


Кэш-память запросов

Кэш-память запросов (параметры query_cache_type, query_cache_size, query_cache_limit) используется для повторной обработки select запросов, предназначена для ускорения данных запросов.
После первой обработки оператора select сервер запоминает текст запроса и возвращаемый им результат. В следующий раз сервер анализирует запрос не выполняя его повторно, вместо этого сервер выбирает результат такого запроса непосредственно из кэш-памяти запросов и возвращает его клиенту.
Запросы считаются разными, если они отличаются регистром или приходят от клиентов, которые используют разные кодировки, протоколы или относятся к другим таблицам.
При обновлении таблицы любые закэшированные запросы в которых сделана ссылка на эту таблицу, автоматически удаляются. Таким образом избегается возвращение устаревших данных.

Query_cache_type - определяет режим работы кэш-памяти запросов, ниже указаны ее возможные значения

0 - не кэшировать результаты выполнения запросов
1 - кэшировать все запросы, за исключением таблицы, которые начинаются с select sql_no_cache
2 - кэшировать по запросу только те запросы, которые начинаются с select sql_cache

Query_cache_size - определяет размер кэш-памяти запросов
Query_cache_limit - определяет максимальный кэширующий размер результата запросов, если размер превышен, то данный результат запроса кэшироваться не будет

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

MySQL - Explain & Procedure analyse

EXPLAIN

Оператор Explain позволяет получить подробную информацию о том как будет выполняться тот или иной SQL запрос, он выведет описание индексов, которые будут использованы при сканирования таблицы, типы используемых объединений, данные о кол-ве сканируемых строк и т.д. При этом сам SQL запрос реально выполнен не будет.

В примере будем использовать Mysql базу данных PowerDNS с тестовыми доменами.

mysql> desc records;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)      | YES  | MUL | NULL    |                |
| name        | varchar(255) | YES  | MUL | NULL    |                |
| type        | varchar(6)   | YES  |     | NULL    |                |
| content     | varchar(255) | YES  |     | NULL    |                |
| ttl         | int(11)      | YES  |     | NULL    |                |
| prio        | int(11)      | YES  |     | NULL    |                |
| change_date | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

mysql> show index from records;
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| records |          0 | PRIMARY        |            1 | id          | A         |         106 |     NULL | NULL   |      | BTREE      |         |
| records |          1 | rec_name_index |            1 | name        | A         |         106 |     NULL | NULL   | YES  | BTREE      |         |
| records |          1 | nametype_index |            1 | name        | A         |         106 |     NULL | NULL   | YES  | BTREE      |         |
| records |          1 | nametype_index |            2 | type        | A         |         106 |     NULL | NULL   | YES  | BTREE      |         |
| records |          1 | domain_id      |            1 | domain_id   | A         |         106 |     NULL | NULL   | YES  | BTREE      |         |
+---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
5 rows in set (0.00 sec)

Выведем все записи закрепленные в базе за domain_id 26, через Explain, чтобы увидеть какие именно индексы будут использоваться при выполнении выборки

mysql> explain select * from records where domain_id = '26';
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
| id | select_type | table   | type | possible_keys | key       | key_len | ref   | rows | Extra       |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
|  1 | SIMPLE      | records | ref  | domain_id     | domain_id | 5       | const |   13 | Using where |
+----+-------------+---------+------+---------------+-----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

Type - бывает значений all (обозначает просмотр всех строк, соответственно индекс использоваться не будет), ref, range
Possible_keys, key - отображает столбец, который может использовать индекс
Rows - кол-во строк, которые требуется просмотреть (чем меньше, тем лучше)

Таким образом при добавлении в таблицу новых индексов с помощью оператора Explain можно проверять эффективность индексов.

PROCEDURE ANALYSE

Функция Procedure analyse выводит предложения по оптимальным типам столбцов таблицы
Например в этой же базе данных PowerDNS есть столбец type, который хранит тип ресурсной записи DNS, проверим его с помощью данной функции

mysql> select type from records procedure analyse()\G
*************************** 1. row ***************************
             Field_name: pdns.records.type
              Min_value: A
              Max_value: TXT
             Min_length: 1
             Max_length: 4
       Empties_or_zeros: 0
                  Nulls: 0
Avg_value_or_avg_length: 1.8302
                    Std: NULL
      Optimal_fieldtype: ENUM('A','AAAA','MX','NS','PTR','SOA','TXT') NOT NULL
1 row in set (0.00 sec)

Мы видим что procedure analyse проанализировав содержимое данных в столбце type предлагает нам для данного столбца использовать тип ENUM (это тип, строки которого имеют ограниченный набор строго определенных значений). Данные такого типа обрабатываются очень и очень быстро.
Смотрим текущий тип столбца type, он сейчас соответствует varchar(6).

mysql> desc records;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)      | YES  | MUL | NULL    |                |
| name        | varchar(255) | YES  | MUL | NULL    |                |
| type        | varchar(6)   | YES  |     | NULL    |                |
| content     | varchar(255) | YES  |     | NULL    |                |
| ttl         | int(11)      | YES  |     | NULL    |                |
| prio        | int(11)      | YES  |     | NULL    |                |
| change_date | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

и если предположить что у нас все ресурсные DNS записи, которые будут добавляться в таблицу будут семи самых распространенных значений ('A','AAAA','MX','NS','PTR','SOA','TXT'), то можно смело переводить столбец type в ENUM, что даст прирост производительности.

пятница, 2 декабря 2011 г.

Миграция с Bind на PowerDNS на серверах с ISPmanager - часть 2

Первая часть http://paperknight.blogspot.com/2011/12/bind-powerdns.html

Создание slave зон доменов на slave сервере.

Два пути, выполняем экспорт базы данных PowerDNS (только таблицу domains) на master сервере. Импортируем ее в базу данных Mysql на Slave сервере PowerDNS, меняем тип зон на slave (mysql> update domains set type = 'SLAVE' where type = 'MASTER';) и ждем пока по AXFR пройдут все трансферы записей в зонах с master сервера на slave сервер.

Второй вариант это использовать дополнительный функционал PowerDNS под названием supermaster. При его использовании не понадобится создавать зоны на slave сервере для трансфера, просто указывается т.н. supermaster сервер в базе данных на slave сервере и отправляется notify с master сервера.

На slave сервере:

mysql> show tables;
+----------------+
| Tables_in_pdns |
+----------------+
| domains        |
| records        |
| supermasters   |
+----------------+
3 rows in set (0.00 sec)

mysql> desc supermasters;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ip         | varchar(25)  | NO   |     | NULL    |       |
| nameserver | varchar(255) | NO   |     | NULL    |       |
| account    | varchar(40)  | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into supermasters (ip, nameserver, account) values ('85.10.234.195', 'ns1.local.lan', 'test');
Query OK, 1 row affected (0.00 sec)

Теперь с master сервера отправляем notify на slave сервер и целевая зона автоматически создается на slave сервере со всем ее содержимым.

srv-01:/usr/local/ispmgr/etc# pdns_control notify-host domain1.local 78.47.130.43
Added to queue

Смотрим создался ли домен на slave сервере:

root@srv-02:~# mysql -u root -p -e 'select * from pdns.domains'
Enter password:
+----+---------------+---------------+------------+-------+-----------------+---------+
| id | name          | master        | last_check | type  | notified_serial | account |
+----+---------------+---------------+------------+-------+-----------------+---------+
| 13 | domain1.local | 85.10.234.195 | 1322843394 | SLAVE |            NULL | test    |
+----+---------------+---------------+------------+-------+-----------------+---------+

root@srv-02:~# mysql -u root -p -e 'select * from pdns.records'
Enter password:
+-----+-----------+--------------------+------+-------------------------------------------------------------------+------+------+-------------+
| id  | domain_id | name               | type | content                                                           | ttl  | prio | change_date |
+-----+-----------+--------------------+------+-------------------------------------------------------------------+------+------+-------------+
|  95 |        13 | domain1.local      | SOA  | ns1.local.lan. root.local.lan. 2011120200 10800 3600 604800 86400 | 3600 |    0 |        NULL |
|  96 |        13 | domain1.local      | NS   | ns1.local.lan                                                     | 3600 |    0 |        NULL |
|  97 |        13 | domain1.local      | NS   | ns2.local.lan                                                     | 3600 |    0 |        NULL |
|  98 |        13 | domain1.local      | MX   | mail.domain1.local                                                | 3600 |   10 |        NULL |
|  99 |        13 | domain1.local      | MX   | mail.domain1.local                                                | 3600 |   20 |        NULL |
| 100 |        13 | domain1.local      | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 101 |        13 | ftp.domain1.local  | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 102 |        13 | mail.domain1.local | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 103 |        13 | pop.domain1.local  | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 104 |        13 | smtp.domain1.local | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 105 |        13 | www.domain1.local  | A    | 85.10.234.195                                                     | 3600 |   20 |        NULL |
| 106 |        13 | domain1.local      | TXT  | "v=spf1 ip4:85.10.234.195 a mx ~all"                              | 3600 |   20 |        NULL |
+-----+-----------+--------------------+------+-------------------------------------------------------------------+------+------+-------------+

Миграция с Bind на PowerDNS на серверах с ISPmanager

На сервере используется панель ISPmanager и задача выполняется с учетом данного факта.

Миграция мастер-зон доменов Bind'а в Mysql базу данных PowerDNS, в данном примере используются тестовые домены domain1.local, domain1.local, domain1.local. Сам DNS сервер содержит только мастер зоны.

zone2sql - это утилита для конвертирования Bind зон в sql

srv-01:~# zone2sql --named-conf=/etc/bind/named.conf --gmysql > domains_from_bind.sql
100% done
Parsed 79 records

srv-01:~# mysql -u root -p pdns < domains_from_bind.sql

Бэкапим конфиг панели ISPmanager /usr/local/ispmgr/etc/ispmgr.conf (можно не весь, а только строчки где определяются пользователи и их владением, теми или иными доменами)

Проверяем результат:

srv-01:/opt/backup# mysql -u root -p -e 'select * from pdns.domains'
Enter password:
+----+------------------+--------+------------+--------+-----------------+---------+
| id | name             | master | last_check | type   | notified_serial | account |
+----+------------------+--------+------------+--------+-----------------+---------+
| 20 | 127.in-addr.arpa | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 18 |                  | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 19 | localhost        | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 21 | 0.in-addr.arpa   | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 22 | 255.in-addr.arpa | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 23 | domain1.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 24 | domain2.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 25 | domain3.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
+----+------------------+--------+------------+--------+-----------------+---------+

srv-01:/opt/backup# mysql -u root -p -e 'select * from pdns.records'
Enter password:
+-----+-----------+------------------------+------+-----------------------------------------------------------------+---------+------+-------------+
| id  | domain_id | name                   | type | content                                                         | ttl     | prio | change_date |
+-----+-----------+------------------------+------+-----------------------------------------------------------------+---------+------+-------------+
| 283 |        22 | 255.in-addr.arpa       | SOA  | localhost root.localhost 1 604800 86400 2419200 604800          |  604800 |    0 |        NULL |
| 282 |        21 | 0.in-addr.arpa         | NS   | localhost                                                       |  604800 |    0 |        NULL |
| 281 |        21 | 0.in-addr.arpa         | SOA  | localhost root.localhost 1 604800 86400 2419200 604800          |  604800 |    0 |        NULL |
| 279 |        20 | 127.in-addr.arpa       | NS   | localhost                                                       |  604800 |    0 |        NULL |
| 280 |        20 | 1.0.0.127.in-addr.arpa | PTR  | localhost                                                       |  604800 |    0 |        NULL |
| 277 |        19 | localhost              | AAAA | ::1                                                             |  604800 |    0 |        NULL |
| 278 |        20 | 127.in-addr.arpa       | SOA  | localhost root.localhost 1 604800 86400 2419200 604800          |  604800 |    0 |        NULL |
| 276 |        19 | localhost              | A    | 127.0.0.1                                                       |  604800 |    0 |        NULL |
| 275 |        19 | localhost              | NS   | localhost                                                       |  604800 |    0 |        NULL |
| 274 |        19 | localhost              | SOA  | localhost root.localhost 2 604800 86400 2419200 604800          |  604800 |    0 |        NULL |
| 273 |        18 | m.root-servers.net     | AAAA | 2001:dc3::35                                                    | 3600000 |    0 |        NULL |
| 272 |        18 | m.root-servers.net     | A    | 202.12.27.33                                                    | 3600000 |    0 |        NULL |
| 270 |        18 | l.root-servers.net     | A    | 199.7.83.42                                                     | 3600000 |    0 |        NULL |
| 271 |        18 |                        | NS   | M.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 269 |        18 |                        | NS   | L.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 268 |        18 | k.root-servers.net     | AAAA | 2001:7fd::1                                                     | 3600000 |    0 |        NULL |
| 267 |        18 | k.root-servers.net     | A    | 193.0.14.129                                                    | 3600000 |    0 |        NULL |
| 266 |        18 |                        | NS   | K.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 265 |        18 | j.root-servers.net     | AAAA | 2001:503:C27::2:30                                              | 3600000 |    0 |        NULL |
| 264 |        18 | j.root-servers.net     | A    | 192.58.128.30                                                   | 3600000 |    0 |        NULL |
| 263 |        18 |                        | NS   | J.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 262 |        18 | i.root-servers.net     | A    | 192.36.148.17                                                   | 3600000 |    0 |        NULL |
| 261 |        18 |                        | NS   | I.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 260 |        18 | h.root-servers.net     | AAAA | 2001:500:1::803f:235                                            | 3600000 |    0 |        NULL |
| 242 |        18 |                        | NS   | A.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 243 |        18 | a.root-servers.net     | A    | 198.41.0.4                                                      | 3600000 |    0 |        NULL |
| 244 |        18 | a.root-servers.net     | AAAA | 2001:503:BA3E::2:30                                             | 3600000 |    0 |        NULL |
| 245 |        18 |                        | NS   | B.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 246 |        18 | b.root-servers.net     | A    | 192.228.79.201                                                  | 3600000 |    0 |        NULL |
| 247 |        18 |                        | NS   | C.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 248 |        18 | c.root-servers.net     | A    | 192.33.4.12                                                     | 3600000 |    0 |        NULL |
| 249 |        18 |                        | NS   | D.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 250 |        18 | d.root-servers.net     | A    | 128.8.10.90                                                     | 3600000 |    0 |        NULL |
| 251 |        18 |                        | NS   | E.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 252 |        18 | e.root-servers.net     | A    | 192.203.230.10                                                  | 3600000 |    0 |        NULL |
| 253 |        18 |                        | NS   | F.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 254 |        18 | f.root-servers.net     | A    | 192.5.5.241                                                     | 3600000 |    0 |        NULL |
| 255 |        18 | f.root-servers.net     | AAAA | 2001:500:2f::f                                                  | 3600000 |    0 |        NULL |
| 256 |        18 |                        | NS   | G.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 257 |        18 | g.root-servers.net     | A    | 192.112.36.4                                                    | 3600000 |    0 |        NULL |
| 258 |        18 |                        | NS   | H.ROOT-SERVERS.NET                                              | 3600000 |    0 |        NULL |
| 259 |        18 | h.root-servers.net     | A    | 128.63.2.53                                                     | 3600000 |    0 |        NULL |
| 284 |        22 | 255.in-addr.arpa       | NS   | localhost                                                       |  604800 |    0 |        NULL |
| 285 |        23 | domain1.local          | SOA  | ns1.local.lan root.local.lan 2011120200 10800 3600 604800 86400 |    3600 |    0 |        NULL |
| 286 |        23 | domain1.local          | NS   | ns1.local.lan                                                   |    3600 |    0 |        NULL |
| 287 |        23 | domain1.local          | NS   | ns2.local.lan                                                   |    3600 |    0 |        NULL |
| 288 |        23 | domain1.local          | MX   | mail.domain1.local                                              |    3600 |   10 |        NULL |
| 289 |        23 | domain1.local          | MX   | mail.domain1.local                                              |    3600 |   20 |        NULL |
| 290 |        23 | domain1.local          | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 291 |        23 | ftp.domain1.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 292 |        23 | mail.domain1.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 293 |        23 | pop.domain1.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 294 |        23 | smtp.domain1.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 295 |        23 | www.domain1.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 296 |        23 | domain1.local          | TXT  | "v=spf1 ip4:85.10.234.195 a mx ~all"                            |    3600 |    0 |        NULL |
| 297 |        24 | domain2.local          | SOA  | ns1.local.lan root.local.lan 2011120200 10800 3600 604800 86400 |    3600 |    0 |        NULL |
| 298 |        24 | domain2.local          | NS   | ns1.local.lan                                                   |    3600 |    0 |        NULL |
| 299 |        24 | domain2.local          | NS   | ns2.local.lan                                                   |    3600 |    0 |        NULL |
| 300 |        24 | domain2.local          | MX   | mail.domain2.local                                              |    3600 |   10 |        NULL |
| 301 |        24 | domain2.local          | MX   | mail.domain2.local                                              |    3600 |   20 |        NULL |
| 302 |        24 | domain2.local          | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 303 |        24 | ftp.domain2.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 304 |        24 | mail.domain2.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 305 |        24 | pop.domain2.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 306 |        24 | smtp.domain2.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 307 |        24 | www.domain2.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 308 |        24 | domain2.local          | TXT  | "v=spf1 ip4:85.10.234.195 a mx ~all"                            |    3600 |    0 |        NULL |
| 309 |        25 | domain3.local          | SOA  | ns1.local.lan root.local.lan 2011120200 10800 3600 604800 86400 |    3600 |    0 |        NULL |
| 310 |        25 | domain3.local          | NS   | ns1.local.lan                                                   |    3600 |    0 |        NULL |
| 311 |        25 | domain3.local          | NS   | ns2.local.lan                                                   |    3600 |    0 |        NULL |
| 312 |        25 | domain3.local          | MX   | mail.domain3.local                                              |    3600 |   10 |        NULL |
| 313 |        25 | domain3.local          | MX   | mail.domain3.local                                              |    3600 |   20 |        NULL |
| 314 |        25 | domain3.local          | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 315 |        25 | ftp.domain3.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 316 |        25 | mail.domain3.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 317 |        25 | pop.domain3.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 318 |        25 | smtp.domain3.local     | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 319 |        25 | www.domain3.local      | A    | 85.10.234.195                                                   |    3600 |    0 |        NULL |
| 320 |        25 | domain3.local          | TXT  | "v=spf1 ip4:85.10.234.195 a mx ~all"                            |    3600 |    0 |        NULL |
+-----+-----------+------------------------+------+-----------------------------------------------------------------+---------+------+-------------+

Корректируем тип зон (так как утилита zone2sql в процессе конвертирования, задает тип зон как NATIVE)

mysql> select * from domains;
+----+------------------+--------+------------+--------+-----------------+---------+
| id | name             | master | last_check | type   | notified_serial | account |
+----+------------------+--------+------------+--------+-----------------+---------+
| 20 | 127.in-addr.arpa | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 18 |                  | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 19 | localhost        | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 21 | 0.in-addr.arpa   | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 22 | 255.in-addr.arpa | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 23 | domain1.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 24 | domain2.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
| 25 | domain3.local    | NULL   |       NULL | NATIVE |            NULL | NULL    |
+----+------------------+--------+------------+--------+-----------------+---------+
8 rows in set (0.00 sec)

mysql> update domains set type = 'MASTER' where type = 'NATIVE';
Query OK, 8 rows affected (0.00 sec)
Rows matched: 8  Changed: 8  Warnings: 0

mysql> select * from domains;
+----+------------------+--------+------------+--------+-----------------+---------+
| id | name             | master | last_check | type   | notified_serial | account |
+----+------------------+--------+------------+--------+-----------------+---------+
| 20 | 127.in-addr.arpa | NULL   |       NULL | MASTER |            NULL | NULL    |
| 18 |                  | NULL   |       NULL | MASTER |            NULL | NULL    |
| 19 | localhost        | NULL   |       NULL | MASTER |            NULL | NULL    |
| 21 | 0.in-addr.arpa   | NULL   |       NULL | MASTER |            NULL | NULL    |
| 22 | 255.in-addr.arpa | NULL   |       NULL | MASTER |            NULL | NULL    |
| 23 | domain1.local    | NULL   |       NULL | MASTER |            NULL | NULL    |
| 24 | domain2.local    | NULL   |       NULL | MASTER |            NULL | NULL    |
| 25 | domain3.local    | NULL   |       NULL | MASTER |            NULL | NULL    |
+----+------------------+--------+------------+--------+-----------------+---------+
8 rows in set (0.00 sec)

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

srv-01:/usr/local/ispmgr/etc# tail -n4 /usr/local/ispmgr/etc/ispmgr.conf
Domain domain1.local 500
Domain domain2.local 503
Domain domain3.local 504

Заходим в панель ISPmanager и проверяем все ли в порядке.