赞
踩
目录
一、服务器配置
服务器IP | CPU | 内存 | 磁盘 | 备注 |
---|---|---|---|---|
172.18.2.18 | 16核 | 64G | 1000G | Postgres主节点、PG-POOL主节点 |
172.18.2.20 | 16核 | 64G | 1000G | 备库 |
172.18.2.33 | 16核 | 64G | 1000G | 备库 |
172.18.2.100 | 虚拟IP,PG_POOL VPI |
Postgres版本:11.5
Pg-Pool版本:4.1
- #1. 创建用户组
- groupadd postgres
- #2. 创建用户
- useradd -m -g postgres postgres
- #3. 为用户增加密码(密码)
- passwd postgres
编译PostgreSQL需要下列软件包:
要求GNU make版本3.80或以上;其他的make程序或更老的GNU make版本将不会工作(GNU make有时以名字gmake
安装)。要测试GNU make可以输入:
make --version
你需要一个ISO/ANSI C 编译器(至少是 C89兼容的)。我们推荐使用最近版本的GCC,不过,众所周知的是PostgreSQL可以利用许多不同厂商的不同编译器进行编译。
除了gzip和bzip2之外,我们还需要tar来解包源代码发布。
默认时将自动使用GNU Readline库。它允许psql(PostgreSQL的命令行 SQL 解释器)记住你输入的每一个命令并且允许你使用箭头键来找回和编辑之前的命令。如果你不想用它,那么你必需给configure
声明--without-readline
选项。作为一种可选方案,你常常可以使用 BSD许可证的libedit
库,它最初是在NetBSD上开发的。libedit
库是GNU Readline兼容的, 如果没有发现libreadline
或者configure
使用了--with-libedit-preferred
选项,都会使用这个库。如果你使用的是一个基于包的 Linux 发布,那么要注意你需要readline
和readline-devel
两个包,特别是如果这两个包在你的版本里是分开的时候。
默认的时候将使用zlib压缩库。 如果你不想使用它,那么你必须给configure
声明--without-zlib
选项。使用这个选项关闭了在pg_dump和pg_restore中对压缩归档的支持。
依赖zlib-devel、readline-devel
- yum install -y zlib-devel
- yum install -y readline-devel
PostgreSQL 11.5 源代码可以从官方网站 https://www.postgresql.org/download/的下载区中获得。将得到一个名为postgresql-11.5.tar.gz
或postgresql-11.5.tar.bz2
的文件
- #1. 创建并修改安装目录权限
- mkdir -p /opt/software/postgresql
- chown -R postgres:postgres /opt/software/postgresql
- chmod 750 -R /opt/software/postgresql
- #2. 配置数据目录
- mkdir -p /data/postgresql/data
- chown -R postgres:postgres /data/postgresql
- chmod 750 -R /data/postgresql
- #3.进入/opt/software文件夹,解压源码
- tar -zxvf postgresql-11.5.tar.gz
- #4.进入源码目录/opt/software/postgresql-11.5 执行配置脚本
- ./configure --prefix=/opt/software/postgresql
- #5.编译
- make
- #6. 回归测试(这条命令不能以 root 运行;请在非特权用户下运行该命令,可跳过)
- make check
- #7. 安装文件
- make install
- #8.添加依赖包环境变量,修改/etc/profile
- LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/software/postgresql/lib
- export LD_LIBRARY_PATH
- #9.添加安装路径,修改/etc/profile
- PG_HOME=/opt/software/postgresql
- PATH=$PG_HOME/bin:$PATH
- export PATH
- #10. 刷新配置
- source /etc/profile
- #11. 创建socket目录
- mkdir -p /data/postgresql/socket
- #1. 数据库初始化需要先切换到postgres用户
- su postgres
- #2. 执行初始化语句
- initdb -E UTF-8 -D /data/postgresql/data --locale=en_US.UTF-8 -U postgres -W
- #3. 修改数据库配置,允许远程连接,以及端口、连接数等配置
- vim /data/postgresql/data/postgresql.conf
- #4. 添加远程连接信息
- vim /data/postgresql/data/pg_hba.conf
- 加入以下配置
- host all all 0.0.0.0/0 md5
- #1. 数据库启动需要先切换到postgres用户
- su postgres
- #2. 启动命令
- pg_ctl -D /data/postgresql/data -l /data/postgresql/logfile start
- #3. 重启命令
- pg_ctl -D /data/postgresql/data -l /data/postgresql/logfile restart
- #3. 停止命令
- pg_ctl -D /data/postgresql/data -l /data/postgresql/logfile stop
- #1. 数据库启动需要先切换到postgres用户
- su postgres
- #2. 刷新命令
- /opt/software/postgresql/bin/pg_ctl reload -D /data/postgresql/data
User Name | Password | Detail |
---|---|---|
repl | rep | 流复制账号 |
pgpool | pgpool | 健康检查、复制时延检查账号 |
postgres | postgres | 在线恢复账号 |
- #1. 连接主库(172.18.2.18)
- psql -U postgres -h 127.0.0.1 -d postgres
- #2.添加数据同步账号:rep
- CREATE USER rep WITH PASSWORD '密码' REPLICATION;
- CREATE ROLE pgpool WITH PASSWORD '密码' LOGIN;
- #3 授予所有权限
- GRANT ALL PRIVILEGES ON all tables in schema public TO rep;
- GRANT ALL PRIVILEGES ON all tables in schema public TO pgpool;
- #3. 创建WAL日志归档路径
- mkdir -p /data/postgresql/archivedir
- #4. 修改数据库配置,允许远程连接,以及端口、连接数等配置
- vim /data/postgresql/data/postgresql.conf
- listen_addresses = '*'
- archive_mode = on
- archive_command = 'gzip < %p > /data/postgresql/data/archivedir/%f.gz'
- max_wal_senders = 20
- max_replication_slots = 20
- wal_level = replica
- hot_standby = on
- wal_log_hints = on
- #5. 添加流复制和在线恢复等账号的免密登录
- vim /home/postgres/.pgpass
- 172.18.2.18:5432:replication:rep:密码
- 172.18.2.20:5432:replication:rep:密码
- 172.18.2.33:5432:replication:rep:密码
- 172.18.2.18:5432:postgres:postgres:密码
- 172.18.2.20:5432:postgres:postgres:密码
- 172.18.2.33:5432:postgres:postgres:密码
- chmod 600 /home/postgres/.pgpass
- #4. 添加远程连接信息
- vim /data/postgresql/data/pg_hba.conf
- 加入以下配置
- host replication rep 0.0.0.0/0 trust
- #1.备用节点执行主库的安装步骤,参考第二节:安装步骤,执行2.1~2.4(可以选择直接把安装后的文件使用scp直接copy过来)
- #2. 切换账号postgres
- su postgres
- #3. 同步主库配置及数据
- #执行命名对应参数说明:
- #-h 启动的主库数据库地址 -p 主库数据库端口
- #-U 流复制用户 -w 不使用密码验证
- #-Fp 备份输出正常的数据库目录 -Xs 使用流复制的方式进行复制
- #-Pv 输出复制过程的详细信息 -R 为备库创建recovery.conf文件
- #-D 指定创建的备库的数据库目录
- pg_basebackup -h 172.18.2.18 -p 5432 -U rep -Fp -Xs -Pv -R -D /data/postgresql/data
- #4. 修改recovery.conf 加入:
- restore_command = 'scp postgresql@172.18.2.18:/data/postgresql/data/archivedir/%f.gz /data/postgresql/data/archivedir/ && gunzip < /data/postgresql/data/archivedir/%f.gz > %p'
- #5. 启动服务
- pg_ctl -D /data/postgresql/data -l /data/postgresql/logfile start
- #1. 查看主备信息 备库是t,主库是f。
- select pg_is_in_recovery();
- #1. 解压pgpool-II-4.1.0.tar.gz至/opt/software
- tar -zxvf pgpool-II-4.1.0.tar.gz -C /opt/software
- #2. 编译,进入解压后的文件目录,配置安装信息
- cd /opt/software/pgpool-II-4.1.0
- #参数说明
- #配置pgpool的安装路径:--prefix=/opt/software/pgpool-2/
- #配置pg的安装路径:--with-pgsql=/opt/software/postgresql
- ./configure --prefix=/opt/software/pgpool-2/ --with-pgsql=/opt/software/postgresql
- #3. 编译、安装
- make
- make install
- #4. 编译安装在线恢复组件
- cd /opt/software/pgpool-II-4.1.0/src/sql/pgpool-recovery
- make
- make install
- # 创建恢复模板
- su postgres
- psql -f pgpool-recovery.sql template1
- # 修改postgres.conf添加以下内容
- pgpool.pg_ctl = '/usr/local/pgsql/bin/pg_ctl'
- #5. 配置安装路径,修改/etc/profile
- PG_POOL_HOME=/opt/software/pgpool-2/
- PATH=$PG_POOL_HOME/bin:$PATH
- #6. 刷新配置
- source /etc/profile
- #7. 新建文件路径:
- mkdir -p /opt/software/pgpool-2/run/pgpool
- mkdir -p /opt/software/pgpool-2/script
- mkdir -p /opt/software/pgpool-2/log/pgpool
- #8. 修改目录权限
- chown -R postgresql:postgresql /opt/software/pgpool-2
# 基础配置 pid_file_name = '/opt/software/pgpool-2/run/pgpool/pgpool.pid' # pid 文件位置, 如果不配置有默认的 logdir = '/opt/software/pgpool-2/log/pgpool' # status 文件存储位置 # 通用 listen_addresses = '*' port = 9999 socket_dir='/opt/software/pgpool-2/run/pgpool' #存储PG-POOl连接信息 pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir='/opt/software/pgpool-2/run/pgpool' #存储PCP连接信息 num_init_children=32 #PG-POOL 客户端连接数、默认32,超过该连接数,新的连接将被阻塞,进入等待队列,直到有连接被关闭,等待队列请求最大数与net.core.somaxconn有关 listen_backlog_multiplier=100 #单个PG-POOL进程允许前端请求队列的最大值,允许的最大连接数=num_init_children*listen_backlog_multiplier reserved_connections=0 #PG-POOL 保留连接数 默认为0,表示不做保留,当此项大于0时,等待队列失效,最大连接数=num_init_children-reserved_connections,超过最大连接数的连接请求将被拒绝 enable_pool_hba=off #默认为false,此项设置为true时,将启用pool_hba.conf中的用户认证,添加用户认证需要修改pool_hba.conf并刷新配置:pgpool reload pool_passwd='' #配置账户密码文件路径,默认为pool_passwd,配置''时,关闭使用文件配置 allow_clear_text_frontend_auth=true #如果PostgreSQL后端服务器需要md5或SCRAM认证才能进行某些用户的身份验证,但该用户的密码不在"pool_passwd"文件中,那么启用allow_clear_text_frontend_auth将允许PG-POOL使用明文密码进行认证,默认为false authentication_timeout=60 # 认证超时时间,默认60s,设置为0表示禁用超时 # 后台数据库链接信息配置,PGPOOL连接PG服务器 backend_hostname0 = '172.18.2.18' # 数据库信息 PG-POOL 使用该连接访问PG数据库 backend_port0 = 5432 # 数据库端口 backend_weight0 = 1 # 这个权重和后面负载比例相关 backend_data_directory0 = '/data/postgresql/data' #用于在线恢复 backend_flag0 = 'ALLOW_TO_FAILOVER' backend_application_name0='master218' #对应postgresql.conf的application_name backend_hostname1 = '172.18.2.20' # 数据库信息 PG-POOL 使用该连接访问PG数据库 backend_port1 = 5432 # 数据库端口 backend_weight1 = 1 # 这个权重和后面负载比例相关 backend_data_directory1 = '/data/postgresql/data' #用于在线恢复 backend_flag1 = 'ALLOW_TO_FAILOVER' backend_application_name0='slave220' #对应postgresql.conf的application_name backend_hostname2 = '172.18.2.33' # 数据库信息 PG-POOL 使用该连接访问PG数据库 backend_port2 = 5432 # 数据库端口 backend_weight2 = 1 # 这个权重和后面负载比例相关 backend_data_directory2 = '/data/postgresql/data' #用于在线恢复 backend_flag2 = 'ALLOW_TO_FAILOVER' backend_application_name0='slave233' #对应postgresql.conf的application_name connection_cache=on #PG-POOL连接数据库缓存的连接数,如果设置为off,所有连接都不会缓存 max_pool=20 #单个PG-POOL进程允许的最大缓存连接数,如果一个请求是相同的数据库、相同的用户、相同的参数(SQL)会使用缓存的连接,反之创建一个新的连接。因此连接后台数据库的连接数可能达到num_init_children*max_pool # 流复制相关配置 replication_mode = off # 复制模式关闭,复制模式和主从模式互斥 load_balance_mode = on # 负载均衡打开 master_slave_mode = on # 主从打开 master_slave_sub_mode = 'stream' # 主从之间模式为流传输stream disable_load_balance_on_write = 'transaction' # 是否关闭写人后负载均衡,此项设置为transaction时,如果写入后立即查询一行,则查询操作会发送到主节点,当此项设置为off时,查询操作会进行负载均衡,随机发送到一个节点进行查询,若数据同步还未完成,此时可能导致读取的数据未更新 statement_level_load_balance = on #设置为 on 时,将为每个读取查询决定负载平衡节点。 当设置为 off 时,负载均衡节点在会话开始时间决定,直到会话结束才会改变。 例如,在使用连接池的应用中,对后端服务器保持连接打开状态,因为会话可能会保持很长时间,所以直到会话结束,负载均衡节点才会发生变化。 在此类应用程序中,启用 statement_level_load_balance 时,可以决定每个查询的负载平衡节点,而不是每个会话。 默认为关闭。 sr_check_period = 10 # 流复制检查相关配置 sr_check_user = 'pgpool' sr_check_password = '' sr_check_database = 'wnos' delay_threshold=10737418240 #指定备用服务器上相对于主服务器的复制延迟的最大容忍级别(以 WAL 字节为单位)。 如果延迟超过此配置级别,即使启用了 load_balance_mode,Pgpool-II 也会停止向备用服务器发送 SELECT 查询并开始将所有内容路由到主服务器,直到备用服务器赶上主服务器。 将此参数设置为 0 将禁用延迟检查。 每个 sr_check_period 执行此延迟阈值检查。 默认值为 0。 log_standby_delay = 'if_over_threshold' #指定何时记录复制延迟。none:不记录 'always':检查一次记录一次 'if_over_threshold':超过了阈值 # 数据库运行状况检查,以便Pgpool-II执行故障转移: 数据库的主备切换,可以为每个PG服务器单独配置,对应前面配置的backend_hostname 例如:health_check_period0=30 无数字后缀,默认为全部服务器应用该配置 health_check_period = 20 # Health check period, Disabled (0) by default health_check_timeout = 20 # 健康检查的超时时间,0 永不超时 health_check_user = 'pgpool' # 健康检查的用户 health_check_password = '' # 健康检查的用户密码 health_check_database = 'postgres' # 健康检查的数据库 health_check_max_retries=3 #指定在健康检查失败时放弃和启动故障转移之前要执行的最大重试次数。默认为0 health_check_retry_delay=10 #健康检查重试间隔 connect_timeout=10000 # 使用connect() 进行系统调用,调用超时的时间,该参数同样于建立连接池超时时间(ms),默认10000ms # 故障后处理, 为了当postgresql数据库挂掉之后执行相应的策略,故障转移顺序根据backend_hostname的后缀有关,例如backend_hostname0出故障会优先转移到backend_hostname1而非backend_hostname2 # 这个脚本时放在pgpool的目录下, 确切的说是由pgpool执行脚本来维护集群中数据库的状态 failover_command = '/opt/software/pgpool-2/script/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S' #指定在 PostgreSQL 后端节点断开(宕机)时要运行的用户命令 # failback_command= #指定当 PostgreSQL 后端节点附加到 Pgpool-II 时要运行的用户命令。 follow_master_command = 'opt/software/pgpool-2/script/follow_master.sh %d %h %p %D %m %H %M %P %r %R' # 2台服务器不配置, 如果使用3台PostgreSQL服务器,则需要指定follow_master_command在主节点故障转移上的故障转移后运行。如果有两个PostgreSQL服务器,则无需follow_master_command设置。 failover_on_backend_error=on # 当设置为 on 时,Pgpool-II 将 PostgreSQL 后端连接上的读/写错误视为后端节点故障,并在断开当前会话后触发该节点上的故障转移。 当此项设置为 off 时,Pgpool-II 仅在出现此类错误时报告错误并断开会话 search_primary_node_timeout = 300 #指定发生故障转移时搜索主节点的最长时间(以秒为单位)。 如果在此配置时间内没有找到主节点,Pgpool-II 将放弃寻找主节点。 默认值为 300,将此参数设置为 0 意味着永远尝试。 detach_false_primary = on #断开失效的主节点,避免脑裂 auto_failback=true #设置为 on 时,如果节点状态为 down 但流式复制正常工作,则备用节点将自动进行故障恢复。 auto_failback_interval=60 #指定自动故障回复的执行间隔的最短时间(以秒为单位)。 在上一次自动故障恢复之后的指定时间过去之前,不会执行下一次自动故障恢复。 例如,当 Pgpool-II 频繁检测到后端因为网络错误而关闭时,您可以通过将此参数设置为足够大的值来避免重复故障转移和故障回复。 默认值为 60。将此参数设置为 0 表示自动故障回复不等待。 use_watchdog = on # 激活看门狗配置 wd_hostname = '172.18.2.18' # 当前主机(也可使用IP) wd_port = 9000 # 工作端口 # 虚拟IP指定 delegate_IP = '172.18.2.100' # 此IP作为虚拟IP,需要在网段内不存在 if_cmd_path = '/sbin' # 如果if_up_cmd, if_down_cmd 以/开头, 忽略此配置 # 命令中的`eth0` 请根据自己机器上ip addr 实际的网卡名称进行修改 # 当前节点启动指定虚拟IP的命令 if_up_cmd = '/sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0' # 当前节点指定关闭虚拟IP的命令 if_down_cmd = '/sbin/ip addr del $_IP_$/24 dev eth0' # 指定用于在虚拟 IP 切换后发送 ARP 请求的命令 arping_cmd = '/usr/sbin/arping -U $_IP_$ -w 1 -I eth0' # watchdog 健康检查 wd_heartbeat_port = 9694 # 健康检查端口 wd_heartbeat_keepalive = 2 wd_heartbeat_deadtime = 30 # 其他机器地址配置(多台请增加配置) heartbeat_destination0 = '172.18.2.20' heartbeat_destination_port0 = 9694 heartbeat_device0 = 'eth0' heartbeat_destination1 = '172.18.2.33' heartbeat_destination_port1 = 9694 heartbeat_device1 = 'eth0' # 其他pgpgool节点链接信息(多台请增加配置) other_pgpool_hostname0 = '172.18.2.20' # 其他节点地址 other_pgpool_port0 = 9999 other_wd_port0 = 9000 # 其他节点watchdof 端口 other_pgpool_hostname1 = '172.18.2.33' # 其他节点地址 other_pgpool_port1 = 9999 other_wd_port1 = 9000 # 其他节点watchdof 端口 # watchdog 发生故障后, 处理的相关配置(宕机, pgpool进程终止) # 当某个节点故障后, failover_when_quorum_exists = on failover_require_consensus = on allow_multiple_failover_requests_from_node = on enable_consensus_with_half_votes = on # 在线恢复(master 恢复后自动变为备库)此配置将在多个pgpool-ii 节点时无效 recovery_user = 'postgres' recovery_password = '' recovery_1st_stage_command = 'recovery_1st_stage' # 在线恢复第一阶段执行的脚本,这个脚本时放在postgresql数据目录下的 #recovery_2nd_stage_command = '' # 在线恢复第二阶段执行的脚本,这个脚本时放在postgresql数据目录下的 recovery_timeout=3600 #如果在线恢复未在此时间内完成,则指定以秒为单位取消在线恢复的超时时间。 由于Pgpool-II在第二阶段在线恢复时不接受连接,因此该参数可用于取消在线恢复以管理在线恢复期间的服务停机时间。 client_idle_limit_in_recovery = 1800 #指定在联机恢复期间,如果自上次查询以来客户端保持空闲,则断开客户端的时间(以秒为单位)。 client_idle_limit_in_recovery 与client_idle_limit 类似,但只在在线恢复的第二阶段生效。此项值需要小于recovery_timeout #缓存 memory_cache_enabled=on # 默认关闭,内存查询缓存可用于 Pgpool-II 的所有模式。 内存查询缓存保留 SELECT 结果并重用结果。 当底层表被更新时,相应的缓存条目将被删除(如果 memqcache_auto_cache_invalidation 开启。该参数默认开启),因此不需要重新启动 Pgpool-II。 memqcache_method = 'shmem' #指定用于缓存的存储类型'shmem':使用共享的内存 'memcached':使用缓存 默认:shmem memqcache_expire = 1800 #以秒为单位指定查询缓存的生命周期。 默认值为 0。这意味着缓存不会过期并且缓存保持有效直到表更新。 memqcache_auto_cache_invalidation = on #动态清理缓存 memqcache_maxcache = 10240 #指定要缓存的 SELECT 查询结果的最大字节数。 Pgpool-II 不会缓存数据大小大于该值的结果。 此值应该小于等于:memqcache_cache_block_size当由于大小限制而拒绝缓存数据时,将会打印LOG日志 #white_memqcache_table_list= #缓存白名单,多个之间用,分割 此参数仅针对视图和中间结果集 #black_memqcache_table_list= #缓存黑名单,多个之间用,分割 配置的表将不会被缓存 memqcache_total_size = 50000000 # 缓存最大空间 memqcache_max_num_cache = 1000000 # 指定缓存条目的数量。 这用于定义缓存管理空间的大小。推荐缓存空间=memqcache_max_num_cache*48 memqcache_cache_block_size = 10240 #指定缓存块大小。 Pgpool-II 使用按 memqcache_cache_block_size 块排列的缓存内存。 SELECT 结果被打包到块中并且必须适合单个块。 并且大于 memqcache_cache_block_size 的结果不被缓存。memqcache_cache_block_size 必须至少设置为 512。 memqcache_oiddir = '/opt/software/pgpool-2/run/oiddir' #memqcache_oiddir 目录包含数据库的子目录。 目录名称是数据库的 OID。 此外,每个数据库目录都包含 SELECT 语句使用的每个表的文件。 同样,文件名是表的 OID。 这些文件包含指向查询缓存的指针,用作删除缓存的键。
- #1. 对rep、postgres用户的密码分别进行MD5加密并添加到pcp.conf
- echo 'pgpool:'`pg_md5 密码` >> /opt/software/pgpool-2/etc/pcp.conf
- #1. 复制pool_hba.conf.sample 重命名为pool_hba.conf
- cp pool_hba.conf.sample pool_hba.conf
- #2. 追加配置
- host all pgpool 0.0.0.0/0 md5
- host all postgres 0.0.0.0/0 md5
- #1. 创建文件failover.sh
- cp /opt/software/pgpool-2/etc/failover.sh.sample /opt/software/pgpool-2/script/failover.sh
- #2.修改PGHOME
- PGHOME=/opt/software/postgresql
- #3. 修改权限
- chown postgres:postgres /opt/software/pgpool-2/script/failover.sh
- #1. 创建文件follow_master.sh
- cp /opt/software/pgpool-2/etc/follow_master.sh.sample /opt/software/pgpool-2/script/follow_master.sh
- #2.修改以下配置
- PGHOME=/opt/software/postgresql
- ARCHIVEDIR=/data/postgresql/data/archivedir
- REPLUSER=rep
- PCP_USER=postgres
- PGPOOL_PATH=/opt/software/pgpool-2
- PCP_PORT=9898
- #3. 修改权限
- chown postgres:postgres /opt/software/pgpool-2/script/follow_master.sh
- #4. 添加PG免密登录
- echo '172.18.2.18:9898:pgpool:密码' >> /home/postgres/.pcppass
- echo '172.18.2.20:9898:pgpool:密码' >> /home/postgres/.pcppass
- echo '172.18.2.33:9898:pgpool:密码' >> /home/postgres/.pcppass
- chmod 600 /home/postgres/.pcppass
- chown postgres:postgres /home/postgres/.pcppass
- #1. 创建文件recovery_1st_stage、pgpool_remote_start
- cp -p /opt/software/pgpool-2/etc/recovery_1st_stage.sample /data/postgresql/data/recovery_1st_stage
- cp -p /opt/software/pgpool-2/etc/pgpool_remote_start.sample /data/postgresql/data/pgpool_remote_start
- chown postgres:postgres /data/postgresql/data/recovery_1st_stage
- chown postgres:postgres /data/postgresql/data/pgpool_remote_start
- #2. 修改recovery_1st_stage
- PGHOME=/opt/software/postgresql
- ARCHIVEDIR=/data/postgresql/archivedir
- REPLUSER=rep
- #修改pgpool_remote_start
- PGHOME=/opt/software/postgresql
- #1.使用root账号拷贝安装文件
- scp -r root@172.18.2.18:/opt/software/pgpool-2 /opt/software/
- #2. 修改目录权限
- chown -R postgres:postgres /opt/software/pgpool-2
- #3. 切换postgres账号
- su postgres
- #4. 拷贝配置文件
- scp -r postgres@172.18.2.18:/home/postgres/.pgpass /home/postgres/.pgpass
- scp -r postgres@172.18.2.18:/data/postgres/data/recovery_1st_stage /data/postgresql/data/
- scp -r postgres@172.18.2.18:/data/postgres/data/pgpool_remote_start /data/postgresql/data/
- #5. 修改pgpool.conf
- use_watchdog = on # 激活看门狗配置
- wd_hostname = '172.18.2.20' # 当前主机(也可使用IP)
- wd_port = 9000 # 工作端口
- heartbeat_destination0 = '172.18.2.18' #从节点换成主节点的
- heartbeat_destination_port0 = 9694 #从节点换成主节点的
- heartbeat_device0 = 'eth0' #从节点换成主节点的
- # 其他pgpgool节点链接信息(多台请增加配置)
- other_pgpool_hostname0 = '172.18.2.20' # 其他节点地址
- other_pgpool_port0 = 9999
- other_wd_port0 = 9000
- #1. 启动(pgpool启动需要root权限)
- pgpool -n -d -D > /opt/software/pgpool-2/log/pgpool/pgpool.log 2>&1 & # 有debug日志
- pgpool -n -D > /opt/software/pgpool-2/log/pgpool/pgpool.log 2>&1 & # 无debug日志
- #2. 停止
- pgpool -m fast stop
- #1. 查看节点状态
- show pool_nodes;
- #1. 查看是否安装了ssh服务
- rpm -qa | grep openssh
- #2. 生成key,一直回车即可
- ssh-keygen -t rsa
- #3. 发送秘钥到对应的主机
- ssh-copy-id 主机
PostgreSQL性能调优重要的配置参数
选项 | 默认值 | 说明 | 是否优化 | 原因 |
---|---|---|---|---|
max_connections | 100 | 允许客户端连接的最大数目 | 是 | 根据实际使用情况调整 |
hot_standby_feedback | off | Specifies whether or not a hot standby will send feedback to the primary or upstream standby about queries currently executing on the standby. This parameter can be used to eliminate query cancels caused by cleanup records, but can cause database bloat on the primary for some workloads. Feedback messages will not be sent more frequently than once per wal_receiver_status_interval . The default value is off . This parameter can only be set in the postgresql.conf file or on the server command line. | 是 | on |
wal_receiver_timeout | 60 | 备库日志接收超时时间(s) | 是 | 受网络影响,超时会造成同步失败,建议设置为5min |
wal_sender_timeout | 60 | 主库日志发送超时时间(s) | 是 | 受网络影响,超时会造成同步失败,建议设置为5min |
max_wal_size | 1GB | 主库日志发送最大字节数 | 是 | 过小会产生多个片段文件,过大容易造成超时,配合wal_receiver_timeout和wal_sender_timeout调整 |
min_wal_size | 80MB | 主库日志发送最小字节数 | 是 | |
fsync | on | 强制把数据同步更新到磁盘 | 是 | 因为系统的IO压力很大,为了更好的测试其他配置的影响,把改参数改为off |
shared_buffers | 24MB | 决定有多少内存可以被PostgreSQL用于缓存数据(推荐内存的1/4) | 是 | 在IO压力很大的情况下,提高该值可以减少IO |
work_mem | 1MB | 使内部排序和一些复杂的查询都在这个buffer中完成 | 是 | 有助提高排序等操作的速度,并且减低IO |
effective_cache_size | 128MB | 优化器假设一个查询可以用的最大内存,和shared_buffers无关(推荐内存的1/2) | 是 | 设置稍大,优化器更倾向使用索引扫描而不是顺序扫描 |
maintenance_work_mem | 16MB | 这里定义的内存只是被VACUUM等耗费资源较多的命令调用时使用 | 是 | 把该值调大,能加快命令的执行 |
wal_buffer | 768kB | 日志缓存区的大小 | 是 | 可以降低IO,如果遇上比较多的并发短事务,应该和commit_delay一起用 |
checkpoint_segments | 3 | 设置wal log的最大数量数(一个log的大小为16M) | 是 | 默认的48M的缓存是一个严重的瓶颈,基本上都要设置为10以上 |
checkpoint_completion_target | 0.5 | 表示checkpoint的完成时间要在两个checkpoint间隔时间的N%内完成 | 是 | 能降低平均写入的开销 |
commit_delay | 0 | 事务提交后,日志写到wal log上到wal_buffer写入到磁盘的时间间隔。需要配合commit_sibling | 是 | 能够一次写入多个事务,减少IO,提高性能 |
commit_siblings | 5 | 设置触发commit_delay的并发事务数,根据并发事务多少来配置 | 是 | 减少IO,提高性能 |
centos7启动报错,命令缺少沾滞位的关系
- 2021-08-19 14:16:50: pid 22259: WARNING: checking setuid bit of if_up_cmd
- 2021-08-19 14:16:50: pid 22259: DETAIL: ifup[/sbin/ip] doesn't have setuid bit
- 2021-08-19 14:16:50: pid 22259: WARNING: checking setuid bit of if_down_cmd
- 2021-08-19 14:16:50: pid 22259: DETAIL: ifdown[/sbin/ip] doesn't have setuid bit
原因:该命令缺少沾滞位的关系(centos7)
解决方案:
- cd /sbin/
- chmod +s ifup
- chmod +s ip
- chmod +s arping
原因:未配置unix_socket_directories目录,该目录默认在tmp目录下,指定服务器要侦听来自客户端应用程序的连接的Unix域套接字的目录。 列出由逗号分隔的多个目录可以创建多个套接字。 条目之间的空白被忽略; 如果您需要在名称中包含空格或逗号,请用双引号括住目录名称。 一个空值指定不侦听任何Unix域套接字,在这种情况下,只有TCP / IP套接字可用于连接到服务器。/tmp目录的定时清理,会断开socket从而导致系统判定为文件已传输,从而归档wal,导致pg_wal下的分段文件被删除
解决办法:修改postgresql.conf 配置unix_socket_directories到外部目录,示例:unix_socket_directories=
PG-POOL 启动后,主节点未生成虚拟VIP
原因1:虚拟VIP IP被占用 解决办法:更换虚拟VIP的IP
原因2:启动账号无root权限 解决办法:添加入sudoers 或者使用root启动
opt/software/postgresql/bin/psql template1 -c "CREATE EXTENSION pgpool_recovery" 报错
- psql: could not connect to server: No such file or directory
- Is the server running locally and accepting
- connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
原因1:postgres端口非5432 解决办法:命令添加参数指定Postgres端口:-p 端口
原因2:修改了unix_socket_directories 解决办法:连接数据库执行一下sql脚本:
CREATE EXTENSION pgpool_recovery; \dx+ pgpool_recovery;
故障转移和在线恢复是通过postgres远程命令将某个备库(使用PG-POOL实际上固定的,跟pgpool.conf文件中配置的顺序有关)提升为主库、然后其他备库包括恢复后变为备库的旧主库,从新的主库拉取数据,然后重启,所以相关故障转移脚本可以自行编写,注意的是:若直接使用官方给的故障转移脚本,但相关安装、配置路径与默认路径不一致时,请逐个核查脚本文件内容的文件路径,例如:.pgpass路径,本文中,没有描述这一块,各位可根据实际配置的路径去做修改,便于更好的理解故障转移的过程。
While using Streaming replication and Hot Standby, it is important to determine which query can be sent to the primary or the standby, and which one should not be sent to the standby. Pgpool-II's Streaming Replication mode carefully takes care of this.
We distinguish which query should be sent to which node by looking at the query itself.
These queries should be sent to the primary node only
INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE, CREATE, DROP, ALTER, COMMENT
SELECT ... FOR SHARE | UPDATE
SELECT in transaction isolation level SERIALIZABLE
LOCK command more strict than ROW EXCLUSIVE MODE
DECLARE, FETCH, CLOSE
SHOW
Some transactional commands:
BEGIN READ WRITE, START TRANSACTION READ WRITE
SET TRANSACTION READ WRITE, SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
SET transaction_read_only = off
Two phase commit commands: PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED
LISTEN, UNLISTEN, NOTIFY
VACUUM
Some sequence functions (nextval and setval)
Large objects creation commands
Multi-statement queries (multiple SQL commands on single line)
These queries can be sent to both the primary node and the standby node. If load balancing is enabled, these types of queries can be sent to the standby node. However, if delay_threshold is set and the replication delay is higher than delay_threshold, queries are sent to the primary node.
SELECT not listed above
COPY TO STDOUT
EXPLAIN
EXPLAIN ANALYZE and the query is SELECT not including writing functions
SHOW
These queries are sent to both the primary node and the standby node
SET
DISCARD
DEALLOCATE ALL
In an explicit transaction:
Transaction starting commands such as BEGIN are sent to both the primary node and the standby node.
Following SELECT and some other queries that can be sent to both primary or standby are executed in the transaction or on the standby node.
Commands which cannot be executed on the standby such as INSERT are sent to the primary. After one of these commands, even SELECTs are sent to the primary node, This is because these SELECTs might want to see the result of an INSERT immediately. This behavior continues until the transaction closes or aborts.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。