linux网站部署手册,PostgreSQL on Linux 最佳部署手册

转载自:http://mp.weixin.qq.com/s/FR65pyRmpEFFVvoJ28uBUg

背景

数据库的安装一直以来都挺复杂的,特别是Oracle,现在身边都还有安装Oracle数据库赚外快的事情。

Postgresql其实安装很简单,但是那仅仅是可用,并不是好用。很多用户使用默认的方法安装好数据库之后,然后测试一通性能,发现性能不行就不用了。

原因不用说,多方面没有优化的结果。

Postgresql数据库为了适应更多的场景能使用,默认的参数都设得非常保守,通常需要优化,比如检查点,SHARED BUFFER等。

本文将介绍一下Postgresql on Linux的最佳部署方法,其实在我的很多文章中都有相关的内容,但是没有总结成一篇文档。

安装常用包

# yum -y install coreutils glib2 lrzsz mpstat dstat sysstat e4fsprogs xfsprogs ntp readline-devel zlib-devel openssl-devel pam-devel libxml2-devel libxslt-devel python-devel tcl-devel gcc make smartmontools flex bison perl-devel perl-ExtUtils* openldap-devel

配置OS内核参数

# vi /etc/sysctl.conf

# add by digoal.zhou

fs.aio-max-nr = 1048576

fs.file-max = 76724600

kernel.core_pattern= /data01/corefiles/core_%e_%u_%t_%s.%p

# /data01/corefiles事先建好,权限777

kernel.sem = 4096 2147483647 2147483646 512000

#信号量,ipcs -l或-u查看,每16个进程一组,每组信号量需要17个信号量。

kernel.shmall = 107374182

#所有共享内存段相加大小限制(建议内存的80%)

kernel.shmmax = 274877906944

#最大单个共享内存段大小(建议为内存一半),>9.2的版本已大幅降低共享内存的使用

kernel.shmmni = 819200

#一共能生成多少共享内存段,每个PG数据库集群至少2个共享内存段

net.core.netdev_max_backlog = 10000

net.core.rmem_default = 262144

# The default setting of the socket receive buffer in bytes.

net.core.rmem_max = 4194304

# The maximum receive socket buffer size in bytes

net.core.wmem_default = 262144

# The default setting (in bytes) of the socket send buffer.

net.core.wmem_max = 4194304

# The maximum send socket buffer size in bytes.

net.core.somaxconn = 4096

net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.tcp_keepalive_intvl = 20

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_time = 60

net.ipv4.tcp_mem = 8388608 12582912 16777216

net.ipv4.tcp_fin_timeout = 5

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syncookies = 1

#开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击

net.ipv4.tcp_timestamps = 1

#减少time_wait

net.ipv4.tcp_tw_recycle = 0

#如果=1则开启TCP连接中TIME-WAIT套接字的快速回收,但是NAT环境可能导致连接失败,建议服务端关闭它

net.ipv4.tcp_tw_reuse = 1

#开启重用。允许将TIME-WAIT套接字重新用于新的TCP连接

net.ipv4.tcp_max_tw_buckets = 262144

net.ipv4.tcp_rmem = 8192 87380 16777216

net.ipv4.tcp_wmem = 8192 65536 16777216

net.nf_conntrack_max = 1200000

net.netfilter.nf_conntrack_max = 1200000

vm.dirty_background_bytes = 409600000

#系统脏页到达这个值,系统后台刷脏页调度进程pdflush(或其他)(dirty_expire_centisecs/100)秒前的脏页刷到磁盘

vm.dirty_expire_centisecs = 3000

#比这个值老的脏页,将被刷到磁盘。3000表示30秒。

vm.dirty_ratio = 95

#如果系统进程刷脏页太慢,使得系统脏页超过内存95 %时,则用户进程如果有写磁盘的操作(如fsync,fdatasync等调用),则需要主动把系统脏页刷出。

#有效防止用户进程刷脏页,在单机多实例,并且使用CGROUP限制单实例IOPS的情况下非常有效。

vm.dirty_writeback_centisecs = 100

# pdflush(或其他)后台刷脏页进程的唤醒间隔,100表示1秒。

vm.extra_free_kbytes = 4096000

vm.min_free_kbytes = 2097152

vm.mmap_min_addr = 65536

vm.overcommit_memory = 0

#在分配内存时,允许少量over malloc,如果设置为1,则认为总是有足够的内存,内存较少的测试环境可以使用1 .

vm.overcommit_ratio = 90

#当overcommit_memory = 2时,用于参与计算允许指派的内存大小。

vm.swappiness = 0

#关闭交换分区

vm.zone_reclaim_mode = 0

#禁用numa,或者在vmlinux.

net.ipv4.ip_local_port_range = 40000 65535

#本地自动分配的TCP,UDP端口号范围

# vm.nr_hugepages = 66536

#建议shared buffer设置超过64GB时使用大页,页大小/proc/meminfo Hugepagesize

配置OS资源限制

# vi /etc/security/limits.conf

* soft nofile 1024000

* hard nofile 1024000

* soft nproc unlimited

* hard nproc unlimited

* soft core unlimited

* hard core unlimited

* soft memlock unlimited

* hard memlock unlimited

配置OS防火墙

(建议按业务场景设置,我这里先清掉)

iptables -F

selinux

如果没有这方面的需求,建议禁用

# vi /etc/sysconfig/selinux

