PostgreSQL集群篇——1、PG环境安装准备
标签
PostgreSQL,PG,集群,DBA,架构师,PG安装,编译安装
背景
PostgreSQL官方文档中讲到了多种高可用、负载均衡和复制特性解决方案,如下图所示:
特性 | 共享磁盘故障转移 | 文件系统复制 | 预写式日志传送 | 逻辑复制 | 基于触发器的主-备复制 | 基于语句的复制中间件 | 异步多主控机复制 | 同步多主控机复制 |
---|---|---|---|---|---|---|---|---|
最通用的实现 | NAS | DRBD | 内建流复制 | 内建逻辑复制,pglogical | Londiste,Slony | pgpool-II | Bucardo | |
通信方法 | 共享磁盘 | 磁盘块 | WAL | 逻辑解码 | 表行 | SQL | 表行 | 表行和行锁 |
不要求特殊硬件 | • | • | • | • | • | • | • | |
允许多个主控机服务器 | • | • | • | • | ||||
无主服务器负载 | • | • | • | • | ||||
不等待多个服务器 | • | with sync off | with sync off | • | • | |||
主控机失效将永不丢失数据 | • | • | with sync on | with sync on | • | • | ||
复制体接受只读查询 | with hot | • | • | • | • | • | ||
每个表粒度 | • | • | • | • | ||||
不需要冲突解决 | • | • | • | • | • |
我们在集群环境中使用这些技术,首先需要考虑的是我们目前面临的是什么问题,例如我现在面临的就是高并发问题如何来解决,按照上述图表中我选择了流复制解决方案。
在流复制解决方案中分为同步、异步两种,异步流复制通常采用的是基于wal日志来传送的方式进行,从节点通常比主节点要少一个wal日志块的数据,这给我们并发查询造成了影响,因此这里我们需要采用同步流复制解决方案,其采用的是数据流的方式,就像小溪一样,水一直流淌着,多条分支最终汇总到一处,同时接收处也在一直存储着。
流复制是从2010年推出pg9.0版本以后开始的,其版本到目前经历的阶段如下:
版本 | 方式 | 描述 |
---|---|---|
PostgreSQL9.0 | 流式物理复制 | 开始支持流式物理复制,用户可以通过流式复制构建只读备库 |
PostgreSQL9.1 | 同步流复制 | 开始支持同步复制,只支持一个同步流复制节点,同步流复制能保证数据的0丢失 |
PostgreSQL9.2 | 级联流复制 | 开始支持联流复制,备库下面还可以再连接备库,形成级联架构 |
PostgreSQL9.2 | 流式虚拟备库 | 开始支持虚拟备库,即备库中没有数据文件,只包含wal文件。 |
PostgreSQL9.4 | 逻辑复制 | 开始支持逻辑复制,逻辑复制可以应对部分表复制的功能。 |
PostgreSQL9.6 | 同步流复制改版 | 同步流复制允许多个备用服务器以提高可靠性。 |
PostgreSQL10 | 使用发布/订阅进行逻辑复制 | |
PostgreSQL11-13 | 持续优化 |
本次我们将采用PostgreSQL13.1版本进行搭建同步流复制环境,数据库安装我们采用了编译安装,如不清楚怎样安装,请查看之前的文章《PostgreSQL集群篇——1、PG环境安装准备》
环境
PostgreSQL集群篇整体采用3台虚拟机进行搭建,相关情况如下:
服务器IP | CPU | 内存 | 存储 | 作用 |
---|---|---|---|---|
10.28.1.181 | 4核 | 8G | 200G | 主master节点, |
10.28.1.182 | 4核 | 8G | 200G | 从slave节点, |
10.28.1.210 | 4核 | 8G | 200G | VIP节点,虚拟IP |
产品简介
内容:
安装脚本:
1、设置服务器使用的时区并校准时间
代码语言:javascript复制 sudo tzselect
#输入 4 9 1 1
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo apt-get update
sudo apt-get install ntpdate -y
sudo ntpdate us.pool.ntp.org
2、安装必要的编译环境
代码语言:javascript复制 sudo apt-get install gcc make libreadline-dev zlib1g-dev -y
3、创建好准备安装的目录并创建pg基础用户,并将pg基础目录授权给该用户
代码语言:javascript复制sudo mkdir /pg
# 授权pg用户目录操作权限,这里在安装完成后权限应是postgres用户
sudo groupadd postgres
sudo useradd -g postgres postgres -s "/bin/bash" -m
sudo passwd postgres
sudo chown -R postgres:postgres /pg
这里我们创建用户的同时对其进行设置了密码,设置一个密码,安全性上更有保障,同时默认密码随机,如果一直使用sudo su则会缺少环境变量,后续会带来不必要的麻烦。同时后续我们切换用户会使用su 直接切换不会增加sudo。
4、从官网下载PostgreSQL最新稳定版本,这里使用编译安装进行可控式安装
源码下载
代码语言:javascript复制 su postgres
mkdir /pg/install
cd /pg/install
wget https://ftp.postgresql.org/pub/source/v13.1/postgresql-13.1.tar.gz
5、开始进行编译
代码语言:javascript复制 tar -zxf postgresql-13.1.tar.gz
cd postgresql-13.1/
./configure --prefix=/pg
# 编译主程序
make
# 编译文档与contrib
make world
# 安装主程序
make install
# 安装全部
make install-world
# 安装完成后清除源码中编译生成的文件,将其还原为发布时的源码包。便于后续时间需要使用时再次编译
make distclean
- make 编译主程序
- make world 在编译主程序的同时将其文档与contrib共享库包全部编译
- make install 安装主程序
- make install-world 安装文档与contrib共享库,当我们把所有共享库都安装上并不代表数据库已经可用这些,而是需要我们在库中根据需要进行create extension启用插件。因此这里我们直接将原带的插件,对其性能不会
6、设置环境变量
代码语言:javascript复制 sudo vim /etc/profile
#在文件最底部增加
export PGHOME=/pg
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH # 主程序目录
export PGDATA=$PGHOME/data # 数据存储目录
export MANPATH=$PGHOME/share/man:$MANPATH # 共享包库
export LANG=en_US.utf8
## wq 保存
sudo reboot
这里我们在设置完成系统环境变量后直接进行了重启,而没有使用当前会话生效命令( source /etc/profile)是因其下面我们要多次切换用户,这时需要每次都执行一次过于麻烦。索性直接重启一次,所有会话下直接生效。
7、开始进行初始化数据库w
代码语言:javascript复制su postgres
pg_ctl initdb
备注:这里我们进入postgres用户后直接使用了pg_ctl命令,是因为上面设置了系统环境变量PATH,其次我们切换用户时使用的是su,如果使用sudo su 进入用户会导致系统环境变量丢失,如果想使用该命令需要再去单独设置root用户的环境变量。
执行到这里后我们可以使用pg_ctl start 与pg_ctl stop 进行测试数据库是否正常启动停止,下面我们将开始对其服务器自启动进行设置,增加到日常linux服务管理中。
8、创建日志库,并添加系统启动项
代码语言:javascript复制 cd /pg
mkdir logfiles
9、进行编写服务器启动服务
代码语言:javascript复制exit # 退出当前的postgres用户
sudo vim /etc/systemd/system/postgresql.service
文件内容如下:
代码语言:javascript复制 [Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGSTARTTIMEOUT=300
Environment=PGDATA=/pg/data
ExecStart=/pg/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT} -l /pg/logfiles/pg_service_log
ExecStop=/pg/bin/pg/pg_ctl stop -D ${PGDATA} -s -m -l /pg/logfiles/pg_service_log
ExecRestart=/pg/bin/pg_ctl restart -D ${PGDATA} -s -l /pg/logfiles/pg_service_log
ExecReload=/pg/bin/pg_ctl reload -D ${PGDATA} -s -l /pg/logfiles/pg_service_log
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=360
[Install]
WantedBy=multi-user.target
代码语言:javascript复制:wq #保存文件
sudo systemctl daemon-reload
10、测试使用postgresql服务进行启动数据库
代码语言:javascript复制systemctl start postgresql
systemctl restart postgresql
systemctl stop postgresql
systemctl restart postgresql
代码语言:javascript复制ps -aux|grep postgres
su postgres
tail -1000f /pg/logfiles/pg_service_log # 查看服务启停日志
至此集群环境下我们需要使用的基础pg环境已准备就绪,下一篇我们将开始对其这两台进行搭建流复制集群设置。
本文声明
知识共享许可协议 本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。