mysql-master-master 1.x

Внедрил первую ветку mysql-master-master. Впечатления остались двойственные: сама задумка неплоха, но авторы откровенно забили на проект, многие issues открыты больше года и до сих пор не закрываются.

Так, например, при установке read_only агент не делает flush tables with read lock, что может серьезно поломать репликацию. Кроме того, авторы забили и на включение-выключение event scheduler в MySQL 5.1.

Ну и само собой, сие поделие от специалистов Percona не поддерживает FreeBSD, пришлось долго и упорно патчить.

Тюнинг ZFS, MySQL и InnoDB

Тюнинг MySQL и InnoDB

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

innodb_flush_method = O_DIRECT

Механизм буфера двойной записи (doublewrite) используется в InnoDB для того, чтобы удостовериться, что измененные страницы были записаны в файл данных. Этот механизм позволяет избежать потери данных при внезапном отключении сервера. Поскольку у ZFS есть свой механизм обеспечения целостности данных, буфер двойной записи можно отключить:

skip-innodb_doublewrite

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

innodb_data_home_dir=/var/db/mysql/ibdata
# zfs create data/mysql/ibdata
# zfs set recordsize=16K data/mysql/ibdata
# mv /var/db/mysql/ibdata1 /var/db/mysql/ibdata/

Тюнинг ZFS

База данных осуществляет чтение в произвольном порядке, который нельзя предсказать.
Отключение префетча позволяет избежать ненужных операций чтения. Добавим в /boot/loader.conf строку

vfs.zfs.prefetch_disable=1

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

# zfs set primarycache=metadata data/mysql/ibdata

См. также: MySQL на ZFS под FreeBSD: подготовка

Бэкапим MySQL на ZFS

Кстати, бэкапиться с ZFS на слейвах очень и очень просто:

#!/bin/sh
user='mysqlbackup';
pass='superpass';
/usr/local/bin/mysql -u $user -p$pass -e 'STOP SLAVE; FLUSH LOGS; FLUSH TABLES WITH READ LOCK; \
SYSTEM zfs destroy -r data/mysql@yesterday; \
SYSTEM zfs rename -r data/mysql@today @yesterday; \
SYSTEM zfs snapshot -r data/mysql@today; \
UNLOCK TABLES; START SLAVE;'

Скрипт выполняется примерно за секунду на 30 гиговой базе.

FreeBSD UFS/ZFS Snapshot Management Environment

Открыл для себя очередную крутую штуку, FreeBSD UFS/ZFS Snapshot Management Environment. В портах можно найти в sysutils/freebsd-snapshot . Утилита позволяет манипулировать UFS2 снапшотами не сложнее, чем это делается в ZFS:

# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1172MB   14.8%      4MB    0.1%  test.0
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1176MB   14.8%      4MB    0.1%  test.0
/var              1176MB   14.8%      4MB    0.1%  test.1
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1181MB   14.9%      4MB    0.1%  test.0
/var              1181MB   14.9%      4MB    0.1%  test.1
/var              1181MB   14.9%      4MB    0.1%  test.2
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1186MB   15.0%      4MB    0.1%  test.0
/var              1186MB   15.0%      4MB    0.1%  test.1
/var              1186MB   15.0%      4MB    0.1%  test.2
/var              1186MB   15.0%      4MB    0.1%  test.3
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1186MB   15.0%      4MB    0.1%  test.0
/var              1186MB   15.0%      4MB    0.1%  test.1
/var              1186MB   15.0%      4MB    0.1%  test.2
/var              1186MB   15.0%      4MB    0.1%  test.3
# snapshot mount /var:test.2 /mnt
# ls /mnt
.snap      crash      games      lost+found obj        rwho
account    cron       heimdal    mail       opkg       spool
at         db         lib        msgs       preserve   tmp
backups    empty      log        named      run        yp
# snapshot umount /mnt
# snapshot make -g0 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot

Про zvol