SELINUX=disabled

SELINUXTYPE=targeted

部署文件系统

注意SSD对齐,延长寿命,避免写放大。

parted -s /dev/sda mklabel gpt

parted -s /dev/sda mkpart primary 1MiB 100%

格式化

mkfs.ext4 /dev/sda1 -m 0 -O extent,uninit_bg -E lazy_itable_init=1 -T largefile -L u01

建议使用的ext4 mount选项

# vi /etc/fstab

LABEL=u01 /u01 ext4 defaults,noatime,nodiratime,nodelalloc,barrier=0,data=writeback 0 0

# mount -a

编译器

建议使用较新的编译器,安装gcc 6.2.0略

cd ~

tar -jxvf gcc6.2.0.tar.bz2

tar -jxvf python2.7.12.tar.bz2

# vi /etc/ld.so.conf

/home/digoal/gcc6.2.0/lib

/home/digoal/gcc6.2.0/lib64

/home/digoal/python2.7.12/lib

# ldconfig

环境变量

# vi ~/env_pg.sh

export PS1="$USER@`/bin/hostname -s`-> "

export PGPORT=$1

export PGDATA=/$2/digoal/pg_root$PGPORT

export.utf8

export PGHOME=/home/digoal/pgsql9.6

export LD_LIBRARY_PATH=/home/digoal/gcc6.2.0/lib:/home/digoal/gcc6.2.0/lib64:/home/digoal/python2.7.12/lib:$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH

export PATH=/home/digoal/gcc6.2.0/bin:/home/digoal/python2.7.12/bin:/home/digoal/cmake3.6.3/bin:$PGHOME/bin:$PATH:.

export DATE=`date +"%Y%m%d%H%M"`

export MANPATH=$PGHOME/share/man:$MANPATH

export PGHOST=$PGDATA

export PGUSER=postgres

export PGDATABASE=postgres

alias rm='rm -i'

alias ll='ls -lh'

unalias vi

编译Postgresql

建议使用NAMED_POSIX_SEMAPHORES

. ~/env_pg.sh 1921 u01

cd postgresql-9.6.1

export USE_NAMED_POSIX_SEMAPHORES=1

LIBS=-lpthread CC="/home/digoal/gcc6.2.0/bin/gcc" CFLAGS="-O3 -flto" ./configure --prefix=/home/digoal/pgsql9.6

LIBS=-lpthread CC="/home/digoal/gcc6.2.0/bin/gcc" CFLAGS="-O3 -flto" make world -j 64

LIBS=-lpthread CC="/home/digoal/gcc6.2.0/bin/gcc" CFLAGS="-O3 -flto" make install-world

初始化数据库集群

pg_xlog建议放在IOPS最好的分区。

. ~/env_pg.sh 1921 u01

initdb -D $PGDATA -E UTF8 --locale=C -U postgres -X /u02/digoal/pg_xlog$PGPORT

配置postgresql.conf

以Postgresql 9.6,512G内存主机为例

最佳到文件末尾即可,重复的会以末尾的作为有效值。

$ vi postgresql.conf

listen_addresses = '0.0.0.0'

port = 1921

max_connections = 5000

unix_socket_directories = '.'

tcp_keepalives_idle = 60

tcp_keepalives_interval = 10

tcp_keepalives_count = 10

shared_buffers = 128GB

maintenance_work_mem = 4GB

dynamic_shared_memory_type = posix

vacuum_cost_delay = 0

bgwriter_delay = 10ms

bgwriter_lru_maxpages = 1000

bgwriter_lru_multiplier = 10.0

bgwriter_flush_after = 0

max_parallel_workers_per_gather = 0

old_snapshot_threshold = -1

backend_flush_after = 0

wal_level = replica

synchronous_commit = off

full_page_writes = on

wal_buffers = 1GB

wal_writer_delay = 10ms

wal_writer_flush_after = 0

checkpoint_timeout = 30min

max_wal_size = 256GB

min_wal_size = 64GB

checkpoint_completion_target = 0.05

checkpoint_flush_after = 0

max_wal_senders = 5

random_page_cost = 1.0

parallel_tuple_cost = 0

parallel_setup_cost = 0

min_parallel_relation_size = 0

effective_cache_size = 300GB

force_parallel_mode = off

log_destination = 'csvlog'

logging_collector = on

log_truncate_on_rotation = on

log_checkpoints = on

log_connections = on

log_disconnections = on

log_error_verbosity = verbose

log_timezone = 'PRC'

autovacuum = on

log_autovacuum_min_duration = 0

autovacuum_max_workers = 16

autovacuum_naptime = 15s

autovacuum_vacuum_scale_factor = 0.02

autovacuum_analyze_scale_factor = 0.01

vacuum_freeze_table_age = 1500000000

vacuum_multixact_freeze_table_age = 1500000000

datestyle = 'iso,mdy'

timezone = 'PRC'

lc_messages = 'C'

lc_monetary = 'C'

lc_numeric = 'C'

lc_time = 'C'

default_text_search_config = 'pg_catalog.english'

shared_preload_libraries='pg_stat_statements'

配置pg_hba.conf

避免不必要的访问,开放允许的访问,建议务必使用密码访问。

$ vi pg_hba.conf

host all all 0.0.0.0/0 md5

启动数据库

pg_ctl start

好了,你的Postgresql数据库基本上部署好了,可以愉快的玩耍了。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值