: | : |
‹ | › | |||||
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
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 для работы.
Введите ответ:
+
=