1

[PostgreSql]生产级别数据库安装要考虑哪些问题?

 1 year ago
source link: https://blog.51cto.com/u_14482423/5623371
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

[PostgreSql]生产级别数据库安装要考虑哪些问题?

精选 原创

字母哥博客 2022-08-26 12:03:13 博主文章分类:通用分类 ©著作权

文章标签 postgresql 数据库 发行版 文章分类 其它 数据库 阅读数196

  • 一、安装包下载
  • 二、必要的准备工作
  • 三、编译并安装
  • 四、配置环境变量
  • 五、数据库及参数初始化
  • 六、启动数据库新建用户
  • 七、开机自启动

大家好,我是字母哥(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/

[PostgreSql]生产级别数据库安装要考虑哪些问题?_postgresql

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

[PostgreSql]生产级别数据库安装要考虑哪些问题?_数据库_02

二、必要的准备工作

需要说明的是,准备工作需要使用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

数据库启动之后,我们查看一些数据库运行的进程如下所示:

[PostgreSql]生产级别数据库安装要考虑哪些问题?_发行版_03

数据库启动成功,我们输入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 '4rfv$RFV';
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

「码文不易,如果您觉得有帮助,请帮忙点击在看或者分享,没有您的支持我可能无法坚持下去!」

​欢迎关注公众号:字母哥杂谈


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK