воскресенье, 8 ноября 2015 г.

Master-Slave WAL-репликация PostgreSQL на Rhel/Centos 6.5


Master-сервер: 192.168.100.122
Hostname: server2.domain.com

Slave-сервер: 192.168.100.175
Hostname: server1.domain.com

Postgresql Version: 9.4.1
Linux version: CentOS 6.5

Шаг 1 (оба сервера). Скачивание и установка репозитория

#yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-2.noarch.rpm
После выполнения должен появиться файл /etc/yum.repos.d/pgdg-94-centos.repo с включенным репозиторием. Если он не появился по каким-то причинам, то выполнить следующее:

# vi /etc/yum.repos.d/centos.repo
add the following lines
[centos-6-base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled=1


Шаг 2 (оба сервера). Установка необходимых пакетов PostgreSQL.

Для начала можно попробовать установить пакет
# yum install postgresql94-server postgresql94-contrib

Если в процессе установки возникли ошибки связанные с публичными ключами, то их нужно исправить:

# cd /etc/pki/rpm-gpg# rpm --import RPM-GPG-KEY-CentOS-6
Затем можно приступить к установке минимального набора пакетов:
# yum install postgresql94 postgresql94-libs postgresql94-server

Следующее действие — инициализация базы банных.
# service postgresql-9.4 initdb
Включить при старте системы
# chkconfig postgresql-9.4 on

Шаг 3 (оба сервера). Запуск postgresql.

# service postgresql-9.4 start
Starting postgresql service: [ OK ]


Проверка состояния postgresql:
# service postgresql-9.4 status
postmaster (pid
ХХХХ) is running...

Шаг 4 (оба сервера). Подготовительные работы.

При установке PostgreSQL создает в системе пользователя "postgres" для того, чтобы можно было производить начальные операции с базами данных. Необходимо настроить доступ через ssh между серверами, чтобы упростить файловые операции.

Задать пароль пользователю postgres
# passwd postgres
Залогиниться в систему как пользователь postgres
# su - postgres

Сгенерировать ключи ssh для пользователя postgres (сделать на обоих серверах одинаково):

На master-server:
$ ssh-keygen -t rsa
$ ssh-keygen -t dsa
$ cd /var/lib/pgsql/.ssh
$ cat id_rsa.pub >>authorized_keys
$ cat id_dsa.pub >>authorized_keys


На slave-server:
$ ssh-keygen -t rsa
$ ssh-keygen -t dsa
$ cd /var/lib/pgsql/.ssh
$ cat id_rsa.pub >>authorized_keys
$ cat id_dsa.pub >>authorized_keys

Обмен ключами между серверами.
 
На master-server:
$ cd /var/lib/pgsql/.ssh
$ cp authorized_keys server2_authorized_keys
$ scp server2_authorized_keys postgres@server1:/var/lib/pgsql/.
ssh/.
$ rm -rf authorized_keys


На slave-server:
$ cd /var/lib/pgsql/.ssh
$ cat server2_authorized_keys >>authorized_keys
$ scp authorized_keys postgres@server2:/var/lib/pgsql/.
ssh/.

Теперь можно протестировать соединение между серверами выполнив простую команду с отдалённой стороны.
 
С master-сервера на slave-сервере
$ ssh server1 date

Со slave-сервера на master-сервере
$ ssh server2 date


Шаг 5. Настройка master-сервера

# su - postgres

Создание специального пользователя rep от имени которого будет проводиться репликация данных.
$ psql -c "CREATE USER rep REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'redhat';"

Нужно настроить
доступ к базе данных с других серверов, а также дать этому специальному пользователю доступ со slave-сервера к СУБД.

$ cd /var/lib/pgsql/9.4/data
$ vi pg_hba.conf
host replication rep 192.168.100.175/32 md5
:wq

Далее нужно отредактировать главный файл конфигурации:

$ vi postgresql.conf

Найдите указанные параметры, раскомментируйте, если нужно.

listen_addresses = 'localhost,192.168.100.122'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on

Сохранить и закрыть.

Перезапустите master-сервер, чтобы применить изменения в конфигурации.
# service postgresql-9.4 restart

Шаг 6. Настройка Slave-сервера.

Перед началом необходимо погасить базу данных на slave-сервере.

# service postgresql-9.4 stop

Далее нужно удалить файлы базы данных и импортировать данные с master-сервера. Предпочтительно не удалять каталог с данными, но, если позволяет место на диске, переименовать существующий /var/lib/pgsql/9.4/data.

$ cd /var/lib/pgsql/9.4/data
$ rm -rf *
$ pg_basebackup -D /var/lib/pgsql/9.4/data -h 192.168.100.122 -U rep


Через какое-то время должно быть сообщение об успешном завершении
NOTICE: pg_stop_backup complete, all required WAL segments have been archived

Теперь необходимо внести изменения в файлы конфигурации на slave-сервере:

$ cd /var/lib/pgsql/9.4/data

Нужно настроить доступ к базе данных с других серверов, а также с master-сервера на slave-сервер для репликации, при смене ролей. Для смены ролей в файл pg_hba.conf (но не в конец файла) добавить строки описывающие доступ.

$ vi pg_hba.conf
host replication rep 192.168.100.122/32 md5
:
wq

Далее внести изменения в главный файл конфигурации на slave-сервере.

$ vi postgresql.conf

Так как на slave-сервер скопирован файл конфигурации с master-сервера, то изменения нужно внести только в IP-адреса, к которым будет привязан сервис.

listen_addresses = 'localhost,192.168.100.175'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on
:
wq

Создание файла для восстановления recovery.conf на slave-сервере.

$ cd /var/lib/pgsql/9.4/data
$ vi recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=192.168.100.122 port=5432 user=rep password=redhat'
trigger_file = '/tmp/postgresql.trigger.5432'
:
wq

Теперь можно запустить PostgreSQL на slave-сервере.
# server postgresql-9.4 start

Тестирование репликации

На master-сервере:
$ su - postgres
$psql
#CREATE TABLE rep_test (test varchar(40));
INSERT INTO rep_test VALUES ('data one');
INSERT INTO rep_test VALUES ('some more words');
INSERT INTO rep_test VALUES ('lalala');
INSERT INTO rep_test VALUES ('hello there');
INSERT INTO rep_test VALUES ('blahblah');
\q


На slave-сервере можно произвести проверку наличия таблицы созданной на master-сервере
$ su - postgres
$psql
#SELECT * FROM rep_test;

      test    
-----------------
 data one
 some more words
 lalala
 hello there
 blahblah
(5 rows)


Теперь можно попробовать сделать вставку данных в таблицу на slave-сервере :
 
#INSERT INTO rep_test VALUES ('oops');
ERROR:  cannot execute INSERT in a read-only transaction

Ошибка связана с тем, что slave-сервер работает только в режиме для чтения. Это позволяет содержать базу данных в целостном состоянии.

Комментариев нет:

Отправить комментарий