some refactoring
Some checks failed
Build MkDocs / build-and-deploy (push) Failing after 0s

This commit is contained in:
Илья Макаров 2025-07-26 15:15:52 +03:00
parent f7dd86f1d3
commit 4396237ac2
10 changed files with 191 additions and 197 deletions

View File

@ -453,3 +453,107 @@ fi
- `SHOW shared_preload_libraries;` - список библиотек, которые были загружены при старте PostgreSQL с помощью параметра `shared_preload_libraries` в `postgresql.conf` - `SHOW shared_preload_libraries;` - список библиотек, которые были загружены при старте PostgreSQL с помощью параметра `shared_preload_libraries` в `postgresql.conf`
- `pg_config --pkglibdir` - показывает путь к каталогу, где находятся библиотеки пг (shared libraries). - `pg_config --pkglibdir` - показывает путь к каталогу, где находятся библиотеки пг (shared libraries).
### Настройка репликации Master-Slave
- `apt install postgresql postgresql-contrib -y` - устанавливаем СУБД на обе машины
- `systemctl status postgresql`
#### Настройка Master
```conf
# /etc/postgresql/16/main/postgresql.conf
listen_addresses = 'localhost,150.241.66.94' # 150.241.66.94 адрес ВМ, на которой slave
wal_level = replica # минимальный уровень необходимый для репликации
max_wal_senders = 5 # максимальное количество подключений для передачи WAL, максимум 5 слейвов
wal_keep_size = 1024MB
hot_standby = on # разрешаем селекты с реплики, по умолчанию нельзя
archive_mode = on # включаем архивирование WAL
archive_command = 'find /var/lib/postgresql/16/main/archive -type f -mtime +7 -delete; gzip < %p > /var/lib/postgresql/16/main/archive/%f.gz'
```
```
# /etc/postgresql/16/main/pg_hba.conf
# файл pg_hba.conf (Host-Based Authentication) управляет доступом к PostgreSQL, определяя, какие пользователи могут подключаться
# c каких IP-адресов и каким способом аутентификации
host replication replicator 192.168.1.2/32 scram-sha-256
```
Создадим роль для репликации, выполнить:
```bash
sudo -u postgres psql
```
```sql
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '<password>';
```
```sql
\q
```
Открыть «MASTER» базу данных, выполнить скрипт на обновление информации о настройках доступа из файла `pg_hba.conf`:
SELECT pg_reload_conf();
??? info "Сжатый WAL"
PostgreSQL не умеет автоматически разархивировать сжатые WAL-файлы.
Если WAL-логи в сжатом формате (.gz), то перед восстановлением их нужно разархивировать вручную в `restore_command`.
Если archive_command на master сжимает WAL при архивации, например:
archive_command = 'gzip < %p > /var/lib/postgresql/archive/%f.gz'
То restore_command на slave должен разархивировать WAL перед восстановлением:
restore_command = 'gunzip -c /var/lib/postgresql/archive/%f.gz > %p'
Как это работает?
restore_command ищет запрашиваемый WAL-файл в архиве.
Если он найден в сжатом виде (.gz), команда gunzip -c разархивирует его в нужное место (%p).
slave применяет этот WAL-файл и продолжает репликацию.
#### Настройка Slave
По умолчанию реплику (slave) нельзя записывать данные, потому что она работает в режиме только для чтения (read-only), на то она и слейв реплика.
```bash
sudo systemctl stop postgresql
```
```bash
sudo -u postgres rm -rf /var/lib/postgresql/16/main/*
```
```bash
sudo -u postgres pg_basebackup -h 192.109.139.92 -U replicator -D /var/lib/postgresql/16/main -P -R --wal-method=stream` # 192.109.139.92 - ip мастера
```
Если файл standby.signal присутствует в директории данных ($PGDATA) при запуске PostgreSQL, сервер не будет принимать записи и будет получать данные с Master.
Он создаётся автоматически при запуске pg_basebackup с флагом -R или вручную.
Если удалить standby.signal и перезапустить PostgreSQL, сервер станет обычным Master (потеряет связь с репликой).
После выполнения pg_basebackup в `/var/lib/postgresql/16/main/` на Slave должен появиться файл standby.signal. Он сообщает PostgreSQL, что сервер работает как Standby (slave).
```bash
sudo systemctl start postgresql
```
```bash
sudo systemctl status postgresql
```
```sql
# проверить репликацию на мастере
SELECT * FROM pg_stat_replication;
```
```sql
# проверить репликацию на слейве
SELECT * FROM pg_stat_wal_receiver;
```
На slave после окончания загрузки бд и запуска postgres проверить наличие файла `/var/lib/pgsql/16/data/standby.signal`, а также наличие строки подключения к серверу master в файле `/var/lib/pgsql/16/data/postgresql.auto.conf`
Открыть master базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «state» должно быть значение «streaming»)
```sql
select * from pg_stat_replication;
```
Открыть slave базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «status» должно быть значение «streaming»)
```sql
select * from pg_stat_wal_receiver;
```

View File

@ -4,6 +4,92 @@
- [**Базовые команды docker-compose**](https://github.com/python-dev-blog/docker-compose-demo) - [**Базовые команды docker-compose**](https://github.com/python-dev-blog/docker-compose-demo)
- [**Линтер для Docker**](https://github.com/hadolint/hadolint) - [**Линтер для Docker**](https://github.com/hadolint/hadolint)
### Команды
- **`docker ps --format "{{.Names}}"`** - только имена контейнеров
- `docker ps -s` - показать размеры контейнеров (`-l` - последний запущенный контейнер)
- `docker history <image_name>` - история создания образа (`--no-trunc` - не обрезать вывод)
- `docker volume ls` - список всех Docker томов на хосте
- `docker volume inspect <volume_name>` - информацию о конкретном docker томе, например, его местоположение, размер и настройки и тп
- `docker inspect <container_name> | grep -i volumes` - ищет информацию о томах, которые примонтированы к контейнеру
- `docker port <container_name>` - показывает маппинг портов
- `docker inspect <container_name> | grep -i port` - подробности о проброшенных портах
- `docker inspect <container_name> | grep -i mount` - показывает информацию о монтированиях (volumes, bind mounts, tmpfs)
??? tip "Монтирования в Docker"
1. Named Volume - создаётся и управляется Docker. Хранится в `/var/lib/docker/volumes/`
```yaml
services:
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
```
2. Anonymous Volume - создаётся и управляется Docker. Хранится в `/var/lib/docker/volumes/`, но вместо имени хэш, например, `/var/lib/docker/volumes/2f4b7c3e8e1a7d9b8b12d34c7e4b1234/`
```yaml
services:
app:
image: nginx
volumes:
- /usr/share/nginx/html
3. Bind Mount - привязка к директории или файлу на хосте. Если мы прокидываем файл и его не существует Docker создаст каталог.
```yaml
services:
web:
image: nginx
volumes:
- ./html:/usr/share/nginx/html:ro
```
`:ro` - контейнеру том доступен только для чтения, по умолчанию доступен и на запись (`:rw`)
4. Tmpfs Mount - данные хранятся в оперативке (RAM), а не на диске, при перезапуске, удалении контейнера данные будут потеряны.
```yaml
services:
cache:
image: redis
tmpfs:
- /tmp
```
5. External Volume - внешний том, например, NFS.
```yaml
services:
app:
image: nginx
volumes:
- nfs_data:/usr/share/nginx/html
volumes:
nfs_data:
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.100,rw
device: :/exported/path
```
- `docker stats` - статистика по запущенным контейнерам
- CONTAINER ID - Уникальный идентификатор контейнера.
- NAME - Имя контейнера.
- CPU % - Использование CPU в процентах.
- MEM USAGE / LIMIT - Использование памяти / установленный лимит.
- MEM % - Доля использования памяти от лимита.
- NET I/O - Сетевой ввод/вывод данных.
- BLOCK I/O - Объем операций ввода/вывода на диске.
- PIDS - Количество процессов внутри контейнера.
- `docker info` - инфа о докер (docker info --format '{{json .}}' - в json)
- Параметры для `restart`
- `no` (или не указывать restart вовсе) — контейнер не будет перезапускаться автоматически. Это значение по умолчанию
- `always` — контейнер будет автоматически перезапущен при любом завершении работы (даже при ручной остановке через docker stop). Он также перезапустится после перезагрузки Docker или хоста
- `on-failure` — контейнер будет перезапущен только в случае выхода с ненулевым статусом (ошибкой). Вы можете также указать максимальное количество перезапусков, например,`on-failure:3`
- `unless-stopped` — контейнер будет автоматически перезапущен при сбоях и после перезагрузки Docker или системы, но не перезапустится, если его остановили вручную.
### Разное ### Разное
#### ARG #### ARG

