首页
解决方案
技术服务
专业数据库维保服务 大数据维保服务
一体机
Oracle数据库一体机 PolarDB数据库一体机 瀚高数据库一体机 崖山数据库一体机 海扬数据库一体机 高斯数据库一体机 金仓数据库一体机
产品
CLup乘数云统一平台 CData高性能数据库云一体机 CPDA高性能双子星数据库机 CBackup数据库备份恢复云平台 CMiner: PostgreSQL中的CDC CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品 APCC: Greenplum管理平台
文档
文章
客户及伙伴
中启开源
关于我们
登录
×
修改密码

1. 操作系统的参数

1.1 禁止SELinux

在打开SELinux时,有时会导致一些问题,所以为了方便一般会禁止SELinux。

先用命令sestatus检查SELinux是否已被打开,方法如下:

  1. [root@pg01 ~]# sestatus
  2. SELinux status: enabled
  3. SELinuxfs mount: /sys/fs/selinux
  4. SELinux root directory: /etc/selinux
  5. Loaded policy name: targeted
  6. Current mode: enforcing
  7. Mode from config file: enforcing
  8. Policy MLS status: enabled
  9. Policy deny_unknown status: allowed
  10. Max kernel policy version: 28

上面中的SELinux status: enabled说明selinux是打开的。

关闭方法是修改/etc/selinux/config:

  1. SELINUX=disabled

修改上面的配置文件,需要重启才生效。我们可以先设置上,整个装完PostgreSQL之后,可以把机器统一重启一次。

也可以临时关闭,但临时关闭之后,重启之后就失败了,临时关闭的方法为执行下面的命令:

  1. setenforce 0

1.2 关闭防火墙

一般我们会关闭防火墙,这样配置PostgreSQL起来方便一些,因为如果不关闭防火墙或在防火墙上做一些特别的配置,外面的机器有可能连接不上。

Linux下有两种防火墙iptables和firewalld

用下面的命令检查iptables是否打开了:

  1. [root@pg01 ~]# systemctl status iptables
  2. iptables.service
  3. Loaded: not-found (Reason: No such file or directory)
  4. Active: inactive (dead)

如果不是禁止,则用下面的命令禁止:

  1. systemctl disable iptables

看防火墙是否正在运行,如果是则关闭:

  1. systemctl status firewalld

关闭和禁止firewalld的方法如下:

  1. systemctl stop firewalld
  2. systemctl disable firewalld

sysctl.conf中的配置

PostgreSQL在9.3版本之前与oralce数据库一样,都是使用“System V”类型的共享内存,但到9.3版本之后,只使用少量的“System V”类型的共享内存,大部分使用“mmap()”方式的共享内存。

所以在PostgreSQL9.3之前的版本需要配置“System V”类型共享内存的操作系统参数,可以用下面的脚本shmsetup.sh脚本生成共享内存的配置:

  1. #!/bin/bash
  2. # simple shmsetup script
  3. page_size=`getconf PAGE_SIZE`
  4. phys_pages=`getconf _PHYS_PAGES`
  5. shmall=`expr $phys_pages / 2`
  6. shmmax=`expr $shmall \* $page_size`
  7. echo kernel.shmmax = $shmmax
  8. echo kernel.shmall = $shmall

这个脚本的使用方法如下:

  1. shmsetup.sh >> /etc/sysctl.conf

最终我们的/etc/sysctl.conf的示例文件如下:

  1. vm.swappiness=0
  2. vm.overcommit_memory=2
  3. vm.overcommit_ratio=85
  4. vm.dirty_background_ratio=1
  5. vm.dirty_ratio=2
  6. kernel.sem=20 13000 20 650
  7. kernel.sysrq = 1
  8. kernel.core_uses_pid = 1
  9. kernel.msgmnb = 65536
  10. kernel.msgmax = 65536
  11. kernel.msgmni = 2048
  12. net.ipv4.tcp_syncookies = 1
  13. net.ipv4.ip_forward = 0
  14. net.ipv4.conf.default.accept_source_route = 0
  15. net.ipv4.tcp_tw_recycle = 1
  16. net.ipv4.tcp_max_syn_backlog = 4096
  17. net.ipv4.conf.all.arp_filter = 1
  18. net.ipv4.ip_local_port_range = 1025 65535
  19. net.core.netdev_max_backlog = 10000
  20. net.core.rmem_max = 2097152
  21. net.core.wmem_max = 2097152

参数解释如下:

其中kernel.sem对应四个参数:

limits.conf

/etc/security/limits.conf:

  1. * soft nofile 65536
  2. * hard nofile 65536
  3. * soft nproc 131072
  4. * hard nproc 131072

以及/etc/security/ limits.d/,通常此文件的内容如下:

  1. * soft nproc 4096
  2. root soft nproc unlimited

