Мащабируемостта е свойството на системата да се справя с нарастващия брой изисквания чрез добавяне на ресурси. Причините за това количество искания могат да бъдат временни, например, ако стартирате отстъпка при разпродажба, или постоянни, за увеличаване на клиенти или служители. Във всеки случай трябва да можете да добавяте или премахвате ресурси, за да управлявате тези промени в зависимост от изискванията или увеличаването на трафика.
Има различни подходи за мащабиране на вашата база данни. В този блог ще разгледаме какви са тези подходи и как да мащабирате вашата PostgreSQL база данни с помощта на Connection Poolers и Load Balancers.
Хоризонтално и вертикално мащабиране
Има два основни начина за мащабиране на вашата база данни.
- Хоризонтално мащабиране (намаляване):Изпълнява се чрез добавяне на повече възли на база данни, създавайки или увеличавайки клъстер на база данни. Може да ви помогне да подобрите производителността на четене, като балансирате трафика между възлите.
- Вертикално мащабиране (увеличаване):Извършва се чрез добавяне на повече хардуерни ресурси (CPU, памет, диск) към съществуващ възел на базата данни. Може да се наложи да промените някакъв конфигурационен параметър, за да позволите на PostgreSQL да използва нов или по-добър хардуерен ресурс.
Пулери за връзки и балансьори на натоварване
И при хоризонтално и вертикално мащабиране може да е полезно да добавите външен инструмент за намаляване на натоварването на вашата база данни, което ще подобри производителността. Може би не е достатъчно, но е добра отправна точка. За това е добра идея да внедрите пул за връзки и балансьор на натоварване. Казах „и“, защото са предназначени за различни роли.
Обединяването на връзки е метод за създаване на пул от връзки и повторното им използване, като се избягва непрекъснатото отваряне на нови връзки към базата данни, което значително ще увеличи производителността на вашите приложения. PgBouncer е популярен пул за връзки, създаден за PostgreSQL.
Използването на Load Balancer е начин да имате висока наличност във вашата топология на базата данни и също така е полезно да увеличите производителността чрез балансиране на трафика между наличните възли. За тази цел HAProxy е добра опция за PostgreSQL, тъй като е прокси с отворен код, който може да се използва за внедряване на висока наличност, балансиране на натоварването и прокси за TCP и HTTP базирани приложения.
Как да внедрите комбинация от HAProxy, PgBouncer и PostgreSQL
Комбинация от двете технологии, HAProxy и PgBouncer, е може би най-добрият начин за мащабиране и подобряване на производителността във вашата PostgreSQL среда. И така, ще видим как да го приложим, използвайки следната архитектура:
Ще приемем, че имате инсталиран ClusterControl, ако не, можете да отидете на официалния сайт или дори се обърнете към официалната документация, за да го инсталирате.
Първо, трябва да разгърнете своя PostgreSQL клъстер с HAProxy пред него. За това, моля, следвайте стъпките в тази публикация в блога, за да разгърнете както PostgreSQL, така и HAProxy с помощта на ClusterControl.
В този момент ще имате нещо подобно:
Сега можете да инсталирате PgBouncer на всеки възел на базата данни или на външна машина .
За да получите софтуера PgBouncer, можете да отидете в раздела за изтегляне на PgBouncer или да използвате RPM или DEB хранилища. За този пример ще използваме CentOS 8 и ще го инсталираме от официалното хранилище на PostgreSQL.
Първо, изтеглете и инсталирайте съответното хранилище от сайта на PostgreSQL (ако все още го нямате):
$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm
След това инсталирайте пакета PgBouncer:
$ yum install pgbouncer
Когато приключи, ще имате нов конфигурационен файл, намиращ се в /etc/pgbouncer/pgbouncer.ini. Като конфигурационен файл по подразбиране можете да използвате следния пример:
$ cat /etc/pgbouncer/pgbouncer.ini
[databases]
world = host=127.0.0.1 port=5432 dbname=world
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admindb
И файлът за удостоверяване:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
Това е само основен пример. За да получите всички налични параметри, можете да проверите официалната документация.
И така, в този случай инсталирах PgBouncer в същия възел на базата данни, слушайки всички IP адреси и се свързва с PostgreSQL база данни, наречена „свят“. Аз също управлявам разрешените потребители във файла userlist.txt с парола в обикновен текст, която може да бъде криптирана, ако е необходимо.
За да стартирате услугата PgBouncer, просто трябва да изпълните следната команда:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
Сега изпълнете следната команда, като използвате вашата локална информация (порт, хост, потребителско име и име на база данни), за да получите достъп до базата данни PostgreSQL:
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
Това е основна топология. Можете да го подобрите, например, като добавите два или повече възела за балансиране на натоварването, за да избегнете една точка на повреда, и като използвате някакъв инструмент като „Keepalived“, за да гарантирате наличността. Може да се направи и с помощта на ClusterControl.
За повече информация относно PgBouncer и как да го използвате, можете да се обърнете към тази публикация в блога.
Заключение
Ако трябва да мащабирате своя PostgreSQL клъстер, добавянето на HAProxy и PgBouncer е добър начин за мащабиране и мащабиране едновременно, тъй като можете да добавите още горещи резервни възли, за да балансирате трафика и ще подобрите производителността, като използвате повторно отворени връзки.
ClusterControl предоставя цял набор от функции, от наблюдение, предупреждение, автоматично преминаване при отказ, архивиране, възстановяване в момента, проверка на архивиране до мащабиране на прочетени реплики. Това може да ви помогне да мащабирате вашата PostgreSQL база данни по хоризонтален или вертикален начин от удобен и интуитивен потребителски интерфейс.