View File

@ -1,92 +0,0 @@
### Полезные источники
- [**Базовые команды Docker**](https://github.com/python-dev-blog/docker-demo)
- [**Базовые команды docker-compose**](https://github.com/python-dev-blog/docker-compose-demo)
- [**Линтер для Docker**](https://github.com/hadolint/hadolint)
### Команды
- **`docker ps --format "{{.Names}}"`** - только имена контейнеров
- `docker ps -s` - показать размеры контейнеров (`-l` - последний запущенный контейнер)
- `docker history <image_name>` - история создания образа (`--no-trunc` - не обрезать вывод)
- `docker volume ls` - список всех Docker томов на хосте
- `docker volume inspect <volume_name>` - информацию о конкретном docker томе, например, его местоположение, размер и настройки и тп
- `docker inspect <container_name> | grep -i volumes` - ищет информацию о томах, которые примонтированы к контейнеру
- `docker port <container_name>` - показывает маппинг портов
- `docker inspect <container_name> | grep -i port` - подробности о проброшенных портах
- `docker inspect <container_name> | grep -i mount` - показывает информацию о монтированиях (volumes, bind mounts, tmpfs)
??? tip "Монтирования в Docker"
1. Named Volume - создаётся и управляется Docker. Хранится в `/var/lib/docker/volumes/`
```yaml
services:
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
```
2. Anonymous Volume - создаётся и управляется Docker. Хранится в `/var/lib/docker/volumes/`, но вместо имени хэш, например, `/var/lib/docker/volumes/2f4b7c3e8e1a7d9b8b12d34c7e4b1234/`
```yaml
services:
app:
image: nginx
volumes:
- /usr/share/nginx/html
3. Bind Mount - привязка к директории или файлу на хосте. Если мы прокидываем файл и его не существует Docker создаст каталог.
```yaml
services:
web:
image: nginx
volumes:
- ./html:/usr/share/nginx/html:ro
```
`:ro` - контейнеру том доступен только для чтения, по умолчанию доступен и на запись (`:rw`)
4. Tmpfs Mount - данные хранятся в оперативке (RAM), а не на диске, при перезапуске, удалении контейнера данные будут потеряны.
```yaml
services:
cache:
image: redis
tmpfs:
- /tmp
```
5. External Volume - внешний том, например, NFS.
```yaml
services:
app:
image: nginx
volumes:
- nfs_data:/usr/share/nginx/html
volumes:
nfs_data:
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.100,rw
device: :/exported/path
```
- `docker stats` - статистика по запущенным контейнерам
- CONTAINER ID - Уникальный идентификатор контейнера.
- NAME - Имя контейнера.
- CPU % - Использование CPU в процентах.
- MEM USAGE / LIMIT - Использование памяти / установленный лимит.
- MEM % - Доля использования памяти от лимита.
- NET I/O - Сетевой ввод/вывод данных.
- BLOCK I/O - Объем операций ввода/вывода на диске.
- PIDS - Количество процессов внутри контейнера.
- `docker info` - инфа о докер (docker info --format '{{json .}}' - в json)
- Параметры для `restart`
- `no` (или не указывать restart вовсе) — контейнер не будет перезапускаться автоматически. Это значение по умолчанию
- `always` — контейнер будет автоматически перезапущен при любом завершении работы (даже при ручной остановке через docker stop). Он также перезапустится после перезагрузки Docker или хоста
- `on-failure` — контейнер будет перезапущен только в случае выхода с ненулевым статусом (ошибкой). Вы можете также указать максимальное количество перезапусков, например,`on-failure:3`
- `unless-stopped` — контейнер будет автоматически перезапущен при сбоях и после перезагрузки Docker или системы, но не перезапустится, если его остановили вручную.

View File

@ -529,7 +529,7 @@ resize2fs /dev/mapper/vg_local-root # или xfs_growfs
- `grep -v '^ *#\|^ *$' /etc/squid/squid.conf` - вывести все незакомментированные строки - `grep -v '^ *#\|^ *$' /etc/squid/squid.conf` - вывести все незакомментированные строки
- `grep -rI '150.241.66.94' /etc` - все вхождения в каталоге `/etc`, кроме бинарных - `grep -rI '150.241.66.94' /etc` - все вхождения в каталоге `/etc`, кроме бинарных
- опция `--exclude-dir={sys,proc,dev}` - понятно
??? info "Флаги grep" ??? info "Флаги grep"
Если не работает корректная регулярка, добавить один из этих флагов Если не работает корректная регулярка, добавить один из этих флагов

View File

@ -1,104 +0,0 @@
## Настройка репликации Master-Slave
- `apt install postgresql postgresql-contrib -y` - устанавливаем СУБД на обе машины
- `systemctl status postgresql`
### Настройка Master
```conf
# /etc/postgresql/16/main/postgresql.conf
listen_addresses = 'localhost,150.241.66.94' # 150.241.66.94 адрес ВМ, на которой slave
wal_level = replica # минимальный уровень необходимый для репликации
max_wal_senders = 5 # максимальное количество подключений для передачи WAL, максимум 5 слейвов
wal_keep_size = 1024MB
hot_standby = on # разрешаем селекты с реплики, по умолчанию нельзя
archive_mode = on # включаем архивирование WAL
archive_command = 'find /var/lib/postgresql/16/main/archive -type f -mtime +7 -delete; gzip < %p > /var/lib/postgresql/16/main/archive/%f.gz'
```
```
# /etc/postgresql/16/main/pg_hba.conf
# файл pg_hba.conf (Host-Based Authentication) управляет доступом к PostgreSQL, определяя, какие пользователи могут подключаться
# c каких IP-адресов и каким способом аутентификации
host replication replicator 192.168.1.2/32 scram-sha-256
```
Создадим роль для репликации, выполнить:
```bash
sudo -u postgres psql
```
```sql
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '<password>';
```
```sql
\q
```
Открыть «MASTER» базу данных, выполнить скрипт на обновление информации о настройках доступа из файла `pg_hba.conf`:
SELECT pg_reload_conf();
??? info "Сжатый WAL"
PostgreSQL не умеет автоматически разархивировать сжатые WAL-файлы.
Если WAL-логи в сжатом формате (.gz), то перед восстановлением их нужно разархивировать вручную в `restore_command`.
Если archive_command на master сжимает WAL при архивации, например:
archive_command = 'gzip < %p > /var/lib/postgresql/archive/%f.gz'
То restore_command на slave должен разархивировать WAL перед восстановлением:
restore_command = 'gunzip -c /var/lib/postgresql/archive/%f.gz > %p'
Как это работает?
restore_command ищет запрашиваемый WAL-файл в архиве.
Если он найден в сжатом виде (.gz), команда gunzip -c разархивирует его в нужное место (%p).
slave применяет этот WAL-файл и продолжает репликацию.
### Настройка Slave
По умолчанию реплику (slave) нельзя записывать данные, потому что она работает в режиме только для чтения (read-only), на то она и слейв реплика.
```bash
sudo systemctl stop postgresql
```
```bash
sudo -u postgres rm -rf /var/lib/postgresql/16/main/*
```
```bash
sudo -u postgres pg_basebackup -h 192.109.139.92 -U replicator -D /var/lib/postgresql/16/main -P -R --wal-method=stream` # 192.109.139.92 - ip мастера
```
Если файл standby.signal присутствует в директории данных ($PGDATA) при запуске PostgreSQL, сервер не будет принимать записи и будет получать данные с Master.
Он создаётся автоматически при запуске pg_basebackup с флагом -R или вручную.
Если удалить standby.signal и перезапустить PostgreSQL, сервер станет обычным Master (потеряет связь с репликой).
После выполнения pg_basebackup в `/var/lib/postgresql/16/main/` на Slave должен появиться файл standby.signal. Он сообщает PostgreSQL, что сервер работает как Standby (slave).
```bash
sudo systemctl start postgresql
```
```bash
sudo systemctl status postgresql
```
```sql
# проверить репликацию на мастере
SELECT * FROM pg_stat_replication;
```
```sql
# проверить репликацию на слейве
SELECT * FROM pg_stat_wal_receiver;
```
На slave после окончания загрузки бд и запуска postgres проверить наличие файла `/var/lib/pgsql/16/data/standby.signal`, а также наличие строки подключения к серверу master в файле `/var/lib/pgsql/16/data/postgresql.auto.conf`
Открыть master базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «state» должно быть значение «streaming»)
```sql
select * from pg_stat_replication;
```
Открыть slave базу данных, выполнить скрипт на проверку состояния репликации (скрипт должен вернуть строку, в поле «status» должно быть значение «streaming»)
```sql
select * from pg_stat_wal_receiver;
```