25.4. ÐÑÑгие меÑÐ¾Ð´Ñ ÑÑанÑлÑÑии жÑÑнала
ÐÑÑÑÐ¾ÐµÐ½Ð½Ð¾Ð¼Ñ ÑÐµÐ¶Ð¸Ð¼Ñ ÑезеÑва, опиÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð² пÑедÑдÑÑем Ñазделе, еÑÑÑ Ð°Ð»ÑÑеÑнаÑива â задаÑÑ Ð² restore_command командÑ, ÑледÑÑÑÑ Ð·Ð° ÑодеÑжимÑм аÑÑ
ива. РвеÑÑии 8.4 и ниже бÑл возможен ÑолÑко Ñакой ваÑианÑ. Ð Ñакой конÑигÑÑаÑии Ñежим standby_mode вÑклÑÑаеÑÑÑ, Ñак как ÑеализÑеÑÑÑ Ð¾ÑделÑнÑй меÑ
анизм ÑÐ»ÐµÐ¶ÐµÐ½Ð¸Ñ Ð·Ð° даннÑми, ÑÑебÑÑÑиÑ
ÑÑ Ð´Ð»Ñ ÑезеÑвного ÑеÑвеÑа. См. модÑÐ»Ñ pg_standby Ð´Ð»Ñ Ð¿ÑимеÑа ÑеализаÑии Ñакой возможноÑÑи.
ÐеобÑ
одимо оÑмеÑиÑÑ, ÑÑо в ÑÑом Ñежиме ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð¿ÑименÑÑÑ ÑолÑко один Ñайл WAL одновÑеменно, Ñо еÑÑÑ ÐµÑли иÑполÑзоваÑÑ ÑезеÑвнÑй ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов (Ñм. ÑеÑÐ²ÐµÑ Ð³Ð¾ÑÑÑего ÑезеÑва), бÑÐ´ÐµÑ Ð·Ð°Ð´ÐµÑжка Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑиÑми на главном и моменÑом видимоÑÑи ÑÑой опеÑаÑии ÑезеÑвнÑм, ÑооÑвеÑÑÑвÑÑÑей вÑемени Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñайла WAL. archive_timeout можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑÑой задеÑжки. Так же необÑ
одимо оÑмеÑиÑÑ, ÑÑо нелÑÐ·Ñ ÑовмеÑаÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод Ñ Ð¿Ð¾Ñоковой ÑепликаÑией.
РпÑоÑеÑÑе ÑабоÑÑ Ð½Ð° ведÑÑем ÑеÑвеÑе и ÑезеÑвном бÑÐ´ÐµÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð¾Ð±ÑÑное ÑоÑмиÑование аÑÑ Ð¸Ð²Ð¾Ð² и Ð¸Ñ Ð²Ð¾ÑÑÑановление. ÐдинÑÑвенной ÑоÑкой ÑопÑикоÑÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ ÑеÑвеÑов бÑдÑÑ ÑолÑко аÑÑ Ð¸Ð²Ñ Ñайлов WAL на Ð¾Ð±ÐµÐ¸Ñ ÑÑоÑÐ¾Ð½Ð°Ñ : на ведÑÑем аÑÑ Ð¸Ð²Ñ ÑоÑмиÑÑÑÑÑÑ, на ÑезеÑвном пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑÑение даннÑÑ Ð¸Ð· аÑÑ Ð¸Ð²Ð¾Ð². СледÑÐµÑ Ð²Ð½Ð¸Ð¼Ð°ÑелÑно ÑледиÑÑ Ð·Ð° Ñем, ÑÑÐ¾Ð±Ñ Ð°ÑÑ Ð¸Ð²Ñ WAL Ð¾Ñ ÑазнÑÑ Ð²ÐµÐ´ÑÑÐ¸Ñ ÑеÑвеÑов не ÑмеÑивалиÑÑ Ð¸Ð»Ð¸ не пеÑепÑÑÑвалиÑÑ. ÐÑÑ Ð¸Ð² не должен бÑÑÑ Ð±Ð¾Ð»ÑÑе, Ñем ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑабоÑÑ ÑезеÑва.
ÐагиÑ, заÑÑавлÑÑÑÐ°Ñ ÑабоÑаÑÑ Ð²Ð¼ÐµÑÑе два Ñлабо ÑвÑзаннÑÑ
ÑеÑвеÑа, пÑоÑÑа: restore_command, вÑполнÑÑÑаÑÑÑ Ð½Ð° ÑезеÑвном пÑи запÑоÑе ÑледÑÑÑего Ñайла WAL, Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÐµÐ³Ð¾ доÑÑÑпноÑÑи на ведÑÑем. Ðоманда restore_command задаÑÑÑÑ Ð² Ñайле recovery.conf на ÑезеÑвном ÑеÑвеÑе. ÐбÑÑно пÑоÑеÑÑ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑаÑÐ¸Ð²Ð°ÐµÑ Ñайл из аÑÑ
ива WAL, ÑообÑÐ°Ñ Ð¾Ð± оÑибке в ÑлÑÑае его недоÑÑÑпноÑÑи. Ð ÑабоÑе ÑезеÑвного ÑеÑвеÑа недоÑÑÑпноÑÑÑ Ð¾ÑеÑедного Ñайла WAL ÑвлÑеÑÑÑ Ð¾Ð±ÑÑной ÑиÑÑаÑией, поÑÑÐ¾Ð¼Ñ ÑезеÑвнÑй пÑоÑÑо Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÐµÐ³Ð¾ поÑвлениÑ. ÐÐ»Ñ Ñайлов, оканÑиваÑÑиÑ
ÑÑ Ð½Ð° .history, ожидание не ÑÑебÑеÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð½ÐµÐ½Ñлевой код. ÐжидаÑÑÐ°Ñ restore_command Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ð°Ð¿Ð¸Ñана как полÑзоваÑелÑÑкий ÑкÑипÑ, коÑоÑÑй в Ñикле опÑаÑиваеÑ, не поÑвилÑÑ Ð»Ð¸ оÑеÑедной Ñайл WAL. Также должен бÑÑÑ ÑпоÑоб иниÑииÑоваÑÑ Ð¿ÐµÑеклÑÑение Ñоли, пÑи коÑоÑом Ñикл в restore_command должен пÑеÑваÑÑÑÑ, а ÑезеÑвнÑй ÑеÑÐ²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ полÑÑиÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Â«Ñайл не найден». ÐÑи ÑÑом воÑÑÑановление завеÑÑиÑÑÑ, и ÑезеÑвнÑй ÑеÑÐ²ÐµÑ ÑÐ¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð¾Ð±ÑÑнÑм.
ÐÑевдокод Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ
одÑÑей restore_command:
triggered = false;
while (!NextWALFileReady() && !triggered)
{
sleep(100000L); /* ждаÑÑ ~0.1 Ñек*/
if (CheckForExternalTrigger())
triggered = true;
}
if (!triggered)
CopyWALFileForRecovery();РабоÑий пÑÐ¸Ð¼ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑей restore_command пÑедÑÑавлен в модÑле pg_standby. Ð Ð½ÐµÐ¼Ñ ÑледÑÐµÑ Ð¾Ð±ÑаÑиÑÑÑ Ð·Ð° пÑимеÑом пÑавилÑной ÑеализаÑии логики, опиÑанной вÑÑе. Ðн Ñак же Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑаÑÑиÑен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки оÑобÑÑ
конÑигÑÑаÑий и окÑÑжений.
ÐеÑод вÑзова пеÑеклÑÑÐµÐ½Ð¸Ñ ÑвлÑеÑÑÑ Ð²Ð°Ð¶Ð½Ð¾Ð¹ ÑаÑÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ аÑÑ
иÑекÑÑÑÑ. Ðдин из возможнÑÑ
ваÑианÑов â команда restore_command. Ðна иÑполнÑеÑÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла WAL, но пÑоÑеÑÑ, запÑÑкаемÑй restore_command, ÑоздаÑÑÑÑ Ð¸ завеÑÑаеÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла, Ñак ÑÑо ÑÑо не ÑлÑжба и не ÑеÑвеÑнÑй пÑоÑеÑÑ, и пÑимениÑÑ ÑÐ¸Ð³Ð½Ð°Ð»Ñ Ð¸ ÑеализоваÑÑ Ð¸Ñ
обÑабоÑÑик в нÑм нелÑзÑ. ÐоÑÑÐ¾Ð¼Ñ restore_command не подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¾ÑÑабоÑки оÑказа. Ðожно оÑганизоваÑÑ Ð¿ÐµÑеклÑÑение по Ñайм-аÑÑÑ, в ÑаÑÑноÑÑи, ÑвÑзав его Ñ Ð¸Ð·Ð²ÐµÑÑнÑм знаÑением archive_timeout на ведÑÑем. Ðднако ÑÑо не оÑÐµÐ½Ñ Ð½Ð°Ð´Ñжно, Ñак как пеÑеклÑÑение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи и из-за пÑоблем в ÑеÑи или загÑÑженноÑÑи ведÑÑего ÑеÑвеÑа. Ридеале Ð´Ð»Ñ ÑÑого ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¼ÐµÑ
анизм Ñведомлений, напÑÐ¸Ð¼ÐµÑ Ñвно ÑоздаваÑÑ Ñайл-ÑÑиггеÑ, еÑли ÑÑо возможно.
25.4.1. РеализаÑиÑ
СокÑаÑÑÐ½Ð½Ð°Ñ Ð¿ÑоÑедÑÑа наÑÑÑойки Ð´Ð»Ñ ÑезеÑвного ÑеÑвеÑа Ñ Ð¿Ñименением алÑÑеÑнаÑивного меÑода Ñказана ниже. ÐÐ»Ñ Ð¿Ð¾Ð´ÑобноÑÑей по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑÐ°Ð³Ñ ÑледÑÐµÑ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑазделÑ.
РазвеÑниÑе ведÑÑÑÑ Ð¸ ÑезеÑвнÑÑ ÑиÑÑемÑ, Ñделав Ð¸Ñ Ð¼Ð°ÐºÑималÑно одинаковÑми, вклÑÑÐ°Ñ Ð´Ð²Ðµ одинаковÑе копии Postgres Pro одного вÑпÑÑка.
ÐаÑÑÑойÑе поÑÑоÑннÑÑ Ð°ÑÑ Ð¸Ð²Ð°ÑÐ¸Ñ Ñ Ð²ÐµÐ´ÑÑего ÑеÑвеÑа в каÑалог аÑÑ Ð¸Ð²Ð¾Ð² WAL на ÑезеÑвном. УбедиÑеÑÑ, ÑÑо archive_mode, archive_command и archive_timeout ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² ÑооÑвеÑÑÑвÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð½Ð° ведÑÑем (Ñм. ÐодÑаздел 24.3.1).
СоздайÑе базовÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð²ÐµÐ´ÑÑего ÑеÑвеÑа (Ñм. ÐодÑаздел 24.3.2) и воÑÑÑановиÑе ÐµÑ Ð½Ð° ÑезеÑвном.
ÐапÑÑÑиÑе воÑÑÑановление на ÑезеÑвном ÑеÑвеÑе из локалÑного аÑÑ Ð¸Ð²Ð° WAL Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
restore_commandиз Ñайлаrecovery.conf, как опиÑано вÑÑе (Ñм. ÐодÑаздел 24.3.4).
ÐоÑок воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑолÑко ÑиÑÐ°ÐµÑ Ð°ÑÑ Ð¸Ð² WAL, поÑÑомÑ, как ÑолÑко Ñайл WAL ÑкопиÑован на ÑезеÑвнÑÑ ÑиÑÑемÑ, его можно копиÑоваÑÑ Ð½Ð° ленÑÑ Ð² Ñо вÑемÑ, как его ÑиÑÐ°ÐµÑ ÑезеÑвнÑй ÑеÑвеÑ. Таким обÑазом, ÑабоÑа ÑезеÑвного ÑеÑвеÑа в ÑелÑÑ Ð¾ÑказоÑÑÑойÑивоÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑовмеÑена Ñ Ð´Ð¾Ð»Ð³Ð¾Ð²ÑеменнÑм ÑÐ¾Ñ Ñанением Ñайлов Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле каÑаÑÑÑоÑиÑеÑÐºÐ¸Ñ Ñбоев.
ÐÐ»Ñ Ñелей ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½ запÑÑк ведÑÑего и ÑезеÑвного ÑеÑвеÑа в одной ÑиÑÑеме. ÐÑо не обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð½Ð°Ð´ÑжноÑÑÑ ÑеÑвеÑов, Ñак же как и не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð´ опиÑание вÑÑокой доÑÑÑпноÑÑи.
25.4.2. ÐоÑÑÑоÑÐ½Ð°Ñ ÑÑанÑлÑÑÐ¸Ñ Ð¶ÑÑнала
Так же возможна ÑеализаÑÐ¸Ñ Ð¿Ð¾ÑÑÑоÑной ÑÑанÑлÑÑии жÑÑналов Ñ Ð¿Ñименением алÑÑеÑнаÑивного меÑода, Ñ Ð¾ÑÑ ÑÑо ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð´Ð¾ÑабоÑок, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на ÑеÑвеÑе гоÑÑÑего ÑезеÑва ÑолÑко поÑле пеÑедаÑи полного Ñайла WAL.
ÐнеÑнÑÑ Ð¿ÑогÑамма Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ ÑÑнкÑÐ¸Ñ pg_walfile_name_offset() (Ñм. Раздел 9.26) Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка имени Ñайла и ÑоÑного ÑмеÑÐµÐ½Ð¸Ñ Ð² нÑм Ð¾Ñ ÑекÑÑего конÑа WAL. Ðожно полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÐ°Ð¹Ð»Ñ WAL напÑÑмÑÑ Ð¸ ÑкопиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе из поÑледнего извеÑÑного оконÑÐ°Ð½Ð¸Ñ WAL до ÑекÑÑего оконÑÐ°Ð½Ð¸Ñ Ð½Ð° ÑезеÑвном ÑеÑвеÑе. ÐÑи Ñаком подÑ
оде инÑеÑвал возможной поÑеÑи даннÑÑ
опÑеделÑеÑÑÑ Ð²Ñеменем Ñикла ÑабоÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ ÐºÐ¾Ð¿Ð¸ÑованиÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑавлÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¼Ð°Ð»ÑÑ Ð²ÐµÐ»Ð¸ÑинÑ. Так же не поÑÑебÑеÑÑÑ Ð½Ð°Ð¿ÑаÑно иÑполÑзоваÑÑ ÑиÑокÑÑ Ð¿Ð¾Ð»Ð¾ÑÑ Ð¿ÑопÑÑÐºÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿ÑинÑдиÑелÑного аÑÑ
ивиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑиÑно заполненного Ñайла ÑегменÑа. СледÑÐµÑ Ð¾ÑмеÑиÑÑ, ÑÑо на ÑезеÑвном ÑеÑвеÑе ÑкÑÐ¸Ð¿Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ restore_command ÑабоÑÐ°ÐµÑ ÑолÑко Ñ Ñайлом WAL Ñеликом, Ñаким обÑазом, копиÑование даннÑÑ
наÑаÑÑаÑÑим иÑогом не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñполнено на ÑезеÑвном обÑÑнÑми ÑÑедÑÑвами. ÐÑо иÑполÑзÑеÑÑÑ ÑолÑко в ÑлÑÑае оÑказа ведÑÑего â когда поÑледний ÑаÑÑиÑно ÑÑоÑмиÑованнÑй Ñайл WAL пÑедоÑÑавлÑеÑÑÑ ÑезеÑÐ²Ð½Ð¾Ð¼Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед пеÑеклÑÑением. ÐоÑÑекÑÐ½Ð°Ñ ÑеализаÑÐ¸Ñ ÑÑого пÑоÑеÑÑа ÑÑебÑÐµÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÑкÑипÑа ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ restore_command Ñ Ð´Ð°Ð½Ð½Ñми из пÑогÑÐ°Ð¼Ð¼Ñ ÐºÐ¾Ð¿Ð¸ÑованиÑ.
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL веÑÑии 9.0 можно иÑполÑзоваÑÑ Ð¿Ð¾ÑоковÑÑ ÑепликаÑÐ¸Ñ (Ñм. ÐодÑаздел 25.2.5) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¶Ðµ пÑеимÑÑеÑÑв менÑÑими ÑÑилиÑми.