基于keepalived postgres的高可用

一)环境描述

主节点:172.31.0.2

从节点:172.31.0.3

数据库目录:/data/apps_data/postgres_data

postgres用户密码:a123456!

数据同步账号:repl

数据同步密码:a123456!



二)安装步骤与主从复制搭建

安装postgresql数据库

yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y

yum list | grep postgresql

yum install postgresql10-contrib.x86_64 postgresql10-server.x86_64 -y



创建数据目录,默认是/var/lib/pgsql,这里更改为/data/apps_data/postgres_data

mkdir /data/apps_data/postgres_data

chown postgres:postgres -R /data/apps_data/postgres_data/

chmod 750 /data/apps_data/postgres_data/



修改配置文件,更改第31行数据目录

vim /usr/lib/systemd/system/postgresql-10.service

Environment=PGDATA=/data/apps_data/postgres_data



添加环境变量

vim /etc/profile

exportPATH=/usr/pgsql-10/bin:$PATH

exportLD_LIBRARY_PATH=/usr/pgsql-10/lib

exportPGDATA=/data/apps_data/postgres_data

source /etc/profile



初始化postgresql并配置重启自动启动

/usr/pgsql-10/bin/postgresql-10-setup initdb

systemctl start postgresql-10

systemctl enable postgresql-10.service



设置登录密码

su - postgres

-bash-4.2$ psql

psql (10.9)

Type "help" for help.

postgres=# ALTER USER postgres WITH PASSWORD 'a123456!';

ALTER ROLE

postgres=# \q



设置远程访问及主从配置

创建复制账号:

su - postgres

createuser --replication -P repl

根据提示输入密码

vim /data/apps_data/postgres_data/pg_hba.conf #拉到最下面,更改如下

local all all md5

# IPv4 local connections:

host all all 127.0.0.1/32 md5

# IPv6 local connections:

host all all ::1/128 md5

# Allow replication connections from localhost, bya user with the

# replication privilege.

#local replication all md5

#host replication all 127.0.0.1/32 md5

#host replication all ::1/128 md5

host all all 0.0.0.0/0 md5

host replication repl 172.31.0.2/32 md5

host replication repl 172.31.0.3/32 md5

更改postgresql.conf配置文件

vim /data/apps_data/postgres_data/postgresql.conf

listen_addresses = '*'

port = 5432

max_connections = 1000

wal_level = hot_standby

synchronous_commit = local

archive_mode = on

archive_command = 'cp %p /data/apps_data/postgres_data/archive/%f'

max_wal_senders = 2

wal_keep_segments = 10

synchronous_standby_names = 'pgslave01'



创建archive目录,并修改权限和用户

mkdir -pv /data/apps_data/postgres_data/archive/ 

chmod 700 -R /data/apps_data/postgres_data/archive/ 

chown -R postgres:postgres /data/apps_data/postgres_data/archive/ 



启动主节点的postgres

systemctl start postgresql-10

从节点加载最新配置,并停止

systemctl start postgresql-10

systemctl stop postgresql-10



备份从节点数据目录,并创建新的数据目录

mv /data/apps_data/postgres_data /data/apps_data/postgres_data-back_`date+%Y-%m-%d-%M`

mkdir /data/apps_data/postgres_data && chmod-R 700 /data/apps_data/postgres_data && chown -R postgres:postgres /data/apps_data/postgres_data

进入postgres用户登陆,并将所有的数据目录从主服务器同步回来

su - postgres

pg_basebackup -h 172.31.0.2 -U repl -D /data/apps_data/postgres_data/ -P

输入密码:



传输完毕后,在/data/apps_data/postgres_data/目录下创建recovery.conf文件,并写入相关配置

touch /data/apps_data/postgres_data/recovery.conf

chown postgres:postgres /data/apps_data/postgres_data/recovery.conf

vim /data/apps_data/postgres_data/recovery.conf

standby_mode = 'on'

primary_conninfo = 'host=172.31.0.3 port=5432 user=repl password=a123456! application_name=pgslave1'

启动从节点的postgres,并且登陆主节点执行

