[转帖]以 PostgreSql 为例,说明生产级别数据库安装要考虑哪些问题?

postgresql,说明,生产,级别,数据库,安装,考虑,哪些,问题 · 浏览次数 : 0

小编点评

## 数据库能够接受的最大请求连接并发数 ``` max_connections = 100 ``` ## 数据库服务器将使用的共享内存缓冲区量 ``` shared_buffers = 1GB ``` ## 启动数据库新建用户完成以上的所有的操作 ```sql CREATE USER acaiWITH password '密码'; GRANT update,delete,insert,select ON ALL TABLES IN SCHEMA public TO acaiuser; ``` ##七、开机自启动为了让 PostgreSQL 在以后每次服务器重启之后,都能够自动启动 ```sql cat > /etc/systemd/system/postgre14.service ``` **执行下列命令,使得 PostgreSQL 数据库开机自启动脚本生效** ``` systemctl daemon-reloadsystemctl enable postgre14 ``` ##后续再启停数据库,查看数据库状态 ```sql systemctl start postgre14 systemctl stop postgre14 systemctl status postgre14 ```

正文

https://xie.infoq.cn/article/487b467b952683e6dd27d9061

 

我让公司的小伙伴写一个生产级别的 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 postgresadduser -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         65535postgres 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 - postgrestar -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/postgre14make  && make install
 
 
 
复制代码
 

四、配置环境变量

安装完成之后,我们来给 postgres 配置一些环境变量,比如 PGPORT 端口、PGDATA 数据目录、PGHOME 安装目录、LD_LIBRARY_PATH 的安装 lib 目录、PATH 命令脚本目录。

 

 
cat >>  ~/.bash_profile <<"EOF"export PGPORT=5432export PGDATA=/home/postgres/pgdataexport PGHOME=/home/postgres/postgre14export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATHexport 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=5432logging_collector = onlog_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       METHODlocal      all       all                    trusthost      all       all    0.0.0.0/0        md5EOF
 
 
 
复制代码
 

 

  • 第一行的内容表示 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 用户,而是新建一个用户。

 

 
#新建一个用户 acaiCREATE USER acai WITH password '密码';#新建一个数据库acaidb,属主是acaiCREATE 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.4Documentation=man:postgres(1)After=network.target
[Service]Type=forkingUser=postgresGroup=postgres
Environment=PGPORT=5432Environment=PGDATA=/home/postgres/pgdata
ExecStart=/home/postgres/postgre14/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300ExecStop=/home/postgres/postgre14/bin/pg_ctl stop -D ${PGDATA} -s -m fastExecReload=/home/postgres/postgre14/bin/pg_ctl reload -D ${PGDATA} -s
KillMode=mixedKillSignal=SIGINTTimeoutSec=120
[Install]WantedBy=multi-user.targetEOF
 
 
 
复制代码
 

 

执行下列命令,使得 PostgreSQL 数据库开机自启动脚本生效。

 

 
systemctl daemon-reloadsystemctl enable postgre14
 
 
 
复制代码
 

 

后续再启停数据库,查看数据库状态,就可以使用下面的这些命令了

 

 
systemctl start postgre14systemctl stop postgre14systemctl status postgre14

与[转帖]以 PostgreSql 为例,说明生产级别数据库安装要考虑哪些问题?相似的内容:

[转帖]以 PostgreSql 为例,说明生产级别数据库安装要考虑哪些问题?

作者:字母哥哥 2022-08-25 吉林 本文字数:4728 字 阅读完需:约 16 分钟 我让公司的小伙伴写一个生产级别的 PostgreSQL 的安装文档,结果他和我说:“不是用一个命令就能安装好么?还用写文档么?”。我知道他想说的是这个命令:yum install postgresql-se

[转帖]以 PostgreSql 为例,说明生产级别数据库安装要考虑哪些问题?

https://xie.infoq.cn/article/487b467b952683e6dd27d9061 我让公司的小伙伴写一个生产级别的 PostgreSQL 的安装文档,结果他和我说:“不是用一个命令就能安装好么?还用写文档么?”。我知道他想说的是这个命令:yum install postg

[转帖]Barman安装及备份PostgreSQL

barman特点 零数据丢失备份。保证用户在只有一台备份服务器的情况下达到零数据丢失。 与备份服务器合作。允许备份服务器在与主服务器的流式复制不可用时,从barman获取wal文件。 可靠的监控集成。用于监控和创建有关Barman配置状态的报告。 可并行的备份和恢复。以更快的速度执行拷贝,加快了整个

[转帖]PostgreSQL 的性能调优方法

https://juejin.cn/post/7119489847529570334 浅谈PostgreSQL的性能调校 PostgreSQL的性能调校是指调校数据库以提高性能和快速访问数据;我们可以通过调校查询和数据库性能相关的参数来调校PostgreSQL的数据库性能。为了提高性能,我们需要通过

[转帖]pg_hba.conf 中 md5 和 scram-sha-256 的区别

db: postgresql 11 auth-method 指定当一个连接匹配这个记录时,要使用的认证方法。下面对可能的选择做了概述,详见第 20.3 节。 trust 无条件地允许连接。这种方法允许任何可以与PostgreSQL数据库服务器连接的用户以他们期望的任意PostgreSQL数据库用户身

[转帖]以系统设计为中心打造卓越体验,浪潮信息发布Inspur KOS操作系统

https://aijishu.com/a/1060000000378449 在中国服务器卖得最多的浪潮信息,居然出了一款名为Inspur KOS的操作系统。 说实话,第一次听到这个消息我还是愕然的,但转瞬又释然了。为什么释然?这道理就像是海底捞出火锅底料、全聚德出烤鸭礼盒一样,算是核心业务的衍生化

[转帖]KVM——以桥接的方式搭建虚拟机网络配置

https://www.cnblogs.com/weilu2/p/kvm_bridge_centos7.html 以桥接的方式搭建虚拟机网络,其优势是可以将网络中的虚拟机看作是与主机同等地位的服务器。 在原本的局域网中有两台主机,一台是win7(IP: 192.168.0.236),一台是CentO

[转帖]KVM——以桥接的方式搭建虚拟机网络配置

https://www.cnblogs.com/weilu2/p/kvm_bridge_centos7.html 以桥接的方式搭建虚拟机网络,其优势是可以将网络中的虚拟机看作是与主机同等地位的服务器。 在原本的局域网中有两台主机,一台是win7(IP: 192.168.0.236),一台是CentO

[转帖]Microchip将以83.5亿美元收购Microsemi

http://www.eefans.com/archives/262979 2017年 2018年的新闻 Microchip 收购 Microsemi Microsemi 收购 PMC 所以现在PMC的Raid卡其实是属于 Microchip的. EETimes旧金山报道,根据双方本周四(3月1日)

[转帖]shell 把以空格分隔的变量 分割后的每个字段赋值给变量

比如我有一个变量 “123 456 789”,要求以空格为分隔符把这个变量分隔,并把分隔后的字段分别赋值给变量,即a=123;b=456;c=789 共有3中方法: 法一:先定义一个数组,然后把分隔出来的字段赋值给数组中的每一个元素 法二:通过eval+赋值的方式 法三:通过多次awk把每个字段赋值