[PostgreSql]生产级别数据库安装要考虑哪些问题?
大家好,我是字母哥(coder)!
我让公司的小伙伴写一个生产级别的PostgreSQL的安装文档,结果他和我说:“不是用一个命令就能安装好么?还用写文档么?”。我知道他想说的是这个命令:yum install postgresql-server,我也是挺无语的。要知道生产级别的应用安装方式,和自己在练习过程中安装的小玩具相比,要严谨的多,考虑的问题也更多。
- 首先是安全问题,能不能用root安装?防火墙怎么搞?数据库打开文件以及连接数会不会超过linux默认打开文件句柄数的限制?
- 其次是合理规划,你的数据放在哪个目录?这个目录是全公司统一的么?linux发行版不一样,软件安装目录一致么?数据目录是单独挂载磁盘么?单独挂载的磁盘做了RAID数据冗余么?
- 然后是运维方便的问题,你是否配置了合理的环境变量,如果不配置你是不是每次执行命令都要敲全路径?是否PostgreSQL具备开机自启动功能?
- 数据库用户是否经过合理规划,你的数据操作(增删改查)用户是否能新建表,truncat表,删除表?数据操作用户具备这些功能是不是导致人为误操作的风险增加?
- 你的数据库安装之后,是否具备企业级的统一管理、故障监控?流程上如何申请?等等等等。
以上的这些问题,都需要写在《数据库安装手册》中,怎么会只有一个命令呢?本文只当抛砖引玉,通过安装PostgreSQL数据库,来说明一下一个完整的《数据库安装手册》该怎么写。 如果有考虑不足不全面之处,欢迎网友们补充。
一、安装包下载
要进行PostgreSQL的安装,首先我们需要先把安装包下载下来。生产环境的postgresql安装一般会使用源码编译的方式进行安装,使用源码编译的安装方式有几个好处(坏处就是相对麻烦):
- 公司的服务器什么型号,什么操作系统版本的都有。如果使用yum或者apt-get安装,很难统一版本,不同的操作系统发行版带的postgreSQL源是不一样的。即使搞成统一的,不同的操作系统之间也无法统一安装目录的位置、lib存放位置等。
- postgresql源码编译的方式进行安装,可以灵活的选择我们需要安装的版本,需要哪一个版本就下载哪一个版本。而使用yum或者apt-get进行安装只能源库指定的若干版本。源码安装,我们想指定什么目录就指定什么目录,全公司所有的PostgreSQL都在这个目录,这也是规范的一种。
所以为了适应更多的场景,为了达到公司内运维统一的标准,一般生产环境会使用postgresql源码编译的方式进行安装。PostgreSql官方源码安装包的下载地址是:https://www.postgresql.org/download/

找到如上图所示的“file browser”,点击进入file browser页面,下载以“tar.gz”结尾的安装包即可。

