{"id":483583,"date":"2026-06-14T17:18:34","date_gmt":"2026-06-14T17:18:34","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483583"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483583","title":{"rendered":"\u0422\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 discovery \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 PostgreSQL master\/replica \u2014 \u0438 \u043a\u0430\u043a \u0438\u0445 \u0440\u0435\u0448\u0438\u0442\u044c"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 PostgreSQL, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c: \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 failover, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u0432\u043e\u0435\u0439 \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. DNS \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438, libpq \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e lag, HAProxy \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b \u043f\u0440\u043e LSN. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u043b\u0451\u0433\u043a\u0438\u0439 HTTP \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 <a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\" rel=\"noopener noreferrer nofollow\">pg-status<\/a>.<\/p>\n<h3>\u041c\u0430\u0441\u0442\u0435\u0440 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 PostgreSQL<\/h3>\n<p>\u0412 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 PostgreSQL \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u042f \u0432\u044b\u0434\u0435\u043b\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:<\/p>\n<h4>\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0445\u043e\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043f\u043e \u0441\u0435\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0445\u043e\u0441\u0442 PostgreSQL \u2014 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0445\u043e\u0441\u0442\u043e\u0432, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u0441\u0442\u0435\u0440-\u0440\u0435\u043f\u043b\u0438\u043a\u0430.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0442\u0435\u0440-\u0445\u043e\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c. \u0418 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432-\u0440\u0435\u043f\u043b\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 <em>\u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e<\/em> (streaming replication): \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e WAL-\u0436\u0443\u0440\u043d\u0430\u043b (Write-Ahead Log) \u2014 \u043b\u043e\u0433 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 PostgreSQL \u0432\u0435\u0434\u0451\u0442 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: \u0440\u0435\u043f\u043b\u0438\u043a\u0430 <strong>\u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0441\u0442\u0430\u0451\u0442<\/strong> \u043e\u0442 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u041c\u0435\u0436\u0434\u0443 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0435\u0451 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u2014 \u043e\u043d\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>replication lag<\/em>. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043d\u043e \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043e\u0442\u0441\u0442\u0430\u0451\u0442, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0451.<\/p>\n<p>\u0412 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u043e\u0432\u044b\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u2014 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0451\u0442 \u044d\u0442\u043e\u0442 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>failover<\/em>. \u0412\u0430\u0436\u043d\u043e: \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 failover \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u043f\u043b\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e. \u0411\u0435\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u0430\u0436\u0435 \u0431\u0435\u0437 failover, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u043f\u043b\u0438\u043a, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c read-only \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n<h4>\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0443\u0437\u043a\u0438\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f PostgreSQL-\u0445\u043e\u0441\u0442. \u042d\u0442\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0421\u0423\u0411\u0414, \u0438 \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 80\u201390% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043c\u0430\u0441\u0442\u0435\u0440 \u0440\u0430\u0437\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u0433\u0434\u0435 \u0431\u043e\u043b\u044c\u043d\u043e: CPU \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 I\/O \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0438\u0441\u043a\u0430. \u041c\u0430\u0441\u0442\u0435\u0440\u0443 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<h3>\u0417\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041f\u043e\u0434\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 \u2014 \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u0434\u0435\u043b\u0430. \u0413\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0445\u043e\u0441\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442, \u0432\u0435\u0434\u044c failover \u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043e\u0442\u0441\u0442\u0430\u044e\u0442 \u043e\u0442 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<p><strong>1. \u041d\u0430\u0439\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/strong> \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u2014 \u0431\u0435\u0437 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435: \u043f\u043e\u0441\u043b\u0435 failover \u0438\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0445\u043e\u0441\u0442, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u044d\u0442\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p><strong>2. \u041d\u0430\u0439\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443.<\/strong> \u041d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u0420\u0435\u043f\u043b\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443 \u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e. \u041e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u0445: \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u043e\u0437\u0430\u0434\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430) \u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c WAL (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c). \u0421\u043b\u043e\u0432\u043e \u201c\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u201d \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0447\u0451\u0442\u0430 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0432 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2014 \u043d\u0435\u0442.<\/p>\n<p><strong>3. \u0413\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c read-your-writes.<\/strong> \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u2026 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0448\u043b\u0430 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 read \u2014 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0433\u043d\u0430\u043b\u0430. \u042d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 2: \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043e \u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 WAL, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h3>\n<h4>libpq multi-host<\/h4>\n<p>\u0412 libpq, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0445\u043e\u0441\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0445\u043e\u0441\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 <code>target_session_attrs<\/code>:<\/p>\n<pre><code>host=host-1,host-2,host-3 target_session_attrs=read-write<\/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>libpq \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0445\u043e\u0441\u0442\u044b \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439, \u0432\u0441\u0451 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>target_session_attrs<\/code>:<\/p>\n<ul>\n<li>\n<p><code>read-write<\/code> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/li>\n<li>\n<p><code>read-only<\/code> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>prefer-standby<\/code> \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u043c\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/li>\n<li>\n<p><code>any<\/code> \u2014 \u043b\u044e\u0431\u043e\u0439 \u0436\u0438\u0432\u043e\u0439 \u0445\u043e\u0441\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 TCP-\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/strong> libpq \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0445\u043e\u0441\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>SELECT pg_is_in_recovery()<\/code> \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0445\u043e\u0441\u0442 \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u0430 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0442\u0435\u0440, libpq \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442 \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u0440\u0430\u0437\u043e\u0440\u0432\u0451\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u0442 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u041a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 TCP-\u0445\u0435\u043d\u0434\u0448\u0435\u0439\u043a + \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f PostgreSQL. \u041f\u0440\u0438 \u0442\u0440\u0451\u0445 \u0445\u043e\u0441\u0442\u0430\u0445 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0434\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430.<\/p>\n<p><strong>\u041c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 failover.<\/strong> libpq \u0443\u0437\u043d\u0430\u0451\u0442 \u043e \u0441\u043c\u0435\u043d\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443. \u041f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0436\u0438\u0432\u043e, libpq \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u2014 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0432 \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u043f\u043b\u0438\u043a\u0438. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0430\u043b \u201c\u044d\u0442\u043e\u0442 \u0445\u043e\u0441\u0442 \u0441\u043c\u0435\u043d\u0438\u043b \u0440\u043e\u043b\u044c\u201d.<\/p>\n<p><strong>\u041d\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043b\u0430\u0433\u0430.<\/strong> <code>prefer-standby<\/code> \u0432\u0435\u0440\u043d\u0451\u0442 \u043b\u044e\u0431\u0443\u044e \u0436\u0438\u0432\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u0434\u0430\u0436\u0435 \u0442\u0443 \u0447\u0442\u043e \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043d\u0430 30 \u043c\u0438\u043d\u0443\u0442. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u201c\u0432\u0435\u0440\u043d\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 lag_ms \u2264 100\u201d.<\/p>\n<p><strong>\u041d\u0435\u0442 read-your-writes.<\/strong> \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430.<\/p>\n<h4>DNS<\/h4>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: dns \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u0440\u0438 failover DNS-\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f. \u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>\u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.<\/strong> \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435. DNS \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0443\u043b \u0438\u0437 20 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u2014 \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0430 \u043d\u0451\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u044b. \u041d\u0438\u043a\u0430\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS \u0438\u0445 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0443\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u043b\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p><strong>\u041c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/strong> \u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 DNS-\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u0435\u0448\u0435\u0439: OS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 (30\u201360 \u0441), JVM (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0435\u0447\u043d\u043e \u2014 <code>networkaddress.cache.ttl = -1<\/code>), Kubernetes CoreDNS (30 \u0441), \u0438 \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u0445 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u0438 failover \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u0442\u043e \u0438 \u043c\u0438\u043d\u0443\u0442\u044b.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 failover \u0441\u043c\u0435\u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 DNS \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442 \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u0435\u043a\u0430. \u0418 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u043d\u044b DNS \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0435\u0449\u0451 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0445\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0443\u043b\u0435.<\/p>\n<p><strong>\u041d\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.<\/strong> DNS \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441, \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u043f\u043b\u0438\u043a.<\/p>\n<h4>HAProxy<\/h4>\n<p>HAProxy \u2014 \u044d\u0442\u043e TCP\/HTTP-\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c health-check \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f PostgreSQL \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430: \u0434\u0432\u0430 listener-\u0430 \u2014 \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0441\u0442\u0435\u0440), \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0440\u0435\u043f\u043b\u0438\u043a\u0438). \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p><strong>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 health-check \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u043e\u043b\u044c \u0445\u043e\u0441\u0442\u0430.<\/strong> HAProxy \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442. \u0414\u043b\u044f role-detection \u043d\u0443\u0436\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 HTTP-endpoint \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c PostgreSQL-\u0445\u043e\u0441\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 200\/503 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u043e\u043b\u0438. \u0422\u0430\u043a\u043e\u0439 endpoint \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p><strong>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430.<\/strong> HAProxy \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 PostgreSQL. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0442\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 health-check endpoint: \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c WAL-\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u0301\u044e \u043c\u0435\u0442\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c 503 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043f\u043e\u0440\u043e\u0433. \u042d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 lag-\u043f\u043e\u0440\u043e\u0433\u0430 \u2014 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p><strong>HAProxy \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0443\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/strong> \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0445\u043e\u043f. \u0414\u043b\u044f HA \u043d\u0443\u0436\u0435\u043d \u0432\u0442\u043e\u0440\u043e\u0439 HAProxy \u0441 keepalived \u0438 VIP, \u0438\u043d\u0430\u0447\u0435 \u0441\u0430\u043c HAProxy \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u0430.<\/p>\n<p><strong>Read-your-writes \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.<\/strong> HAProxy \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u043e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 LSN \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<h4>pgpool-II<\/h4>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 SQL-\u043f\u0440\u043e\u043a\u0441\u0438: \u043f\u0430\u0440\u0441\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0443\u0434\u0430 \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c (SELECT \u2192 \u0440\u0435\u043f\u043b\u0438\u043a\u0430, INSERT\/UPDATE \u2192 \u043c\u0430\u0441\u0442\u0435\u0440), \u043f\u0443\u043b\u0438\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 failover. \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0443 pgpool-II \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><code>delay_threshold<\/code> \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 WAL. \u0415\u0441\u043b\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0430 \u043f\u043e\u0440\u043e\u0433, pgpool \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0441\u043b\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0451 SELECT \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u0433\u043e\u043d\u0438\u0442.<\/p>\n<\/li>\n<li>\n<p><code>delay_threshold_by_time<\/code> (pgpool-II 4.4+) \u2014 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>pg_stat_replication.replay_lag<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>prefer_lower_delay_standby<\/code> (pgpool-II 4.3+) \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0430 \u043f\u043e\u0440\u043e\u0433, pgpool \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u043e\u0442\u0441\u0442\u0430\u044e\u0449\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0439\u0442\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c DNS \u0438\u043b\u0438 libpq. \u041d\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u0442\u043e\u0438\u0442 \u0432 \u043f\u0443\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/strong> \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0430\u0437\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 pgpool \u2014 \u043b\u0438\u0448\u043d\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0445\u043e\u043f. pgpool \u0441\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u0430; \u0434\u043b\u044f HA \u043d\u0443\u0436\u0435\u043d watchdog-\u0440\u0435\u0436\u0438\u043c \u0441 VIP.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/strong> \u0425\u043e\u0441\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>statement_level_load_balance<\/code>. \u0410 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0436\u0435 write-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 SELECT \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0440\u043e\u0433\u0438 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435.<\/strong> <code>delay_threshold<\/code> \u0438 <code>delay_threshold_by_time<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0430 \u043d\u0435 query-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u201c\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u0440\u043e\u0433 50 \u043c\u0441\u201d. \u041e\u0434\u0438\u043d \u043f\u043e\u0440\u043e\u0433 \u043d\u0430 \u0432\u0441\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 read-your-writes \u0447\u0435\u0440\u0435\u0437 LSN.<\/strong> pgpool-II \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 WAL-\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<h4>Patroni REST API<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Patroni \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c PostgreSQL, \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c HTTP API: <code>\/leader<\/code>, <code>\/primary<\/code>, <code>\/replica<\/code>, <code>\/health<\/code>, <code>\/cluster<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>Patroni \u0443\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434. Endpoint <code>\/replica?lag=10MB<\/code> \u0432\u0435\u0440\u043d\u0451\u0442 HTTP 200 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 10 \u041c\u0411 \u2014 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u0438\u043b\u0438 \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (<code>16kB<\/code>, <code>64MB<\/code>, <code>1GB<\/code>). Endpoint <code>\/cluster<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f <code>replay_lsn<\/code>, <code>replay_lag<\/code>, <code>receive_lsn<\/code>, <code>receive_lag<\/code>.<\/p>\n<ul>\n<li>\n<p><strong>\u042d\u0442\u043e health-check API, \u0430 \u043d\u0435 discovery API.<\/strong> <code>\/replica?lag=X<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP 200 \u0438\u043b\u0438 503 \u2014 \u201c\u044d\u0442\u0430 \u043d\u043e\u0434\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442\u201d. \u041e\u043d \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u043c \u0436\u0435 HAProxy), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 <code>\/cluster<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Patroni \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 HA-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/strong> \u041e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e DCS (etcd, Consul \u0438\u043b\u0438 ZooKeeper). \u0415\u0441\u043b\u0438 Patroni \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u2014 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0435\u0433\u043e API. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a \u0440\u0430\u0434\u0438 discovery \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 read-your-writes \u0447\u0435\u0440\u0435\u0437 LSN.<\/strong> <code>\/replica?lag=X<\/code> \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u043f\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u043c\u0443 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044e \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u043d\u043e \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e WAL-\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043e \u043d\u0435\u0451.<\/p>\n<\/li>\n<\/ul>\n<h4>pg-status \u2014 HTTP discovery-\u0441\u0435\u0440\u0432\u0438\u0441<\/h4>\n<p>\u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\" rel=\"noopener noreferrer nofollow\">pg-status<\/a> \u2014 \u043b\u0451\u0433\u043a\u0438\u0439 HTTP-\u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 PostgreSQL-\u0445\u043e\u0441\u0442\u044b \u0432 \u0444\u043e\u043d\u0435 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u201c\u043a\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u0430\u0441\u0442\u0435\u0440?\u201d, \u201c\u043a\u0430\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 100 \u043c\u0441?\u201d, \u201c\u043a\u0430\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 WAL LSN?\u201d \u2014 \u0432\u0441\u0451 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430 \u0434\u043e\u043b\u0438 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p><strong>\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0443\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/strong> \u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 HAProxy \u0438 pgpool-II. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a PostgreSQL \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 pg-status \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <em>\u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443<\/em> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p><strong>\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433, \u0430 \u043d\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438.<\/strong> \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 libpq \u0438 DNS, pg-status \u043d\u0435 \u0436\u0434\u0451\u0442 \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u043f\u0430\u0434\u0451\u0442. \u041e\u043d \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0445\u043e\u0441\u0442\u044b \u0432 \u0444\u043e\u043d\u0435 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443. \u0421\u043c\u0435\u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 5 \u0441\u0435\u043a\u0443\u043d\u0434, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c) \u2014 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u043a\u0443\u043d\u0434 TTL \u0438 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433.<\/strong> \u041f\u043e\u0440\u043e\u0433 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e, \u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 query-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435. \u041e\u0434\u0438\u043d endpoint \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c lag \u2264 50 \u043c\u0441, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0442\u044c\u0441\u044f \u043d\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434, \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<p><strong>Read-your-writes \u0447\u0435\u0440\u0435\u0437 LSN.<\/strong> \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0438\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0434\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 WAL-\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a pg-status \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u0438\u043b\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430).<\/p>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438.<\/strong> \u041a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435, pg-status \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043f\u043e round-robin. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p><strong>\u0421\u0442\u0435\u043a \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e \u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a.<\/strong> \u041e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP, \u043e\u0442\u0432\u0435\u0442 \u2014 plain text \u0438\u043b\u0438 JSON. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u0438\u043c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 C, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Linux \u0438 macOS.<\/p>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/strong> \u041d\u0435 \u043d\u0443\u0436\u0435\u043d etcd, Consul \u0438\u043b\u0438 ZooKeeper \u043a\u0430\u043a \u0443 Patroni. \u041d\u0435 \u043d\u0443\u0436\u0435\u043d watchdog-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0443 pgpool-II \u0432 HA-\u0440\u0435\u0436\u0438\u043c\u0435. \u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u044c, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u2014 \u0438 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 9 \u041c\u0411 RAM \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u043a sidecar, \u0447\u0442\u043e\u0431\u044b \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 discovery helper, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c pg-status \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u2014 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e Python-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 1: \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430<\/h3>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 pg-status \u0435\u0441\u0442\u044c endpoint <code>GET \/master<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0445\u043e\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/masterhost-1<\/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\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. pg-status \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0445\u043e\u0441\u0442\u044b \u0432 \u0444\u043e\u043d\u0435 \u0438 \u0441\u0430\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043c\u0435\u043d\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u2014 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u201c\u043a\u0442\u043e \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441?\u201d \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Accept: application\/json<\/code>, \u043e\u0442\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432 JSON:<\/p>\n<pre><code class=\"bash\">$ curl -H \"Accept: application\/json\" http:\/\/localhost:8000\/master{\"host\": \"host-1\"}<\/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>\u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0435\u0442 \u2014 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f 404.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 2: \u043d\u0430\u0439\u0442\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c pg-status \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e endpoints \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0443\u0436\u043d\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438. \u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f:<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u0436\u0438\u0432\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0431\u0435\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u0438 \u2014 <code>\/replica<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u0436\u043d\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f (\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b) \u2014 <code>\/sync_by_time<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u0436\u0435\u043d \u043e\u0431\u044a\u0451\u043c \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e WAL (\u0431\u0430\u0439\u0442\u044b) \u2014 <code>\/sync_by_bytes<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u2014 <code>\/sync_by_time_or_bytes<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u044b \u043e\u0431\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u2014 <code>\/sync_by_time_and_bytes<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0432\u0435\u0436\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u2014 <code>\/most_sync_by_bytes<\/code><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u043e \u0436\u0438\u0432\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430<\/strong> \u2014 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435, \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e round-robin:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/replicahost-2<\/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><strong>\u0420\u0435\u043f\u043b\u0438\u043a\u0430 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong> \u2014 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c):<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/sync_by_timehost-2<\/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><strong>\u0420\u0435\u043f\u043b\u0438\u043a\u0430 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c WAL<\/strong> \u2014 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1 mb, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c):<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/sync_by_byteshost-2<\/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><strong>\u0420\u0435\u043f\u043b\u0438\u043a\u0430, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044e<\/strong> \u2014 \u043b\u0438\u0431\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043b\u0438\u0431\u043e \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/sync_by_time_or_byteshost-2<\/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><strong>\u0420\u0435\u043f\u043b\u0438\u043a\u0430, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e \u043e\u0431\u043e\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/strong> \u2014 \u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/sync_by_time_and_byteshost-2<\/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><strong>\u0421\u0430\u043c\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430<\/strong> \u2014 \u0442\u0430, \u0447\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0442\u0441\u0442\u0430\u043b\u0430 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/most_sync_by_byteshost-2<\/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\u0440\u043e\u0433\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0447\u0435\u0440\u0435\u0437 query-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"bash\"># \u0420\u0435\u043f\u043b\u0438\u043a\u0430 \u0441 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 50 \u043c\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430$ curl 'http:\/\/localhost:8000\/sync_by_time?lag_ms=50'# \u0420\u0435\u043f\u043b\u0438\u043a\u0430 \u0441 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 10 \u041a\u0411$ curl 'http:\/\/localhost:8000\/sync_by_bytes?lag_bytes=10000'<\/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>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043c\u044f\u0433\u043a\u0438\u0435 \u2014 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/strong> \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0435\u0442, \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 endpoints \u0432\u0435\u0440\u043d\u0451\u0442 \u043c\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a fallback. \u041a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0445\u043e\u0441\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u0441\u0442\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0438.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 3: read-your-writes \u0447\u0435\u0440\u0435\u0437 min_lsn<\/h3>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043d\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430. \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: WAL LSN<\/h4>\n<p>PostgreSQL \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 (WAL LSN), \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u0436\u0434\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435. pg-status \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u0442\u0430\u043a\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c LSN \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 <code>pg_current_wal_lsn()<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u044d\u0442\u043e\u0442 LSN \u0432 pg-status \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>pg-status \u0432\u0435\u0440\u043d\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\"># \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c LSN:# SELECT pg_current_wal_lsn(); \u2192 '0\/3000060'# \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 read \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0440\u0435\u043f\u043b\u0438\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 '0\/3000060'$ curl 'http:\/\/localhost:8000\/replica?min_lsn=0\/3000060'host-2<\/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>\u0415\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0433\u043d\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a fallback. \u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u0447\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 Python<\/h3>\n<p>\u041f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c Python-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 FastAPI \u0441 async SQLAlchemy.<\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0441\u0435\u0441\u0441\u0438\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/github.com\/krylosov-aa\/context-async-sqlalchemy\" rel=\"noopener noreferrer nofollow\">context-async-sqlalchemy<\/a> \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u041e\u043d\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u0445\u0440\u0430\u043d\u0438\u0442\u044c SQLAlchemy-\u0441\u0435\u0441\u0441\u0438\u044e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0435 \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u2014 <code>DBConnect<\/code>: \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u0435\u0442 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u043b\u0435\u043d\u0438\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0445\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 <code>change_host()<\/code> \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <code>DBConnect<\/code> \u043d\u0430 \u043a\u0430\u0434\u0436\u044b\u0439 \u0445\u043e\u0441\u0442.<\/p>\n<h4>\u041a\u043b\u0438\u0435\u043d\u0442 \u043a pg-status<\/h4>\n<p>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 HTTP \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 endpoint \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430:<\/p>\n<pre><code class=\"python\"># pg_status.pyimport aiohttpPG_STATUS_URL = \"http:\/\/localhost:8000\"async def get_master_host() -&gt; str:    async with aiohttp.ClientSession() as client:        async with client.get(f\"{PG_STATUS_URL}\/master\") as response:            response.raise_for_status()            return await response.text()async def get_replica_host() -&gt; str:    async with aiohttp.ClientSession() as client:        async with client.get(f\"{PG_STATUS_URL}\/most_sync_by_bytes\") as response:            response.raise_for_status()            return await response.text()async def get_all_hosts() -&gt; list[str]:    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0445\u043e\u0441\u0442\u043e\u0432\"\"\"    async with aiohttp.ClientSession() as client:        async with client.get(f\"{PG_STATUS_URL}\/hosts\") as response:            response.raise_for_status()            data = await response.json()            return [h[\"host\"] for h in data]<\/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<h4>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/h4>\n<p><code>DBConnect<\/code> \u0438\u0437 <code>context-async-sqlalchemy<\/code> \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0432\u0438\u0436\u043e\u043a SQLAlchemy \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0438 \u043b\u0435\u043d\u0438\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u043a \u043d\u0435\u043c\u0443. \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 <code>DBConnect<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u043e\u0441\u0442 \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u2014 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c pg-status \u043a\u0430\u043a\u043e\u0439 \u0445\u043e\u0441\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u0438 \u0434\u043e\u0441\u0442\u0430\u0451\u043c \u043d\u0443\u0436\u043d\u044b\u0439 <code>DBConnect<\/code> \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f:<\/p>\n<pre><code class=\"python\"># database.pyfrom sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmakerfrom context_async_sqlalchemy import DBConnect, db_sessiondef create_engine(host: str):    return create_async_engine(        f\"postgresql+asyncpg:\/\/user:password@{host}:5432\/mydb\",        pool_pre_ping=True,    )def create_session_maker(engine):    return async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)# \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e \u0432\u0441\u0435\u043c \u0445\u043e\u0441\u0442\u0430\u043c \u2014 \u0438 \u043c\u0430\u0441\u0442\u0435\u0440, \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438_connections: dict[str, DBConnect] = {}async def prepare_connections() -&gt; None:    \"\"\"\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u043c DBConnect \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430\"\"\"    hosts = await get_all_hosts()  # GET \/hosts    for host in hosts:        _connections[host] = DBConnect(            engine_creator=create_engine,            session_maker_creator=create_session_maker,            host=host,        )async def master_session() -&gt; AsyncSession:    master_host = await get_master_host()  # GET \/master    return await db_session(_connections[master_host])async def replica_session() -&gt; AsyncSession:    replica_host = await get_replica_host()  # GET \/most_sync_by_bytes    return await db_session(_connections[replica_host])<\/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>\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 failover: pg-status \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442 \u0441\u043c\u0435\u043d\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 5 \u0441\u0435\u043a\u0443\u043d\u0434, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f). \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432 <code>master_session()<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043e\u0442 pg-status \u043d\u043e\u0432\u044b\u0439 \u0445\u043e\u0441\u0442 \u0438 \u0432\u0435\u0440\u043d\u0451\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>DBConnect<\/code> \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0438\u0437 <code>_connections<\/code>. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u2014 \u0432\u0441\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043b\u0435\u0436\u0430\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435, \u0430 pg-status \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430\u0445<\/h4>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u0435\u043d\u0434\u043b\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u0435\u0441\u0441\u0438\u0438:<\/p>\n<pre><code class=\"python\"># handlers.pyasync def create_order(data: OrderData) -&gt; Order:    session = await master_session()  # \u0437\u0430\u043f\u0438\u0441\u044c \u2192 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440    order = Order(**data.model_dump())    session.add(order)    return orderasync def get_order_list(user_id: int) -&gt; list[Order]:    session = await replica_session()  # \u0447\u0442\u0435\u043d\u0438\u0435 \u2192 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443    result = await session.execute(        select(Order).where(Order.user_id == user_id)    )    return result.scalars().all()<\/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<h4>Read-your-writes<\/h4>\n<p>\u0414\u043b\u044f RYOW \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c LSN \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0430 \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0438. \u0423\u0434\u043e\u0431\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0430 middleware.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u2014 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b middleware \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 LSN \u0432 cookie \u043e\u0442\u0432\u0435\u0442\u0430. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>pg_current_wal_lsn()<\/code> \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0437\u0434\u0435\u0441\u044c \u201c\u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u201d: <code>pg_current_xact_id_if_assigned()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 NULL \u0434\u043b\u044f read-only \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 cookie \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0433\u0434\u0435 \u0431\u044b\u043b\u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u2014 SELECT-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b.<\/p>\n<p>\u041e\u0434\u0438\u043d \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 <code>_LsnHolder<\/code>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>save_current_lsn_if_there_writes<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0445\u0443\u043a\u0430 <code>before_commit<\/code> \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 <code>lsn_cookie_middleware<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u0443\u0436\u0435\u043d shared mutable state: <code>lsn_cookie_middleware<\/code> \u043a\u043b\u0430\u0434\u0451\u0442 <code>_LsnHolder<\/code> \u0432 <code>ContextVar<\/code>, \u0430 <code>save_current_lsn_if_there_writes<\/code> \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 LSN \u0432 \u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"python\"># read_own_writes.pyfrom contextvars import ContextVarfrom sqlalchemy import textfrom sqlalchemy.ext.asyncio import AsyncSessionfrom starlette.middleware.base import RequestResponseEndpointfrom starlette.requests import Requestfrom starlette.responses import Responseclass _LsnHolder:    value: str | None = None_request_lsn: ContextVar[_LsnHolder] = ContextVar(\"_request_lsn\")def get_request_lsn() -&gt; _LsnHolder:    return _request_lsn.get()async def save_current_lsn_if_there_writes(session: AsyncSession) -&gt; None:    \"\"\"\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 LSN \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\"\"\"    result = await session.execute(        text(            \"SELECT pg_current_wal_lsn()::text \"            \"WHERE pg_current_xact_id_if_assigned() IS NOT NULL\"        )    )    lsn = result.scalar()    if lsn:        get_request_lsn().value = lsnasync def lsn_cookie_middleware(    request: Request, call_next: RequestResponseEndpoint) -&gt; Response:    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c holder \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430    _request_lsn.set(_LsnHolder())    response = await call_next(request)    # \u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u2014 \u043e\u0442\u0434\u0430\u0451\u043c LSN \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 cookie    lsn_holder = get_request_lsn()    if lsn_holder.value:        response.headers[\"Set-Cookie\"] = (            f\"X-WAL-LSN={lsn_holder.value}; Path=\/; SameSite=Lax; Secure\"        )    return response<\/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\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0431\u0430 middleware \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"python\"># setup_app.pyfrom context_async_sqlalchemy.fastapi_utils import add_fastapi_http_db_session_middlewarefrom starlette.middleware.base import BaseHTTPMiddlewarefrom read_own_writes import lsn_cookie_middleware, save_current_lsn_if_there_writesadd_fastapi_http_db_session_middleware(    app,    before_commit=save_current_lsn_if_there_writes,  # \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 LSN \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c)app.add_middleware(BaseHTTPMiddleware, dispatch=lsn_cookie_middleware)  # \u043e\u0442\u0434\u0430\u0451\u0442 LSN \u0432 cookie<\/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 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u2014 \u0434\u043e\u0441\u0442\u0430\u0451\u043c LSN \u0438\u0437 cookie \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 pg-status:<\/p>\n<pre><code class=\"python\">async def replica_session_ryow(request: Request) -&gt; AsyncSession:    min_lsn = request.cookies.get(\"X-WAL-LSN\")    replica_host = await get_replica_host(min_lsn=min_lsn)    return await db_session(_connections[replica_host])<\/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<pre><code class=\"python\">async def get_replica_host(min_lsn: str | None = None) -&gt; str:    params = {\"min_lsn\": min_lsn} if min_lsn else {}    async with aiohttp.ClientSession() as client:        async with client.get(f\"{PG_STATUS_URL}\/most_sync_by_bytes\", params=params) as response:            response.raise_for_status()            return await response.text()<\/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>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a: \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u2192 LSN \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u2192 cookie <code>X-WAL-LSN<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u2192 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0451 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u2192 \u0441\u0435\u0440\u0432\u0435\u0440 \u0447\u0438\u0442\u0430\u0435\u0442 cookie \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 <code>min_lsn<\/code> \u0432 pg-status \u2192 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e WAL, \u0438\u043b\u0438 \u043c\u0430\u0441\u0442\u0435\u0440 \u0435\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0433\u043d\u0430\u043b\u0430.<\/p>\n<h3>\u0413\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c LSN<\/h3>\n<p>Cookie \u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432: \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, LSN \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Redis \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. Scope \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0451\u043c \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<ul>\n<li>\n<p><strong>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u0442\u0432\u0435\u0442\u0430 + \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/strong> \u2014 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 LSN \u0432 <code>X-WAL-LSN<\/code>, \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f API-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>Redis \/ shared storage<\/strong> \u2014 LSN \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c <code>user_id<\/code> \u0438\u043b\u0438 <code>session_id<\/code>. \u041d\u0443\u0436\u0435\u043d \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 cookie \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, LSN \u043d\u0443\u0436\u043d\u043e \u043a\u043b\u0430\u0441\u0442\u044c \u0432 \u043e\u0431\u0449\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>JWT \/ session token<\/strong> \u2014 LSN \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a claim \u0432 \u0442\u043e\u043a\u0435\u043d. \u0423\u0434\u043e\u0431\u043d\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c JWT-\u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0417\u0430\u0449\u0438\u0442\u0430 LSN \u0432 production<\/h3>\n<p>LSN \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 WAL \u0432\u0438\u0434\u0430 <code>0\/3000060<\/code>. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043e\u043d \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439, \u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u043f\u0430\u0441\u043d\u043e: \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 LSN \u0438 \u0432\u044b\u043d\u0443\u0434\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u2014 \u043d\u0438 \u043e\u0434\u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0412 production \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 HMAC \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u2014 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c LSN \u0432 pg-status.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/h3>\n<h4>Docker<\/h4>\n<pre><code class=\"bash\">docker run -d \\  -e pg_status__hosts=host-1,host-2,host-3 \\  -e pg_status__pg_user=postgres \\  -e pg_status__pg_password=postgres \\  -p 8000:8000 \\  krylosovaa\/pg-status:latest<\/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\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">$ curl http:\/\/localhost:8000\/masterhost-1$ curl http:\/\/localhost:8000\/hosts | jq .[  {\"host\": \"host-1\", \"master\": true, \"alive\": true, \"lag_ms\": 0, ...},  {\"host\": \"host-2\", \"master\": false, \"alive\": true, \"lag_ms\": 45, ...},  {\"host\": \"host-3\", \"master\": false, \"alive\": true, \"lag_ms\": 120, ...}]<\/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<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__hosts<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043f\u0438\u0441\u043e\u043a \u0445\u043e\u0441\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__sleep_ms<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0440\u043e\u0441\u0430 \u0445\u043e\u0441\u0442\u043e\u0432 \u0432 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__sync_max_lag_ms<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0440\u043e\u0433 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f <code>sync_by_time<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__sync_max_lag_bytes<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">1000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0440\u043e\u0433 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f <code>sync_by_bytes<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__max_fails<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e\u0434\u0440\u044f\u0434 \u0434\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u043c\u0451\u0440\u0442\u0432\u044b\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>pg_status__query_timeout_ms<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0445\u043e\u0441\u0442\u0430 \u0432 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/hub.docker.com\/r\/krylosovaa\/pg-status\" rel=\"noopener noreferrer nofollow\">Docker Hub<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\/releases\/latest\" rel=\"noopener noreferrer nofollow\">deb-\u043f\u0430\u043a\u0435\u0442<\/a> \u0434\u043b\u044f Debian\/Ubuntu<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\/releases\/latest\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u044c<\/a> \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\" rel=\"noopener noreferrer nofollow\">GitHub<\/a> \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 CMake \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 master\/replica PostgreSQL \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u0440\u0451\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c: \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c read-your-writes. pg-status \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 HTTP API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430 \u0434\u043e\u043b\u0438 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u2014 \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/github.com\/krylosov-aa\/pg-status\" rel=\"noopener noreferrer nofollow\">pg-status<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/krylosov-aa\/context-async-sqlalchemy\" rel=\"noopener noreferrer nofollow\">context-async-sqlalchemy<\/a> \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/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\/1047374\/\">https:\/\/habr.com\/ru\/articles\/1047374\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 PostgreSQL, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c: \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 failover, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u0432\u043e\u0435\u0439 \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. DNS \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438, libpq \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e lag, HAProxy \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b \u043f\u0440\u043e LSN. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u043b\u0451\u0433\u043a\u0438\u0439 HTTP \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 pg-status.\u041c\u0430\u0441\u0442\u0435\u0440 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 PostgreSQL\u0412 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 PostgreSQL \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u042f \u0432\u044b\u0434\u0435\u043b\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u041e\u0434\u0438\u043d \u0445\u043e\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043f\u043e \u0441\u0435\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0445\u043e\u0441\u0442 PostgreSQL \u2014 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0445\u043e\u0441\u0442\u043e\u0432, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u0441\u0442\u0435\u0440-\u0440\u0435\u043f\u043b\u0438\u043a\u0430.\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0442\u0435\u0440-\u0445\u043e\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c. \u0418 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432-\u0440\u0435\u043f\u043b\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e (streaming replication): \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e WAL-\u0436\u0443\u0440\u043d\u0430\u043b (Write-Ahead Log) \u2014 \u043b\u043e\u0433 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 PostgreSQL \u0432\u0435\u0434\u0451\u0442 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435.\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043e\u0442 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u041c\u0435\u0436\u0434\u0443 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0435\u0451 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u2014 \u043e\u043d\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f replication lag. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043d\u043e \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043e\u0442\u0441\u0442\u0430\u0451\u0442, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0451.\u0412 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0440\u0435\u043f\u043b\u0438\u043a \u043d\u043e\u0432\u044b\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u2014 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0451\u0442 \u044d\u0442\u043e\u0442 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f failover. \u0412\u0430\u0436\u043d\u043e: \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 failover \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u043f\u043b\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e. \u0411\u0435\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u0430\u0436\u0435 \u0431\u0435\u0437 failover, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u043f\u043b\u0438\u043a, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c read-only \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0443\u0437\u043a\u0438\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f PostgreSQL-\u0445\u043e\u0441\u0442. \u042d\u0442\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0421\u0423\u0411\u0414, \u0438 \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 80\u201390% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043c\u0430\u0441\u0442\u0435\u0440 \u0440\u0430\u0437\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u0433\u0434\u0435 \u0431\u043e\u043b\u044c\u043d\u043e: CPU \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 I\/O \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0438\u0441\u043a\u0430. \u041c\u0430\u0441\u0442\u0435\u0440\u0443 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438.\u0417\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u041f\u043e\u0434\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0441\u0442\u043e\u0432 \u2014 \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u0434\u0435\u043b\u0430. \u0413\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0445\u043e\u0441\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442, \u0432\u0435\u0434\u044c failover \u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043e\u0442\u0441\u0442\u0430\u044e\u0442 \u043e\u0442 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438:1. \u041d\u0430\u0439\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u2014 \u0431\u0435\u0437 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435: \u043f\u043e\u0441\u043b\u0435 failover \u0438\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0445\u043e\u0441\u0442, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u044d\u0442\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.2. \u041d\u0430\u0439\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443. \u041d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430. \u0420\u0435\u043f\u043b\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443 \u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e. \u041e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u0445: \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u043e\u0437\u0430\u0434\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430) \u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c WAL (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c). \u0421\u043b\u043e\u0432\u043e \u201c\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u201d \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u0447\u0451\u0442\u0430 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0432 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e, \u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2014 \u043d\u0435\u0442.3. \u0413\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c read-your-writes. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u2026 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0448\u043b\u0430 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 read \u2014 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0433\u043d\u0430\u043b\u0430. \u042d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 2: \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043e \u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 WAL, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044flibpq multi-host\u0412 libpq, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0445\u043e\u0441\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0445\u043e\u0441\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 target_session_attrs:host=host-1,host-2,host-3 target_session_attrs=read-writelibpq \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0445\u043e\u0441\u0442\u044b \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439, \u0432\u0441\u0451 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f target_session_attrs:read-write \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0441\u0442\u0435\u0440read-only \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430prefer-standby \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u043c\u0430\u0441\u0442\u0435\u0440any \u2014 \u043b\u044e\u0431\u043e\u0439 \u0436\u0438\u0432\u043e\u0439 \u0445\u043e\u0441\u0442\u0417\u0432\u0443\u0447\u0438\u0442 \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.\u041f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 TCP-\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. libpq \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0445\u043e\u0441\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 SELECT pg_is_in_recovery() \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0445\u043e\u0441\u0442 \u2014 \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u0430 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0442\u0435\u0440, libpq \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442 \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430, \u0440\u0430\u0437\u043e\u0440\u0432\u0451\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u0442 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u041a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 TCP-\u0445\u0435\u043d\u0434\u0448\u0435\u0439\u043a + \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f PostgreSQL. \u041f\u0440\u0438 \u0442\u0440\u0451\u0445 \u0445\u043e\u0441\u0442\u0430\u0445 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0434\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430.\u041c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 failover. libpq \u0443\u0437\u043d\u0430\u0451\u0442 \u043e \u0441\u043c\u0435\u043d\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443. \u041f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u0436\u0438\u0432\u043e, libpq \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u2014 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0432 \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u043f\u043b\u0438\u043a\u0438. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0430\u043b \u201c\u044d\u0442\u043e\u0442 \u0445\u043e\u0441\u0442 \u0441\u043c\u0435\u043d\u0438\u043b \u0440\u043e\u043b\u044c\u201d.\u041d\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043b\u0430\u0433\u0430. prefer-standby \u0432\u0435\u0440\u043d\u0451\u0442 \u043b\u044e\u0431\u0443\u044e \u0436\u0438\u0432\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443, \u0434\u0430\u0436\u0435 \u0442\u0443 \u0447\u0442\u043e \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043d\u0430 30 \u043c\u0438\u043d\u0443\u0442. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u201c\u0432\u0435\u0440\u043d\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0441 lag_ms \u2264 100\u201d.\u041d\u0435\u0442 read-your-writes. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430.DNS\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: dns \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u0440\u0438 failover DNS-\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f. \u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f.\u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435. \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435. DNS \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0443\u043b \u0438\u0437 20 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u2014 \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0430 \u043d\u0451\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u044b. \u041d\u0438\u043a\u0430\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS \u0438\u0445 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0443\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u043b\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.\u041c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 DNS-\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u0435\u0448\u0435\u0439: OS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 (30\u201360 \u0441), JVM (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0435\u0447\u043d\u043e \u2014 networkaddress.cache.ttl = -1), Kubernetes CoreDNS (30 \u0441), \u0438 \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u0445 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u0438 failover \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u0442\u043e \u0438 \u043c\u0438\u043d\u0443\u0442\u044b.\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 failover \u0441\u043c\u0435\u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 DNS \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442 \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u0435\u043a\u0430. \u0418 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u043d\u044b DNS \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0435\u0449\u0451 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0445\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0443\u043b\u0435.\u041d\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. DNS \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441, \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u043f\u043b\u0438\u043a.HAProxyHAProxy \u2014 \u044d\u0442\u043e TCP\/HTTP-\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c health-check \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f PostgreSQL \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430: \u0434\u0432\u0430 listener-\u0430 \u2014 \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0441\u0442\u0435\u0440), \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0440\u0435\u043f\u043b\u0438\u043a\u0438). \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f.\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 health-check \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u043e\u043b\u044c \u0445\u043e\u0441\u0442\u0430. HAProxy \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442. \u0414\u043b\u044f role-detection \u043d\u0443\u0436\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 HTTP-endpoint \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c PostgreSQL-\u0445\u043e\u0441\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 200\/503 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u043e\u043b\u0438. \u0422\u0430\u043a\u043e\u0439 endpoint \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430. HAProxy \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 PostgreSQL. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0442\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 health-check endpoint: \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c WAL-\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u0301\u044e \u043c\u0435\u0442\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c 503 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043f\u043e\u0440\u043e\u0433. \u042d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 lag-\u043f\u043e\u0440\u043e\u0433\u0430 \u2014 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.HAProxy \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0443\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0445\u043e\u043f. \u0414\u043b\u044f HA \u043d\u0443\u0436\u0435\u043d \u0432\u0442\u043e\u0440\u043e\u0439 HAProxy \u0441 keepalived \u0438 VIP, \u0438\u043d\u0430\u0447\u0435 \u0441\u0430\u043c HAProxy \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u0430.Read-your-writes \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435. HAProxy \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u043e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 LSN \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430.pgpool-II\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 SQL-\u043f\u0440\u043e\u043a\u0441\u0438: \u043f\u0430\u0440\u0441\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0443\u0434\u0430 \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c (SELECT \u2192 \u0440\u0435\u043f\u043b\u0438\u043a\u0430, INSERT\/UPDATE \u2192 \u043c\u0430\u0441\u0442\u0435\u0440), \u043f\u0443\u043b\u0438\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 failover. \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.\u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0443 pgpool-II \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u044f:delay_threshold \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 WAL. \u0415\u0441\u043b\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0430 \u043f\u043e\u0440\u043e\u0433, pgpool \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0441\u043b\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0451 SELECT \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u0433\u043e\u043d\u0438\u0442.delay_threshold_by_time (pgpool-II 4.4+) \u2014 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 pg_stat_replication.replay_lag.prefer_lower_delay_standby (pgpool-II 4.3+) \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b\u0430 \u043f\u043e\u0440\u043e\u0433, pgpool \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u043e\u0442\u0441\u0442\u0430\u044e\u0449\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0439\u0442\u0438 \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440.\u042d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c DNS \u0438\u043b\u0438 libpq. \u041d\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:\u0421\u0442\u043e\u0438\u0442 \u0432 \u043f\u0443\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0430\u0437\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 pgpool \u2014 \u043b\u0438\u0448\u043d\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0445\u043e\u043f. pgpool \u0441\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u0430; \u0434\u043b\u044f HA \u043d\u0443\u0436\u0435\u043d watchdog-\u0440\u0435\u0436\u0438\u043c \u0441 VIP.\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0425\u043e\u0441\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438&#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-483583","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483583","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=483583"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483583\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}