ZFS предоставляет интерфейс zvol, который позволяет обращаться к разделам как к блочным устройствам, используя путь /dev/zvol/zpoolname/volume. Как показала практика, объекты типа filesystem адресовать нельзя.

# uname -r
8.0-RELEASE-p2
# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
system      1.16G   269G  1.16G  legacy
tank         177K  1.43T  30.4K  none
tank/video  28.8K  1.43T  28.8K  none
# mount
system on / (zfs, local)
devfs on /dev (devfs, local, multilabel)
# zfs get type tank/video
NAME        PROPERTY  VALUE       SOURCE
tank/video  type      filesystem  -
# ls -la /dev/zvol
ls: /dev/zvol: No such file or directory

Однако если создать volume с четко заданным размером, то его можно будет использовать как блочное устройство.

# zfs create -V 100m tank/test
# ls -l /dev/zvol/tank
total 0
crw-r-----  1 root  operator    0, 116 Jan 12 13:21 test

Клонирование ZFS на другой пул

Цель: сделать копию файловой системы и развернуть ее на другом пуле ZFS.
Решение проще пареной репы:

zfs create backup/root
zfs snapshot tank/root@now
zfs send tank/root@now | zfs receive -F backup/root
zfs rollback backup/root@now
zfs destroy tank/root@now
zfs destroy backup/root@now

nginx vs DDoS: accept-фильтры во FreeBSD

Вот что пишет о механизме accept-фильтров автор web-сервера nginx Игорь Сысоев:

Два года назад во FreeBSD появились accept-фильтры. Они позволяют не передавать в accept() пришедшее соединение до тех пор, пока не придёт первый пакет с данными (фильтр dataready) или заголовок HTTP-запроса (фильтр httpready). Использование фильтров в Apache (а в нём они поддерживаются, начиная с версии 1.3.14) позволяет уменьшить число процессов. В серверах, использующих select(), poll() или kqueue(), например, в thttpd-2.22, фильтры уменьшают число открытых файлов. И наконец, в обоих случаях accept-фильтры уменьшают число переключений контекста процесса.

Таким образом, использование данного инструментария позволить перенести обработку части запросов в ядро и снизить общую загрузку сервера. Читать далее nginx vs DDoS: accept-фильтры во FreeBSD

MySQL на ZFS под FreeBSD: подготовка

Итак, что есть на руках:

# uname -rm
8.0-RELEASE amd64
# atacontrol list
ATA channel 2:
    Master:  ad4 ST3500320NS/SN06 SATA revision 1.x
    Slave:       no device present
ATA channel 3:
    Master:  ad6 ST3500320NS/SN06 SATA revision 1.x
    Slave:       no device present
# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            ad4s1d  ONLINE       0     0     0
            ad6s1d  ONLINE       0     0     0

errors: No known data errors

Имеем мы 64 битную FreeBSD 8-й ветки, релиз которой состоялся совсем недавно Операционная система установлена на ZFS зеркале из двух SATA жестких дисков. FreeBSD ZFS Tuning Guide рекомендует именно такие версии софта для наиболее стабильной работы. Для начала создадим в уже имеющемся ZFS пуле с названием tank файловые системы, которые мы будем использовать для хранения данных Не забыв при этом остановить сервер MySQL и сделать бэкап директории с данными.
Читать далее MySQL на ZFS под FreeBSD: подготовка

Хранение сессий PHP в memcached

Данные всех пользовательских сессий php по умолчанию складывает в особые файлы во временной директории. Количество этих файлов пропорционально количеству пользователей, работающих с проектом.

При определенном уровне нагрузки это приведет к тому, что даже простое открытие файла сессии будет длиться секунду и дольше. Что неизбежно привезет к зависанию клиентских запросов в пуле PHP-FastCGI и появлению ошибок 502 Bad Gateway при попытке открыть любой пхп скрипт — только лишь потому, что большинство воркеров будут заняты открытием файлов сессий.
Читать далее Хранение сессий PHP в memcached