接着上一篇文章对DBaaS的介绍,这一次介绍Postgresql的基本情况.
PostgreSQL is the world’s most advanced Open Source database.
而mysql是最流行的开源数据库,事实证明,确实postgresql是要强大许多的.
- 可移植性
- 由ANSI C开发,高性能并且可以在windows,mac,linux,unix上运行
- 可靠
- 遵循ACID,
- atomicity
- 原子性,也就是一个失误中的所有操作要么都发生,要么都不发生,比如给人转账
- consistency
- 也就是之前的状态A,和我这个事务希望他变成什么状态B,再经过事务后,确实变成了状态B
- isolation
- 通过在事务并发的时候,添加锁,来保证事务之间不会互相影响
- durability
- 事务完成后,更改是保存在磁盘中的,不会造成回滚
- atomicity
- 支持事务
- 失败的事务可以回滚
- 支持保存点
- 在事务中创建保存点,并且回滚到这个点
- 写前日志
- 通过在写前先写日志来防止机器挂掉
- 遵循ACID,
- 可伸缩
- 通过多版本的并发控制来防止数据的不一致
- 支持表分区来提高性能
- 安全
- 提供限定主机的访问控制,也就是这能某些机器能够访问这个数据库
- 可用
- 支持主从库,这在负载均衡中很有用
- 在灾难情况下支持流式分库来保证高可用
- 先进
- 支持全文搜索
- 支持触发功能
- 支持存储过程
- 支持热备份,时间点恢复
MVVC(Multi-Version Concurrency Control):
通过在读写的时候,对每一个事务生成快照,等一下然后再写入或者读取,使得读不会阻塞写,写不会阻塞读,进而提高并发性能
Write Ahead Logging (WAL)
通过写前日志机制来实现崩溃的恢复.
1. 在每个insert/update/delete操作前都先生成一个记录
2. 在日志被写入磁盘前不认为数据是安全的
3. 在数据库崩溃的时候提供恢复
4. 然后REDO,再执行一次
Postgresql的限制:
- 整个数据库的大小是没有限制的
- 单表最大32TB,很大很大了
- 单行最大1.6TB
- 单个字段最大1GB
- 根据列的数据类型,最大支持250-600个字段
- 每张表的索引数无限制
postgresql架构如上
postgreql是多进程架构,有三种进程
-
primary (postmaster)
-
per-connection backend process
-
utility (maintenance processes)
-
postmaster
- 当postgresql启动的时候,postmaster首先启动,是整个数据库的管理员,负责数据库的启动和关闭,负责外部的里连接
- 分配
shared memory.
- 启动 utility processes.
- 标记自己的状态
- 接受来自外部的连接
-
backend process
- postmaster接受到来自外部的连接,就创建一个backend process,进而进行验证连接的合法性,如果ok,就把这个进程附加到会话中
安装教程就不写了,其他地方到处都是
数据库的配置
postgresql.conf
一般在/etc/postgresql/11/main
下
可以修改其中的参数,来获得更好的性能和稳定性
连接部分
listen_addresses
默认localhost仅提供本机访问,可以指定可以访问的主机,用逗号隔开,*表示所有主机都可以访问
port
监听的端口,默认5432
max_connections
最大连接数,默认100,随着值的增大,也会小号更多的内存
superuser_reserved_connections
允许最大超级用户连接数,默认为3,且会挤占所有的连接数
安全部分
authentication_timeout
默认一分钟,超过一分钟则验证失败
ssl
连接启用ssl
ssl_ciphers
ssl启用的cipher
内存部分
shared_buffers
很重要的参数.!
进程默认128MB,经验上是调整为内存的25%
temp_buffers (default 8MB)
临时表创建的时候,用于存储临时数据
work_mem (default 1MB):
每一个排序或哈希操作所占用的内存,默认比较保守,如果需要增加,经验上是最大连接数占用内存的25%
maintenance_work_mem(default 16MB)
创建每个索引的时候占用的内存
写前日志设置
wal_buffers (default 64KB):
WAL数据需要的数据,读写繁忙的数据库需要调整到1-16MB
checkpoint_timeout (default 5 minutes):
默认5分钟做一次check point
日志地址
log_directory
log路径
log_filename
用于设置log file的文件名
log_rotation_age
多长时间写下一个log
log_rotation_size
如果log超过这个size就新开一个log