Oracle Linux/PostgreSQL
From r00tedvw.com wiki
(Difference between revisions)
(Created page with "=Master/Slave Replication= A simple example of master/slave replication on PostgreSQL.") |
|||
| Line 1: | Line 1: | ||
=Master/Slave Replication= | =Master/Slave Replication= | ||
A simple example of master/slave replication on PostgreSQL. | A simple example of master/slave replication on PostgreSQL. | ||
| + | <br>Done on CentOS7 | ||
| + | ==Master configuration== | ||
| + | ===Installation=== | ||
| + | Install PostgreSQL | ||
| + | <nowiki>~$ sudo yum install -y postgresql-server net-tools vim</nowiki> | ||
| + | Setup the initial database | ||
| + | <nowiki>~$ sudo /usr/bin/postgresql-setup initdb | ||
| + | Initializing database ... OK</nowiki> | ||
| + | Start PostgreSQL | ||
| + | <nowiki>~$ sudo systemctl start postgresql | ||
| + | ~$ sudo systemctl enable postgresql</nowiki> | ||
| + | Set postgresql password | ||
| + | <nowiki>~$ sudo su - postgres | ||
| + | bash$ psql | ||
| + | postgres=# \password postgres | ||
| + | Enter new password: | ||
| + | Enter it again: | ||
| + | postgres=# \q</nowiki> | ||
| + | ===Configuration=== | ||
| + | Setup firewalld | ||
| + | <nowiki>~$ sudo firewall-cmd --add-service=postgresql --permanent | ||
| + | ~$ sudo firewall-cmd --reload</nowiki> | ||
| + | Configure <code>postgresql.conf</code> | ||
| + | <nowiki> ~$ sudo mkdir -p /var/lib/pgsql/archive && sudo chmod 700 /var/lib/pgsql/archive && sudo chown -R postgres:postgres /var/lib/pgsql/archive | ||
| + | ~$ sudo vim /var/lib/pgsql/data/postgresql.conf | ||
| + | listen_addresses = '*' | ||
| + | wal_level = hot_standby | ||
| + | synchronous_commit = local | ||
| + | archive_mode = on | ||
| + | archive_command = 'cp %p /var/lib/pgsql/archive/%f' | ||
| + | max_wal_senders = 2 | ||
| + | wal_keep_segments = 10 | ||
| + | synchronous_standby_names = 'pgslave01'</nowiki> | ||
| + | Configure <code>pg_hba.conf</code> (add to the end) | ||
| + | <nowiki>~$ sudo vim /var/lib/pgsql/data/pg_hba.conf | ||
| + | #Localhost | ||
| + | host replication replica 127.0.0.1/32 md5 | ||
| + | #Master | ||
| + | host replication replica 10.10.0.40/32 md5 | ||
| + | #Slave | ||
| + | host replication replica 10.10.0.41/32 md5</nowiki> | ||
| + | Restart postgres and create replication user. | ||
| + | <nowiki>~$ sudo systemctl restart postgresql | ||
| + | ~$ sudo su - postgres | ||
| + | bash$ createuser --replication -P replica | ||
| + | Enter password for new role: | ||
| + | Enter it again:</nowiki> | ||
| + | |||
| + | ==Slave Configuration== | ||
| + | ===Installation=== | ||
| + | Install PostgreSQL | ||
| + | <nowiki>~$ sudo yum install -y postgresql-server net-tools vim</nowiki> | ||
| + | ===Configuration=== | ||
| + | Setup firewalld | ||
| + | <nowiki>~$ sudo firewall-cmd --add-service=postgresql --permanent | ||
| + | ~$ sudo firewall-cmd --reload</nowiki> | ||
| + | Stop PostgreSQL | ||
| + | <nowiki>~$ sudo systemctl stop postgresql</nowiki> | ||
| + | Copy data from Master | ||
| + | <nowiki>~$ sudo su - postgres | ||
| + | bash$ pg_basebackup -h 10.10.0.40 -U replica -D /var/lib/pgsql/data -P --xlog</nowiki> | ||
| + | Configure <code>postgresql.conf</code> | ||
| + | <nowiki>~$ sudo vim /var/lib/pgsql/data/postgresql.conf | ||
| + | listen_addresses = '*' | ||
| + | hot_standby = on</nowiki> | ||
| + | Configure <code>recovery.conf</code> | ||
| + | <nowiki>~$ sudo touch /var/lib/pgsql/data/recovery.conf | ||
| + | ~$ sudo chmod 600 /var/lib/pgsql/data/recovery.conf && sudo chown postgres:postgres /var/lib/pgsql/data/recovery.conf | ||
| + | ~$ sudo vim /var/lib/pgsql/data/recovery.conf | ||
| + | standby_mode = 'on' | ||
| + | primary_conninfo = 'host=10.10.0.40 port=5432 user=replica password=Password application_name=pgslave01' | ||
| + | trigger_file = '/tmp/postgresql.trigger.5432'</nowiki> | ||
| + | Start PostgreSQL | ||
| + | <nowiki>~$ sudo systemctl start postgresql</nowiki> | ||
| + | |||
| + | ==Testing== | ||
| + | ===netstat=== | ||
| + | Use <code>netstat</code> to look for the proper listening ports on both the master and slave. | ||
| + | <nowiki>~$ sudo netstat -plntu | ||
| + | Active Internet connections (only servers) | ||
| + | Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name | ||
| + | tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1684/postgres</nowiki> | ||
| + | |||
| + | ===db query=== | ||
| + | From the '''Master''': | ||
| + | <nowiki>~$ sudo su - postgres | ||
| + | bash$ psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;" | ||
| + | application_name | state | sync_priority | sync_state | ||
| + | -------------------+-----------+---------------+------------ | ||
| + | pgslavel01 | streaming | 1 | sync | ||
| + | (1 row)</nowiki> | ||
| + | <nowiki>bash$ psql -x -c "select * from pg_stat_replication;" | ||
| + | -[ RECORD 1 ]----+------------------------------ | ||
| + | pid | 1810 | ||
| + | usesysid | 16384 | ||
| + | usename | replica | ||
| + | application_name | pgslave01 | ||
| + | client_addr | 10.10.0.41 | ||
| + | client_hostname | | ||
| + | client_port | 59828 | ||
| + | backend_start | 2020-02-18 12:36:53.638717-05 | ||
| + | state | streaming | ||
| + | sent_location | 0/30145C8 | ||
| + | write_location | 0/30145C8 | ||
| + | flush_location | 0/30145C8 | ||
| + | replay_location | 0/30145C8 | ||
| + | sync_priority | 1 | ||
| + | sync_state | sync</nowiki> | ||
| + | |||
| + | ===db data replication=== | ||
| + | Test data replication from the master to slave. <br> | ||
| + | From the '''Master''': | ||
| + | <nowiki>~$ sudo su - postgres | ||
| + | bash$ psql | ||
| + | postgres=# CREATE TABLE test_table (test varchar(100)); | ||
| + | postgres=# INSERT INTO test_table VALUES ('This is VPSCheap.net');</nowiki> | ||
| + | From the '''Slave''': | ||
| + | <nowiki>~$ sudo su - postgres | ||
| + | bash$ psql -c "SELECT * FROM test_table;" | ||
| + | test | ||
| + | ---------------------- | ||
| + | This is VPSCheap.net | ||
| + | (1 row)</nowiki> | ||
Revision as of 17:05, 18 February 2020
Contents |
Master/Slave Replication
A simple example of master/slave replication on PostgreSQL.
Done on CentOS7
Master configuration
Installation
Install PostgreSQL
~$ sudo yum install -y postgresql-server net-tools vim
Setup the initial database
~$ sudo /usr/bin/postgresql-setup initdb Initializing database ... OK
Start PostgreSQL
~$ sudo systemctl start postgresql ~$ sudo systemctl enable postgresql
Set postgresql password
~$ sudo su - postgres bash$ psql postgres=# \password postgres Enter new password: Enter it again: postgres=# \q
Configuration
Setup firewalld
~$ sudo firewall-cmd --add-service=postgresql --permanent ~$ sudo firewall-cmd --reload
Configure postgresql.conf
~$ sudo mkdir -p /var/lib/pgsql/archive && sudo chmod 700 /var/lib/pgsql/archive && sudo chown -R postgres:postgres /var/lib/pgsql/archive ~$ sudo vim /var/lib/pgsql/data/postgresql.conf listen_addresses = '*' wal_level = hot_standby synchronous_commit = local archive_mode = on archive_command = 'cp %p /var/lib/pgsql/archive/%f' max_wal_senders = 2 wal_keep_segments = 10 synchronous_standby_names = 'pgslave01'
Configure pg_hba.conf (add to the end)
~$ sudo vim /var/lib/pgsql/data/pg_hba.conf #Localhost host replication replica 127.0.0.1/32 md5 #Master host replication replica 10.10.0.40/32 md5 #Slave host replication replica 10.10.0.41/32 md5
Restart postgres and create replication user.
~$ sudo systemctl restart postgresql ~$ sudo su - postgres bash$ createuser --replication -P replica Enter password for new role: Enter it again:
Slave Configuration
Installation
Install PostgreSQL
~$ sudo yum install -y postgresql-server net-tools vim
Configuration
Setup firewalld
~$ sudo firewall-cmd --add-service=postgresql --permanent ~$ sudo firewall-cmd --reload
Stop PostgreSQL
~$ sudo systemctl stop postgresql
Copy data from Master
~$ sudo su - postgres bash$ pg_basebackup -h 10.10.0.40 -U replica -D /var/lib/pgsql/data -P --xlog
Configure postgresql.conf
~$ sudo vim /var/lib/pgsql/data/postgresql.conf listen_addresses = '*' hot_standby = on
Configure recovery.conf
~$ sudo touch /var/lib/pgsql/data/recovery.conf ~$ sudo chmod 600 /var/lib/pgsql/data/recovery.conf && sudo chown postgres:postgres /var/lib/pgsql/data/recovery.conf ~$ sudo vim /var/lib/pgsql/data/recovery.conf standby_mode = 'on' primary_conninfo = 'host=10.10.0.40 port=5432 user=replica password=Password application_name=pgslave01' trigger_file = '/tmp/postgresql.trigger.5432'
Start PostgreSQL
~$ sudo systemctl start postgresql
Testing
netstat
Use netstat to look for the proper listening ports on both the master and slave.
~$ sudo netstat -plntu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1684/postgres
db query
From the Master:
~$ sudo su - postgres bash$ psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;" application_name | state | sync_priority | sync_state -------------------+-----------+---------------+------------ pgslavel01 | streaming | 1 | sync (1 row) bash$ psql -x -c "select * from pg_stat_replication;" -[ RECORD 1 ]----+------------------------------ pid | 1810 usesysid | 16384 usename | replica application_name | pgslave01 client_addr | 10.10.0.41 client_hostname | client_port | 59828 backend_start | 2020-02-18 12:36:53.638717-05 state | streaming sent_location | 0/30145C8 write_location | 0/30145C8 flush_location | 0/30145C8 replay_location | 0/30145C8 sync_priority | 1 sync_state | sync
db data replication
Test data replication from the master to slave.
From the Master:
~$ sudo su - postgres
bash$ psql
postgres=# CREATE TABLE test_table (test varchar(100));
postgres=# INSERT INTO test_table VALUES ('This is VPSCheap.net');
From the Slave:
~$ sudo su - postgres
bash$ psql -c "SELECT * FROM test_table;"
test
----------------------
This is VPSCheap.net
(1 row)