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

Някои идеи за обединяване на ресурси на ниско ниво в PostgreSQL

Миналата седмица в CHAR(10) конференция имахме семинар на тема „Облачни бази данни“. Казано по-просто:какво да правим, когато изискванията на случаите на използване надвишават наличните ресурси в сървъра на базата данни.
Това беше основна тема на цялата конференция и през деня бяха илюстрирани няколко решения. Обща тема е, че никое решение не отговаря на всички случаи на употреба и че всяко решение идва със своята цена; следователно трябва да изберете решението, което вашият случай на употреба може да си позволи.


Друг често срещан (макар и имплицитен) момент е фокусът върху решенията на „високо ниво“, тоест:свързване на няколко сървъра на бази данни на по-високо ниво, за да се емулира един сървър с по-големи ресурси.
Очевидно предимство е, че не е нужно да променяте добре проверения PostgreSQL код; недостатъкът е, че като използвате множество сървъри на бази данни с техните независими времеви линии, губите някои полезни свойства. Два примера:частичната загуба на транзакционната семантика генерира конфликти; Предварителният анализ на всяка заявка извън базата данни въвежда ограничения върху приетите заявки.
Дискусията беше доста интересна и когато Димитри Фонтейн спомена отдалечени пространства за таблици, започнах да се чудя около свързана, но отделна идея, а именно:дали подход на по-ниско ниво към проблема с обединяването на ресурсите наистина би било непрактично. Преди да успея да разясня детайлите, семинарът приключи и можех само да скицирам идеята на някои от хората, които бяха около бялата дъска (сред които Габриеле Бартолини, Ник Фериер, Марко Крин, Хану Кросинг, Грег Смит) заедно с основните въпроси "осъществимо ли изглежда?" и „това прилича ли на нещо, което вече знаете?“.
Кратка скица:стекът от приложения може да бъде представен по този начин

(application) --> (connection) --> (db server) --> (resources)

където ресурсите, използвани от базата данни, включват съхранение, RAM и CPU. Целта е да се позволи на приложението да управлява повече ресурси, за да увеличи капацитета и скоростта. „Умните“ приложения, които управляват няколко бази данни, могат да бъдат представени като

(application) --> (connection) --> (db server) --> (resources)
|
+---------> (connection) --> (db server) --> (resources)

докато решенията за „обединяване на връзки“ могат да бъдат представени като

(application) --> (connection) --> (db server) --> (resources)
|
+---------> (db server) --> (resources)

под решения на „по-ниско ниво“ имам предвид нещо като

(application) --> (connection) --> (db server) --> (resources)
|
+---------> (resources)

което може да прилича на нещо познато, но не е това, което предлагам тук. За да обясня разликата, мога да увелича детайлите и да напиша

(resources) = (virtual resources) --> (physical resources)

за да представи факта, че на най-ниското ниво можете да имате нетривиално съпоставяне между физически и виртуални обекти. Например, SAN съхранение или RAID ивици могат да осигурят по-големи виртуални дискове чрез свързване на по-малки физически дискове. Такива случаи могат да бъдат представени като

(application) --> (connection) --> (db server) --> (virt.res.) --> (ph.res.)
|
+--------> (ph.res.)

Моето предложение е да се обединят ресурси на сървъра на базата данни ниво, така че да можем да имаме по-ефективна „виртуализация“, като използваме познанията за конкретните случаи на използване за всеки ресурс (CPU, RAM, диск), и в същото време можем да избегнем трудностите на транзакционната парадигма. Картината ще бъде:

(application) --> (connection) --> (db server) --> (virt.res.) --> (ph.res.)
|
+--------> (virt.res.) --> (ph.res.)

Предимството е, че не е необходимо да управляваме всички възможни случаи на използване за всеки виртуален ресурс; просто трябва да управляваме (и да оптимизираме) случаите на употреба, които всъщност са необходими на PostgreSQL. Например:WAL все пак трябва да се записва в локално “невиртуализирано” хранилище, bgwriter ще има достъп до локални и отдалечени ресурси (RAM и диск) и т.н.
Някои последни думи за надеждността. За да работи правилно цялата система се нуждае от всяка подсистема; частичните откази не се управляват, тъй като тази архитектура не е излишна. Това е разпределена система, но не е споделена. Ако тази архитектура може да осигури евтина и проста мащабируемост чрез сървър на виртуална база данни, който е функционално еквивалентен на физически сървър с по-големи ресурси, тогава високата наличност може да се получи по стандартния начин чрез настройка на два идентични виртуални сървъра в конфигурация с горещ режим на готовност.
Качеството на мрежата оказва голямо влияние върху цялостната производителност; този дизайн може да бъде полезен само ако имате масив от машини в една и съща локална мрежа, не само от съображения за скорост, но и защото мрежовата повреда всъщност би била системна повреда. Дори и с тези ограничения, моето мнение е, че тази опция би била доста полезна.
Това все още е скица, която да се използва като справка за по-нататъшно обсъждане. Следващи възможни стъпки:

  • за да направите подробен списък на случаите на използване на ресурсите
  • за да решите кои технологии могат да помогнат най-добре във всеки случай на употреба
  • за оценка на действителните разходи за изпълнение/разработка

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разплитане на надстройката на PostgreSQL

  2. PostgreSQL деактивира повече изход

  3. Кажете на потребителите си да се разклонят

  4. Как да приложим функция към всеки елемент от колона на масив в Postgres?

  5. 3 функции, които получават деня, месеца и годината от дата в PostgreSQL