MyException - 我的异常网
当前位置:我的异常网» 操作系统 » PostgreSQL on ECS SLA 源复制备库+秒级快照+PITR+

PostgreSQL on ECS SLA 源复制备库+秒级快照+PITR+自动清理

www.MyException.Cn  网友分享于:2013-12-18  浏览:0次
PostgreSQL on ECS SLA 流复制备库+秒级快照+PITR+自动清理

点击有惊喜


阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

 

标签

 

PostgreSQL , ECS , 阿里云 , 部署 , 物理镜像 , 流复制 , 快照备份 , 备份验证 , 自动清理


背景

介绍在阿里云ECS环境中,实现一个非常简单,但是可用性和可靠性满足一般企业要求的PostgreSQL环境。

包括:

1、自动启动数据库

2、包括一个物理流复制备库

3、包括自动的秒级快照备份

4、包括自动备份集有效性验证

5、包括自动清理N天以前的备份集、归档文件

6、监控请自建

部署环境介绍

1、ECS

111.111.111.199 (主)    
    
111.111.111.223 (备)    

2、云盘

400 GB    

3、软件

OS: CentOS 7.4 x64    
    
PostgreSQL: 10.1    
    
ZFS: 0.7.3    

部署流程

双机

1、安装软件

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

2、修改内核配置

vi /etc/sysctl.conf    
    
# add by digoal.zhou      
fs.aio-max-nr = 1048576      
fs.file-max = 76724600      
        
kernel.sem = 4096 2147483647 2147483646 512000            
kernel.shmall = 107374182            
kernel.shmmax = 274877906944         
kernel.shmmni = 819200               
      
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          
net.ipv4.tcp_timestamps = 1          
net.ipv4.tcp_tw_recycle = 0          
net.ipv4.tcp_tw_reuse = 1            
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 = 204800000             
      
vm.dirty_expire_centisecs = 3000                   
vm.dirty_ratio = 90                                
      
vm.dirty_writeback_centisecs = 50                  
      
vm.swappiness = 0      
      
vm.mmap_min_addr = 65536      
vm.overcommit_memory = 0           
      
vm.overcommit_ratio = 90           
vm.swappiness = 0                  
vm.zone_reclaim_mode = 0           
net.ipv4.ip_local_port_range = 40000 65535          
fs.nr_open=20480000      

3、修改资源限制

# 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     

4、关闭透明大页

chmod +x /etc/rc.d/rc.local      
vi /etc/rc.local      
      
# 追加      
       
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then      
   echo never > /sys/kernel/mm/transparent_hugepage/enabled      
fi      

5、分配磁盘

parted -s /dev/vdb mklabel gpt    
parted -s /dev/vdb mkpart primary 1MiB 100%    

主机

1、创建文件系统

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

2、加载文件系统

mkdir /data01      
    
vi /etc/fstab      
      
LABEL=data01 /data01     ext4        defaults,noatime,nodiratime,nodelalloc,barrier=0,data=writeback    0 0    
    
    
mount -a     

备机

1、安装ZFS

yum install -y http://download.zfsonlinux.org/epel/zfs-release.el7_4.noarch.rpm    
    
yum install -y kernel-devel-3.10.0-693.2.2.el7.x86_64         
    
    
yum install -y zfs    

2、手动加载zfs模块

/usr/sbin/modprobe zfs    

3、创建zpool和zfs for 数据目录,归档目录

zpool create -o ashift=12 zp1 vdb1    
    
zfs set compression=lz4 zp1        
zfs set canmount=off zp1        
zfs set atime=off zp1        
    
    
zfs create -o mountpoint=/data01 zp1/data01         
zfs create -o mountpoint=/pg_arch zp1/pg_arch        

4、自动加载zpool

vi /etc/rc.local    
    
/usr/sbin/modprobe zfs    
/usr/sbin/zpool import zp1    

双机

1、安装PostgreSQL与EPEL软件 yum 仓库

yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm    
    
yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm    

2、安装数据库软件与周边软件

yum install -y  postgresql10*  postgis24_10*   pgrouting_10*   osm2pgrouting_10*   plpgsql_check_10*   pgbadger pg_top10* hypopg_10*  citus_10*  cstore_fdw_10*   pg_pathman10* orafce10* pgfincore10* pgbson10*  pgmemcache-10* pldebugger10* plv8_10*  geoip10*  ip4r10*  pg_repack10*  pgsphere10*  plr10*    

3、修改环境变量

su - postgres      
      
vi ~/.bash_profile      
      