需要把第一行“* soft nproc 4096”改成:

  1. * soft nproc 131072
  2. root soft nproc unlimited

然后su - postgres用ulimit -a命令检查 :

  1. [postgres@pg01 ~]$ ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 513410
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 65536
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 8192
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 4096
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

主要看“open files”与“max user processes”
有时上面的参数不生效,需要重启sshd服务或重启机器。

XFS的设置

格式化XFS建议用下面的参数:

  1. mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 -d agcount=16 -L pgdata01 /dev/sdb1

把上面的参数解释一下:

如果是做了Raid的硬盘,也可以加条带大小的参数:

注意,条带还有两个参数sunit和swidth,实际上这两个参数与su和sw类似,只是单位不同,sunit是扇区大小,sunit=16等同于su=8k,当su=8k时,swidth=64等同于sw=4,4块盘的条带大小为 4×8k=32k,即64个扇区。

通常的mount参数如下:

  1. defaults,noatime,nodiratime,noikeep,nobarrier,logbufs=8,logbsize=32k,allocsize=4M,attr2,inode64,swalloc

需要把这些mount参数配置到/etc/fstab中,如下所示:

  1. echo LABEL=/pgdata01 /data xfs defaults,noatime,nodiratime,nobarrier,logbufs=8,logbsize=32k,allocsize=4M,attr2,largeio,inode64,swalloc 0 0 >>/etc/fstab

如果是SSD硬盘,增加了参数“discard,ikeep”:

  1. defaults,noatime,nodiratime,discard,ikeep,nobarrier,allocsize=4M,attr2,largeio,inode64,swalloc

把xfs的一些mount参数解释一下:

块设备的IO调度策略

数据库通常建议使用deadline,要让deadline生效的最简单方法是对PostgreSQL数据库使用的硬盘做下面的设置:

  1. echo deadline > /sys/block/sda/queue/scheduler
  2. echo deadline > /sys/block/sdb/queue/scheduler
  3. echo deadline > /sys/block/sdc/queue/scheduler

但上面的设置,机器重启之后就失效,所以需要把上面的内容加到/etc/rc.local中,以便每次重启能生效。

当然在CentOS6.X中和CentOS7.X中我们可以在全局范围内把磁盘的默认调度策略就改成deadline,这种方法是我们强烈推荐的,方法如下:

如果是CentOS6.X在/boot/grub/grub.conf中加入elevator=deadline,如下所示:

  1. kernel /vmlinuz-2.6.18-274.3.1.el5 ro root=LABEL=/ elevator=deadline crashkernel=128M@16M quiet panic=30 transparent_hugepage=never
  2. initrd /initrd-2.6.18-274.3.1.el5.img

如果是CentOS7.X,执行下面命令:

  1. grubby --update-kernel=ALL --args="elevator=deadline"

而在centos7.2以上的版本,不需要设置上面的内容,默认已是“deadline”策略了。

禁止透明大页

Linux下的透明大页不够成熟,通常需要禁止,否则会导致数据库的性能变低或反应变慢。

查看是否开启了透明大页:

  1. cat /sys/kernel/mm/*transparent_hugepage/enabled

CentOS7.X下禁止透明大页:

  1. grubby --update-kernel=ALL --args="transparent_hugepage=never"

安装postgresql9.6

  1. yum install postgresql96-contrib.x86_64 postgresql96-libs.x86_64 postgresql96-plperl.x86_64 postgresql96-plpython.x86_64 postgresql96-libs.x86_64 postgresql96-server.x86_64 postgresql96.x86_64 postgresql96-devel.x86_64

数据库的配置

典型的数据库配置:

  1. listen_addresses = '*'
  2. max_connections = 10000
  3. tcp_keepalives_idle = 5
  4. tcp_keepalives_interval = 5
  5. tcp_keepalives_count =3
  6. shared_buffers = 32GB
  7. maintenance_work_mem = 256M
  8. bgwriter_delay = 50ms
  9. wal_level = logical
  10. max_wal_size = 4GB
  11. min_wal_size = 160MB
  12. max_wal_senders = 10
  13. wal_keep_segments = 80
  14. hot_standby = on
  15. hot_standby_feedback = on
  16. logging_collector = on
  17. log_min_duration_statement = 10000
  18. track_io_timing = on
  19. track_functions = all
  20. autovacuum_vacuum_cost_delay = 1ms
  21. statement_timeout = 0
  22. lock_timeout = 60000

有时虽然设置autovacuum_vacuum_cost_delay为1ms,但有些操作系统会延迟10ms,这时需要加大“autovacuum_vacuum_cost_limit”的值,默认为200

默认情况下9.6下logging_collector已经设置为on,不需要设置了。

也可以安装一些常用的插件如pg_stat_statement、pg_buffercache:

  1. CREATE EXTENSION pg_buffercache;
  2. CREATE EXTENSION pg_stat_statements;