28.3. ÐÑÑабоÑка оÑказа логиÑеÑкой ÑепликаÑии #
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑики могли пÑодолжиÑÑ ÑепликаÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñ Ð¿ÑбликÑÑÑего Ñзла даже в ÑлÑÑае оÑказа Ñзла, необÑ
одим ÑизиÑеÑкий ÑезеÑвнÑй ÑеÑвеÑ, ÑвÑзаннÑй Ñ Ð¿ÑбликÑÑÑим Ñзлом. ÐогиÑеÑкие ÑлоÑÑ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ ÑеÑвеÑа, ÑооÑвеÑÑÑвÑÑÑие подпиÑкам, можно ÑинÑ
ÑонизиÑоваÑÑ Ñ ÑезеÑвнÑм ÑеÑвеÑом, ÑказÑÐ²Ð°Ñ Ð¿Ñи Ñоздании подпиÑок паÑамеÑÑ failover = true. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 47.2.3. ÐклÑÑение паÑамеÑÑа failover обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð±ÐµÑÑовнÑй пеÑеÑ
од ÑакиÑ
подпиÑок поÑле повÑÑÐµÐ½Ð¸Ñ ÑезеÑва. Ðни могÑÑ Ð¿ÑодолжиÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¿ÑбликаÑии Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ главного ÑеÑвеÑа.
ÐоÑколÑÐºÑ ÑинÑ
ÑонизаÑÐ¸Ñ ÑлоÑов логиÑеÑкой ÑепликаÑии пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð°ÑинÑ
Ñонно, необÑ
одимо ÑдоÑÑовеÑиÑÑÑÑ, ÑÑо ÑлоÑÑ ÑепликаÑии ÑинÑ
ÑонизиÑовалиÑÑ Ñ ÑезеÑвнÑм ÑеÑвеÑом до наÑала оÑÑабоÑки оÑказа. ÐÑо можно ÑделаÑÑ, наÑÑÑоив паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии synchronized_standby_slots.
ЧÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ Ð² гоÑовноÑÑи ÑезеÑвного ÑеÑвеÑа к Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð¼Ñ Ð¾ÑÐºÐ°Ð·Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного подпиÑÑика, пÑовеÑÑÑе, ÑÑо вÑе ÑлоÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии, ÑÑебÑÑÑиеÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑикÑ, ÑÐ¸Ð½Ñ ÑонизиÑÐ¾Ð²Ð°Ð½Ñ Ñ ÑезеÑвнÑм ÑеÑвеÑом Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´:
ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, какие ÑлоÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии нÑжно ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ñ ÑезеÑвнÑм ÑеÑвеÑом, коÑоÑÑй планиÑÑеÑÑÑ Ð¿Ð¾Ð²ÑÑиÑÑ, вÑполниÑе пÑиведÑннÑй ниже SQL-запÑÐ¾Ñ Ð½Ð° подпиÑÑике. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑлоÑÑ, ÑвÑзаннÑе Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñками, на коÑоÑÑÑ Ð²ÐºÐ»ÑÑÑн Ñежим оÑÑабоÑки оÑказа.
test_sub=# SELECT array_agg(quote_literal(s.subslotname)) AS slots FROM pg_subscription s WHERE s.subfailover AND s.subslotname IS NOT NULL; slots ------- {'sub1','sub2','sub3'} (1 row)ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, какие ÑлоÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии нÑжно ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ñ ÑезеÑвнÑм ÑеÑвеÑом, коÑоÑÑй планиÑÑеÑÑÑ Ð¿Ð¾Ð²ÑÑиÑÑ, вÑполниÑе пÑиведÑннÑй ниже SQL-запÑÐ¾Ñ Ð½Ð° подпиÑÑике. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ запÑÑÑиÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , где еÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ñ Ð²ÐºÐ»ÑÑÑнной оÑÑабоÑкой оÑказа. ÐбÑаÑиÑе внимание, ÑÑо ÑÐ»Ð¾Ñ ÑÐ¸Ð½Ñ ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ñ ÑезеÑвнÑм ÑеÑвеÑом, ÑолÑко еÑли завеÑÑено Ñоздание копии ÑаблиÑÑ (Ñм. Раздел 51.57). РдÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ ÑакÑÑ ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ð¿ÑовеÑÑÑÑ Ð½Ðµ нÑжно, поÑколÑÐºÑ ÑлоÑÑ Ð»Ð¸Ð±Ð¾ бÑдÑÑ ÑдаленÑ, либо воÑÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð½Ð° новом главном ÑеÑвеÑе.
test_sub=# SELECT array_agg(quote_literal(slot_name)) AS slots FROM ( SELECT CONCAT('pg_', srsubid, '_sync_', srrelid, '_', ctl.system_identifier) AS slot_name FROM pg_control_system() ctl, pg_subscription_rel r, pg_subscription s WHERE r.srsubstate = 'f' AND s.oid = r.srsubid AND s.subfailover ); slots ------- {'pg_16394_sync_16385_7394666715149055164'} (1 row)ÐÑовеÑÑÑе, ÑÑо ÑказаннÑе ÑлоÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии ÑÑÑеÑÑвÑÑÑ Ð½Ð° ÑезеÑвном ÑеÑвеÑе и гоÑÐ¾Ð²Ñ Ðº оÑÑабоÑке оÑказа.
test_standby=# SELECT slot_name, (synced AND NOT temporary AND invalidation_reason IS NULL) AS failover_ready FROM pg_replication_slots WHERE slot_name IN ('sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'); slot_name | failover_ready --------------------------------------------+---------------- sub1 | t sub2 | t sub3 | t pg_16394_sync_16385_7394666715149055164 | t (4 rows)
ÐÑли ÑлоÑÑ Ð¿ÑиÑÑÑÑÑвÑÑÑ Ð½Ð° ÑезеÑвном ÑеÑвеÑе и гоÑÐ¾Ð²Ñ Ðº оÑÑабоÑке оÑказа (запÑÐ¾Ñ Ð²ÑÑе веÑнÑл true Ð´Ð»Ñ failover_ready), Ñо ÑÑÑеÑÑвÑÑÑие подпиÑки пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°Ñ ÑабоÑаÑÑ Ñ Ð½Ð¾Ð²Ñм главнÑм ÑеÑвеÑом.
ÐеÑвÑе два Ñага вÑÑеÑказанной пÑоÑедÑÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком PostgreSQL. РекомендÑеÑÑÑ Ð¿ÑойÑи ÑÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ Ð½Ð° каждом Ñзле подпиÑÑика, коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ð±ÑлÑживаÑÑÑÑ Ð½Ð°Ð·Ð½Ð°ÑеннÑм ÑезеÑвнÑм ÑеÑвеÑом поÑле пеÑеклÑÑениÑ, ÑÑо ÑÑоÑмиÑÑÐµÑ Ð¿Ð¾Ð»Ð½Ñй ÑпиÑок ÑлоÑов ÑепликаÑии. ÐÑÐ¾Ñ ÑпиÑок можно пÑовеÑиÑÑ Ð½Ð° ÑÑеÑÑем Ñаге, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ Ð² гоÑовноÑÑи аваÑийного пеÑеклÑÑениÑ. ÐодпиÑÑики, не оÑноÑÑÑиеÑÑ Ðº PostgreSQL, могÑÑ Ð¸ÑполÑзоваÑÑ Ð´ÑÑгие меÑодÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, какие ÑлоÑÑ ÑепликаÑии иÑполÑзÑеÑÑÑ Ð² Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÐ°Ñ .
РнекоÑоÑÑÑ ÑлÑÑаÑÑ , напÑÐ¸Ð¼ÐµÑ Ð¿Ñи плановом пеÑеклÑÑении, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑбедиÑÑÑÑ, ÑÑо вÑе подпиÑÑики, оÑноÑÑÑиеÑÑ Ð¸ не оÑноÑÑÑиеÑÑ Ðº PostgreSQL, ÑмогÑÑ Ð¿ÑодолжиÑÑ ÑепликаÑÐ¸Ñ Ð¿Ð¾Ñле пеÑеклÑÑÐµÐ½Ð¸Ñ Ð½Ð° заданнÑй ÑезеÑвнÑй ÑеÑвеÑ. Ð ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¸ÑполÑзÑйÑе ÑледÑÑÑий SQL-запÑÐ¾Ñ Ð²Ð¼ÐµÑÑо пеÑвÑÑ Ð´Ð²ÑÑ Ñагов, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, какие ÑлоÑÑ ÑепликаÑии на ведÑÑем ÑеÑвеÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ñ ÑезеÑвнÑм, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð²ÑÑаÑÑÑÑ. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð²Ñе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ ÑÑого ÑлоÑÑ ÑепликаÑии, ÑвÑзаннÑе Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñками, ÑÑаÑÑвÑÑÑими в пеÑеклÑÑении.
/* primary # */ SELECT array_agg(quote_literal(r.slot_name)) AS slots
FROM pg_replication_slots r
WHERE r.failover AND NOT r.temporary;
slots
-------
{'sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'}
(1 row)