export PS1="$USER@`/bin/hostname -s`-> "      
export PGPORT=3433      
export PGDATA=/data01/pg_root$PGPORT      
export LANG=en_US.utf8      
export PGHOME=/usr/pgsql-10      
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH      
export DATE=`date +"%Y%m%d%H%M"`      
export PATH=$PGHOME/bin:$PATH:.      
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      

主机

1、创建数据目录,修改权限

cd /data01    
mkdir pg_root3433    
mkdir -p pg_arch/pg3433    
    
chown postgres:postgres /data01/*    
ln -s /data01/pg_arch /pg_arch    

备机

1、创建数据目录,修改权限

cd /data01    
mkdir pg_root3433    
chown postgres:postgres /data01/*    
    
cd /pg_arch    
mkdir pg3433    
chown postgres:postgres /pg_arch/pg3433    

主机

1、初始化数据库集群

su - postgres    
initdb -D $PGDATA -U postgres --locale=en_US.UTF8 -E UTF8     

2、修改数据库参数配置

cd $PGDATA    
    
vi postgresql.auto.conf    
    
listen_addresses = '0.0.0.0'      
port = 3433  # 监听端口      
max_connections = 2000  # 最大允许的连接数      
superuser_reserved_connections = 10      
unix_socket_directories = '.'      
unix_socket_permissions = 0700      
tcp_keepalives_idle = 60      
tcp_keepalives_interval = 60      
tcp_keepalives_count = 10      
shared_buffers = 16GB                  # 共享内存,建议设置为系统内存的1/4  .      
maintenance_work_mem = 512MB           # 系统内存超过32G时,建议设置为1GB。超过64GB时,建议设置为2GB。超过128GB时,建议设置为4GB。      
work_mem = 64MB                        # 1/4 主机内存 / 256 (假设256个并发同时使用work_mem)    
wal_buffers = 128MB                    # min( 2047MB, shared_buffers/32 )     
dynamic_shared_memory_type = posix      
vacuum_cost_delay = 0      
bgwriter_delay = 10ms      
bgwriter_lru_maxpages = 500      
bgwriter_lru_multiplier = 5.0      
effective_io_concurrency = 0      
max_worker_processes = 128                     
max_parallel_workers_per_gather = 16        # 建议设置为主机CPU核数的一半。      
max_parallel_workers = 16                   # 看业务AP和TP的比例,以及AP TP时间交错分配。实际情况调整。例如 主机CPU cores-2    
wal_level = replica      
fsync = on      
synchronous_commit = off      
full_page_writes = on                  # 支持原子写超过BLOCK_SIZE的块设备,在对齐后可以关闭。或者支持cow的文件系统可以关闭。    
wal_writer_delay = 10ms      
wal_writer_flush_after = 1MB      
checkpoint_timeout = 30min      
max_wal_size = 32GB                    # shared_buffers*2     
min_wal_size = 8GB                     # max_wal_size/4     
archive_mode = always      
archive_command = '/bin/date'      
hot_standby = on    
max_wal_senders = 10      
max_replication_slots = 10      
wal_receiver_status_interval = 1s      
max_logical_replication_workers = 4      
max_sync_workers_per_subscription = 2      
random_page_cost = 1.2      
parallel_tuple_cost = 0.1      
parallel_setup_cost = 1000.0      
min_parallel_table_scan_size = 8MB      
min_parallel_index_scan_size = 512kB      
effective_cache_size = 32GB                 # 建议设置为主机内存的5/8。         
log_destination = 'csvlog'      
logging_collector = on      
log_directory = 'log'      
log_filename = 'postgresql-%a.log'      
log_truncate_on_rotation = on      
log_rotation_age = 1d      
log_rotation_size = 0      
log_min_duration_statement = 5s      
log_checkpoints = on      
log_connections = on                            # 如果是短连接,并且不需要审计连接日志的话,建议OFF。    
log_disconnections = on                         # 如果是短连接,并且不需要审计连接日志的话,建议OFF。    
log_error_verbosity = verbose      
log_line_prefix = '%m [%p] '      
log_lock_waits = on      
log_statement = 'ddl'      
log_timezone = 'PRC'      
log_autovacuum_min_duration = 0       
autovacuum_max_workers = 5      
autovacuum_vacuum_scale_factor = 0.1      
autovacuum_analyze_scale_factor = 0.05      
autovacuum_freeze_max_age = 1000000000      
autovacuum_multixact_freeze_max_age = 1200000000      
autovacuum_vacuum_cost_delay = 0      
statement_timeout = 0                                # 单位ms, s, min, h, d.  表示语句的超时时间,0表示不限制。      
lock_timeout = 0                                     # 单位ms, s, min, h, d.  表示锁等待的超时时间,0表示不限制。      
idle_in_transaction_session_timeout = 2h             # 单位ms, s, min, h, d.  表示空闲事务的超时时间,0表示不限制。      
vacuum_freeze_min_age = 50000000      
vacuum_freeze_table_age = 800000000      
vacuum_multixact_freeze_min_age = 50000000      
vacuum_multixact_freeze_table_age = 800000000      
datestyle = 'iso, ymd'      
timezone = 'PRC'      
lc_messages = 'en_US.UTF8'      
lc_monetary = 'en_US.UTF8'      
lc_numeric = 'en_US.UTF8'      
lc_time = 'en_US.UTF8'      
default_text_search_config = 'pg_catalog.simple'      
shared_preload_libraries='pg_stat_statements,pg_pathman'      

2、修改备库将用到的自动流复制参数文件

cp $PGHOME/share/recovery.conf.sample ./    
mv recovery.conf.sample recovery.done    
    
vi recovery.done    
    
recovery_target_timeline = 'latest'    
standby_mode = on    
primary_conninfo = 'host=111.111.111.223 port=3433 user=rep password=xxxxxxxxxx'    
restore_command = 'BASEDIR="/pg_arch/pg3433" ; find $BASEDIR -name %f -exec cp {} %p \\;'     

3、修改数据库认证权限访问控制ACL, pg_hba.conf

vi pg_hba.conf    
host all all 0.0.0.0/0 md5    
host replication rep 0.0.0.0/0 md5    

4、启动数据库

pg_ctl start    

5、创建流复制,数据库角色

psql -n    
    
create role rep replication login encrypted password 'xxxxxxxxxx';    

备机

1、创建备库

su - postgres    
pg_basebackup -D $PGDATA -F p -h 111.111.111.199 -p 3433 -U rep     

2、修改数据库配置

cd $PGDATA    
vi postgresql.auto.conf    
    
archive_command = 'DT="/pg_arch/pg3433/`date +%F`" ; test ! -d $DT && mkdir -p $DT ; test ! -f $DT/%f && cp %p $DT/%f'    

3、配置备库的自动同步参数文件

mv recovery.done recovery.conf    
    
vi recovery.conf    
    
primary_conninfo = 'host=111.111.111.199 port=3433 user=rep password=xxxxxxxxxx'    

5、修改数据目录权限

su - root    
chmod 700 /data01/pg_root3433    

双机

1、系统启动时,自动启动数据库

vi /etc/rc.local      
      
# 追加      
      
su - postgres -c "pg_ctl start"      

2、重启ECS验证

reboot      
      
su - postgres      
      
psql      
      
postgres=# show max_connections ;      
 max_connections       
-----------------      
 2000      
(1 row)      

备机

1、配置自动备份(快照备份)

su - root    
    
mkdir script    
    
vi /root/script/zfs_snap.sh        
    
#!/bin/bash       
    
date +%F%T    
# 自动创建、清理快照    
/sbin/zfs snapshot zp1/data01@`date +%Y%m%d`        
/sbin/zfs destroy zp1/data01@`date +%Y%m%d -d '-10 day'`        
/sbin/zfs list -t snapshot     
    
# 自动清理归档    
rm -rf /pg_arch/pg3433/`date +%F -d '-11 day'`    
    
date +%F%T    

2、设置脚本权限

chmod 500 /root/script/zfs_snap.sh        

3、设置自动备份任务,每天备份一次

# crontab -e        
1 8 * * * /root/script/zfs_snap.sh >> /root/zfs_snap.log 2>&1     

 

点击有惊喜

文章评论

程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
每天工作4小时的程序员
每天工作4小时的程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员应该关注的一些事儿
程序员应该关注的一些事儿
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
旅行,写作,编程
旅行,写作,编程
编程语言是女人
编程语言是女人
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我的丈夫是个程序员
我的丈夫是个程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
那些争议最大的编程观点
那些争议最大的编程观点
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
鲜为人知的编程真相
鲜为人知的编程真相
如何成为一名黑客
如何成为一名黑客
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
中美印日四国程序员比较
中美印日四国程序员比较
 程序员的样子
程序员的样子
程序员和编码员之间的区别
程序员和编码员之间的区别
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
10个调试和排错的小建议
10个调试和排错的小建议
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
我是如何打败拖延症的
我是如何打败拖延症的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
代码女神横空出世
代码女神横空出世
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的鄙视链
程序员的鄙视链
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有