: :

ПнВтСрЧтПтСбВс

2018-03-26 10:29:14 13578 0

Настройка Master-Slave репликации в PostgreSQL

Репликация — это метод обеспечения высокой доступности и отказоустойчивости БД путём копирования информации из базы данных на вторую систему. В данной статье мы рассмотрим настройку Master-Slave репликацию для СУБД Postgresql.

Настройка будет проводиться на двух серверах с операционной системой Ubuntu16.04. Имена серверов Master - postgres-node1(10.25.128.172), Slave postgres-node2(10.25.128.109).

Настройка Master-сервера

Устанавливаем Postgresql

Добавим репозиторий postgresql, создадим файл /etc/apt/sources.list.d/pgdg.list и пропишим в него репозиторий

deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main

Добавляем ключ

root@postgres-node1:~# wget --quiet -O - \ 
https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

Синхронизируем репозитории

root@postgres-node1:~# apt-get update

Ставим пакет postgresql-9.6

root@postgres-node1:~# apt-get install postgresql-9.6

Запускаем демона и добавляем в автозагрузку

root@postgres-node1:~# systemctl start postgresql
root@postgres-node1:~# systemctl enable postgresql

На файерволе необходимо разрешить соединения на порту 5432 (порт по-умолчанию для postgresql)

root@postgres-node1:~# iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

Настройка Postgresql

Правим основной конфигурационный файл /etc/postgresql/9.6/main/postgresql.conf

root@postgres-node1:~# vim /etc/postgresql/9.6/main/postgresql.conf 

#Указываем ip-адреса, на которых postgresql будет принимать запросы

listen_addresses = "*"

port = 5432

# Добавляет информациюЭ необходимую для запуска только 
#запросов на чтение на резервный сервер

wal_level = replica

#Использование локальной синхронизации

synchronous_commit = local

#Включение архивирования

archive_mode = on

#Команда для выполнения архива с указанием файла

archive_command = "cp %p /var/lib/postgresql/9.6/archive/%f"

#Число серверов, так как используем два то и ставим значение 2

max_wal_senders = 2 

#Сколько хранить сегментов. Нужно количество надо выбрать такое,
#чтобы резервный сервер успевал все забирать и обрабатывать.

wal_keep_segments = 12

# Указываем имя сервера для репликации, оно будет использоваться на Slave-сервере
#в файле recovery.conf в директиве "application_name"

synchronous_standby_names = "postgresnode1"


Создаем директорию для архивов и даем пользвателю postgres на нее права:

root@postgres-node1:~# mkdir -p /var/lib/postgresql/9.6/archive
root@postgres-node1:~# chmod 700 /var/lib/postgresql/9.6/archive/
root@postgres-node1:~# chown -R postgres:postgres /var/lib/postgresql/9.6/archive/

Редактируем файл pg_hba.conf, который отвечает за аутентификацию



# Локальное подключение для пользователя replica_user
host replication replica_user   127.0.0.1/32                    md5

# Master-сервер ip-адрес
host replication replica_user   10.25.128.172/32                   md5
#Slave-сервер ip-адрес
host replication replica_user   10.25.128.109/32                md5

replication - это не имя базы, а специальное служебное значение для postgresql

Перезапускаем демона postgresql

root@postgres-node1:~# systemctl restart postgresql

Создаем пользователя под именем которого будет работать репликация, заходим в консоль postgresql

root@postgres-node1:~# su postgres -c "psql"
postgres=# CREATE USER replica_user ENCRYPTED PASSWORD "1111" REPLICATION;
CREATE ROLE

Пароль нужно ставить надежный)

Настройка Slave-сервера

Так же устанавливаем демона postgresql по аналогии с Master хостом

Останавливаем демона postgresql

root@postgres-node2:~# systemctl stop postgresql

Удаляем директорию с данными postgresql, лучше на всякий случай ее сохранить где-нибудь

root@postgres-node2:~# rm -rf /var/lib/postgresql/9.6/main/

Логинимся пол пользователем postgres

root@postgres-node2:~# su postgres

И копируем данные с Master-сервера

postgres@postgres-node2:/root$ pg_basebackup -h 10.25.128.172 \ 
-U replica_user -D /var/lib/postgresql/9.6/main -P --xlog -p 5432
Password: 
38387/38387 kB (100%), 1/1 tablespace

Редактируем конфигурационный файл /etc/postgresql/9.6/main/postgresql.conf

root@postgres-node2:~# vim /etc/postgresql/9.6/main/postgresql.conf

#включаем hot_standby:

hot_standby = on

#Указываем ip-адреса, на которых демон будет ожидать подключения (все адреса)

listen_addresses = "*" 

Создаем recovery файл

vim /var/lib/postgresql/9.6/main/recovery.conf

standby_mode = "on"
primary_conninfo = "host=10.25.128.172 port=5432 user=replica_user password=1111 \
application_name=postgresnode1"
trigger_file = "/tmp/postgresql.trigger.5432"

Вписываем только свои значения где host - ip-адрес Master

Запускаем демона postgresql

root@postgres-node2:~# systemctl start postgresql

Проверяем работу репликации, создадим на Master сервере таблицу и сделаем в ней записи


postgres=# CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR, age VARCHAR);
CREATE TABLE

Добавим несколько пользователей

postgres=# INSERT INTO users (name,age) VALUES ("Petya", 20);
INSERT 0 1
postgres=# INSERT INTO users (name,age) VALUES ("Katya", 30);
INSERT 0 1

Теперь проверяем их наличие на Slave

postgres=# SELECT * FROM users;
 id | name  | age 
----+-------+-----
  1 | Petya | 20
  2 | Katya | 30
(2 rows)

Записи появились, теперь попробуем вставить новую запись на Slave, должны получить ошибку

postgres=# INSERT INTO users (name,age) VALUES ("Ivan", 10);
ERROR:  cannot execute INSERT in a read-only transaction

Репликация работает

В случаем падаения Master-сервера, Slave так и останется работать в режиме readonly.Если мы хотим сделать его Master-ом и разрешить запись на нем, необходимо создать файл который указан в директории "trigger_file" файл recovery.conf. Но в этом случае когда мы вернем в работу основной Master, прийдется в ручную перенести на него измененные записи и снова настраивать Slave для работы.






Введите ответ:

+

=