Документация по PostgreSQL 8.4.2 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 28. Надёжность и журнал опережающей записи (WAL) | Fast Forward | Next |
Надёжность — это одна из важных составляющих любой серьёзной СУБД и в PostgreSQL всегда делалется всё возможное, чтобы гарантировать надёжность работы. Один из аспектов надёжности состоит в том, что все данные, записанные с помощью завершённых транзакций должны храниться в отказоустойчивых областях, которые не подвержены отказам по питанию, сбоям операционной системы и аппартного обеспечения (конечно, за исключением сбоев самих таких областей). Успешная запись данных на постоянный носитель (обычно диск или его эквивалент) обычно удовлетворяет этим требованиям. Фактически, даже если компьютер невосстановимо повреждён, но диски пережили это повреждение, они могут быть переставлены в другой компьютер и все завершённые транзакции не пропадут.
Хотя и кажется, что работа с данными на диске осуществляется просто, на самом деле это не так. Поскольку диски огорчительно медленнее, чем работа с оперативной памятью и процессорами, существует несколько уровней кэширования между оперативной памятью компьютера и диском. Во-первых, это буфер кэша операционной системы, который кэширует частые запросы к блокам диска и комбинирует запись на диск. К счастью, что все операционные системы дают приложениям способ принудительно записывать данный буфер кэша на диск и PostgreSQL использует эту возможность. (См. параметр wal_sync_method, чтобы настроить выполнение этой операции).
Далее, у контроллера диска может быть свой кэш; особенно это относится к RAID контроллерам. Некоторые из них кэшируют в режиме write-through, что означает, что запись выполнится на диск как только появятся данные. Другие работают в режиме write-back, что означает, что запись на диск будет осуществлена несколько позже. Такое кэширование может быть рискованым в плане надёжности, потому что память на контроллере диска зависит от наличия питания и её содержимое будет потеряно, если питание вдруг исчезнет. Более лучшие контроллеры имеют battery-backed кэш, который оснащён собственной батареей, которая запитывает память кэша в случае если системное питание отключается. После восстановления системного питания, содержимое кэша будет записано на диск.
Наконец, большинство дисков имеет свой кэш. Некоторые работают в режиме write-through, некоторые в режиме write-back с тем же риском потери данных из кэша для write-back. Потребительские IDE и SATA диски наиболее часто оснащаются write-back кэшем, который теряется при отключении питания. Чтобы проверить запись кэша на диск в Linux, используйте hdparm -I; она разрешена, если вы увидите на экране среди прочих данных символ * за которым следуют слова Write cache. Команда hdparm -W выключает запись кэша. В операционной системе FreeBSD используйте atacontrol. (Для SCSI дисков, чтобы выключить WCE, используйте sdparm.) В Операционной системе Solaris, запись кэша на диск с управляется format -e. (Файловая ситема ZFS в Solarisfile является безопасной с включеным режимом записи кэша, потому что она использует свои собственные команды работы с дисковым кэшем.) В операционной системе Windows, если значение wal_sync_method установлено в open_datasync (по умолчанию), то запись кэша запрещается при снятии флажка My Computer\Open\{select disk drive}\Properties\Hardware\Properties\Policies\Enable write caching on the disk. Также следует помнить, что в Windows, fsync и fsync_writethrough никогда не выполняют запись кэша.
Когда операционная система отправляет запрос записи на диск, мало что можно сделать, чтобы убедиться в том, что данные были сохранены на диске физически и уже не пропадут при отключении питания. Однако, администратор должен быть уверен, что все сохранённые компоненты данных целостны. Избегайте дисковых контроллеров без кэшей на батарейках. На уровне диска, запретить запись кэша, если диск не может гарантировать запись всех данных перед выключением.
Другой риск потерять данные состоит в самих физических операциях записи на диск. Диск состоит их пластин, которые разделены на секторы, обычно по 512 байт в каждом. Каждая операция физического чтение или записи работает со всем сектором. Когда для диска выполняется запрос на запись, он может быть и 512 и 1024 и 8192 байт, и процесс записи может закончится неудачно в случае отключения питания в любом месте, и где-то 512 байт будут записаны, а где-то нет. Чтобы защитится от таких сбоев PostgreSQL периодически записывает полностраничные образы в постоянное хранилище перед изменением актуальной страницы на диске. Благодаря этому, во время восстановления работы после отказа PostgreSQL может восстановить частично записанные страницы. Если у вас дисковый контроллер с батарейкой или файловая система, которая предотвращает запись неполных страниц (например, ReiserFS 4), вы можете выключить запись образов страниц, с помощью параметра full_page_writes.