29.1. Надежность#
29.1. Надежность
Надежность является важным свойством любой серьезной системы баз данных, и Tantor SE делает все возможное, чтобы гарантировать надежную работу. Одним из аспектов надежной работы является то, что все данные, записанные подтвержденной транзакцией, должны быть сохранены в неволатильной области, которая защищена от потери питания, сбоя операционной системы и сбоя оборудования (за исключением сбоя самой неволатильной области, конечно). Обычно этому требованию соответствует успешная запись данных на постоянное хранилище компьютера (жесткий диск или эквивалент). Фактически, даже если компьютер получает критические повреждения, если жесткие диски остаются целыми, их можно переместить на другой компьютер с аналогичным оборудованием, и все подтвержденные транзакции останутся нетронутыми.
В то время как принудительная запись данных на магнитные диски периодически может показаться простой операцией, на самом деле это не так. Поскольку дисковые накопители значительно медленнее оперативной памяти и процессоров, между основной памятью компьютера и магнитными дисками существует несколько уровней кеширования. Во-первых, есть буферный кеш операционной системы, который кеширует часто запрашиваемые блоки диска и объединяет записи на диск. К счастью, все операционные системы предоставляют приложениям способ принудительной записи данных из буферного кеша на диск, и Tantor SE использует эти возможности. (См. параметр wal_sync_method, чтобы настроить эту операцию).
Следующим шагом может быть кеш в контроллере дискового накопителя; это особенно распространено на контроллерах карт RAID. Некоторые из этих кешей работают в режиме write-through, что означает, что записи отправляются на диск сразу после их получения. Другие работают в режиме write-back, что означает, что данные отправляются на диск в более позднее время. Такие кеши могут представлять опасность для надежности, поскольку память в кеше контроллера диска является эфемерной и теряет свое содержимое при сбое питания. Лучшие контроллеры имеют батарейные блоки питания (BBU), что означает, что на карте установлена батарея, поддерживающая питание кеша в случае потери питания системы. После восстановления питания данные будут записаны на диски.
И, наконец, у большинства жестких дисков есть кеши. Некоторые из них работают в режиме записи-через, в то время как другие - в режиме записи-назад, и те же проблемы с потерей данных существуют для кешей жесткого диска, работающих в режиме записи-назад, как и для кешей контроллера диска. Жесткие диски стандарта IDE и SATA, предназначенные для потребителей, особенно часто имеют кеши записи-назад, которые не выживут при сбое питания. Многие твердотельные накопители (SSD) также имеют летучие кеши записи-назад.
Эти кеши обычно можно отключить; однако, способ сделать это зависит от операционной системы и типа диска:
На Linux можно запросить информацию о дисках IDE и SATA с помощью команды
hdparm -I
; запись в кеш включена, если рядом сWrite cache
есть символ*
. Чтобы отключить запись в кеш, можно использовать командуhdparm -W 0
. Диски SCSI можно запросить с помощью sdparm. Используйте командуsdparm --get=WCE
для проверки включенности кеша записи и командуsdparm --clear=WCE
для его отключения.На FreeBSD IDE-диски можно опрашивать с помощью
camcontrol identify
и отключать кэширование записи, установивhw.ata.wc=0
в/boot/loader.conf
; SCSI-диски можно опрашивать с помощьюcamcontrol identify
, а кэш записи можно как опрашивать, так и изменять с помощьюsdparm
, если он доступен.На Solaris кеш записи на диске контролируется с помощью команды
format -e
. (Файловая система Solaris ZFS безопасна при включенном кеше записи на диске, поскольку она сама отправляет команды сброса кеша на диск).На Windows, если
wal_sync_method
установлено вopen_datasync
(по умолчанию), кэширование записи может быть отключено путем снятия флажкаMy Computer\Open\
. Можно также установитьdisk drive
\Properties\Hardware\Properties\Policies\Enable write caching on the diskwal_sync_method
вfsync
илиfsync_writethrough
, что предотвратит кэширование записи.На macOS кэширование записи может быть предотвращено путем установки
wal_sync_method
вfsync_writethrough
.
Недавние SATA-диски (те, которые следуют за ATAPI-6 или более поздними)
предлагают команду очистки кеша диска (FLUSH CACHE EXT
),
в то время как SCSI-диски давно поддерживают аналогичную команду
SYNCHRONIZE CACHE
. Эти команды не доступны напрямую
для Tantor SE, но некоторые файловые системы
(например, ZFS, ext4) могут использовать их для сброса
данных на диски с включенной записью в кеш. К сожалению, такие
файловые системы работают неоптимально при использовании контроллеров дисков
с резервным питанием (BBU). В таких настройках команда синхронизации
принуждает все данные из кеша контроллера на диски,
ликвидируя большую часть преимуществ BBU. Вы можете запустить
программу pg_test_fsync, чтобы узнать,
подвержены ли вы этому. Если вы подвержены, преимущества производительности
BBU могут быть восстановлены путем отключения барьеров записи в
файловой системе или переконфигурирования контроллера диска, если это
возможно. Если барьеры записи отключены, убедитесь, что батарея
остается функциональной; неисправная батарея может привести к потере данных.
Надеемся, что разработчики файловых систем и контроллеров дисков в конечном итоге
устранят это неоптимальное поведение.
Когда операционная система отправляет запрос на запись на аппаратное обеспечение хранения, она мало что может сделать, чтобы убедиться, что данные прибыли в действительно неперемещаемую область хранения. Вместо этого ответственность лежит на администраторе, чтобы убедиться, что все компоненты хранения обеспечивают целостность как данных, так и метаданных файловой системы. Избегайте контроллеров дисков, у которых нет батарейно-защищенного кеша записи. На уровне диска отключите кеширование записи с отложенной записью, если диск не может гарантировать, что данные будут записаны перед выключением. Если вы используете SSD, имейте в виду, что многие из них по умолчанию не выполняют команды сброса кеша. Вы можете проверить надежность работы подсистемы ввода-вывода с помощью diskchecker.pl
.
Еще одним риском потери данных являются операции записи на дисковые пластины. Дисковые пластины разделены на секторы, обычно по 512 байт каждый. Каждая физическая операция чтения или записи обрабатывает целый сектор. Когда запрос на запись поступает на диск, он может быть для нескольких кратных 512 байт (Tantor SE обычно записывает 8192 байта или 16 секторов за раз), и процесс записи может завершиться неудачно из-за потери питания в любой момент, что означает, что некоторые секторы по 512 байт были записаны, а другие - нет. Чтобы защититься от таких сбоев, Tantor SE периодически записывает полные изображения страниц в постоянное хранилище WAL перед изменением фактической страницы на диске. При восстановлении после сбоя Tantor SE может восстановить частично записанные страницы из WAL. Если у вас есть программное обеспечение файловой системы, которое предотвращает частичную запись страниц (например, ZFS), вы можете отключить это изображение страницы, отключив параметр full_page_writes. Контроллеры дисков с батарейным резервным источником (BBU) не предотвращают частичную запись страниц, если они не гарантируют, что данные записываются в BBU в виде полных (8 кБ) страниц.
Tantor SE также защищает от некоторых видов повреждения данных на устройствах хранения, которые могут возникнуть из-за ошибок аппаратного обеспечения или отказа носителя со временем, таких как чтение/запись мусорных данных.
Каждая отдельная запись в файле WAL защищена контрольной суммой CRC-32 (32-бит), которая позволяет нам определить, являются ли содержимое записи правильным. Значение CRC устанавливается при записи каждой записи WAL и проверяется во время восстановления после сбоя, восстановления из архива и репликации.
По умолчанию контрольные суммы страниц данных не рассчитываются, хотя полные образы страниц, записанные в записях WAL, будут защищены; см. initdb для получения подробной информации о включении контрольных сумм данных. Контрольные суммы страниц данных рассчитываются, если wal_sender_stop_when_crc_failed равно true. Если контрольная сумма не верна, страницы данных читаются из буфера.
Внутренние структуры данных, такие как
pg_xact
,pg_subtrans
,pg_multixact
,pg_serial
,pg_notify
,pg_stat
,pg_snapshots
не являются прямо контрольной суммой, и страницы не защищены полными записями страниц. Однако, где такие структуры данных являются постоянными, записи WAL записываются, что позволяет недавние изменения точно восстановить при восстановлении после сбоя, и эти записи WAL защищены, как обсуждалось выше.Индивидуальные файлы состояния в
pg_twophase
защищены CRC-32.Временные файлы данных, используемые в более крупных SQL-запросах для сортировки, материализации и промежуточных результатов, в настоящее время не подвергаются контрольной суммированию, и записи WAL не будут создаваться для изменений в этих файлах.
Tantor SE не защищает от исправимых ошибок памяти, и предполагается, что вы будете работать с ОЗУ, использующей коды исправления ошибок (ECC) стандарта отрасли или лучшую защиту.