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-сервер работает
только в режиме для чтения. Это позволяет
содержать базу данных в целостном
состоянии.