二、必要的准备工作
需要说明的是,准备工作需要使用root用户进行操作。我们以CentOS linux发行版操作系统为例,命令如下。如若是其他的linux发行版,准备工作这一块内容操作步骤是差不多的,linux命令需要调整。
1、安装必要的编译环境
首先需要安装一些必要的依赖,PostgreSQL安装的过程需要使用到这些linux包。
yum install -y cmake make gcc zlib zlib-devel gcc-c++ perl readline readline-devel python36 \
tcl openssl ncurses-devel openldap pam flex
2、创建postgre用户
通过groupadd添加一个用户组postgres,再使用adduser命令添加一个操作系统的postgres用户,该用户的用户组是-g postgres。
groupadd postgres
adduser -g postgres postgres
adduser命令在CentOS或者RedHat发行版中,在添加操作系统用户的同时会自动新建一个该用户的主目录/home/postgres,该目录也是我们后续安装PostgreSql的主目录。该目录的权限归属于postgres组的postgres用户。
passwd postgres
新建用户之后,我们使用passwd命令修改操作系统内的postgres用户的密码。
如果你使用的是其他的linux操作系统发行版,这个目录你可能需要手动的去创建,并且手动执行命令为postgres 用户赋权。命令如下
mkdir -p /home/postgres;
chmod -R 775 /home/postgres;
chown -R postgres:postgres /home/postgres;
3、开放防火墙端口
开放防火墙,使用如下2条命令开放postgreSQL的标准端口5432的端口。其实,笔者建议安装postgreSQL的时候,不要使用这个端口,因为端口越固定,被攻击的可能性就越大。我们随机选择一个不常用的端口,安全性会更好一些,这里我还是使用标准端口了。
firewall-cmd --zone=public --add-port=5432/tcp --permanent;
firewall-cmd --reload
4.修改操作系统打开最大文件句柄数
在/etc/security/limits.conf中进行设置(需要root权限修改该文件),可添加如下两行,表示用户postgres最大打开文件描述符数的soft limit为65535,hard limit为65535。
postgres soft nofile 65535
postgres hard nofile 65535
该配置在关闭linux访问终端session重新登录之后生效,ulimit -n的值会变成65535 。进行这一步操作的目的是防止linux操作系统内打开文件句柄数量的限制,避免不必要的故障。
5、创建必要的目录
创建目录的时候要做好规划,下文中 /home/postgres/postgre14是我规划的postgreSql安装目录; /home/postgres/pgdata是我规划的postgreSql数据存放目录。
mkdir -p /home/postgres/{postgre14,pgdata}
这里需要注意的是, /home/postgres/pgdata这样的目录规划并不标准,这里我只是给大家做演示操作。实际上生产环境,postgreSql数据存放目录应该是服务器单独挂载的一块磁盘,与linux操作系统以及安装程序是分开的。 这样做的好处:一是方便数据备份(硬件层面或软件层面),二是操作系统出现的问题,不影响数据安全。
三、编译并安装
准备工作做好之后我们就开始真正的安装了,安装过程使用postgres用户,使用su命令从root用户切换到postgres用户。并且解压安装包,解压路径是/home/postgres。
su - postgres
tar -xzvf ./postgresql-14.4.tar.gz -C /home/postgres
解压之后的文件路径是postgresql-14.4,进入这个目录里面,我们来执行编译安装,编译安装的结果目录我们指定为/home/postgres/postgre14。最后一步make和insatll的过程比较耗时,多等一会。如果没有报错信息,我们的安装就完成了,其实也很快的,并不比yum安装方式麻烦多少。
cd /home/postgres/postgresql-14.4
./configure --prefix=/home/postgres/postgre14
make && make install
四、配置环境变量
安装完成之后,我们来给postgres配置一些环境变量,比如PGPORT端口、PGDATA数据目录、PGHOME安装目录、LD_LIBRARY_PATH的安装lib目录、PATH命令脚本目录。
cat >> ~/.bash_profile <<"EOF"
export PGPORT=5432
export PGDATA=/home/postgres/pgdata
export PGHOME=/home/postgres/postgre14
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
EOF
配置完成之后,使用如下命令使配置生效。
source ~/.bash_profile
有了环境变量之后,我们的运维工作会更方便。比如:在postgres用户下我们执行命令psql就可以,就不用敲全路径了,比如:/home/postgres/postgre14/bin/psql。
五、数据库及参数初始化
数据库安装完成之后,我们需要完成一个数据库初始化工作。指定-D数据目录,-E字符编码, --locale本及语言环境,-U初始化用户信息。
$PGHOME/bin/initdb -D $PGDATA -E UTF8 --locale=en_US.utf8 -U postgres
完成这个操作之后,数据库存在了postgres用户,数据目录PGDATA目录下面初始化了一些配置文件,比如:/home/postgres/pgdata/postgresql.conf参数文件,/home/postgres/pgdata/pg_hba.conf 用户访问权限文件。
我们来修改一下参数文件,以期望它能够适配我们的操作系统和我们的运行需求。下文中命令的含义是将EOF包含的文件内容写入/home/postgres/pgdata/postgresql.conf配置文件。
cat >> /home/postgres/pgdata/postgresql.conf <<"EOF"
listen_addresses = '*'
port=5432
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
EOF
listen_addresses表示postgre进程监听的网卡地址,配置*表示监听所有。port服务监听端口配置logging_collector=on,启动日志收集器log_directory表示日志文件在PGDATA目录下的文件夹位置。log_filename表示日志文件的名称
这里只列出一些通常情况下需要修改的参数,性能调优参数就不一一列举了,我后续可能会专门写一篇PostgreSQL性能调优的文章,欢迎大家关注我!
# 数据库能够接受的最大请求连接并发数
max_connections = 100
# 数据库服务器将使用的共享内存缓冲区量。建议值:数据库独立服务器的1/4内存。
shared_buffers =1GB
基础运行参数配置完成之后,还需要配置一些访问权限。如下所示使用cat命令将EOF包含的文件内容,写入/home/postgres/pgdata/pg_hba.conf 配置文件:
cat > /home/postgres/pgdata/pg_hba.conf << EOF
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 0.0.0.0/0 md5
EOF
- 第一行的内容表示local本机,all所有用户可以访问postgre的所有数据库,并且密码发送方式不需要加密(trust)。
- 第二行的内容用于远程访问,指定了可以访问postgreSql数据库的远程用户的ip范围,
0.0.0.0/0表示所有ip都可以。如果你希望指定ip段,可以像这样去配置192.168.3.1/24(表示的ip范围是:192.168.3.1到192.168.3.255)。md5表示数据库访问密码使用md5的加密方式发送。
六、启动数据库新建用户
完成以上的所有的操作之后,我们就可以启动数据库了,使用如下的这些命令启停数据库。
#启动命令
pg_ctl start
#重启命令
pg_ctl restart
#查看数据库运行状态
pg_ctl status
#停止数据库
pg_ctl stop
数据库启动之后,我们查看一些数据库运行的进程如下所示:

