пятница, 15 июля 2016 г.

Потоковая репликация в Postgresql

Все изменения в master будут немедленно отражены на standby.
 
   ----------------              -------------------------
  |   Master       |            | Standby (Только чтение) |
  | 192.168.56.101 |----------->|    192.168.56.102       |
   ----------------    данные   -------------------------
Настройки на Master
  1. Измените /var/lib/pgsql/9.3/data/postgresql.conf
2.  wal_level = hot_standby  
3.  max_wal_senders = 2          // Maximum number of standby DB can support
wal_keep_segments = 5000     // Write ahead log segment size; maximum disk space for pg_xlog/ is 16MB x 5000 = 80GB
  1. Измените /var/lib/pgsql/9.3/data/pg_hba.conf
    Дайте права relication user на соединение с master (IP = 192.168.56.102) to connect to the master.
host    replication    replication     192.168.56.102/32    md5
  1. Создайте пользователя replication
6.  $ su postgres
7.  $ psql -d postgres -c "create user replication superuser password'12345';"
8.  $ exit
9.  $ /etc/init.d/postgresql-9.3 restart

  1. Сделайте бэкап
11.$ su postgres
12.$ psql -d postgres -c "SELECT pg_start_backup('/var/lib/pgsql/9.3/data');"
13.$ rsync -av --exclude pg_xlog --exclude data/*.conf /var/lib/pgsql/9.3/ root@192.168.56.102:/var/lib/pgsql/9.3/
14.$ psql -d postgres -c "SELECT pg_stop_backup();"
  1. Откройте порт 5432 в найтройках фаерволла. Добавьте следующее правило в /etc/sysconfig/iptables (перед строкой с COMMIT).
16.-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
  1. Перезапустите iptables.
$ /etc/init.d/iptables restart
Настройки Standby
  1. Измените /var/lib/pgsql/9.3/data/postgresql.conf
2.  port = 5432
3.  hot_standby = on
  1. Создайте файл с настройками восстановления /var/lib/pgsql/9.3/data/recovery.conf
5.  standby_mode = 'on'
6.  primary_conninfo = 'host=192.168.56.101 port=5432 user=replication password=12345'
7.  trigger_file = '/var/lib/pgsql/9.3/data/trigger_activestand'
  1. Перезапустите postgresql
9.  $ service postresql-9.3 restart
  1. Откройте порт 5432. В /etc/sysconfig/iptables добавьте.
11.-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
  1. Перезапустите iptables.
$ /etc/init.d/iptables restart
Различные действия
На master
  1. Подключение к бд
2.  $ su postgres
3.  $ psql
  1. Создайте  sample с данными
5.   postgres=# CREATE DATABASE sample;
6.   postgres=# \c sample
7.   sample=# CREATE table samples (
8.    id integer  PRIMARY KEY,
9.    name varchar(25),
10.  stuff text);
11.sample=# INSERT into samples values (1, 'foo', 'тест');
12.sample=# INSERT into samples values (2, 'bar', 'тест' );
13.sample=# INSERT into samples values (4, 'bin', 'тест' );
14.sample=# INSERT into samples values (3, 'baz', 'тест' );

На standby
  1. Подключитесь к базе данных
2.  $ su postgres
3.  $ psql
  1. Проверьте, существуют ли данные
5.   postgres=# \c sample
6.   sample=# select * from samples;
7.    id | name |    stuff
8.   ----+------+-------------
9.     1 | foo  | тест
10.   2 | bar  | тест
11.   3 | baz  | тест
   4 | bin  | тест
  1. Убедитесь, что база данных на standby в режиме только для чтения
13.postgres=# \c sample
14.sample=# INSERT into samples values (6, 'тест', 'тест');
ERROR:  cannot execute INSERT in a read-only transaction
Если Master падает, его место занимает standby
Остановите сервер на master
$ service postgresql-9.3 stop
На standby переключите базу данных в режим master
  1. Edit /var/lib/pgsql/9.3/data/postgresql.conf
2.  #hot_standby = off
  1. Переименуйте /var/lib/pgsql/9.3/data/recovery.conf в /var/lib/pgsql/9.3/data/_recovery.conf
4.  $ mv /var/lib/pgsql/9.3/data/recovery.conf /var/lib/pgsql/9.3/data/_recovery.conf
  1. Перезапустите сервер
$ service postgresql-9.3 restart

Взято отсюда.