title: 部署postgresql 12.3 #标题tags: 部署postgresql #标签
date: 2021-12-12
categories: postgresql # 分类

记录下postgresql 12.3部署过程。

安装postgresql

  1. # 安装基础依赖
  2. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  3. yum clean all && yum makecache fast
  4. yum -y install systemd-devel bash-completion bash-completion-extras \
  5. wxBase pgagent_11 gcc make perl-ExtUtils-Embed readline-devel \
  6. zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel \
  7. openssl-devel tcl-devel python-devel openssh-clients
  8. # 内核优化
  9. # 注: kernel.shmmax的值取决于你的系统配置,我机器是16G内存,故设置为13958643712 B(13G)
  10. cat >> /etc/sysctl.conf << EOF
  11. kernel.shmmax = 13958643712
  12. kernel.shmall = 4194304
  13. kernel.shmmni = 4096
  14. fs.file-max = 7672460
  15. net.ipv4.ip_local_port_range = 1024 65000
  16. net.core.rmem_default = 1048576
  17. net.core.rmem_max = 4194304
  18. net.core.wmem_default = 262144
  19. net.core.wmem_max = 1048576
  20. kernel.sem = 50100 64128000 50100 1280
  21. EOF
  22. sysctl -p
  23. # 最大可打开文件数及进程数等
  24. $ cat >> /etc/security/limits.conf << EOF
  25. * soft nofile 65536
  26. * hard nofile 65536
  27. * soft nproc 65536
  28. * hard nproc 65536
  29. * soft memlock unlimited
  30. * hard memlock unlimited
  31. EOF
  32. # 创建数据库运行用户及数据存放目录
  33. $ useradd postgres
  34. echo Y51KEBzU | passwd --stdin postgres
  35. mkdir -p /apps/usr/postgres/data
  36. # 安装pgsql
  37. wget https://mirrors.tuna.tsinghua.edu.cn/postgresql/source/v12.3/postgresql-12.3.tar.gz
  38. curl https://mirrors.tuna.tsinghua.edu.cn/postgresql/source/v12.3/postgresql-12.3.tar.gz.md5 | md5sum -c
  39. tmp_dir=$(mktemp -d)
  40. tar zxf postgresql-12.3.tar.gz -C ${tmp_dir} --strip-components=1
  41. cd ${tmp_dir}
  42. ./configure \
  43. --prefix=/apps/usr/postgres \
  44. --with-pgport=5432 \
  45. --with-systemd \
  46. --with-perl \
  47. --with-tcl \
  48. --with-python \
  49. --with-openssl \
  50. --with-pam \
  51. --with-libxml \
  52. --with-libxslt \
  53. --enable-thread-safety \
  54. --with-wal-blocksize=16 \
  55. --with-blocksize=8
  56. gmake world && gmake install-world
  57. cat >> /etc/profile << "EOF"
  58. export PGPORT=5432
  59. export PGDATA=/apps/usr/postgres/data
  60. export PGHOME=/apps/usr/postgres
  61. export PATH=$PGHOME/bin:$PATH
  62. export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
  63. export MANPATH=$PGHOME/share/man:$MANPATH
  64. export LANG=en_US.utf8
  65. EOF
  66. source /etc/profile
  67. chown -R postgres /apps/usr/postgres
  68. # 查看sql版本
  69. $ psql --version
  70. psql (PostgreSQL) 12.3

切换至postgres用户初始化数据库

  1. $ su - postgres
  2. # 设置postgresql默认用户密码,使用openssl指令生成密码文件
  3. openssl rand -base64 20 | cut -c 6-15 > /home/postgres/.psqlpasswd
  4. initdb -D /apps/usr/postgres/data/ --pwfile=/home/postgres/.psqlpasswd -A md5
  5. # --pwfile: 指定密码文件
  6. # -A: 指定登录验证方式,默认为trust,表示无需密码即可登录到数据库
  7. # 注:data目录可以不存在,但绝对不允许其目录下有数据,这样将会初始化失败。

输出如下,表示初始化成功。

部署postgresql 12.3 - 图1

注: 若想添加为系统服务,使用systemctl指令来控制服务的启停,可以参考官方文档。如下(个人觉得没必要配置):

  1. [Unit]
  2. Description=PostgreSQL database server
  3. Documentation=man:postgres(1)
  4. [Service]
  5. Type=notify
  6. User=postgres
  7. ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data # 注意这里替换为你的实际路径
  8. ExecReload=/bin/kill -HUP $MAINPID
  9. KillMode=mixed
  10. KillSignal=SIGINT
  11. TimeoutSec=0
  12. [Install]
  13. WantedBy=multi-user.target

