Ускоряем базу данных. Bcache

в 9:30, , рубрики: bcache, linux, OSM, Администрирование баз данных, системное администрирование, метки: ,

Для работы мы используем postgresql + postgis базу данных с данными для всей планеты от osm.org. На диске она занимает около 350 Gb и работает не быстро, да и хранится на обычном винчестере 2Tb 7200rpm, без RAID-a. Т.к. нагрузка на базу данных постепенно растет, было решено ускорить дисковую подсистему, потратив при этом минимум денег. Вариантов было не много:

  • или купить еще один такой же винчестер и объединить их в raid-0.
  • или купить небольшой SSD и организовать на нем быстрый кэш:
    • dm-cache. Был добавлен в ядро 3.9, ставится просто.
    • bcache. Судя по обзорам самый быстрый. Основной минус — надо форматировать диски перед началом использования. Официально добавлен в ядро 3.10, распространяется как пропатченое ядро 3.9.
    • EnhanceIO. В обзорах я встретил упоминание его, как самого медленного, но простого в использовании. Добавлен в ядро 3.10.

Взвесив плюсы и минусы, а так же спросив отзывы знакомых, я решил остановиться на bcache. О нем и расскажу подробнее.

Сборка ядра bcache

Чтобы попробовать bcache — надо собрать пропатченое ядро 3.9. Проект активно развивается и его исходники даже не распространяются как tar.bz2. Хочешь скачать — качай репозиторий (700Мб где-то).

# устанавливаем все необходимое для сборки ядра
sudo apt-get install kernel-package fakeroot build-essential ncurses-dev bc
# забираем последние исходники bcache
git clone http://evilpiepirate.org/git/linux-bcache.git
cd linux-bcache
# за основу конфига ядра с bcache используем конфиг текущего ядра
cat /boot/config-`uname -r`>.config
make oldconfig

После этого шага надо будет выбрать какие опции использовать для добавившихся параметров ядра. Я оставил все по умолчанию, только bcache собрал как модуль ядра. Debug ключи bcache оставил в выключенном состоянии.

make-kpkg clean
# С ключом -j можно задать число параллельных процессов сборки.
sudo time fakeroot make-kpkg -j8 --initrd kernel_image kernel_headers
# Через 24 минуты ядро было готово. Можно устанавливать.
sudo dpkg -i ../linux-image-3.9.0+_3.9.0+-10.00.Custom_amd64.deb ../linux-headers-3.9.0+_3.9.0+-10.00.Custom_amd64.deb

# следом установим и bcache-tools
cd ..
git clone http://evilpiepirate.org/git/bcache-tools.git
cd bcache-tools
make
sudo make install

Если это ядро самое свежее по версии — оно загрузится автоматически, если у вас установлено что-то более новое — ядро с bcache можно будет выбрать при загрузке в grub2 в меню Advanced boot options.

Настраиваем bcache

Для работы с bcache диски надо предварительно отформатировать. (не забудьте забэкапить данные)

sudo -i
umount /dev/sdb4
# форматируем раздел HDD
make-bcache -B /dev/sdb4
# форматируем SSD для кэша
make-bcache -С /dev/sda

Далее диски надо зарегистрировать в ядре.

echo /dev/sdb4 > /sys/fs/bcache/register
echo /dev/sda > /sys/fs/bcache/register

После регистрации диск появится как /dev/bcache0, а кэш как /sys/fs/bcache/<UDID>. Форматируем диск в файловую систему по выбору и монтируем его.

mkfs.ext4 /dev/bcache0
mount /dev/bcache0 /mnt

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

echo <UUID> > /sys/block/bcache0/bcache/attach

Ну вот и все. У вас в системе есть диск который с подключенным к нему writetrough кэшем. Если основная нагрузка на базу — это выборки, без модификации данных — такого режима кэширования будет достаточно и SSD проживет дольше. Writeback можно включить коммандой:

echo writeback > /sys/block/bcache0/cache_mode

Впечатления от bcache

После заполнения кэша база стала работать в разы шустрее. Привести какие-то цифры мне тяжело, т.к. до перехода на bcache я не делал референсных запросов. Но приблизительное отношение скоростей я показать смогу. Так сферический запрос с пустым кэшем выполняется за 171 секунду. Повторно он же выполняется за 3.2 секунды. Чтобы время исключить влияние кэшей базы данных на скорость обработки, я перезапустил БД, после чего запрос выполнился за 4 секунды. С таким приростом скорости обработка данных всей планеты не кажется невыполнимой задачей на нашем относительно слабом железе.

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

$ cd /sys/block/bcache0/bcache/stats_hour
$ cat cache_hit_ratio 
90
$ cat cache_hits
836233
$ cat cache_misses 
91086
$ cd cache/cache0
$ cat btree_written 
92.3M
$ cat metadata_written 
481M
$ cat written 
41.3G

Спасибо за внимание. О опечатках и неточностях сообщайте в личку, на вопросы постараюсь ответить в комментариях.
p.s. Документация к bcache очень подробная и хорошо написана, рекомендую к прочтению.

Автор: mOlind

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js