From 4396237ac2ef8b98608169c974ac921482eeadca Mon Sep 17 00:00:00 2001 From: ilyamak04 Date: Sat, 26 Jul 2025 15:15:52 +0300 Subject: [PATCH] some refactoring --- docs/{Other => DB}/InfluxDB.md | 0 docs/{Other => DB}/MariaDB.md | 0 .../Разное.md => DB/Postgresql.md} | 104 ++++++++++++++++++ docs/{ansible => IaC}/Ansible.md | 0 docs/{git/Команды.md => Other/Git.md} | 0 .../Заметки.md => container/Docker.md} | 86 +++++++++++++++ docs/{Other => container}/k8s.md | 0 docs/docker/Команды.md | 92 ---------------- docs/linux/Команды.md | 2 +- docs/postgresql/Репликация.md | 104 ------------------ 10 files changed, 191 insertions(+), 197 deletions(-) rename docs/{Other => DB}/InfluxDB.md (100%) rename docs/{Other => DB}/MariaDB.md (100%) rename docs/{postgresql/Разное.md => DB/Postgresql.md} (79%) rename docs/{ansible => IaC}/Ansible.md (100%) rename docs/{git/Команды.md => Other/Git.md} (100%) rename docs/{docker/Заметки.md => container/Docker.md} (54%) rename docs/{Other => container}/k8s.md (100%) delete mode 100644 docs/docker/Команды.md delete mode 100644 docs/postgresql/Репликация.md diff --git a/docs/Other/InfluxDB.md b/docs/DB/InfluxDB.md similarity index 100% rename from docs/Other/InfluxDB.md rename to docs/DB/InfluxDB.md diff --git a/docs/Other/MariaDB.md b/docs/DB/MariaDB.md similarity index 100% rename from docs/Other/MariaDB.md rename to docs/DB/MariaDB.md diff --git a/docs/postgresql/Разное.md b/docs/DB/Postgresql.md similarity index 79% rename from docs/postgresql/Разное.md rename to docs/DB/Postgresql.md index f86ce5b..b1c3a02 100644 --- a/docs/postgresql/Разное.md +++ b/docs/DB/Postgresql.md @@ -453,3 +453,107 @@ fi - `SHOW shared_preload_libraries;` - список библиотек, которые были загружены при старте PostgreSQL с помощью параметра `shared_preload_libraries` в `postgresql.conf` - `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 ''; +``` +```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; +``` diff --git a/docs/ansible/Ansible.md b/docs/IaC/Ansible.md similarity index 100% rename from docs/ansible/Ansible.md rename to docs/IaC/Ansible.md diff --git a/docs/git/Команды.md b/docs/Other/Git.md similarity index 100% rename from docs/git/Команды.md rename to docs/Other/Git.md diff --git a/docs/docker/Заметки.md b/docs/container/Docker.md similarity index 54% rename from docs/docker/Заметки.md rename to docs/container/Docker.md index 4dead98..5d6a3d9 100644 --- a/docs/docker/Заметки.md +++ b/docs/container/Docker.md @@ -4,6 +4,92 @@ - [**Базовые команды 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 ` - история создания образа (`--no-trunc` - не обрезать вывод) +- `docker volume ls` - список всех Docker томов на хосте +- `docker volume inspect ` - информацию о конкретном docker томе, например, его местоположение, размер и настройки и тп +- `docker inspect | grep -i volumes` - ищет информацию о томах, которые примонтированы к контейнеру +- `docker port ` - показывает маппинг портов +- `docker inspect | grep -i port` - подробности о проброшенных портах +- `docker inspect | 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 diff --git a/docs/Other/k8s.md b/docs/container/k8s.md similarity index 100% rename from docs/Other/k8s.md rename to docs/container/k8s.md diff --git a/docs/docker/Команды.md b/docs/docker/Команды.md deleted file mode 100644 index 875207a..0000000 --- a/docs/docker/Команды.md +++ /dev/null @@ -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 ` - история создания образа (`--no-trunc` - не обрезать вывод) -- `docker volume ls` - список всех Docker томов на хосте -- `docker volume inspect ` - информацию о конкретном docker томе, например, его местоположение, размер и настройки и тп -- `docker inspect | grep -i volumes` - ищет информацию о томах, которые примонтированы к контейнеру -- `docker port ` - показывает маппинг портов -- `docker inspect | grep -i port` - подробности о проброшенных портах -- `docker inspect | 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 или системы, но не перезапустится, если его остановили вручную. - diff --git a/docs/linux/Команды.md b/docs/linux/Команды.md index 48e5ff4..644b279 100644 --- a/docs/linux/Команды.md +++ b/docs/linux/Команды.md @@ -529,7 +529,7 @@ resize2fs /dev/mapper/vg_local-root # или xfs_growfs - `grep -v '^ *#\|^ *$' /etc/squid/squid.conf` - вывести все незакомментированные строки - `grep -rI '150.241.66.94' /etc` - все вхождения в каталоге `/etc`, кроме бинарных - +- опция `--exclude-dir={sys,proc,dev}` - понятно ??? info "Флаги grep" Если не работает корректная регулярка, добавить один из этих флагов diff --git a/docs/postgresql/Репликация.md b/docs/postgresql/Репликация.md deleted file mode 100644 index 3d588fd..0000000 --- a/docs/postgresql/Репликация.md +++ /dev/null @@ -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 ''; -``` -```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; -```