select * frompg_stat_replication; 查看是否有从节点信息,若有则说明主从复制搭建成功



三)keepalived高可用搭建

安装keepalived

yum install -y net-tools psmisc

yum install -y net-snmp

yum install -y ipvsadm  keepalived

cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf



主节点配置

 cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id LVS_DEVEL

script_user root

# enable_script_security

}

vrrp_script check_postgres {

script "/data0/scripts/keepalived_scripts/check-postgres.sh"

interval 10

weight +10

fall 5

rise 1

}

vrrp_instance VI_4 {

  state BACKUP

  notify_master "/data0/scripts/keepalived_scripts/start-postgres.sh"

  unicast_src_ip 172.31.0.2

  unicast_peer {

    172.31.0.3

  }

  nopreempt       #非抢占模式,用于在故障恢复的时候不切换

  interface ens5

  virtual_router_id 54

  priority 140

  authentication {

      auth_type PASS

      auth_pass 555555

  }

  virtual_ipaddress {

      172.31.0.66

  }

  track_script {

      check_postgres

  }

}



cat /data0/scripts/keepalived_scripts/check-postgres.sh

#!/bin/bash

fix_pid=`ps -aux|grep postgres|grep -v check-postgres.sh|grep -v grep`

if [ -z "$fix_pid" ];

then

    exit 1

else

    exit 0

fi



cat /data0/scripts/keepalived_scripts/start-postgres.sh

#!/bin/bash

su - postgres -c "pg_ctl promote -D /data/apps_data/postgres_data/"



从节点配置

 cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id LVS_DEVEL

script_user root

# enable_script_security

}

vrrp_script check_postgres {

script "/data0/scripts/keepalived_scripts/check-postgres.sh"

interval 10

weight 1

fall 3

rise 1

}

vrrp_instance VI_4 {

  state BACKUP

  notify_master "/data0/scripts/keepalived_scripts/start-postgres.sh"

  notify_backup "/data0/scripts/keepalived_scripts/kill-postgres.sh"

  unicast_src_ip 172.31.0.3

  unicast_peer {

    172.31.0.2

  }

  interface ens5

  virtual_router_id 54

#  nopreempt

  priority 142

  authentication {

      auth_type PASS

      auth_pass 555555

  }

  virtual_ipaddress {

      172.31.0.66

  }

  track_script {

      check_postgres

  }

}



cat /data0/scripts/keepalived_scripts/start-postgres.sh

#!/bin/bash

su - postgres -c "pg_ctl promote -D /data/apps_data/postgres_data/"

touch /data/scripts/keepalived_scripts/postgres.text



cat /data0/scripts/keepalived_scripts/kill-postgres.sh

#!/bin/bash

rm -rf /data/scripts/keepalived_scripts/postgres.text   #作为标识位,用于识别此时的节点信息是否为主



cat /data0/scripts/keepalived_scripts/check-postgres.sh

#!/bin/bash

fix_pid=`ps -aux|grep postgres|grep -v check-postgres.sh|grep -v grep`

if [ -z "$fix_pid" ];

then

    if [ -e "/data/scripts/keepalived_scripts/postgres.text" ];  #判断是否为主,若是从节点postgres宕机则无操作,为主节点时宕机则需要重启keepalived

    then

        systemctl restart keepalived

    fi

    exit 0

else

    exit 0

fi



先启动主节点的keepalived然后再启动从节点的keepalived

高可用描述:当主从正常时,主节点的优先级为150,从节点的优先级为143,主节点获得vip:172.31.0.66,当主节点的postgres宕机时,其优先级下降为140,从节点升级为主机点获得vip提供服务,当旧的主节点恢复的时候由于设置了非抢占模式,所以哪怕优先级回到了150也不会抢占vip,将其配置为新主节点的从即可继续实现高可用,在此时如果新的主节点的postgres再发生宕机,那么根据keepalived的check脚本会重启keepalived,让非抢占式的从节点成为主节点,vip又切换回去了

写的有些匆忙可能还会有一些不足,欢迎指正

联系邮箱:958905365@qq.com


参考链接:

https://www.seraphln.com/article/2019/4/3/17.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容