启动前配置

  1. cd /apps/usr/postgres/data
  2. cp postgresql.conf{,.bak} # 备份默认配置文件
  3. cat /apps/usr/postgres/data/postgresql.conf # 修改配置文件如下
  4. listen_addresses = '*' # *表示监听所有地址
  5. port = 5432 # 监听端口
  6. max_connections = 1000 # 指定最大连接数
  7. tcp_keepalives_idle = 60
  8. tcp_keepalives_interval = 10
  9. tcp_keepalives_count = 10
  10. shared_buffers = 1GB # 设置共享内存缓冲区的内存量,建议值为系统总内存的25%
  11. temp_buffers = 80MB # 设置用于每个数据库会话中的临时缓冲区的最大内存量
  12. max_files_per_process = 65535 # 设置允许每个服务器子进程同时打开的文件的最大数量。不能大于ulimt -n的数值
  13. bgwriter_delay = 100ms
  14. bgwriter_lru_maxpages = 1000
  15. bgwriter_flush_after = 0
  16. synchronous_commit = off
  17. wal_level = replica
  18. archive_mode = on
  19. # 以下路径替换为实际备份路径
  20. archive_command = 'test ! -f /apps/usr/postgres/backup/incre/%f && cp %p /apps/usr/postgres/backup/incre/%f'
  21. full_page_writes = on
  22. wal_buffers = -1
  23. wal_writer_delay = 100ms
  24. wal_writer_flush_after = 256kB
  25. checkpoint_timeout = 30min
  26. max_wal_size = 5GB
  27. min_wal_size = 1GB
  28. log_destination = 'stderr'
  29. logging_collector = on
  30. log_directory = 'logs'
  31. log_filename = 'postgresql-%Y-%m-%d_%H.log'
  32. log_file_mode = 0640
  33. log_rotation_age = 1d
  34. log_rotation_size = 100MB
  35. log_truncate_on_rotation = off
  36. log_min_messages = notice
  37. log_min_error_statement = notice
  38. log_min_duration_statement = 3s
  39. log_checkpoints = on
  40. log_connections = on
  41. log_error_verbosity = verbose
  42. log_line_prefix = '%m '
  43. log_timezone = 'PRC'
  44. track_activities = on
  45. log_autovacuum_min_duration = 3s
  46. autovacuum_max_workers = 4
  47. autovacuum_naptime = 45s
  48. autovacuum_vacuum_scale_factor = 0.1
  49. autovacuum_analyze_scale_factor = 0.1
  50. autovacuum_freeze_max_age = 1600000000
  51. autovacuum_multixact_freeze_max_age = 1600000000
  52. vacuum_freeze_table_age = 1500000000
  53. vacuum_multixact_freeze_table_age = 1500000000
  54. datestyle = 'iso, mdy'
  55. timezone = 'PRC'
  56. lc_messages = 'en_US.utf8'
  57. lc_monetary = 'en_US.utf8'
  58. lc_numeric = 'en_US.utf8'
  59. lc_time = 'en_US.utf8'
  60. default_text_search_config = 'pg_catalog.english'
  61. $ vim /apps/usr/postgres/data/pg_hba.conf # 添加访问权限
  62. host all all 192.168.20.5/24 md5

关于配置文件的优化,可以参考官方文档

启动并访问数据库

  1. $ pg_ctl start # 启动数据库
  2. $ ss -lnput | grep 5432 # 确定端口在监听
  3. tcp LISTEN 0 128 *:5432 *:* users:(("postgres",pid=31928,fd=3))
  4. tcp LISTEN 0 128 :::5432 :::* users:(("postgres",pid=31928,fd=4))
  5. # 访问测试
  6. $ cat ~/.psqlpasswd # 查看密码
  7. S1w4ktZhUV
  8. $ psql -h 127.0.0.1
  9. Password for user postgres: # 输入查看到的密码
  10. postgres=# \l # 查看所有库
  11. List of databases
  12. Name | Owner | Encoding | Collate | Ctype | Access privileges
  13. -----------+----------+----------+------------+------------+-----------------------
  14. postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
  15. template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
  16. | | | | | postgres=CTc/postgres
  17. template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
  18. | | | | | postgres=CTc/postgres
  19. (3 rows)

调整linux大页面

使用大的页面可以减少使用大量连续的内存块时的开销,尤其是当使用较大的shared_buffers值时。要在PostgreSQL中使用此功能,需要一个带有CONFIG_HUGETLBFS=y和的内核CONFIG_HUGETLB_PAGE=y。还必须调整内核设置vm.nr_hugepages。如果要估计所需的大页面数,请在未启用大页面的情况下启动PostgreSQL,然后进行一下操作:

  1. $ pg_pid=$(head -1 $PGDATA/postmaster.pid)
  2. $ pmap ${pg_pid} | awk '/rw-s/ && /zero/ {print $2}'
  3. 1140976K
  4. $ grep ^Hugepagesize /proc/meminfo
  5. Hugepagesize: 2048 kB

计算: 1140976 / 2048 约等于 558 ,那么内核参数应配置如下:

  1. $ echo "vm.nr_hugepages=558" >> /etc/sysctl.conf
  2. $ sysctl -p
  3. $ grep Huge /proc/meminfo # 验证大页面分配情况
  4. AnonHugePages: 61440 kB
  5. HugePages_Total: 558
  6. HugePages_Free: 558
  7. HugePages_Rsvd: 0
  8. HugePages_Surp: 0
  9. Hugepagesize: 2048 kB

如果机器上的其他程序也需要大页面,则较大的设置将是适当的。