一、节点信息
Ip | 角色 |
172.18.10.76 | 主节点 |
172.18.10.119 | 备1节点 |
172.18.10.120 | 备2节点 |
172.18.10.200 | VIP |
二、主备关系:
主节点 > 备1 > 备2
三、Pgstgresql
1、安装数据库
tar -zxf postgresql-16.3_centos_7.5_x86_64.tar.gz #配置环境变量与启动服务,运行以下脚本内容,请根据环境修改install_postgresql16.sh内容 APPTRACE_HOME=/opt/apptrace #解压目录 #执行安装脚本 bash install_postgresql16.sh #设置环境变量 sudo vim /etc/profile #将一下内容添加到/etc/profile文件中,请注意postgresql的安装位置 export PGHOME=/opt/apptrace/postgresql export PGDATA=/opt/apptrace/postgresql/data export PATH=$PATH:$HOME/bin:$PGHOME/bin #修改环境变量 source /etc/profile |
2、修改 postgresql.conf(主)
在 data/postgresql.conf 文件中,设置以下参数#(如果用脚本安装,可能存在多个参数,删除掉多余的):
listen_addresses = '*' port = 5432 wal_level = logical archive_mode = on wal_log_hints = on max_wal_senders= 10 wal_sender_timeout = 120s hot_standby = on |
3、修改 pg_hba.conf(主)
在 data/pg_hba.conf 文件中,添加其他节点的访问权限:
# 根据去求添加对应ip
host replication all 172.18.10.76/0 trust host replication all 172.18.10.119/0 trust host replication all 172.18.10.120/0 trust host all all 172.18.10.76/0 md5 host all all 172.18.10.119/0 md5 host all all 172.18.10.120/0 md5 host all all 172.17.102.123/0 md5 #172.17.102.123为应用的服务地址 |
修改后重启服务
sudo systemctl restart postgresql.service; #重启服务 |
在主节点登录pgsql报一下错误,需要在变量环境里指定依赖
编辑/etc/profile和~/.bash_profile 文件,加入以下内容
export LD_LIBRARY_PATH=/data/apptrace/postgresql/lib/libpq.so.5:$LD_LIBRARY_PATH source ~/.bash_profile |
无法确定依赖目录可执行:sudo find / -name libpq.so.5 2 > /dev/null搜索
4、生成用户(主节点执行)
#如手动initdb的话请进入数据库后先执行一下3条命令 CREATE EXTENSION adminpack; ALTER USER apptrace WITH ENCRYPTED PASSWORD 'apptrace'; GRANT ALL PRIVILEGES ON DATABASE postgres TO apptrace; #创建复制流所用的数据库 psql -U apptrace -d postgres -c " CREATE ROLE repl WITH REPLICATION LOGIN; ALTER USER repl WITH ENCRYPTED PASSWORD 'repl'; " |
5、生成备库 (备)
rm -rf /opt/apptrace/postgresql/data/*; pg_basebackup -h 172.18.10.76 -U repl -R -Fp -P -D /opt/apptrace/postgresql/data;(节点2) pg_basebackup -h 172.18.10.119 -U repl -R -Fp -P -D /opt/apptrace/postgresql/data;(节点3) sudo systemctl restart postgresql.service; |
6、检查或测试
(1)检查复制流状态
查看主节点复制流状态
psql -h 172.18.10.76 -p 5432 -U apptrace -d postgres -c "SELECT pid, usename, application_name, client_addr, state, sync_state FROM pg_stat_replication;" 结果: |
查看备1节点复制流状态
psql -h 172.18.10.119 -p 5432 -U apptrace -d postgres -c "SELECT pid, usename, application_name, client_addr, state, sync_state FROM pg_stat_replication;" 结果: |
(2)测试复制流是否正常
创建表格
psql -h 172.18.10.76 -p 5432 -U apptrace -d postgres -c "CREATE TABLE test_table (id SERIAL PRIMARY KEY,name VARCHAR(100))"; |
添加数据
psql -h 172.18.10.76 -p 5432 -U apptrace -d postgres -c "INSERT INTO test_table (name) VALUES ('Alice'), ('Bob'), ('Charlie');" #可以多执行几次 |
查看数据是否添加成功
psql -h 172.18.10.76 -p 5432 -U apptrace -d postgres -c "SELECT * FROM test_table;" |
查看备1和备2节点是否成功同步数据
psql -h 172.18.10.119 -p 5432 -U apptrace -d postgres -c "SELECT * FROM test_table;" psql -h 172.18.10.120 -p 5432 -U apptrace -d postgres -c "SELECT * FROM test_table;" |
四、Keepalived(所有节点执行)
1、安装keepalived
tar -zxf keepalived-2.3.1-centos7.9.tar.gz cd keepalived-2.3.1 #如未编译 ./configure --prefix=/usr/local/keepalived sudo make install sudo cp /usr/local/keepalived/sbin/keepalived /etc/init.d/ sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ sudo cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ |
2、添加keepalived信息
tar -zxf keepalived-conf.tar.gz sudo cp -r keepalived /etc/ |
3、修改keepalived信息
sudo vim /etc/keepalived/keepalived.conf #修改一下配置
interface ens33 #网卡名称 unicast_src_ip 172.18.10.76 #本机ip unicast_peer { # 填写集群其他节点IP 172.18.10.119 172.18.10.120 } virtual_ipaddress { 172.18.10.200 # 虚拟VIP地址 } priority 200 # 优先级,数字越大优先级越高,建议主节点200,备1节点199,备2节点198(给故障转移修复给出充足空间) |
4、修改switch_pg.sh脚本信息
sudo vim /etc/keepalived/scripts/switch_pg.sh #修改标红的数据库安装目录信息
#!/bin/bash export LANG="en_US.UTF-8" if [[ -f /opt/apptrace/postgresql/data/standby.signal ]];then su - apptrace -c "/opt/apptrace/postgresql/bin/pg_ctl promote -D /opt/apptrace/postgresql/data" else echo 'The file /opt/apptrace/postgresql/data/standby.signal does not exist' fi |
5、启动keepalived
sudo systemctl start keepalived #主节点先执行,在依次在备1和备2节点执行 |
执行完成后,在主节点使用ip a查看是否已有VIP地址
五、故障测试
1、停止主节点postgresql服务
sudo systemctl stop postgresql |
2、查看是否正常切换
停止主节点的postgresql后,vip会切换到备2节点机器上
使用ip a命令查看VIP是否已转移到备1节点
原主节点:
原备1节点:
原主节点keepalived服务会停止
3、查看复制流是否正常
psql -h 172.18.10.200 -p 5432 -U apptrace -d postgres -c "SELECT pid, usename, application_name, client_addr, state, sync_state FROM pg_stat_replication;" |
查看是否已切换成主节点
psql -h 172.18.10.200 -p 5432 -U apptrace -d postgres -c "SELECT pg_is_in_recovery()" # f为主节点,t为备节点 |
添加数据
psql -h 172.18.10.200 -p 5432 -U apptrace -d postgres -c "INSERT INTO test_table (name) VALUES ('Alice'), ('Bob'), ('Charlie');" #可以多执行几次 |
查看备2节点是否成功同步数据
psql -h 172.18.10.120 -p 5432 -U apptrace -d postgres -c "SELECT * FROM test_table;" |
六、故障修复(原主节点执行)
1、修改keepalived信息
sudo vim /etc/keepalived/keepalived.conf
#将priority 参数调整到比备2节点要低 priority 197 |
2、添加复制流,同步原备2节点
rm -rf /opt/apptrace/postgresql/data pg_basebackup -h 172.18.10.120 -U repl -R -Fp -P -D /opt/apptrace/postgresql/data; sudo systemctl restart postgresql.service; |
3、查看复制流是否已添加
psql -h 172.18.10.120 -p 5432 -U apptrace -d postgres -c "SELECT pid, usename, application_name, client_addr, state, sync_state FROM pg_stat_replication;" |
添加数据
psql -h 172.18.10.200 -p 5432 -U apptrace -d postgres -c "INSERT INTO test_table (name) VALUES ('Alice'), ('Bob'), ('Charlie');" #可以多执行几次 |
查看备2节点是否成功同步数据
psql -h 172.18.10.76 -p 5432 -U apptrace -d postgres -c "SELECT * FROM test_table;" |