14  /  96

Как выбрать дисковую систему для базы MySQL

Просмотров: 1548 (Статистика ведётся с 06.02.2017)

Если вы периодически наблюдаете близкую к 100% утилизацию диска в iostat, то пришло время задуматься над тем правильно ли вы выбрали дисковую систему.

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

Другой подход - использовать не один, а несколько дисков: RAID.

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

Примечание: также можно посмотреть результаты тестов на EBS дисках в Amazon, опубликованные в MySQL Performance Blog. Эта информация тоже будет полезна, не смотря на то, что не корректно сравниваются очень разные результаты (например, чтение с одного диска в один поток, RAID 0 - 8 потоков, RAID 10 - 4; и тому подобное).

Пример тестирования проведём на работе с RAID 10. Именно он одновременно и быстрый, и надежный. А, вот, различных его конфигураций - достаточно много.

Примечание: В процессе тестирования оцените еще одно очень важное преимущество "облака": в нём очень удобно проводить самые разные тесты, собирая и разбирая любые тестовые стенды. И при этом платить — только за время реального использования.

Собрано 5 стендов:

  1. single disk - 100 Gb
  2. RAID 10 - 4 диска по 50 Gb. Добавить через админку Амазона 4 диска, подключить их, назначив соответствующие имена. А затем создать рейд вот так:
    # mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/xvd[g-j]
  3. RAID 10 - RAID 0 из двух RAID 1 (каждый по 2 диска по 50 Gb). Та же процедура, но итоговый рейд создается в три приема:
    # mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/xvd[g-h]
    # mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/xvd[i-j]
    # mdadm --create /dev/md2 --level=0 --raid-devices=2 /dev/md[0-1]
  4. RAID 10 - 8 дисков по 25 Gb. Аналогично пункту 2, но только подключаются 8 дисков, а не 4.
    # mdadm --create /dev/md0 --level=10 --raid-devices=8 /dev/xvd[g-n]
  5. RAID 10 - RAID 0 из четырех RAID 1 (каждый по 2 диска по 25 Gb).
    # mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/xvd[g-h]
    # mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/xvd[i-j]
    # mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/xvd[k-l]
    # mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/xvd[m-n]
    # mdadm --create /dev/md4 --level=0 --raid-devices=4 /dev/md[0-3]

На всех тестовых стендах используйте однотипную файловую систему, например: ext4. Параметры монтирования:

noatime,nodiratime,data=writeback,barrier=0

Для тестов лучше использовать sysbench - на файле 256 Мб; режимы - random read, random write, random read/write; разным количеством потоков, от 1 до 16.

  • Ось X - число потоков
  • Ось Y - число операций в секунду.

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

Что бы определить какая дисковая система лучше в конкретно вашем случае, необходимо чётко поставить задачу. В нашем случае выбирается дисковая система для базы. Формат хранения данных: InnoDB. Это означает что работа в основном ожидается с большими файлами (несколько Гб) ibdata.

Значит типичный профиль нагрузки - random read/write (чтений больше). И вот уже исходя из более понятной реальной задачи, делаем новую серию тестов - на файле размером 16 Гб:

Видно, что при чтении один диск сразу упирается в потолок и увеличение количества потоков не дает прироста производительности. А рейды из 4 дисков на нескольких потоках дают прирост производительности в 3-4 раза. Рейды из 8 дисков — в 6-7 раз.

На запись у рейдов примерно та же картина, что и с одним диском.

Резюме

Типичная работы базы MySQL - random read/write, чтений больше, чем записи. Самые производительные для такой задачи: RAID 10 с большим количеством дисков.

Минус такого решения - в удвоенной стоимости дисков (что при текущей их стоимости не является критичным).

Главное преимущество - у нас есть простое решение (software RAID можно собрать как на физическом сервере, так и в "облаке") для масштабирования производительности дисковой системы.


4
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии