28.4. ÐаÑÑÑойка WAL
СÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко конÑигÑÑаÑионнÑÑ Ð¿Ð°ÑамеÑÑов, оÑноÑÑÑÐ¸Ñ ÑÑ Ðº WAL, коÑоÑÑе влиÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ Ð¡Ð£ÐÐ. Ðалее ÑаÑÑказÑваеÑÑÑ Ð¾Ð± Ð¸Ñ Ð¸ÑполÑзовании. ÐбÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± ÑÑÑановке паÑамеÑÑов конÑигÑÑаÑии ÑеÑвеÑа ÑмоÑÑиÑе в Ðлаве 18.
ÐонÑÑолÑнÑе ÑоÑки â ÑÑо ÑоÑки в поÑледоваÑелÑноÑÑи ÑÑанзакÑий, в коÑоÑÑÑ Ð³Ð°ÑанÑиÑÑеÑÑÑ, ÑÑо ÑÐ°Ð¹Ð»Ñ Ñ Ð´Ð°Ð½Ð½Ñми и индекÑами бÑли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð²Ñей инÑоÑмаÑией, запиÑанной пеÑед конÑÑолÑной ÑоÑкой. Ðо вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки вÑе «гÑÑзнÑе» ÑÑÑаниÑÑ Ð´Ð°Ð½Ð½ÑÑ , Ð½Ð°Ñ Ð¾Ð´ÑÑиеÑÑ Ð² памÑÑи, ÑбÑаÑÑваÑÑÑÑ Ð½Ð° диÑк, а в Ñайле жÑÑнала ÑоздаÑÑÑÑ ÑпеÑиалÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки. (СделаннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñли пеÑед ÑÑим запиÑÐ°Ð½Ñ Ð² ÑÐ°Ð¹Ð»Ñ WAL.) Ð ÑлÑÑае ÑÐ±Ð¾Ñ Ð¿ÑоÑедÑÑа воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑÐµÑ Ð¿Ð¾ÑледнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑÑÑ ÑоÑÐºÑ Ð² жÑÑнале (назÑваемÑÑ Ð·Ð°Ð¿Ð¸ÑÑÑ REDO), Ð¾Ñ ÐºÐ¾ÑоÑой пÑоÑедÑÑа должна наÑаÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñайлов даннÑÑ Ð´Ð¾ ÑÑой ÑоÑки Ñже гаÑанÑиÑованно Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð½Ð° диÑке. Таким обÑазом, поÑле конÑÑолÑной ÑоÑки ÑегменÑÑ Ð¶ÑÑнала, коÑоÑÑе пÑедÑеÑÑвÑÑÑ Ð·Ð°Ð¿Ð¸Ñи REDO, болÑÑе не нÑÐ¶Ð½Ñ Ð¸ могÑÑ Ð±ÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ напÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑиклиÑеÑкÑÑ Ð¿ÐµÑезапиÑÑ. (Ðогда вÑполнÑеÑÑÑ Ð°ÑÑ Ð¸Ð²Ð¸Ñование WAL, ÑегменÑÑ Ð¶ÑÑнала Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð°ÑÑ Ð¸Ð²Ð¸ÑÐ¾Ð²Ð°Ð½Ñ Ð¿ÐµÑед ÑиклиÑеÑкой пеÑезапиÑÑÑ Ð¸Ð»Ð¸ Ñдалением.)
ÐапиÑÑ Ð²ÑÐµÑ Â«Ð³ÑÑзнÑÑ Â» ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð· памÑÑи на диÑк, коÑоÑÐ°Ñ ÑÑебÑеÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ Ð·Ð½Ð°ÑиÑелÑнÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð½Ð° диÑковÑй ввод/вÑвод. Ðо ÑÑой пÑиÑине, акÑивноÑÑÑ Ð·Ð°Ð¿Ð¸Ñи по конÑÑолÑной ÑоÑке ÑегÑлиÑÑеÑÑÑ Ñак, ÑÑо ввод/вÑвод наÑинаеÑÑÑ Ð¿Ñи ÑÑаÑÑе конÑÑолÑной ÑоÑки и завеÑÑаеÑÑÑ Ð¿ÐµÑед ÑÑаÑÑом ÑледÑÑÑей конÑÑолÑной ÑоÑки; ÑÑо минимизиÑÑÐµÑ Ð¿Ð¾ÑеÑÑ Ð¿ÑоизводиÑелÑноÑÑи во вÑÐµÐ¼Ñ Ð¿ÑÐ¾Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑек.
ÐÑделÑнÑй ÑеÑвеÑнÑй пÑоÑеÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ
ÑоÑек авÑомаÑиÑеÑки вÑполнÑÐµÑ ÐºÐ¾Ð½ÑÑолÑнÑе ÑоÑки Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаÑÑоÑой. ÐонÑÑолÑнÑе ÑоÑки пÑоизводÑÑÑÑ ÐºÐ°Ð¶Ð´Ñе checkpoint_timeout ÑекÑнд либо пÑи пÑиближении к пÑÐµÐ´ÐµÐ»Ñ max_wal_size, еÑли ÑÑо Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо ÑанÑÑе. ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ: 5 минÑÑ Ð¸ 1 ÐбайÑ, ÑооÑвеÑÑÑвенно. ÐÑли поÑле пÑедÑдÑÑей конÑÑолÑной ÑоÑки новÑе запиÑи WAL не добавилиÑÑ, ÑледÑÑÑие конÑÑолÑнÑе ÑоÑки бÑдÑÑ Ð¿ÑопÑÑенÑ, даже еÑли пÑоÑ
Ð¾Ð´Ð¸Ñ Ð²ÑÐµÐ¼Ñ checkpoint_timeout. (ÐÑли Ð²Ñ Ð¿ÑименÑеÑе аÑÑ
иваÑÐ¸Ñ WAL и Ñ
оÑиÑе ÑÑÑановиÑÑ Ð½Ð¸Ð¶Ð½Ð¸Ð¹ пÑедел Ð´Ð»Ñ ÑаÑÑоÑÑ Ð°ÑÑ
иваÑии, ÑÑÐ¾Ð±Ñ Ð¾Ð³ÑаниÑиÑÑ Ð¿Ð¾ÑенÑиалÑнÑÑ Ð¿Ð¾ÑеÑÑ Ð´Ð°Ð½Ð½ÑÑ
, вам ÑледÑÐµÑ Ð½Ð°ÑÑÑаиваÑÑ Ð¿Ð°ÑамеÑÑ archive_timeout, а не паÑамеÑÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ
ÑоÑек.) Также можно вÑполниÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ ÑоÑÐºÑ Ð¿ÑинÑдиÑелÑно, воÑполÑзовавÑиÑÑ SQL-командой CHECKPOINT.
УменÑÑение знаÑений checkpoint_timeout и/или max_wal_size пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÑаÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑнÑÑ
ÑоÑек. ÐÑо позволÑÐµÑ ÑÑкоÑиÑÑ Ð²Ð¾ÑÑÑановление поÑле ÑÐ±Ð¾Ñ (поÑколÑÐºÑ Ð´Ð»Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ñжно менÑÑе даннÑÑ
), но Ñ Ð´ÑÑгой ÑÑоÑÐ¾Ð½Ñ Ð½Ñжно ÑÑиÑÑваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð½Ð°Ð³ÑÑзкÑ, возникаÑÑÑÑ Ð²ÑледÑÑвие более ÑаÑÑого ÑбÑоÑа «гÑÑзнÑÑ
» ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
на диÑк. ÐÑли вклÑÑÑн Ñежим full_page_writes (по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑо Ñак), нÑжно ÑÑеÑÑÑ Ð¸ еÑÑ Ð¾Ð´Ð¸Ð½ ÑакÑоÑ. ÐÐ»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи ÑÑÑаниÑÑ Ð´Ð°Ð½Ð½ÑÑ
пÑи пеÑвом изменении ÑÑÑаниÑÑ Ð´Ð°Ð½Ð½ÑÑ
поÑле конÑÑолÑной ÑоÑки ÑÑа ÑÑÑаниÑа запиÑÑваеÑÑÑ Ð² жÑÑнал Ñеликом. Рданном ÑлÑÑае, Ñем менÑÑе инÑеÑвал Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑÑолÑнÑми ÑоÑками, Ñем болÑÑе обÑÑм запиÑи в жÑÑнал WAL, Ñак ÑÑо ÑÑо ÑаÑÑиÑно диÑкÑедиÑиÑÑÐµÑ Ð¸Ð´ÐµÑ ÑменÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑвала запиÑи и в лÑбом ÑлÑÑае пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑвелиÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑма обмена Ñ Ð´Ð¸Ñком.
ÐонÑÑолÑнÑе ÑоÑки доволÑно доÑоги Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑеÑÑÑÑов: во-пеÑвÑÑ
, поÑÐ¾Ð¼Ñ ÑÑо они ÑÑебÑÑÑ Ð·Ð°Ð¿Ð¸Ñи вÑеÑ
«гÑÑзнÑÑ
» бÑÑеÑов из памÑÑи на диÑк, и во-вÑоÑÑÑ
, поÑÐ¾Ð¼Ñ ÑÑо они ÑоздаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй ÑÑаÑик WAL, о ÑÑм говоÑилоÑÑ Ð²ÑÑе. Таким обÑазом, бÑÐ´ÐµÑ Ð±Ð»Ð°Ð³Ð¾ÑазÑмнÑм ÑÑÑановиÑÑ Ð¿Ð°ÑамеÑÑÑ ÐºÐ¾Ð½ÑÑолÑнÑÑ
ÑоÑек Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ не вÑполнÑлиÑÑ ÑлиÑком ÑаÑÑо. ÐÐ»Ñ Ð¿ÑоÑÑой пÑовеÑки паÑамеÑÑов конÑÑолÑной ÑоÑки можно ÑÑÑановиÑÑ Ð¿Ð°ÑамеÑÑ checkpoint_warning. ÐÑли пÑомежÑÑок вÑемени Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑÑолÑнÑми ÑоÑками бÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑе, Ñем колиÑеÑÑво ÑекÑнд, заданное в checkpoint_warning, Ñо в жÑÑнал ÑеÑвеÑа бÑÐ´ÐµÑ Ð²Ñдано ÑообÑение Ñ ÑекомендаÑией ÑвелиÑиÑÑ max_wal_size. ÐпизодиÑеÑкое поÑвление Ñакого ÑообÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿Ð¾Ð²Ð¾Ð´Ð¾Ð¼ Ð´Ð»Ñ Ð±ÐµÑпокойÑÑва. Ðо еÑли оно поÑвлÑеÑÑÑ ÑаÑÑо, необÑ
одимо ÑвелиÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑолÑнÑми ÑоÑками. ÐаÑÑовÑе опеÑаÑии, Ñакие как COPY Ñ Ð±Ð¾Ð»ÑÑим обÑÑмом даннÑÑ
, могÑÑ Ð¿ÑивеÑÑи к поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑколÑкиÑ
ÑакиÑ
пÑедÑпÑеждений, еÑли знаÑение max_wal_size не ÑÑÑановлено доÑÑаÑоÑно болÑÑим.
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Â«Ð·Ð°Ð²Ð°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ» ÑиÑÑÐµÐ¼Ñ Ð²Ð²Ð¾Ð´Ð°/вÑвода пÑи Ñезкой инÑенÑивной запиÑи ÑÑÑаниÑ, запиÑÑ Â«Ð³ÑÑзнÑÑ
» бÑÑеÑов во вÑÐµÐ¼Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки ÑаÑÑÑгиваеÑÑÑ Ð½Ð° опÑеделÑннÑй пеÑиод вÑемени. ÐÑÐ¾Ñ Ð¿ÐµÑиод ÑпÑавлÑеÑÑÑ Ð¿Ð°ÑамеÑÑом checkpoint_completion_target, коÑоÑÑй задаÑÑÑÑ ÐºÐ°Ðº ÑаÑÑÑ Ð¸Ð½ÑеÑвала конÑÑолÑной ÑоÑки. СкоÑоÑÑÑ Ð²Ð²Ð¾Ð´Ð°/вÑвода подÑÑÑаиваеÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÑÑолÑÐ½Ð°Ñ ÑоÑка завеÑÑилаÑÑ Ðº моменÑÑ Ð¸ÑÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаÑÑи Ð¾Ñ checkpoint_timeout ÑекÑнд или до пÑевÑÑÐµÐ½Ð¸Ñ max_wal_size, еÑли оно Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо ÑанÑÑе. Со знаÑением 0.5, заданнÑм по ÑмолÑаниÑ, можно ожидаÑÑ, ÑÑо Postgres Pro завеÑÑÐ¸Ñ Ð¿ÑоÑедÑÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки пÑимеÑно за Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ Ð²Ñемени до наÑала ÑледÑÑÑей. Ð ÑиÑÑеме, коÑоÑÐ°Ñ ÑабоÑÐ°ÐµÑ Ð¿ÑакÑиÑеÑки на пÑеделе моÑноÑÑи ввода/вÑвода в обÑÑном Ñежиме, еÑÑÑ ÑмÑÑл ÑвелиÑиÑÑ checkpoint_completion_target, ÑÑÐ¾Ð±Ñ ÑменÑÑиÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð²Ð²Ð¾Ð´Ð°/вÑвода, ÑвÑзаннÑÑ Ñ ÐºÐ¾Ð½ÑÑолÑнÑми ÑоÑками. Ðо Ñ Ð´ÑÑгой ÑÑоÑонÑ, ÑаÑÑÑгивание конÑÑолÑнÑÑ
ÑоÑек влиÑÐµÑ Ð½Ð° вÑÐµÐ¼Ñ Ð²Ð¾ÑÑÑановлениÑ, Ñак как Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ñжно бÑÐ´ÐµÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð±Ð¾Ð»ÑÑее колиÑеÑÑво ÑегменÑов WAL. ХоÑÑ Ð² checkpoint_completion_target можно задаÑÑ Ð·Ð½Ð°Ñение вплоÑÑ Ð´Ð¾ 1.0, лÑÑÑе вÑбÑаÑÑ Ð·Ð½Ð°Ñение менÑÑе (по кÑайней меÑе, не болÑÑе 0.9), Ñак как пÑи конÑÑолÑнÑÑ
ÑоÑкаÑ
вÑполнÑÑÑÑÑ Ð¸ некоÑоÑÑе дÑÑгие опеÑаÑии, помимо запиÑи «гÑÑзнÑÑ
» бÑÑеÑов. Со знаÑением 1.0 конÑÑолÑнÑе ÑоÑки, ÑкоÑее вÑего, не бÑдÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ð²Ð¾Ð²ÑемÑ, ÑÑо пÑиведÑÑ Ðº поÑеÑе пÑоизводиÑелÑноÑÑи из-за неожиданнÑÑ
колебаний ÑÑебÑемого колиÑеÑÑва ÑегменÑов WAL.
Ðа плаÑÑоÑмаÑ
Linux и POSIX паÑамеÑÑ checkpoint_flush_after позволÑÐµÑ Ð¿ÑинÑдиÑÑ ÐС к ÑбÑоÑÑ ÑÑÑаниÑ, запиÑÑваемÑÑ
во вÑÐµÐ¼Ñ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки, пÑи накоплении заданного колиÑеÑÑва байÑ. ÐÑли его не наÑÑÑоиÑÑ, ÑÑи ÑÑÑаниÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÑÑаваÑÑÑÑ Ð² кеÑе ÑÑÑÐ°Ð½Ð¸Ñ ÐС, ÑÑо повлеÑÑÑ Ð·Ð°ÑоÑмаживание пÑи вÑполнении fsync в конÑе конÑÑолÑной ÑоÑки. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ ÑаÑÑо Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑменÑÑиÑÑ Ð·Ð°Ð´ÐµÑжки ÑÑанзакÑий, но Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð¸ негаÑивное влиÑние на пÑоизводиÑелÑноÑÑÑ; оÑобенно, когда обÑÑм нагÑÑзки болÑÑе shared_buffers, но менÑÑе кеÑа ÑÑÑÐ°Ð½Ð¸Ñ Ð² ÐС.
ЧиÑло Ñайлов ÑегменÑов WAL в каÑалоге pg_wal завиÑÐ¸Ñ Ð¾Ñ min_wal_size, max_wal_size и обÑÑма WAL, ÑгенеÑиÑованного в пÑедÑдÑÑиÑ
ÑиклаÑ
конÑÑолÑнÑÑ
ÑоÑек. Ðогда ÑÑаÑÑе ÑÐ°Ð¹Ð»Ñ ÑегменÑов оказÑваÑÑÑÑ Ð½Ðµ нÑжнÑ, они ÑдалÑÑÑÑÑ Ð¸Ð»Ð¸ пеÑеÑабаÑÑваÑÑÑÑ (Ñо еÑÑÑ Ð¿ÐµÑеименовÑваÑÑÑÑ, ÑÑÐ¾Ð±Ñ ÑÑаÑÑ Ð±ÑдÑÑими ÑегменÑами в нÑмеÑованной поÑледоваÑелÑноÑÑи). ÐÑли вÑледÑÑвие кÑаÑковÑеменного ÑкаÑка инÑенÑивноÑÑи запиÑи в жÑÑнал, пÑедел max_wal_size пÑевÑÑаеÑÑÑ, ненÑжнÑе ÑÐ°Ð¹Ð»Ñ ÑегменÑов бÑдÑÑ ÑдалÑÑÑÑÑ, пока ÑиÑÑема не опÑÑÑиÑÑÑ Ð½Ð¸Ð¶Ðµ ÑÑого пÑедела. ÐÑÑаваÑÑÑ Ð½Ð¸Ð¶Ðµ ÑÑого пÑедела, ÑиÑÑема пеÑеÑабаÑÑÐ²Ð°ÐµÑ ÑÑолÑко Ñайлов WAL, ÑколÑко необÑ
одимо Ð´Ð»Ñ Ð¿Ð¾ÐºÑÑÑÐ¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð¹ поÑÑебноÑÑи до ÑледÑÑÑей конÑÑолÑной ÑоÑки, и ÑдалÑÐµÑ Ð¾ÑÑалÑнÑе. ÐÑа оÑенка базиÑÑеÑÑÑ Ð½Ð° ÑколÑзÑÑем ÑÑеднем ÑиÑла Ñайлов WAL, задейÑÑвованнÑÑ
в пÑедÑдÑÑиÑ
ÑиклаÑ
конÑÑолÑнÑÑ
ÑоÑек. СколÑзÑÑее ÑÑеднее ÑвелиÑиваеÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾, еÑли ÑакÑиÑеÑкое иÑполÑзование пÑевÑÑÐ°ÐµÑ Ð¾ÑенкÑ, Ñак ÑÑо в нÑм в некоÑоÑой ÑÑепени накапливаеÑÑÑ Ð¿Ð¸ÐºÐ¾Ð²Ð¾Ðµ иÑполÑзование, а не ÑÑеднее. ÐнаÑение min_wal_size огÑаниÑÐ¸Ð²Ð°ÐµÑ ÑÐ½Ð¸Ð·Ñ ÑиÑло Ñайлов WAL, коÑоÑÑе бÑдÑÑ Ð¿ÐµÑеÑабоÑÐ°Ð½Ñ Ð´Ð»Ñ Ð±ÑдÑÑего иÑполÑзованиÑ; Ñакой обÑÑм WAL вÑегда бÑÐ´ÐµÑ Ð¿ÐµÑеÑабаÑÑваÑÑÑÑ, даже еÑли ÑиÑÑема пÑоÑÑÐ°Ð¸Ð²Ð°ÐµÑ Ð¸ оÑенка иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ð²Ð¾ÑиÑ, ÑÑо нÑжен ÑовÑем неболÑÑой WAL.
Ðне завиÑимоÑÑи Ð¾Ñ max_wal_size, в колиÑеÑÑве wal_keep_segments + 1 ÑамÑе поÑледние ÑÐ°Ð¹Ð»Ñ WAL ÑоÑ
ÑанÑÑÑÑÑ Ð² лÑбом ÑлÑÑае. ÐÑоме Ñого, еÑли пÑименÑеÑÑÑ Ð°ÑÑ
иваÑÐ¸Ñ WAL, ÑÑаÑÑе ÑегменÑÑ Ð½Ðµ могÑÑ Ð±ÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ пеÑеÑабоÑанÑ, пока они не бÑдÑÑ Ð·Ð°Ð°ÑÑ
ивиÑованÑ. ÐÑли WAL аÑÑ
ивиÑÑеÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ, Ñем генеÑиÑÑеÑÑÑ, либо еÑли команда archive_command поÑÑоÑнно даÑÑ Ñбои, ÑÑаÑÑе ÑÐ°Ð¹Ð»Ñ WAL бÑдÑÑ Ð½Ð°ÐºÐ°Ð¿Ð»Ð¸Ð²Ð°ÑÑÑÑ Ð² pg_wal, пока ÑиÑÑаÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑазÑеÑена. Ðедленно ÑабоÑаÑÑий или оÑказавÑий ведомÑй ÑеÑвеÑ, иÑполÑзÑÑÑий ÑÐ»Ð¾Ñ ÑепликаÑии, даÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑÐµÐºÑ (Ñм. ÐодÑаздел 25.2.6).
Ð Ñежиме воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑÑ
ива или гоÑÑÑего ÑезеÑва ÑеÑÐ²ÐµÑ Ð¿ÐµÑиодиÑеÑки вÑполнÑÐµÑ ÑоÑки пеÑезапÑÑка, коÑоÑÑе поÑ
ожи на конÑÑолÑнÑе ÑоÑки в обÑÑном Ñежиме ÑабоÑÑ: ÑеÑÐ²ÐµÑ Ð¿ÑинÑдиÑелÑно ÑбÑаÑÑÐ²Ð°ÐµÑ ÑÐ²Ð¾Ñ ÑоÑÑоÑние на диÑк, обновлÑÐµÑ Ñайл pg_control, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ, ÑÑо Ñже обÑабоÑаннÑе даннÑе WAL не нÑжно ÑканиÑоваÑÑ Ñнова, и заÑем пеÑеÑабаÑÑÐ²Ð°ÐµÑ Ð²Ñе ÑÑаÑÑе ÑÐ°Ð¹Ð»Ñ ÑегменÑов жÑÑнала в каÑалоге pg_wal. ТоÑки пеÑезапÑÑка не могÑÑ Ð²ÑполнÑÑÑÑÑ ÑаÑе, Ñем конÑÑолÑнÑе ÑоÑки на главном ÑеÑвеÑе, Ñак как они могÑÑ Ð¿ÑоиÑÑ
одиÑÑ ÑолÑко в запиÑÑÑ
конÑÑолÑнÑÑ
ÑоÑек. ТоÑка пеÑезапÑÑка пÑоизводиÑÑÑ, когда доÑÑигаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ¾Ð½ÑÑолÑной ÑоÑки и поÑле пÑедÑдÑÑей ÑоÑки пеÑезапÑÑка пÑоÑло не менÑÑе checkpoint_timeout ÑекÑнд или ÑÐ°Ð·Ð¼ÐµÑ WAL Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑевÑÑиÑÑ max_wal_size. Ðднако из-за Ñого, ÑÑо на вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑоÑек пеÑезапÑÑка накладÑваÑÑÑÑ Ð¾Ð³ÑаниÑениÑ, max_wal_size ÑаÑÑо пÑевÑÑаеÑÑÑ Ð¿Ñи воÑÑÑановлении, вплоÑÑ Ð´Ð¾ обÑÑма WAL, запиÑÑваемого в Ñикле Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð½ÑÑолÑнÑми ÑоÑками. (ÐнаÑение max_wal_size никогда и не бÑло жÑÑÑким пÑеделом, Ñак ÑÑо вÑегда ÑледÑÐµÑ Ð¾ÑÑавлÑÑÑ Ð¿ÑилиÑнÑй Ð·Ð°Ð¿Ð°Ñ ÑвеÑÑ
Ñ, ÑÑÐ¾Ð±Ñ Ð½Ðµ оÑÑаÑÑÑÑ Ð±ÐµÐ· Ñвободного меÑÑа на диÑке.)
Ðаиболее ÑаÑÑо иÑполÑзÑÑÑÑÑ Ð´Ð²Ðµ ÑвÑзаннÑе Ñ WAL внÑÑÑенние ÑÑнкÑии: XLogInsertRecord и XLogFlush. XLogInsertRecord пÑименÑеÑÑÑ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи в бÑÑеÑÑ WAL в ÑазделÑемой памÑÑи. ÐÑли меÑÑа Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ запиÑи недоÑÑаÑоÑно, XLogInsertRecord пÑидÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ (пеÑемеÑÑиÑÑ Ð² ÐºÐµÑ ÑдÑа) неÑколÑко заполненнÑÑ
бÑÑеÑов WAL. ÐÑо нежелаÑелÑно, Ñак как XLogInsertRecord иÑполÑзÑеÑÑÑ Ð¿Ñи каждом изменении в базе даннÑÑ
на низком ÑÑовне (напÑимеÑ, пÑи добавлении ÑÑÑоки) в моменÑ, когда ÑÑÑановлена иÑклÑÑиÑелÑÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка задейÑÑвованнÑÑ
ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¼Ð°ÐºÑималÑно бÑÑÑÑой. ЧÑо еÑÑ Ñ
Ñже, запиÑÑ Ð±ÑÑеÑов WAL Ð¼Ð¾Ð¶ÐµÑ Ñакже повлеÑÑ Ñоздание нового ÑегменÑа жÑÑнала, ÑÑо займÑÑ ÐµÑÑ Ð±Ð¾Ð»ÑÑе вÑемени. ÐбÑÑно бÑÑеÑÑ WAL Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð¸ ÑоÑ
ÑанÑÑÑÑÑ Ð½Ð° диÑке в ÑÑнкÑии XLogFlush, коÑоÑÐ°Ñ Ð²ÑзÑваеÑÑÑ, по болÑÑей ÑаÑÑи, пÑи ÑикÑиÑовании ÑÑанзакÑии, ÑÑÐ¾Ð±Ñ ÑезÑлÑÑаÑÑ ÑÑанзакÑии ÑоÑ
ÑанилиÑÑ Ð² надÑжном Ñ
ÑанилиÑе. Ð ÑиÑÑемаÑ
Ñ Ð¸Ð½ÑенÑивной запиÑÑÑ Ð² жÑÑнал вÑÐ·Ð¾Ð²Ñ XLogFlush могÑÑ Ð¸Ð¼ÐµÑÑ Ð¼ÐµÑÑо не Ñак ÑаÑÑо, ÑÑÐ¾Ð±Ñ XLogInsertRecord не пÑиÑ
одилоÑÑ Ð¿ÑоизводиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ. Ð ÑакиÑ
ÑиÑÑемаÑ
ÑледÑÐµÑ ÑвелиÑиÑÑ ÑиÑло бÑÑеÑов WAL, изменив паÑамеÑÑ wal_buffers. Ðогда вклÑÑÑн Ñежим full_page_writes и ÑиÑÑема оÑÐµÐ½Ñ ÑилÑно загÑÑжена, ÑвелиÑение wal_buffers Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ ÑгладиÑÑ ÑкаÑки во вÑемени оÑвеÑа в пеÑиод ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле каждой конÑÑолÑной ÑоÑки.
ÐаÑамеÑÑ commit_delay опÑеделÑеÑ, на ÑколÑко микÑоÑекÑнд бÑÐ´ÐµÑ Ð·Ð°ÑÑпаÑÑ Ð²ÐµÐ´ÑÑий пÑоÑеÑÑ Ð³ÑÑппÑ, запиÑÑваÑÑий в жÑÑнал, поÑле полÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки в XLogFlush, пока подÑинÑннÑе ÑоÑмиÑÑÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð½Ð° запиÑÑ. Ðо вÑÐµÐ¼Ñ ÑÑой задеÑжки дÑÑгие ÑеÑвеÑнÑе пÑоÑеÑÑÑ ÑмогÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð·Ð°Ð¿Ð¸Ñи в WAL бÑÑеÑÑ Ð¶ÑÑнала, ÑÑÐ¾Ð±Ñ Ð²Ñе ÑÑи запиÑи ÑоÑ
ÑанилиÑÑ Ð½Ð° диÑк в ÑезÑлÑÑаÑе одной опеÑаÑии ÑинÑ
ÑонизаÑии, коÑоÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð²ÐµÐ´ÑÑий. ÐедÑÑий пÑоÑеÑÑ Ð½Ðµ заÑÑпаеÑ, еÑли оÑклÑÑÑн Ñежим fsync, либо ÑиÑло ÑеанÑов Ñ Ð°ÐºÑивнÑми ÑÑанзакÑиÑми менÑÑе commit_siblings, Ñак как маловеÑоÑÑно, ÑÑо какой-либо дÑÑгой ÑÐµÐ°Ð½Ñ Ð·Ð°ÑикÑиÑÑÐµÑ ÑÑанзакÑÐ¸Ñ Ð² ближайÑее вÑемÑ. ÐамеÑÑÑе, ÑÑо на некоÑоÑÑÑ
плаÑÑоÑмаÑ
, ÑазÑеÑение ÑÑого ÑаймеÑа Ñна ÑоÑÑавлÑÐµÑ 10 миллиÑекÑнд, Ñак ÑÑо лÑбое знаÑение паÑамеÑÑа commit_delay Ð¾Ñ 1 до 10000 микÑоÑекÑнд бÑÐ´ÐµÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾. ÐÑоме Ñого, в некоÑоÑÑÑ
ÑиÑÑемаÑ
ÑоÑÑоÑние Ñна Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑодлиÑÑÑÑ Ð½ÐµÑколÑко долÑÑе, Ñем ÑÑебÑÐµÑ Ð¿Ð°ÑамеÑÑ.
Так как ÑÐµÐ»Ñ commit_delay ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸ÑÑ ÑÑоимоÑÑи каждой опеÑаÑии ÑинÑ
ÑонизаÑии амоÑÑизиÑоваÑÑÑÑ ÑеÑез паÑаллелÑнÑÑ ÑикÑаÑÐ¸Ñ ÑÑанзакÑий (поÑенÑиалÑно за ÑÑÑÑ Ð·Ð°Ð´ÐµÑжки ÑÑанзакÑии), необÑ
одимо опÑеделиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво Ñой ÑÑоимоÑÑи, пÑежде Ñем ÑÑегÑлиÑование ÑÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑбÑано ÑазÑмно. Чем вÑÑе ÑÑоимоÑÑÑ, Ñем более ÑÑÑекÑивнÑй бÑÐ´ÐµÑ commit_delay в ÑвелиÑении пÑопÑÑкной ÑпоÑобноÑÑи ÑÑанзакÑий в какой-Ñо ÑÑепени. ÐÑогÑамма pg_test_fsync Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÑиÑÑ ÑÑеднее вÑÐµÐ¼Ñ Ð² микÑоÑекÑндаÑ
, коÑоÑое Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð¸Ð½Ð¾ÑÐ½Ð°Ñ ÑабоÑа ÑбÑоÑа WAL на диÑк. ÐнаÑение Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ ÑÑеднего вÑемени ÑообÑаемого пÑогÑаммой ÑекомендÑеÑÑÑ Ð² каÑеÑÑве оÑпÑавной ÑоÑки Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² паÑамеÑÑе commit_delay пÑи опÑимизаÑии Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного обÑÑма ÑабоÑÑ, и говоÑÐ¸Ñ Ð¾ Ñом, ÑколÑко нÑжно вÑемени Ð´Ð»Ñ ÑинÑ
ÑонизаÑии ÑбÑоÑа единÑÑвенной опеÑаÑии запиÑи 8 ÐбайÑ. ÐаÑÑÑойка паÑамеÑÑа commit_delay оÑобенно полезна в ÑлÑÑае Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ WAL в Ñ
ÑанилиÑе Ñ Ð²ÑÑокоÑкоÑоÑÑнÑми диÑками, Ñакими как ÑвеÑдоÑелÑнÑе накопиÑели (SSD) или RAID-маÑÑÐ¸Ð²Ñ Ñ ÐºÐµÑем запиÑи и аваÑийнÑм пиÑанием на баÑаÑее; но ÑÑо опÑеделÑнно должно ÑеÑÑиÑоваÑÑÑÑ Ð½Ð° ÑепÑезенÑаÑивной ÑабоÑей нагÑÑзке. Ðолее вÑÑокие знаÑÐµÐ½Ð¸Ñ commit_siblings Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑакиÑ
ÑлÑÑаÑÑ
, Ñогда как менÑÑие знаÑÐµÐ½Ð¸Ñ commit_siblings ÑаÑÑо Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð½Ð° ноÑиÑелÑÑ
Ñ Ð±Ð¾Ð»ÑÑими задеÑжками. ÐбÑаÑиÑе внимание на Ñо, ÑÑо ÑвелиÑение знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа commit_delay Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ ÑÑанзакÑии наÑÑолÑко, ÑÑо поÑÑÑÐ°Ð´Ð°ÐµÑ Ð¾Ð±ÑÐ°Ñ Ð¿ÑоизводиÑелÑноÑÑÑ ÑÑанзакÑий.
Ðаже еÑли commit_delay Ñавен нÑÐ»Ñ (знаÑение по ÑмолÑаниÑ), гÑÑÐ¿Ð¿Ð¾Ð²Ð°Ñ ÑикÑаÑÐ¸Ñ Ð²ÑÑ Ñавно Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи, но гÑÑппа бÑÐ´ÐµÑ ÑоÑÑоÑÑÑ ÑолÑко из ÑеÑ
ÑеанÑов, коÑоÑÑм понадобилоÑÑ ÑбÑоÑиÑÑ Ð·Ð°Ð¿Ð¸Ñи о ÑикÑаÑии на диÑк за Ñо вÑемÑ, пока пÑоиÑÑ
одил пÑедÑдÑÑий ÑбÑоÑ. Чем болÑÑе ÑеанÑов, Ñем ÑаÑе ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð´Ð°Ð¶Ðµ пÑи нÑлевом commit_delay, поÑÑÐ¾Ð¼Ñ ÑвелиÑение ÑÑого паÑамеÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð¸ не оказаÑÑ Ð·Ð°Ð¼ÐµÑного дейÑÑвиÑ. УÑÑановка commit_delay Ð¸Ð¼ÐµÐµÑ ÑмÑÑл в двÑÑ
ÑлÑÑаÑÑ
: (1) когда неÑколÑко ÑÑанзакÑий одновÑеменно ÑикÑиÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, (2) либо когда ÑаÑÑоÑа ÑикÑаÑий огÑаниÑена пÑопÑÑкной ÑпоÑобноÑÑÑÑ Ð´Ð¸Ñковой подÑиÑÑемÑ. Ðднако пÑи задеÑжке из-за низкой ÑкоÑоÑÑи вÑаÑÐµÐ½Ð¸Ñ Ð´Ð¸Ñка ÑÑа наÑÑÑойка Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ даже вÑего пÑи двÑÑ
ÑеанÑаÑ
.
ÐаÑамеÑÑ wal_sync_method опÑеделÑеÑ, как Postgres Pro бÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑдÑÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑинÑдиÑелÑно ÑоÑ
ÑаниÑÑ WAL на диÑк. ÐÑе меÑÐ¾Ð´Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми в плане надÑжноÑÑи, за иÑклÑÑением fsync_writethrough, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð½Ð¾Ð³Ð´Ð° пÑинÑдиÑелÑно ÑбÑаÑÑваÑÑ ÐºÐµÑ Ð´Ð¸Ñка, даже еÑли дÑÑгие меÑÐ¾Ð´Ñ Ð½Ðµ делаÑÑ ÑÑого. Ðднако какой из ниÑ
ÑамÑй бÑÑÑÑÑй, во многом опÑеделÑеÑÑÑ Ð¿Ð»Ð°ÑÑоÑмой; Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоÑеÑÑиÑоваÑÑ ÑкоÑоÑÑÑ, иÑполÑзÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ pg_test_fsync. ÐбÑаÑиÑе внимание, ÑÑо даннÑй паÑамеÑÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ, еÑли fsync вÑклÑÑен.
ÐклÑÑение паÑамеÑÑа конÑигÑÑаÑии wal_debug (пÑедоÑÑавлÑеÑÑÑ, еÑли Postgres Pro бÑл ÑкомпилиÑован Ñ ÐµÐ³Ð¾ поддеÑжкой) пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо вÑе вÑÐ·Ð¾Ð²Ñ ÑвÑзаннÑÑ
Ñ WAL ÑÑнкÑий XLogInsertRecord и XLogFlush пÑоÑоколиÑÑÑÑÑÑ Ð² жÑÑнале ÑеÑвеÑа. РбÑдÑÑем даннÑй паÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ñн более обÑим меÑ
анизмом.