Notatka sporządzona na podstawie informacji ze SLack instrukcję przygotował [@MichalBulawa] GSNI -> Postgres 13 + ETCD + Patroni + HAproxy + confd + keepalived # Informacje ogólne Postgres - wiadomo etcd -> klaster do przechowywania kluczy dla rozwiązania patroni -> coś co utrzymuje całość przy życiu ( manual później ) haproxy -> wiadomo / używane do komunikacji z “Leaderem klastra”, oraz do umożliwienia load-balancingu na replikach confd -> odpowiedzialny za pilnowanie konfiguracji plików ( nie pozwala wprowadzić samemu zmian keepalived -> usługa do utrzymywania VIP-a ( GSNI TO: plpa2ps01srrm, plpa2ps02srrm, plwa2ps03srrm ) 1. Prereq /etc/hosts ( na każdym serwerze wyglądają podobnie ) -sh-4.4$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 158.98.154.129 plpa2ps01srrm.plf.esni.ibm.com plpa2ps01srrm pgsql-01 158.98.154.130 plpa2ps02srrm.plf.esni.ibm.com plpa2ps02srrm pgsql-02 158.98.154.131 plwa2ps03srrm.plf.esni.ibm.com plwa2ps03srrm pgsql-03 158.98.154.122 plpa2ps00srrm.plf.esni.ibm.com plpa2ps00srrm pgsql-vip -sh-4.4$ 2. Postgres ( pre-install ) -sh-4.4$ ls -l /etc/yum.repos.d/pgdg-redhat-all.repo -rw-r--r--. 1 root root 11072 Sep 30 16:28 /etc/yum.repos.d/pgdg-redhat-all.repo -sh-4.4$ head /etc/yum.repos.d/pgdg-redhat-all.repo -n 15 ####################################################### # PGDG Red Hat Enterprise Linux / CentOS repositories # ####################################################### # PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions [pgdg-common] name=PostgreSQL common RPMs for RHEL/CentOS $releasever - $basearch baseurl=https://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG repo_gpgcheck = 1 proxy=http://172.25.1.10:8080 <--------------- taka sztuczka jak dodać repozytorium postgresowe na gsni by działało -sh-4.4$ 3. squid ( opcja za firewallem więc proxy potrzebne ) [root@plpa4gp01psrm acls]# cat pgsql.services postgresql.org github.com pypi.org python.org pythonhosted.org [root@plpa4gp01psrm acls]# 4. sysctl sysctl svm.swappiness=1 sysctl vm.dirty_vm.min_free_kbytes=102400 sysctl vm.dirty_expire_centisecs=1000 sysctl vm.dirty_background_bytes=67108864 sysctl vm.dirty_bytes=536870912 sysctl vm.nr_hugepages=9510 sysctl vm.zone_reclaim_mode=0 sysctl kernel.numa_balancing=0 sysctl kernel.sched_migration_cost_ns=5000000 sysctl kernel.sched_autogroup_enabled=0 sysctl net.ipv4.ip_nonlocal_bind=1 sysctl net.ipv4.ip_forward=1 sysctl net.core.netdev_max_backlog=10000 sysctl net.ipv4.tcp_max_syn_backlog=8192 sysctl net.core.somaxconn=65535 sysctl net.ipv4.tcp_tw_reuse=1 5. yum install && pip3 update yum install -y git yum install -y keepalived yum install -y libyaml yum install -y python3-psycopg2 yum install -y python2-psycopg2 yum install -y python3 yum install -y python2 yum install -y haproxy HTTPS_PROXY=http://172.25.1.10:8080 pip3 install --upgrade pip 6. SSL Sprawdzenie czy są zaimportowane w CA 7. System HDD + Postgres [root@plpa2ps01srrm ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 512M 0 part /boot └─sda2 8:2 0 49.5G 0 part └─rootvg-backup_lv 253:12 0 10G 0 lvm /backup sdb 8:16 0 100G 0 disk └─databasevg-data_lv 253:13 0 100G 0 lvm /database sr0 11:0 1 1024M 0 rom [root@plpa2ps01srrm ~]# 8. Postgres install <– tutaj też mamy dodanie repozytorium / a je ( o ile trzeba ) edytujemy dodając proxy no i jak podaje manual na stronie dnf -qy module disable postgresql dnf install -y postgresql13-server dnf install -y pgaudit15_13.x86_64 dnf install -y postgresql13-contrib taka instalacja powoduje dodanie użytkownika w systemie o nazwie postgres oraz binarki które lądują w: -bash-4.4$ ls -l /usr/pgsql-13/bin/ total 11104 -rwxr-xr-x. 1 root root 73192 Aug 12 12:04 clusterdb 9. Pre-Konfiguracja Porsgres-a Pre-Konfiguracja Porsgres-a —> generuje kawałek pliku postgres.conf w zależności od tego co mamy za sprzęt na GSNI to: RHEL8 x86-64, NS-SAN, 8cpu, 16mem, maxcon 100, ver.13, ERP or long… ( zapotrzebowanie dla Zabbix ) 10. Uruchomienie bazy [root@plpa2ps01srrm ~]# cd /database/ [root@plpa2ps01srrm database]# mkdir data [root@plpa2ps01srrm database]# chown postgres:postgres data/ [root@plpa2ps01srrm database]# su - postgres Last login: Thu Oct 7 10:59:49 CEST 2021 on pts/1 -bash-4.4$ /usr/pgsql-13/bin/initdb --pgdata=/database/data The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /database/data ... ok creating subdirectories ... ok selecting dynamic shared memory implementation ... posix selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default time zone ... Europe/Warsaw creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok initdb: warning: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: /usr/pgsql-13/bin/pg_ctl -D /database/data -l logfile start -bash-4.4$ cd /database/data/ -bash-4.4$ ls base pg_hba.conf pg_notify pg_stat pg_twophase postgresql.auto.conf global pg_ident.conf pg_replslot pg_stat_tmp PG_VERSION postgresql.conf pg_commit_ts pg_logical pg_serial pg_subtrans pg_wal pg_dynshmem pg_multixact pg_snapshots pg_tblspc pg_xact -bash-4.4$ /usr/pgsql-13/bin/pg_ctl -D /database/data -l logfile start waiting for server to start.... done server started -bash-4.4$ psql psql (13.4) Type "help" for help. postgres=# 11. Hasło dla użytkownika postgres oraz na potrzeby replikacji, użytkownik do replikacji z hasłem postgres=# ALTER USER postgres PASSWORD 'bo zupa była za słona'; // :D ALTER ROLE postgres=# \q -bash-4.4$ createuser -U postgres replicator -P -c 5 --replication Enter password for new role: 'bo zupa była za słona' // :D Enter it again: 'bo zupa była za słona' // :D -bash-4.4$ 12. wyłączamy bazę -> bo już nam narazie nie będzie potrzebna -bash-4.4$ /usr/pgsql-13/bin/pg_ctl stop -D /database/data waiting for server to shut down.... done server stopped -bash-4.4$ 13. ETCD wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz tar -xzf etcd-v3.5.0-linux-amd64.tar.gz cp etcd-v3.5.0-linux-amd64/etcd etcd-v3.5.0-linux-amd64/etcdctl etcd-v3.5.0-linux-amd64/etcdutl /usr/bin/ [root@plwa2ps03srrm ~]# /usr/bin/etcd --version etcd Version: 3.5.0 Git SHA: 946a5a6f2 Go Version: go1.16.3 Go OS/Arch: linux/amd64 [root@plwa2ps03srrm ~]# /usr/bin/etcdctl version etcdctl version: 3.5.0 API version: 3.5 [root@plwa2ps03srrm ~]# /usr/bin/etcdutl version etcdutl version: 3.5.0 API version: 3.5 [root@plwa2ps03srrm ~]# 14. konfiguracja ( serwis uruchamiany jako root / więc uprawnienia aż tak nie są ważne ) vim /usr/lib/systemd/system/etcd.service vim /etc/etcd/etcd.conf mkdir /etc/etcd mkdir /var/lib/etcd vim /etc/etcd/etcd.conf systemctl enable etcd.service systemctl start etcd.service 15. Patroni vim requirements.txt pip3 install -r requirements.txt pip3 install patroni[etcd] mkdir -p /etc/patroni/ chmod go-rwx /etc/patroni/ chown postgres:postgres /etc/patroni/ vim /etc/patroni/patroni.yml vim /usr/lib/systemd/system/patroni.service systemctl daemon-reload echo "export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml" >> /etc/profile cat requirements urllib3>=1.19.1,!=1.21 ipaddress; pythonversion==“2.7” boto PyYAML six >= 1.7 kazoo>=1.3.1 python-etcd>=0.4.3,<0.5 python-consul>=0.7.1 click>=4.1 prettytable>=0.7 python-dateutil pysyncobj>=0.3.8 cryptography>=1.4 psutil>=2.0.0 ydiff>=1.2.0 [root@plpa2ps01srrm ~]# patronictl version patronictl version 2.1.1 [root@plpa2ps01srrm ~]# 16. Keepalived zainstalowany był wcześniej, konfiguracja w plikach na serverze: vim /etc/keepalived/keepalived.conf vim /usr/libexec/keepalived/leadercheck.sh chmod u+x /usr/libexec/keepalived/leadercheck.sh standardowe rozwiązanie pgSQL+etcd+Patroni+HAProxy wykorzystuje do VIP-y keepalived i opiera go o działający proces haproxy natomiast moim zdaniem lepszym rozwiązaniem jest oprzeć go o inny mechanizm sprawdzający / o sam klaster patroni, co też zastosowane jest w GSNI ( skrypt leadercheck.sh ) 17. HAProxy rozwiązanie zakłada że: - połączenie do vip:5000 - łączy nas do lidera i daje prawo zapisu i odczytu - połączenie do vip:5001 - łączy nas do jednej z replik z prawem tylko do odczytu moja modyfikacja daje możliwość podłączenia do vip:5432 - łączy do lidera i daje prawo do odczytu i zapisu (różnice pomiędzy podłączeniem via 5000 a 5432 są w działaniu pghba.conf) vim /etc/haproxy/haproxy.conf [root@plpa2ps01srrm ~]# systemctl start patroni.service [root@plpa2ps01srrm ~]# patronictl list +---------------+----------------+--------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | + Cluster: PLPA2PS00SRRM (7016247082177975663) -----+----+-----------+ | plpa2ps01srrm | 158.98.154.129 | Leader | running | 2 | | +---------------+----------------+--------+---------+----+-----------+ [root@plpa2ps01srrm ~]# 18. Stworzenie / edycja / wyświetlanie konfiguracji w klastrze: defakto stworzony to on już jest, bo część z niego jest brana z pliku patroni.yml patronictl edit-config / patronictl show-config 19. Uruchomienie pozostałych nodów klastra: jak już odpowiednio wyedytujemy hosty dla replikacji danych to po odpaleniu na 2 nodzie patroni mamy efekt: [root@plpa2ps02srrm patroni]# patronictl list +---------------+----------------+---------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | + Cluster: PLPA2PS00SRRM (7016247082177975663) ------+----+-----------+ | plpa2ps01srrm | 158.98.154.129 | Leader | running | 3 | | | plpa2ps02srrm | 158.98.154.130 | Replica | running | 3 | 0 | +---------------+----------------+---------+---------+----+-----------+ [root@plpa2ps02srrm patroni]# i ostatni [root@plwa2ps03srrm patroni]# patronictl list +---------------+----------------+---------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | + Cluster: PLPA2PS00SRRM (7016247082177975663) ------+----+-----------+ | plpa2ps01srrm | 158.98.154.129 | Leader | running | 3 | | | plpa2ps02srrm | 158.98.154.130 | Replica | running | 3 | 16 | | plwa2ps03srrm | 158.98.154.131 | Replica | running | 3 | 0 | +---------------+----------------+---------+---------+----+-----------+ [root@plwa2ps03srrm patroni]# 20. Start usługi keepalived [root@plpa2ps01srrm ~]# systemctl start keepalived.service [root@plpa2ps01srrm ~]# systemctl status keepalived.service ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2021-10-11 13:02:39 CEST; 5s ago Process: 3677958 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 3677959 (keepalived) Tasks: 2 (limit: 102175) Memory: 4.4M CGroup: /system.slice/keepalived.service ├─3677959 /usr/sbin/keepalived -D └─3677960 /usr/sbin/keepalived -D Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: Registering Kernel netlink command channel Oct 11 13:02:39 plpa2ps01srrm systemd[1]: Started LVS and VRRP High Availability Monitor. Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: Opening file '/etc/keepalived/keepalived.conf> Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: Assigned address 158.98.154.129 for interface> Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: Registering gratuitous ARP shared channel Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: (VI_1) removing VIPs. Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: (VI_1) Entering BACKUP STATE (init) Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: VRRP sockpool: [ifindex( 2), family(IPv4), p> Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: VRRP_Script(haproxy_check) succeeded Oct 11 13:02:39 plpa2ps01srrm Keepalived_vrrp[3677960]: (VI_1) Changing effective priority from 100 t> [root@plpa2ps01srrm ~]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens192: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:50:56:8e:3a:3f brd ff:ff:ff:ff:ff:ff inet 158.98.154.129/24 brd 158.98.154.255 scope global noprefixroute ens192 valid_lft forever preferred_lft forever inet 158.98.154.122/32 scope global ens192 valid_lft forever preferred_lft forever [root@plpa2ps01srrm ~]# 21. start haproxy [root@plwa2ps03srrm ~]# systemctl enable haproxy.service && systemctl status haproxy Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service. ● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: inactive (dead) [root@plwa2ps03srrm ~]# systemctl start haproxy [root@plwa2ps03srrm ~]# systemctl status haproxy.service ● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2021-10-11 13:15:52 CEST; 54s ago Process: 3365621 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $OPTIONS (code=exited, status=0/SU> Main PID: 3365624 (haproxy) Tasks: 2 (limit: 102175) Memory: 14.4M CGroup: /system.slice/haproxy.service ├─3365624 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid └─3365627 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid Oct 11 13:15:52 plwa2ps03srrm systemd[1]: Starting HAProxy Load Balancer... Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy stats started. Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy stats started. Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy master started. Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy master started. Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy replicas started. Oct 11 13:15:52 plwa2ps03srrm haproxy[3365624]: Proxy replicas started. Oct 11 13:15:52 plwa2ps03srrm systemd[1]: Started HAProxy Load Balancer. [root@plwa2ps03srrm ~]#