Jeśli chodzi o łączenie połączeń w świecie PostgreSQL, prawdopodobnie najpopularniejszą opcją jest PgBouncer. Jest to bardzo proste narzędzie, które robi dokładnie jedną rzecz – znajduje się między bazą danych a klientami i obsługuje protokół PostgreSQL, emulując serwer PostgreSQL. Klient łączy się z PgBouncer z dokładnie taką samą składnią, jakiej użyłby podczas bezpośredniego łączenia się z PostgreSQL – PgBouncer jest zasadniczo niewidoczny.
PgBouncer jest obsługiwany przez prawie każdego dostawcę PostgreSQL DBaaS i jest szeroko stosowany w całej społeczności. W tym poście na blogu wyjaśnimy, jak działa PgBouncer, wady i zalety korzystania z niego oraz jak skonfigurować pulę połączeń. Jeśli chcesz dowiedzieć się więcej o pulowaniu połączeń ogólnie lub zastanawiasz się, czy jest to odpowiednie dla Twojego wdrożenia, zapoznaj się z naszym postem dotyczącym pulowania połączeń PostgreSQL:Część 1 – Zalety i wady.
Seria pul połączeń PostgreSQL
|
---|
Jak działa PgBouncer?
Kiedy PgBouncer otrzymuje połączenie od klienta, najpierw przeprowadza uwierzytelnianie w imieniu serwera PostgreSQL. PgBouncer obsługuje wszystkie mechanizmy uwierzytelniania obsługiwane przez serwer PostgreSQL, w tym konfigurację dostępu opartego na hoście (uwaga:nie możemy kierować połączeń replikacji przez PgBouncer). Jeśli podano hasło, uwierzytelnienie można przeprowadzić na dwa sposoby:
- PgBouncer najpierw sprawdza plik userslist.txt – ten plik określa zestaw krotek (nazwa użytkownika, zaszyfrowane hasła md5). Jeśli nazwa użytkownika istnieje w tym pliku, hasło jest dopasowywane do podanej wartości. Brak połączenia z serwerem PostgreSQL.
- Jeśli skonfigurowano uwierzytelnianie przekazujące, a użytkownik nie został znaleziony w pliku userslist.txt, PgBouncer szuka auth_query. Łączy się z PostgreSQL jako predefiniowany użytkownik (którego hasło musi być obecne w pliku userslist.txt) i wykonuje zapytanie auth, aby znaleźć hasło użytkownika i dopasować je do podanej wartości.
Po pomyślnym uwierzytelnieniu:
- PgBouncer sprawdza połączenie z pamięcią podręczną, z tą samą kombinacją nazwy użytkownika i bazy danych.
- Jeśli zostanie znalezione połączenie z pamięci podręcznej, zwraca połączenie do klienta.
- Jeśli połączenie buforowane nie zostanie znalezione, tworzy nowe połączenie, pod warunkiem, że tworzenie nowego połączenia nie:
- Zwiększ liczbę połączeń do> pool_size
- Zwiększ liczbę połączeń od klienta do> max_client_connections
- Zwiększ liczbę połączeń z bazą danych do> max_db_connections
- Zwiększ liczbę połączeń od użytkownika do> max_user_connections
- Wszystkie te wartości można zdefiniować w ustawieniach PgBouncer.
- Jeżeli utworzenie nowego połączenia naruszyłoby którekolwiek z ustawień, PgBouncer kolejkuje połączenie do momentu utworzenia nowego, chyba że narusza to ograniczenie max_client_connections.
Uwaga — czas kroków po uwierzytelnieniu różni się nieznacznie w zależności od trybu PgBouncer. W trybie pulowania transakcji lub wyciągów kroki po uwierzytelnieniu są wykonywane tylko wtedy, gdy klient rozpoczyna wykonywanie transakcji/wyciągu. Omówimy więcej o trybach łączenia poniżej. - Jeśli narusza ograniczenie max_client_connections, przerywa połączenie.
Na podstawie puli trybie, PgBouncer czeka na możliwość zwrócenia połączenia z powrotem do bazy danych:
- W trybie pulowania sesji połączenie jest zwracane do puli tylko wtedy, gdy klient zamyka sesję.
- W trybie puli transakcji połączenie jest zwracane do puli tylko wtedy, gdy klient zakończy transakcję (zazwyczaj wykonywane jest wycofanie lub zatwierdzenie). W rezultacie funkcje oparte na sesji nie są obsługiwane w tym trybie. Nie ma gwarancji, że dwie transakcje uruchomione na tym samym połączeniu klienta PgBouncer będą działały na tym samym połączeniu z serwerem PgBouncer.
- W trybie pulowania instrukcji połączenie jest zwracane do puli natychmiast po wykonaniu instrukcji. Tutaj automatyczne zatwierdzanie jest zawsze włączone.
Przed zwróceniem połączenia z powrotem do bazy danych, PgBouncer uruchamia zapytanie resetujące, aby usunąć z niego wszystkie informacje o sesji – dzięki temu udostępnianie połączeń między klientami jest bezpieczne. Możliwe jest skonfigurowanie tego zapytania w oparciu o potrzeby aplikacji.
Tryb puli transakcji jest używany najczęściej, chociaż tryb puli sesji może być przydatny w przypadku określonych obciążeń. Możesz przeczytać więcej o PgBouncer na ich stronie Wiki.
Pula połączeń PostgreSQL:część 2 – PgBouncerKliknij, aby tweetowaćDlaczego warto wybrać PgBouncer?
Jest wiele powodów, dla których PgBouncer jest najpopularniejszym wyborem, jeśli chodzi o łączenie połączeń w PostgreSQL. Oto niektóre z najlepszych funkcji i zalet oferowanych przez PgBouncer:
- Tryby łączenia – Dając użytkownikom możliwość decydowania, kiedy połączenie zostanie zwrócone do puli, PgBouncer jest w stanie obsłużyć szeroki zakres przypadków użycia. A ponieważ ta konfiguracja jest na poziomie puli, możesz użyć trybu transakcyjnego (lepsza wydajność) dla zwykłych połączeń z bazą danych, a trybu sesji tylko wtedy, gdy potrzebujesz funkcji, takich jak przygotowane instrukcje!
- Łatwa konfiguracja i użytkowanie – PgBouncer jest jednym z najłatwiejszych do skonfigurowania puli połączeń PostgreSQL, a także nie wymaga zmian kodu po stronie klienta.
- Uwierzytelnianie przekazywane – PgBouncer to jeden z niewielu „pośredników” pul połączeń, które mogą bezpiecznie uwierzytelniać użytkownika bez dostępu do jego haseł (w postaci zwykłego tekstu lub zaszyfrowanej). Dzięki temu PgBouncer jest bezpieczniejszy i łatwiejszy w utrzymaniu – nie musisz aktualizować PgBouncera za każdym razem, gdy użytkownik aktualizuje swoje hasło.
- Lekki – Jest to pojedynczy proces, a wszystkie polecenia od klienta i odpowiedzi z serwera przechodzą przez PgBouncer bez żadnego przetwarzania. Nie musi więc „widzieć” całej zawartości na raz, a zatem zachowuje bardzo mały ślad w pamięci.
- Skalowalność i wydajność – Jak omówimy bardziej szczegółowo w końcowej części naszej serii, PgBouncer może znacznie poprawić transakcje na sekundę, które może obsługiwać Twój serwer PostgreSQL, i bardzo dobrze skaluje się do bardzo dużej liczby klientów.
Czego nie robi PgBouncer?
PgBouncer, chociaż jest świetnym narzędziem do puli połączeń, nie obsługuje automatycznego równoważenia obciążenia ani wysokiej dostępności. Zaleca używanie innych popularnych narzędzi linuksowych, takich jak HAProxy, do tworzenia architektury obsługującej te funkcje.
Rzuć okiem na przykładową architekturę PostgreSQL dla odczytów o zrównoważonym obciążeniu:
Uwaga – węzeł główny (czyli wszystkie te będzie replikowany z) nie jest pokazany na schemacie.
Jak skonfigurować PgBouncera
Jeśli masz wdrożenie ScaleGrid PostgreSQL, możesz skonfigurować PgBouncer za pomocą kilku kliknięć. Przejdź do widoku szczegółów swojego klastra PostgreSQL i kliknij ikonę PgBouncer. Po wybraniu opcji „Włącz PgBouncer” zostaną wyświetlone opcje konfiguracji umożliwiające dostosowanie trybu łączenia i rozmiaru puli – możesz zaakceptować ustawienia domyślne (nie martw się, możesz je zmienić w dowolnym momencie bez przestojów) i kliknij Włącz!
I to wszystko! Możesz iść.
Jeśli masz wdrożenie inne niż ScaleGrid, PgBouncer jest dystrybuowany jako część repozytorium PostgreSQL i można go zainstalować za pomocą odpowiednich menedżerów pakietów. Aby uzyskać bardziej szczegółowe instrukcje lub zbudować ze źródła, możesz postępować zgodnie z instrukcjami na ich blogu.
Po zainstalowaniu PgBouncer wymaga tylko ustawienia kilku parametrów konfiguracyjnych do uruchomienia:
- Lista (nazwa użytkownika, zaszyfrowane hasło md5) do uwierzytelniania klientów lub konfiguracja uwierzytelniania przekazywanego dla bezpieczniejszego wdrożenia.
- Interfejsy/IP:porty do nasłuchiwania połączeń przychodzących.
- Definicje puli. „Pula” to nazwa, której klienci używają jako nazwy bazy danych podczas łączenia się z PgBouncer – można ją zmapować do pełnego ciągu połączenia (host, port, nazwa bazy danych i użytkownik). Najprostsza definicja ma postać:
* = host=
Stworzy to dynamiczne pule dla każdej kombinacji nazwa_bazy+użytkownik i połączy się ze zdefiniowanym hostem przy użyciu portu, nazwy db i nazwy użytkownika dostarczonych przez użytkownika.
I to wszystko! Dzięki PgBouncer możesz działać bardzo szybko. Istnieje jednak wiele innych ustawień, które należy dostosować do dowolnej dystrybucji produkcyjnej – wykraczają one poza zakres tego wpisu na blogu, ale możesz przeczytać więcej na ich temat w tym przeglądzie konfiguracji PgBouncer.
PgBouncer nie jest jednak jedyną opcją dla puli połączeń PostgreSQL – w naszym następnym poście omówimy Pgpool-II, który jest prawdopodobnie głównym konkurenta PgBouncera. Czekajcie na nasz czwarty post z tej czteroczęściowej serii, w której porównujemy PgBouncer z Pgpool-II.