数据库启动成功,我们输入psql命令,进入数据库管理命令行
$ psql
数据库初始化的过程,新建了一个用户postgres,我们给它修改一下密码。
alter user postgres with password '你设置的密码';
一般来说,我们的程序在运行过程中,不会直接使用postgres用户,而是新建一个用户。
#新建一个用户 acai
CREATE USER acai WITH password '密码';
#新建一个数据库acaidb,属主是acai
CREATE DATABASE acaidb OWNER acai;
# 为用户acai赋权,all表示所有权限,acaidb的管理用户
GRANT all ON DATABASE acaidb TO acai;
实际上在生产环境中,我们需要创建两个用户,一个数据库管理用户用于管理表、视图等操作;另一个是程序用户,用于操作数据库表里面的数据,完成增删改查。
CREATE USER acaiuser WITH password '********';
GRANT update,delete,insert,select ON ALL TABLES IN SCHEMA public TO acaiuser;
七、开机自启动
为了让PostgreSQL在以后每次服务器重启之后,都能够自动启动,我们写一个自启动配置文件。下面的命令需要使用root用户执行
cat > /etc/systemd/system/postgre14.service <<"EOF"
[Unit]
Description=PostgreSQL database server 14.4
Documentation=man:postgres(1)
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGPORT=5432
Environment=PGDATA=/home/postgres/pgdata
ExecStart=/home/postgres/postgre14/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/home/postgres/postgre14/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/home/postgres/postgre14/bin/pg_ctl reload -D ${PGDATA} -s
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=120
[Install]
WantedBy=multi-user.target
EOF
执行下列命令,使得PostgreSQL数据库开机自启动脚本生效。
systemctl daemon-reload
systemctl enable postgre14
后续再启停数据库,查看数据库状态,就可以使用下面的这些命令了
systemctl start postgre14
systemctl stop postgre14
systemctl status postgre14
欢迎关注我的公告号:字母哥杂谈,回复003赠送作者专栏《docker修炼之道》的PDF版本,30余篇精品docker文章。字母哥博客:zimug.com
[PostgreSql]生产级别数据库安装要考虑哪些问题?的更多相关文章
- Greenplum 数据库安装部署(生产环境)
Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...
- 转_Greenplum 数据库安装部署(生产环境)
Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...
- PostGreSQL数据库安装教程
windows 10 x64 pro 1703安装postgresql-9.6.3-2-windows-x64.exe数据库,步骤如下: 第一:下载数据库安装程序,下载地址为:https://www. ...
- PostGreSQL数据库安装配置说明
windows 10 x64 pro 1703安装postgresql-9.6.3-2-windows-x64.exe数据库,步骤如下: 第一:下载数据库安装程序,下载地址为:https://www. ...
- PostgreSQL数据库安装
PostgreSQL数据库安装 postgresqllinux9.6.0 2018年01月31日 10时53分13秒 编译以及安装 源码编译 程序安装 数据库的启动和停止 启动数据库 关闭数据库 数据 ...
- PostgreSQL数据库安装Version10.5
PostgreSQL数据库安装,基于版本10.5安装, 在Linux系统上使用*.gz二进制压缩包手动安装. 操作系统:Red Hat Enterprise Linux Server release ...
- MongoDB学习笔记——数据库安装及配置
MongoDB数据库安装 MongoDB官方下载地址:https://www.mongodb.com/download-center 首先需要根据Windows版本选择正确的MongoDB版本进行安装 ...
- Mysql单实例数据库安装
第1章 MySQL数据库安装 在当今的大中型互联网企业里,MySQL数据库服务几乎都是运行在Linux系列操作系统上,当然,你在可以运行在Windows/Unix等商业操作系统上,大中型互联网企业使用 ...
- Linux环境PostgreSQL源码编译安装
Linux环境PostgreSQL源码编译安装 Linux版本: Red Hat 6.4 PostgreSQL版本: postgresql-9.3.2.tar.gz 数据存放目录: /var/post ...
随机推荐
- KALI2020忘记用户名和密码
时隔半年,打开kali发现忘记了自己精心研制的用户名密码......... 第一步 在开机的时候就按e键进入如下界面 第二步 用键盘上的上下箭头↑↓进行屏幕滚动,滑到最后一行发现修改目标 倒数第四行: ...
- JMeter - 生成随机数/随机字符串/随机变量/随机日期
1. Random - 随机数 1.1 作用 1.2 声明 1.3 例子 2. __RandomDate - 随机日期 2.1 作用 2.2 声明参数 2.3 例子 3. RandomString - ...
- JS:Array
js有五种基本数据类型:string,number,boolean,null,undefined 一种引用类型,包括:1.Object类型:2.Function类型:3.Array类型:4.RegEx ...
- DDos、CC攻击与防御
DDoS介绍 DDoS是英文Distributed Denial of Service的缩写,意即"分布式拒绝服务",那么什么又是拒绝服务(Denial of Service)呢? ...
- Python-基础知识汇集
1.列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可 代码理解:列表 ...
- AI 绘画极简教程
昨天在朋友圈发了几张我用AI绘画工具Disco Diffusion画的画 既然有同学问,就写个极简教程吧,画个图是足够了,想要深入了解还是自行百度吧,可以找到更详细的教程. 第 0 步:学会上网,注册 ...
- 树莓派实战:微信机器人(itchat实现)
背景 楼主有一台树莓派4B开发板(8G内存版),是目前的顶配机型.这一年来的业余时间,除了写Java.架构方面的文章,也陆续折腾了不少树莓派上的好玩小项目,在此新开一个树莓派实战的文章系列,分享给粉丝 ...
- BUCK 电路PSIM仿真模型搭建之二 (传递函数模块的使用)
1. 利用S函数模块进行环路仿真 将PI 写成 截止频率的表示形式 Kp* (Ti*s+1)/Ti*s , 这里Kp = 20, Ti = 0.0001 , 写入仿真模型参数框 仿真结果: ...
- Webpack干货系列 | 怎么运用 Webpack 5 处理css/scss/sass、less、stylus样式资源
程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解webpack 5 如何高效处理CSS 资源.scss/sass 资源.l ...
- 【Codeforces1706A】 Another String Minimization Problem
官方标签 贪心.字符串 题目描述 输入 输出 样例输入 6 4 5 1 1 3 1 1 5 2 4 1 1 1 1 1 2 4 1 3 2 7 7 5 4 5 5 5 3 5 样例输出 ABABA B ...