From: Sergey Matveev Date: Sat, 23 Jan 2021 09:52:31 +0000 (+0300) Subject: Let's Encrypt на ZFS X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=cc1ebd60bd524b94e27b00ec70cc661670ae6b43;p=stargrave-blog.git Let's Encrypt на ZFS https://letsencrypt.org/2021/01/21/next-gen-database-servers.html https://github.com/letsencrypt/openzfs-nvme-databases Let's Encrypt опубликовала то, как они живут с ZFS-ом и MariaDB для своих довольно нагруженных задач. По железу ничего интересного: stripe из 12 NVMe зеркал -- да там за миллион IOPS-ов должно быть! В памяти можно ничего не хранить (индексы БД) -- одни IOPS-ы выжмут всё что надо. А настройка ZFS ничем не примечательна, но грамотна. Именно такой и должен быть подход и понимание особенностей dataset-ов: * выставленный ashift -- must-have, для NVMe даже 8KiB поставили * включённый hotspare -- так держать. Тем более что несколько терабайт для их NVMe это вопрос очень небольшого времени * использование простых зеркал в stripe -- разумно, из-за NVMe и малого времени resilvering-а. Для HDD конечно было бы неразумно * используют /dev/disk/by-id/ -- если диск честно отдаёт свой id, то разумно. Нормальные NVMe думаю что такое. Хотя лично я предпочитаю создавать GPT с label-ом... содержащим серийник диска :-) * балансировка дисков по контроллерам и шинам -- как минимум понимают важность (всё ж у меня и не было сомнений что там квалифицированные специалисты работают) этого * atime=off -- так держать. Лично у меня только единственный dataset с Maildir-ом моей почты для Mutt имеет atime=on * compression=lz4 -- вообще в случае с дюжиной NVMe у меня бы были сомнения а не упрёмся ли мы в CPU, но видимо что LZ4 и CPU настолько хороши, что даже с такой дисковой подсистемой это не бутылочное горлышко * primarycache=metadata -- правильно, учитывая что у СУБД своё неплохое кэширование (для задач) * recordsize=128k -- ну это и так default, всё ok * xattr=sa -- вот с этим, кроме как на Ceph, не сталкивался, но видел что надо бы. Хотя на FreeBSD эта настройка вообще не используется InnoDB раздел -- особый. Как минимум в нём fsync: * logbias=throughput -- разумно, ибо, как верно заметили, все диски и так одинаковы по производительности, плюс это не HDD где головку надо перемещать на ZIL и обратно. throughput тут позволяет "вне ZIL" сразу записывать данные, что для NVMe разумно * recordsize=16k -- самая главная настройка по сути. В PostgreSQL это 8K. Это убирает дичайший overhead который бы был с recordsize=128K * redundant_metadata=most -- убирает необходимость создания некоторых копий метаданных. Если это сильно вредит, и раз всё равно зеркало есть, то разумно В самой MariaDB отключены checksum-ы -- разумно, так как оно есть в ZFS. Отключён doublewrite -- ибо записи в ZFS атомарны. write ahead log бессмысленнен на CoW -- выставлены в размер recordsize. Отключён AIO, ну потому что это Linux и он говно в котором много что работает плохо, это очевидно. flush_neighbors отключён, ибо это всё равно CoW и NVMe. У меня придраться не к чему, всё как надо. Хотя я удивлён что sysctl никак не настраивали. Но видимо современные ZFS версии и так очень хорошо себя ведут. ---