PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Общ преглед на PostgreSQL кеширане на заявки и балансиране на натоварването

Темата за кеширането се появи в PostgreSQL още преди 22 години и по това време фокусът беше върху надеждността на базата данни.

Бързо напред до 2020 г., дисковите плочи са скрити още по-дълбоко във виртуализирани среди, хипервизори и свързани устройства за съхранение. Освен това, взаимосвързаните, разпределени приложения, работещи в глобален мащаб, крещят за връзки с ниска латентност и внезапно настройват кешовете на сървъра, а SQL заявките се конкурират с гарантирането, че резултатите се връщат на клиентите в рамките на милисекунди. Раждат се кешове на ниво приложение и в паметта, а заявките за четене вече се записват близо до сървърите на приложения. В резултат на това I/O операциите са намалени само до запис, а латентността на мрежата е драстично подобрена. С един улов. Реализациите са отговорни за управлението на собствения кеш, което понякога води до влошаване на производителността.

Кеширането на запис е много по-сложен въпрос, както е обяснено в уикито на PostgreSQL.

Този блог е преглед на кеша на заявки в паметта и балансировчиците на натоварване, които се използват с PostgreSQL.

Балансиране на натоварването на PostgreSQL

Идеята за балансиране на натоварването е възникнала едновременно с кеширането през 1999 г., когато Брус Момджиам пише:

[...] възможно е да бъдем _много_ популярни в близко бъдеще.

Основата за внедряване на балансиране на натоварването в PostgreSQL се осигурява от вградената функция Hot Standby. Единственото изискване е приложението да се справи с преодоляването на отказ и тук идват решенията на трети страни. Ще разгледаме някои от тези решения в следващите раздели.

Заявките с балансирано натоварване могат да връщат последователни резултати само докато забавянето на синхронната репликация се поддържа ниско. На практика дори най-съвременната мрежова инфраструктура като AWS може да показва закъснения от десетки милисекунди:

Обикновено наблюдаваме времена на забавяне в 10-те милисекунди. [...] Въпреки това, при типични условия, забавянето на репликацията под една минута е често срещано. [...]

Многорегионалните реплики, използващи логическа репликация, ще бъдат повлияни от скоростта на промяна/прилагане и закъсненията в мрежовата комуникация между избраните конкретни региони. Репликата в различни региони, използващи Aurora Global Database, ще имат типично забавяне от под секунда.

Както беше посочено по-рано, решенията на трети страни разчитат на основните функции на PostgreSQL. Например, балансирането на натоварването на заявките за четене се постига с помощта на множество синхронни режими на готовност.

Решения

pgpool-II

pgpool-II е богат на функции продукт, който осигурява както балансиране на натоварването, така и кеширане на заявки в паметта. Това е подмяна, не са необходими промени от страната на приложението.

Като средство за балансиране на натоварването pgpool-II разглежда всяка SQL заявка — за да бъдат балансирани на натоварването, заявките SELECT трябва да отговарят на няколко условия.

Настройката може да бъде толкова проста, колкото един възел, показан по-долу е клъстер с два възела:

Както е в случая с всеки страхотен софтуер, има определени ограничения , и pgpool-II не прави изключение:

  • Не обработва заявки с множество изрази.
  • SELECT заявките към временни таблици изискват SQL коментара /*NO LOAD BALANCE*/.

Приложенията, работещи във високопроизводителни среди, ще се възползват от смесена конфигурация, при която pgBouncer е пул за свързване, а pgpool-II обработва балансиране на натоварването и кеширане. Резултатът е впечатляващо 4 пъти увеличение на пропускателната способност и 40% намаляване на латентността:

Кеширането в паметта отново работи само при заявки за четене, с кеширане данните се записват или в споделената памет, или във външна мемкеширана инсталация. Въпреки че документацията е доста добра в обяснението на различните опции за конфигурация, тя косвено подсказва, че реализациите трябва да наблюдават изхода на SHOW POOL CACHE, за да предупреждават при коефициенти на попадане, падащи под 70%, в който момент се губи печалбата на производителността, осигурена от кеширането.

Букардо

Bucardo е инструмент за репликация на PostgreSQL, написан на Perl и PL/Perl.

Споменах Bucardo, тъй като балансирането на натоварването е една от неговите характеристики, според PostgreSQL wiki, обаче търсенето в интернет не дава подходящи резултати. За да изясня се насочих към официалната документация, която включва подробности за това как всъщност работи софтуерът:

Това е доста ясно, че Bucardo не е балансьор на натоварване, точно както беше посочен от хората в Database Soup.

HAProxy

HAProxy е инструмент за балансиране на натоварването с общо предназначение, което работи на ниво TCP (за целите на връзките към базата данни). Проверките на състоянието гарантират, че заявките се изпращат само до живи възли.

В сравнение с pgpool-II, приложенията, използващи HAProxy като балансьор на натоварването, трябва да бъдат информирани за заявките за изпращане на крайната точка към възлите за четене.

Apache Ignite

Apache Ignite е кеш от второ ниво, който разбира ANSI-99 SQL и осигурява поддръжка за ACID транзакции. Apache Ignite не разбира PostgreSQL Frontend/Backend Protocol и следователно приложенията трябва да използват или постоянен слой, като Hibernate ORM. Като алтернатива на модифицирането на приложения, Apache Ignite предоставя `memcached интеграция`_, която изисква разширението memcached PostgreSQL. За съжаление, тази последна опция не е съвместима с последните версии на PostgreSQL, тъй като разширението pgmemcache е актуализирано последно през 2017 г.

Данни на Heimdall

Като търговски продукт, Heimdall Data поставя отметки в двете квадратчета:балансиране на натоварването и кеширане. Това е зрял продукт, който беше демонстриран на конференции на PostgreSQL още през PGCon 2017:

Повече подробности и демонстрация на продукта можете да намерите в блога на Azure за PostgreSQL .

Заключение

В днешните разпределени изчисления кеширането на заявки и балансирането на натоварването са също толкова важни за настройката на производителността на PostgreSQL, колкото добре познатите GUC, ядрото на ОС, съхранението и оптимизирането на заявките. Докато pgpool-II и Heimdall Data са с отворен код и съответно предпочитаните от търговската мрежа решения, има случаи, когато нарочно направените инструменти могат да се използват като градивни елементи за постигане на подобни резултати.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да накарам функция plpgsql да връща цяло число, без да използвам променлива?

  2. Postgresql вмъкване на тригер за задаване на стойност

  3. вземете последните три месеца записи от таблицата

  4. Търсене в пълен текст от PostgreSQL 8.3

  5. Добавете колона с времеви клеймо с по подразбиране СЕГА() само за нови редове