{"id":480133,"date":"2026-05-18T12:39:32","date_gmt":"2026-05-18T12:39:32","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=480133"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=480133","title":{"rendered":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0437\u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u043c\u0435\u043d\u044b \u043c\u0430\u0441\u0442\u0435\u0440\u0430 Patroni"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0440\u0435\u043a \u0410\u0433\u043c\u0430\u043b\u043e\u0432, \u044f DBA-SRE \u0432 <a href=\"http:\/\/%D0%92%D0%B8.Tech\" rel=\"noopener noreferrer nofollow\">\u0412\u0438.Tech<\/a> &#8212; IT-\u0434\u043e\u0447\u043a\u0435 \u0412\u0441\u0435\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.\u0440\u0443.<\/p>\n<p>\u041c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0438 PostgreSQL \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Patroni \u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0435\u0437 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f.<\/p>\n<p>\u0414\u043b\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c consul-dns \u0438 Patroni, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044b DSN \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0441\u0435\u0431\u044f \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Consul. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043d\u0430 PostgreSQL 18, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438 master \u0438 replica \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f33\/52b\/29c\/f3352b29c1940df39ba499009ec5f05e.png\" width=\"1403\" height=\"1121\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f33\/52b\/29c\/f3352b29c1940df39ba499009ec5f05e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f33\/52b\/29c\/f3352b29c1940df39ba499009ec5f05e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/vitech\/articles\/884828\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 PostgreSQL \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/a> \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u0448\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c: \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0447\u0435\u0440\u0435\u0437 consul-dns<strong>.<\/strong><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0432 patroni \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u0435\u0436\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0422\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Patroni \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u201c\u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u201d.\u00a0<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435\u00a0 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Patroni \u0441 postgresql v.15 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043d\u043e\u0434, \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043c\u043e\u0447\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0411\u0414 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0441\u0442\u0430\/\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u0435\u0440\u0441\u0438\u044f\u043c PostgreSQL \u043d\u0435\u0442, \u0432\u0430\u0436\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.\u00a0 <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/64b\/e5c\/ef2\/64be5cef2a8b8552fae1d27fdfec4408.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Patroni + Consul (+consul-dns)\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Patroni + Consul (+consul-dns)\" width=\"1327\" height=\"907\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/64b\/e5c\/ef2\/64be5cef2a8b8552fae1d27fdfec4408.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/64b\/e5c\/ef2\/64be5cef2a8b8552fae1d27fdfec4408.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Patroni + Consul (+consul-dns)<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<p>1) \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0444\u0438\u0437.\u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043e pg v.18.<\/p>\n<p>2) \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a replica \u0447\u0435\u0440\u0435\u0437 consul-dns\u00a0<\/p>\n<p>3) \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a master \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c sequence.\u00a0<\/p>\n<p>4) \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Patroni. <\/p>\n<p>\u041f\u043b\u0430\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043d\u043e\u0434\u0443. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0435\u0437 \u043f\u0430\u0442\u0440\u043e\u043d\u0438 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441 \u043b\u0438\u0434\u0435\u0440\u043e\u043c \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0442\u0435\u0433\u043e\u0432 \u0434\u043b\u044f consul-dns. <\/p>\n<h4>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 PostgreSQL<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443. \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 18 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (pg_hba) \u0443\u0447\u0435\u0441\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u0445\u0435\u0448\u0435\u0439 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043d\u0430 scram-sha256. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439: \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 patroni, \u0442\u043e\u043b\u044c\u043a\u043e postgresql. <br \/>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 wal_level = logical,\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/companies\/vitech\/articles\/884828\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> , \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u044d\u043a\u0430\u043f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430. \u0421\u043b\u043e\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 patroni \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u043a \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043d\u043e\u0434\u044b. \u0414\u0430\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 pg_upgrade c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435 \u0438 \u0441\u043c\u0435\u0449\u0451\u043d\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u0442\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f30\/0b0\/822\/f300b0822c912be8b9149b82710233b7.png\" alt=\"\u041e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0432\u0435\u0440\u0441\u0438\u044f PostgreSQL \u043d\u0430 \u043d\u0435\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0434\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439\" title=\"\u041e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0432\u0435\u0440\u0441\u0438\u044f PostgreSQL \u043d\u0430 \u043d\u0435\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0434\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439\" width=\"1323\" height=\"927\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f30\/0b0\/822\/f300b0822c912be8b9149b82710233b7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f30\/0b0\/822\/f300b0822c912be8b9149b82710233b7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0432\u0435\u0440\u0441\u0438\u044f PostgreSQL \u043d\u0430 \u043d\u0435\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0434\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439<\/figcaption><\/div>\n<\/figure>\n<h4>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u043d\u043e\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0443 consul-dns<\/h4>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 curl \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c consul \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0445\u043e\u0441\u0442\u0430\u0445 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430 pg v.15. <br \/>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 consul-dns \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0434\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8500\/v1\/agent\/services | jq .<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 replica \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 pg, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 IP \u0430\u0434\u0440\u0435\u0441 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"bash\">$ curl --request PUT --data '{\"Name\": \"&lt;pgcluster-name&gt;\",\"ID\": \"&lt;pgcluster-name&gt;\",\"Address\": \"&lt;node_IP&gt;\",\"Port\": 5432,\"Tags\": [\"replica\"],\"Meta\": {},\"EnableTagOverride\": true}' http:\/\/127.0.0.1:8500\/v1\/agent\/service\/register<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 replica \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 pg v.15, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0438\u043c\u044f \u043d\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 consul-dns, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445:<\/p>\n<pre><code class=\"bash\">$ curl -X PUT http:\/\/localhost:8500\/v1\/agent\/service\/deregister\/&lt;pgcluster-name&gt;\/&lt;node-name&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 consul-dns \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u043d\u043e\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0443 consul-dns<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b ~\/.pgpass \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u043d\u0430 pg v.18 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439\/\u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a postgres \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432 .pgpass.<\/p>\n<p>\u0421\u0430\u043c\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 bash \u0441\u043a\u0440\u0438\u043f\u0442. \u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0434\u0435 \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c pg v.15 \u0438\u0437 \u043f\u043e\u0434 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 postgres. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0430\u0437\u044b (pg15) \u0438 \u0431\u0430\u0437\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (pg18).\u00a0<\/p>\n<p>\u041a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u043a\u0440\u043e\u043c\u0435 \u0448\u0430\u0433\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432\/\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439. \u0417\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u0444\u0430\u0439\u043b \u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043a\u0430\u043a \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0434\u043e, \u0442\u0430\u043a \u0438 \u043f\u043e\u0441\u043b\u0435. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\u00a0<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 nslookup, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f consul-dns, \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043d\u0441 \u0432\u0441\u0451 \u0436\u0435 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f. <\/p>\n<details class=\"spoiler\">\n<summary>switch_master.sh<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">#!\/bin\/bash ### switch master from previous cluster to new instance# --- Configuration ---LOG_FILE=log_switch_master.log # CURRENT LEADER\/MASTER # LOCAL INSTANCESOURCE_HOST=\"localhost\"SOURCE_DB=\"testdb\"SOURCE_HOSTNAME=`hostname -s`PGCLUSTER_NAME=\"pgcluster-testdb\" # NEXT LEADER\/MASTERDEST_IP=\"10.243.187.62\"DEST_PORT=\"5432\"DEST_DB=\"$SOURCE_DB\"DEST_USER=\"postgres\"# --------------------- ### START LOGGINGecho \"$(date '+%Y-%m-%d %H:%M:%S') | START SCRIPT\" \"$SOURCE_HOSTNAME\" \"$PGCLUSTER_NAME\" \"$SOURCE_DB\" \"$DEST_IP\" &gt;&gt; \"$LOG_FILE\"echo \"$(date '+%Y-%m-%d %H:%M:%S') | START SCRIPT\" \"$SOURCE_HOSTNAME\" \"$PGCLUSTER_NAME\" \"$SOURCE_DB\" \"$DEST_IP\" ### nslookup for master and replica before switchRESULT=$(nslookup master.\"$PGCLUSTER_NAME\".service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER| ERROR | $RESULT\"fi RESULT=$(nslookup replica.\"$PGCLUSTER_NAME\".service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA| ERROR | $RESULT\"fi  ### check logical slot is activeSQL=\"select slot_name,database,active,catalog_xmin,restart_lsn,confirmed_flush_lsn from pg_replication_slots where slot_name like '%_slot' and slot_type = 'logical' and active = 't';\"RESULT=$(psql -d \"$SOURCE_DB\" -t -c \"$SQL\" 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |LOGICAL SLOT|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |LOGICAL SLOT|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |LOGICAL SLOT| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |LOGICAL SLOT| ERROR | $RESULT\"fi ### log current state of consul from current_node (pg15) --not remove now - just log current state# state before changesRESULT=$(curl http:\/\/localhost:8500\/v1\/agent\/services | jq . 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |BEFORE REMOVE MASTER DNS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |BEFORE REMOVE MASTER DNS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |BEFORE REMOVE MASTER DNS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |BEFORE REMOVE MASTER DNS| ERROR | $RESULT\"fi echo \"$(date '+%Y-%m-%d %H:%M:%S') | START SWITCH\" &gt;&gt; \"$LOG_FILE\"echo \"$(date '+%Y-%m-%d %H:%M:%S') | START SWITCH\" ### enable read_only on previous masterSQL1=\"ALTER SYSTEM SET default_transaction_read_only TO on;\"SQL2=\"SELECT pg_reload_conf();\"SQL3=\"SHOW default_transaction_read_only;\"psql -d \"$SOURCE_DB\" -c \"$SQL1\"psql -d \"$SOURCE_DB\" -c \"$SQL2\"RESULT=$(psql -d \"$SOURCE_DB\" -t -c \"$SQL3\" 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |READ ONLY ON|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |READ ONLY ON|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |READ ONLY ON| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |READ ONLY ON| ERROR | $RESULT\"fi ### terminate all user\/client connectionsSQL_TERM=\"SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE backend_type = 'client backend' AND pid &lt;&gt; pg_backend_pid() AND datname = '$SOURCE_DB';\"RESULT=$(psql -d \"$SOURCE_DB\" -c \"$SQL_TERM\"  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS| ERROR | $RESULT\"fi ### synchronize sequences from previous master to new# Import sequences values as SQL commands from the sourceSQL_SEQ=\"SELECT 'SELECT setval(' || quote_literal(schemaname || '.' || sequencename) || ', ' || last_value || ');' FROM pg_sequences;\"SEQUENCE_VAL=$(psql -d \"$SOURCE_DB\" -Atc \"$SQL_SEQ\"  2&gt;&amp;1)RESULT=$SEQUENCE_VALif [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE IMPORT|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE IMPORT|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE IMPORT| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE IMPORT| ERROR | $RESULT\"fi # Export sequences values by executing on the destinationRESULT=$(psql -h \"$DEST_IP\" -p \"$DEST_PORT\" -d \"$DEST_DB\" -U \"$DEST_USER\" -Atc \"$SEQUENCE_VAL\" 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE EXPORT|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE EXPORT|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE EXPORT| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SEQUENCE EXPORT| ERROR | $RESULT\"fi ### add master teg for new master instance (pg18)CURL_ADDR=$\"http:\/\/127.0.0.1:8500\/v1\/agent\/service\/register\"CURL_DATA4=\"{\\\"Name\\\": \\\"$PGCLUSTER_NAME\\\",\\\"ID\\\": \\\"$PGCLUSTER_NAME\\\",\\\"Address\\\": \\\"$DEST_IP\\\",\\\"Port\\\": $DEST_PORT,\\\"Tags\\\": [\\\"primary\\\",\\\"master\\\",\\\"replica\\\"],\\\"Meta\\\": {},\\\"EnableTagOverride\\\": true}\"echo \"curl --request PUT --data\" \"$CURL_DATA4\" \"$CURL_ADDR\"RESULT=$(curl --request PUT --data \"$CURL_DATA4\" \"$CURL_ADDR\"  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SET NEW CONSUL-DNS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SET NEW CONSUL-DNS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SET NEW CONSUL-DNS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |SET NEW CONSUL-DNS| ERROR | $RESULT\"fi ### remove old master# removing master, should be without resultRESULT=$(curl -X PUT http:\/\/localhost:8500\/v1\/agent\/service\/deregister\/\"$PGCLUSTER_NAME\"\/\"$SOURCE_HOSTNAME\" 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |REMOVE MASTER DNS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |REMOVE MASTER DNS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |REMOVE MASTER DNS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |REMOVE MASTER DNS| ERROR | $RESULT\"fi# state of local consul-dns after master tag removeRESULT=$(curl http:\/\/localhost:8500\/v1\/agent\/services | jq . 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |AFTER REMOVE MASTER DNS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |AFTER REMOVE MASTER DNS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |AFTER REMOVE MASTER DNS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |AFTER REMOVE MASTER DNS| ERROR | $RESULT\"fi ### repeat session termination on previous masterRESULT=$(psql -d \"$SOURCE_DB\" -c \"$SQL_TERM\"  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |TERMINATE CLIENTS| ERROR | $RESULT\"fiecho \"$(date '+%Y-%m-%d %H:%M:%S') | FINISH SWITCH\" &gt;&gt; \"$LOG_FILE\"echo \"$(date '+%Y-%m-%d %H:%M:%S') | FINISH SWITCH\" ### additional consul-dns check after switch# state after changesRESULT=$(curl http:\/\/localhost:8500\/v1\/agent\/services | jq . 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |CONSUL-DNS AFTER SWITCH|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |CONSUL-DNS AFTER SWITCH|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |CONSUL-DNS AFTER SWITCH| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |CONSUL-DNS AFTER SWITCH| ERROR | $RESULT\"fi ### nslookup for master and replica after switchRESULT=$(nslookup master.\"$PGCLUSTER_NAME\".service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP MASTER| ERROR | $RESULT\"fi RESULT=$(nslookup replica.\"$PGCLUSTER_NAME\".service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo \"$RESULT\" | xargs)    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA|  $CLEAN_RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA|  $CLEAN_RESULT\"else    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA| ERROR | $RESULT\" &gt;&gt; \"$LOG_FILE\"    echo \"$(date '+%Y-%m-%d %H:%M:%S') |NSLOOKUP REPLICA| ERROR | $RESULT\"fi echo \"$(date '+%Y-%m-%d %H:%M:%S') | FINISH SCRIPT\" &gt;&gt; \"$LOG_FILE\"echo \"$(date '+%Y-%m-%d %H:%M:%S') | FINISH SCRIPT\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c consul-dns \u043a\u0430\u043a \u043a \u0440\u0435\u043f\u043b\u0438\u043a\u0435 \u0442\u0430\u043a \u0438 \u043a \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 postgresql v.18.  <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c20\/584\/74c\/c2058474c45d88c7b7d495a67b6f7ea3.png\" alt=\"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 PostgreSQL\" title=\"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 PostgreSQL\" width=\"1354\" height=\"947\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c20\/584\/74c\/c2058474c45d88c7b7d495a67b6f7ea3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c20\/584\/74c\/c2058474c45d88c7b7d495a67b6f7ea3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 PostgreSQL<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a consul-dns \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u043d\u043e\u0434\u0443 \u0431\u044b\u0432\u0448\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430 (pg15), \u0442\u043e \u0442\u0430\u043c <strong>\u043d\u0435\u043b\u044c\u0437\u044f <\/strong>\u043d\u0438 <strong>\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c consul<\/strong> \u0430\u0433\u0435\u043d\u0442, \u043d\u0438 \u0441\u0430\u043c <strong>\u0445\u043e\u0441\u0442<\/strong>. \u041f\u043e\u043a\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 patroni\/pg \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 \u043d\u0430 pg.18.  <\/p>\n<h4>\u041f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 patroni \u0441 pg15 \u043d\u0430 pg18<\/h4>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 patroni, \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u043a \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0443\u0447\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c \u0432 consul.<br \/>\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 patroni \u043d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u043e\u0434\u0430\u0445 c pg v.15 ($ sudo service patroni stop)<\/p>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 patroni, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<pre><code class=\"bash\">postgres$ patronictl -c \/etc\/patroni\/patroni.yml remove &lt;pgcluster-name&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043d\u043e\u0434\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 pg18 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 patroni. \u0415\u0441\u043b\u0438 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0451 \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043d\u0435 \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0431\u0430\u0437\u044b, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041d\u0430 \u043d\u043e\u0434\u0430\u0445 \u0441 pg15 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u041f\u041e PostgreSQL 18. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0431\u0430\u0437\u044b pg15 \u0434\u043b\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 patroni, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043b\u0438\u0432\u043a\u0443.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 patroni. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 consul-dns \u0447\u0435\u0440\u0435\u0437 nslookup:<\/p>\n<pre><code class=\"bash\">postgres$ patronictl -c \/etc\/patroni\/patroni.yml topology$ nslookup replica.\"$PGCLUSTER_NAME\".service.consul$ nslookup master.\"$PGCLUSTER_NAME\".service.consul<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043d\u043e\u0434\u0430\u0445 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0432 consul-dns \u0437\u0430\u043f\u0438\u0441\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u0442\u0435\u043c\u0438, \u0447\u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Patroni, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0441\u0451 \u0436\u0435 \u043f\u043e\u0434 \u043d\u0430\u0448\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<pre><code class=\"bash\">postgres$ curl -X PUT http:\/\/localhost:8500\/v1\/agent\/service\/deregister\/&lt;pgcluster-name&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 PostgreSQL. \u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0442\u0435\u043c \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u0434\u043d\u0441 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0438\u0442\u043e\u0433\u0438<\/h4>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u043d\u0430 \u0442\u0435\u0441\u0442\u0430\u0445: \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0430 \u0441\u0445\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043d\u043e \u0438\u00a0 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043c\u0435\u043d\u044b \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u0443\u044e DNS-\u0437\u0430\u043f\u0438\u0441\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u0430 \u043d\u043e\u0432\u0430\u044f \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u044c\u0441\u044f \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b \u0431\u043e\u043b\u044c\u0448\u0435 120 \u0441\u0435\u043a\u0443\u043d\u0434, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0430. <br \/>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0430\u0441\u0442\u0435\u0440 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"bash\">ERROR:  cannot execute INSERT in a read-only transaction<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u044b \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432 \u0431\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043d\u0441 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0440\u0432\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043b\u0438\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u043e \u201c\u0430 \u043d\u0435 \u0432 read-only \u043b\u0438 \u0431\u0430\u0437\u0430?\u201d, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u043e\u0441\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u0431\u044b\u043b\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443. \u041f\u0440\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0435\u0441\u0442\u0430\u0445 \ud83d\ude09 \u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0432 consul.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0442\u0440\u0430\u0444\u0438\u043a \u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430\u044f \u043a\u044d\u0448\u0438; \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u0438\u0434\u0435\u0440\u0430 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043e\u0437\u0430\u0431\u043e\u0442\u044c\u0442\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u043e\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0418 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043d\u0443\u0441: \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u043c int \u043d\u0430 bigint, \u0433\u0434\u0435 \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043c\u0430\u044f\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u0435\u043b; \u0438 \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c data_checksums \u0433\u0434\u0435 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e.<\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443: \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 pg \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 \u0431\u0435\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0431\u0435\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 (&lt; 300) \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u043b \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0447\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u043e \u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0434\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 Patroni.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1036420\/\">https:\/\/habr.com\/ru\/articles\/1036420\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0440\u0435\u043a \u0410\u0433\u043c\u0430\u043b\u043e\u0432, \u044f DBA-SRE \u0432 \u0412\u0438.Tech &#8212; IT-\u0434\u043e\u0447\u043a\u0435 \u0412\u0441\u0435\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.\u0440\u0443.\u041c\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0438 PostgreSQL \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Patroni \u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0435\u0437 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f.\u0414\u043b\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c consul-dns \u0438 Patroni, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044b DSN \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0441\u0435\u0431\u044f \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Consul. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043d\u0430 PostgreSQL 18, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438 master \u0438 replica \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b.\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 PostgreSQL \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u0448\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c: \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0447\u0435\u0440\u0435\u0437 consul-dns.\u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0432 patroni \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u0435\u0436\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0422\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Patroni \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u201c\u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u201d.\u00a0\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435\u00a0 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Patroni \u0441 postgresql v.15 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043d\u043e\u0434, \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043c\u043e\u0447\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0411\u0414 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0441\u0442\u0430\/\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u0435\u0440\u0441\u0438\u044f\u043c PostgreSQL \u043d\u0435\u0442, \u0432\u0430\u0436\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.\u00a0 \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Patroni + Consul (+consul-dns)\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:1) \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0444\u0438\u0437.\u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043e pg v.18.2) \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a replica \u0447\u0435\u0440\u0435\u0437 consul-dns\u00a03) \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a master \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c sequence.\u00a04) \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Patroni. \u041f\u043b\u0430\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043d\u043e\u0434\u0443. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0435\u0437 \u043f\u0430\u0442\u0440\u043e\u043d\u0438 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441 \u043b\u0438\u0434\u0435\u0440\u043e\u043c \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0442\u0435\u0433\u043e\u0432 \u0434\u043b\u044f consul-dns. \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 PostgreSQL\u041e\u0434\u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443. \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 18 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (pg_hba) \u0443\u0447\u0435\u0441\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u0445\u0435\u0448\u0435\u0439 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043d\u0430 scram-sha256. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439: \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 patroni, \u0442\u043e\u043b\u044c\u043a\u043e postgresql. \u041f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 wal_level = logical,\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438.\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 , \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u044d\u043a\u0430\u043f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430. \u0421\u043b\u043e\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 patroni \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u043a \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043d\u043e\u0434\u044b. \u0414\u0430\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 pg_upgrade c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435 \u0438 \u0441\u043c\u0435\u0449\u0451\u043d\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u0442\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438.\u041e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0432\u0435\u0440\u0441\u0438\u044f PostgreSQL \u043d\u0430 \u043d\u0435\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0434\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u043d\u043e\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0443 consul-dns\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 curl \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c consul \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0445\u043e\u0441\u0442\u0430\u0445 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430 pg v.15. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 consul-dns \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0434\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439:$ curl http:\/\/localhost:8500\/v1\/agent\/services | jq .\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 replica \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 pg, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 IP \u0430\u0434\u0440\u0435\u0441 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435:$ curl &#8212;request PUT &#8212;data &#8216;{&#171;Name&#187;: &#171;&lt;pgcluster-name&gt;&#187;,&#187;ID&#187;: &#171;&lt;pgcluster-name&gt;&#187;,&#187;Address&#187;: &#171;&lt;node_IP&gt;&#187;,&#187;Port&#187;: 5432,&#187;Tags&#187;: [&#171;replica&#187;],&#187;Meta&#187;: {},&#187;EnableTagOverride&#187;: true}&#8217; http:\/\/127.0.0.1:8500\/v1\/agent\/service\/register\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 replica \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 pg v.15, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0438\u043c\u044f \u043d\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 consul-dns, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445:$ curl -X PUT http:\/\/localhost:8500\/v1\/agent\/service\/deregister\/&lt;pgcluster-name&gt;\/&lt;node-name&gt;\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 consul-dns \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u043d\u043e\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u0432\u043a\u0443 consul-dns\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b ~\/.pgpass \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u043d\u0430 pg v.18 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439\/\u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a postgres \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0432 .pgpass.\u0421\u0430\u043c\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 bash \u0441\u043a\u0440\u0438\u043f\u0442. \u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0434\u0435 \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c pg v.15 \u0438\u0437 \u043f\u043e\u0434 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 postgres. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0430\u0437\u044b (pg15) \u0438 \u0431\u0430\u0437\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (pg18).\u00a0\u041a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u043a\u0440\u043e\u043c\u0435 \u0448\u0430\u0433\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432\/\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439. \u0417\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432 \u0444\u0430\u0439\u043b \u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043a\u0430\u043a \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0434\u043e, \u0442\u0430\u043a \u0438 \u043f\u043e\u0441\u043b\u0435. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\u00a0\u041a\u043e\u043c\u0430\u043d\u0434\u0430 nslookup, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f consul-dns, \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043d\u0441 \u0432\u0441\u0451 \u0436\u0435 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f. switch_master.sh#!\/bin\/bash ### switch master from previous cluster to new instance# &#8212; Configuration &#8212;LOG_FILE=log_switch_master.log # CURRENT LEADER\/MASTER # LOCAL INSTANCESOURCE_HOST=&#187;localhost&#187;SOURCE_DB=&#187;testdb&#187;SOURCE_HOSTNAME=`hostname -s`PGCLUSTER_NAME=&#187;pgcluster-testdb&#187; # NEXT LEADER\/MASTERDEST_IP=&#187;10.243.187.62&#8243;DEST_PORT=&#187;5432&#8243;DEST_DB=&#187;$SOURCE_DB&#187;DEST_USER=&#187;postgres&#187;# &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; ### START LOGGINGecho &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) | START SCRIPT&#187; &#171;$SOURCE_HOSTNAME&#187; &#171;$PGCLUSTER_NAME&#187; &#171;$SOURCE_DB&#187; &#171;$DEST_IP&#187; &gt;&gt; &#171;$LOG_FILE&#187;echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) | START SCRIPT&#187; &#171;$SOURCE_HOSTNAME&#187; &#171;$PGCLUSTER_NAME&#187; &#171;$SOURCE_DB&#187; &#171;$DEST_IP&#187; ### nslookup for master and replica before switchRESULT=$(nslookup master.&#187;$PGCLUSTER_NAME&#187;.service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP MASTER|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP MASTER|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP MASTER| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP MASTER| ERROR | $RESULT&#187;fi RESULT=$(nslookup replica.&#187;$PGCLUSTER_NAME&#187;.service.consul  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP REPLICA|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP REPLICA|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP REPLICA| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |NSLOOKUP REPLICA| ERROR | $RESULT&#187;fi  ### check logical slot is activeSQL=&#187;select slot_name,database,active,catalog_xmin,restart_lsn,confirmed_flush_lsn from pg_replication_slots where slot_name like &#8216;%_slot&#8217; and slot_type = &#8216;logical&#8217; and active = &#8216;t&#8217;;&#187;RESULT=$(psql -d &#171;$SOURCE_DB&#187; -t -c &#171;$SQL&#187; 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |LOGICAL SLOT|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |LOGICAL SLOT|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |LOGICAL SLOT| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |LOGICAL SLOT| ERROR | $RESULT&#187;fi ### log current state of consul from current_node (pg15) &#8212;not remove now &#8212; just log current state# state before changesRESULT=$(curl http:\/\/localhost:8500\/v1\/agent\/services | jq . 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |BEFORE REMOVE MASTER DNS|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |BEFORE REMOVE MASTER DNS|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |BEFORE REMOVE MASTER DNS| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |BEFORE REMOVE MASTER DNS| ERROR | $RESULT&#187;fi echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) | START SWITCH&#187; &gt;&gt; &#171;$LOG_FILE&#187;echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) | START SWITCH&#187; ### enable read_only on previous masterSQL1=&#187;ALTER SYSTEM SET default_transaction_read_only TO on;&#187;SQL2=&#187;SELECT pg_reload_conf();&#187;SQL3=&#187;SHOW default_transaction_read_only;&#187;psql -d &#171;$SOURCE_DB&#187; -c &#171;$SQL1&#8243;psql -d &#171;$SOURCE_DB&#187; -c &#171;$SQL2&#8243;RESULT=$(psql -d &#171;$SOURCE_DB&#187; -t -c &#171;$SQL3&#187; 2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |READ ONLY ON|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |READ ONLY ON|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |READ ONLY ON| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |READ ONLY ON| ERROR | $RESULT&#187;fi ### terminate all user\/client connectionsSQL_TERM=&#187;SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE backend_type = &#8216;client backend&#8217; AND pid &lt;&gt; pg_backend_pid() AND datname = &#8216;$SOURCE_DB&#8217;;&#187;RESULT=$(psql -d &#171;$SOURCE_DB&#187; -c &#171;$SQL_TERM&#187;  2&gt;&amp;1)if [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |TERMINATE CLIENTS|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |TERMINATE CLIENTS|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |TERMINATE CLIENTS| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |TERMINATE CLIENTS| ERROR | $RESULT&#187;fi ### synchronize sequences from previous master to new# Import sequences values as SQL commands from the sourceSQL_SEQ=&#187;SELECT &#8216;SELECT setval(&#8216; || quote_literal(schemaname || &#8216;.&#8217; || sequencename) || &#8216;, &#8216; || last_value || &#8216;);&#8217; FROM pg_sequences;&#187;SEQUENCE_VAL=$(psql -d &#171;$SOURCE_DB&#187; -Atc &#171;$SQL_SEQ&#187;  2&gt;&amp;1)RESULT=$SEQUENCE_VALif [ $? -eq 0 ]; then    CLEAN_RESULT=$(echo &#171;$RESULT&#187; | xargs)    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |SEQUENCE IMPORT|  $CLEAN_RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |SEQUENCE IMPORT|  $CLEAN_RESULT&#187;else    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |SEQUENCE IMPORT| ERROR | $RESULT&#187; &gt;&gt; &#171;$LOG_FILE&#187;    echo &#171;$(date &#8216;+%Y-%m-%d %H:%M:%S&#8217;) |SEQUENCE IMPORT| ERROR | $RESULT&#187;fi # Export sequences values by&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-480133","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=480133"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480133\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=480133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=480133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=480133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}