1.高可用
服务可用时间量,冗余是高可用的基础
2.备用数据库
备用数据库的想法是保留始终具有相同数据的生产数据库的副本,并且可以在故障发生时使用备份数据库。有以下几种方式对备用数据库进行分类。
根据复制的性质:
物理备份数据库:复制磁盘块
逻辑备份数据:复制数据流更改
备份的同步性:
异步:存在数据丢失的可能性
同步:不存在数据丢失的可能性,主设备的提交等待备用设备的响应。
3.件目录结构
postgresql的磁盘布局:
data/base
存放各数据库实例对应文件夹,命名方式是数据库的OID,select oid,datname from pg_database;可以查询每个数据库的OID,对应的可以在base目录下找到这个数据库的文件夹。
数据表使用表名对应的relfilenode作为文件名存放在数据库文件夹下,select relfilenode,relname from pg_class;
可以查询表的relfilenode,然后在相应的数据库文件夹下可以看到这个表的文件,该文件用于存储表的数据,最大1G,超出自动扩展,扩展名为relfilenode.1,relfilenode.2 ...
为了提高I/O性能,pg总是以8K大小的块执行IO。因此数据文件总是以8K的步长增长。(物理复制时,双方需要使用相同的块大小)
global -全局数据
包括全局系统表
pg_clog -提交日志
提交日志是一个工作数据库实例的一个重要组成部分。它存储系统上进行的事物的状态。
一个事物有四种状态(TRANSACTION_STATUS_IN_PROGRESS,TRANSACTION_STATUS_COMMITTED,TRANSACTION_STATUS_ABORTED,TRANSACTION_STATUS_SUB_COMMITTED),
如果一个事物的提交日志的状态是不可用,postgresql将不知道是否应该被看到。
pg_hba.conf -基于主机的网络配置
常用认证方式
trust
ident
md5
pg_ident.conf -身份认证
pg_notify-监听、通知数据
系统存储关于监听、通知的信息(异步后端接口)
pg_serial-关于提交序列化事物的信息
序列化事物的信息存储在这里。我们必须在磁盘上存储序列化事物提交信息,以确保长时间运行的事物不会膨胀内存,内部采用一个简单的SLRU结构来跟踪这些事物
pg_snapshot-输出快照
pg_stat_tmp-临时统计数据
该信息被大多数pg_stat_*系统视图所需要
pg_subtrans -子事物数据
pg_xlog postgresql的事物日志(WAL)
WAL(Write Ahead Log)和XLOG是一个事物的两个名字。默认事物日志文件大小16M。
xlog不可能无限增大,需要删除无用的xlog,原则:如果xlog文件中的所有更改也被放到数据文件中,xlog才可以被截断(删除)。需要检查点的配置
postgresql.conf -pg配置文件
4.配置参数
shared_buffers
数据库服务使用的共享内存缓冲区。默认值128MB。(一般使用Mem的25%,不超过40%,因为pg还要依赖于os cache)
background writer
pg的一个独立子进程,用于将shared_buffers中的dirty buffer写入磁盘。(数据的修改不用立即写入磁盘,因为写入了wal日志,可以用于故障恢复)
background writer会根据LRU链表,扫描shared buffers,如果发现脏页,就会调用系统write,写入磁盘。具体调用策略见下面参数
bgwriter_delay
指定background writer将dirty buffer写入磁盘的频率,默认200ms,即200ms写一次,写入周期200ms。
bgwriter_lru_maxpages
指定一次写入周期 写入的dirty buffer的最大数量(单位buffers),默认值100
bgwriter_lru_multiplier
一次写入周期要写到磁盘的dirt buffers的数量T,是基于上一个周期内server进程需要的新的buffers数量N。
bgwriter_lru_multiplier是一个乘法因子p,T = N * p;较大的值为峰值提供了缓冲,较小的值则需要服务器进程完成写入。
例:
上一个写入周期内服务器使用了100个new buffer(100次写产生不同的脏数据),bgwriter_lru_multiplier使用了默认值2.那么这次会将100*2个dirty buffers写到磁盘中,也就是腾出了200个干净的buffers,
如果再下一次写入周期前,服务器申请的buffers数量小于这个值,则自然够用,如果大于200,那么需要服务器自己去触发将dirty buffers写入磁盘。
备注
上面的写入磁盘行为指的是普通意义的向磁盘文件写,但是会被操作系统缓存,所以实际行为可能没有写到磁盘中。
bgwriter_flush_after
当超过bgwriter_flush_after bytes的数据被bgwriter写时,强制OS将缓存数据写入物理磁盘。默认值为512KB
write ahead log(WAL)
wal_level
指定写入到wal中的信息,默认是minimal,只写从crash中恢复或者快速shutdown需要的信息。
replica 是在minimal的基础上