Zamierzam dodać zaktualizowane informacje i odniesienia do doskonałej odpowiedzi @ max-malysh powyżej.
Krótko mówiąc, jeśli zrobisz coś na master, musisz to powtórzyć na slave. Postgres wykorzystuje do tego rekordy WAL, które są wysyłane po każdym zarejestrowanym działaniu na mastera do slave'a. Slave następnie wykonuje akcję i te dwa elementy są ponownie zsynchronizowane. W jednym z kilku scenariuszy możesz być w konflikcie na niewolniku z tym, co przychodzi od mistrza w akcji WAL. W większości z nich dochodzi do transakcji na niewolniku, która jest sprzeczna z tym, co akcja WAL chce zmienić. W takim przypadku masz dwie możliwości:
- Opóźnij nieco wykonanie akcji WAL, pozwalając slave'owi zakończyć jego konfliktową transakcję, a następnie zastosuj akcję.
- Anuluj sprzeczne zapytanie na slave.
Martwimy się numerem 1 i dwiema wartościami:
max_standby_archive_delay
- jest to opóźnienie stosowane po długim rozłączeniu między master a slave, gdy dane są odczytywane z archiwum WAL, które nie jest danymi bieżącymi.
max_standby_streaming_delay
- opóźnienie używane do anulowania zapytań, gdy wpisy WAL są odbierane za pośrednictwem replikacji strumieniowej.
Ogólnie rzecz biorąc, jeśli serwer jest przeznaczony do replikacji o wysokiej dostępności, warto, aby te liczby były krótkie. Do 30000
tego wystarczające jest ustawienie domyślne (milisekund, jeśli nie podano jednostek). Jeśli jednak chcesz skonfigurować coś w rodzaju archiwum, repliki raportowania lub odczytu, które mogą mieć bardzo długo działające zapytania, ustaw to na coś wyższego, aby uniknąć anulowanych zapytań. Powyższe zalecane 900s
ustawienie wydaje się dobrym punktem wyjścia. Nie zgadzam się z oficjalną dokumentacją dotyczącą ustawiania nieskończonej wartości -1
jako dobrego pomysłu - może to maskować jakiś błędny kod i powodować wiele problemów.
Jedynym zastrzeżeniem dotyczącym długo działających zapytań i ustawiania tych wartości na wyższe jest to, że inne zapytania działające na serwerze podrzędnym równolegle z długotrwałym, które powoduje opóźnienie akcji WAL, będą widzieć stare dane do czasu zakończenia długiego zapytania. Deweloperzy będą musieli to zrozumieć i serializować zapytania, które nie powinny działać jednocześnie.
Pełne wyjaśnienie, jak max_standby_archive_delay
i jak max_standby_streaming_delay
działa, i dlaczego, znajdziesz tutaj .