文章开始之前,我们首先得明确几个问题:
问题1:什么是数据库高可用(high availability)
问题2:数据库高可用是必须的吗
问题3:PG的高可用是啥子模样
首先理一理高可用。如图所示,来自维基百科的释义:高可用性,IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度。
简单来说,高可用就是当某一个服务(比如服务器)挂掉了,对外提供的服务不能中断。一般是由众多服务节点构成一个服务集群。普通用户是感知不到服务发生了中断。
那数据库需要高可用吗?当然是需要的,数据库也是重要的服务之一,虽然它不是直接对外服务。试想一下,如果只有一个数据库,达不到高可用状态,发生意外挂掉了,那么所有服务都不能使用了。比如头条或微博的数据库挂了,那么我们就不能愉快地吃瓜玩耍了。所以,数据库高可用是必须的。
作为大名鼎鼎的开源数据库,postgresql又是怎么做到高可用呢。我们直接使用搜索引擎搜索一下。ps:关于技术查找,国内各种论坛是一锅炖,建议直接使用官网。
可见pg官方有自己的高可用解决方案。pg要怎么解决高可用呢?
1)数据库集群,并保证数据一致性。
2)管理数据库集群,比如故障转移。
本文先学习PG数据库集群。数据库集群一般是主从模式,即是一个master,多个slave。主从的数据是一样的。这样同样可以做到读写分离。关于读写分离,暂时按下不表,后面专门写。pg有个Streaming Replication,即流复制。流复制是使用WAL(预读写日志文件)从主库传输到从库实现的。
复制方式分为同步流复制和异步流复制。同步流复制,主库需要等从库写完才能释放锁,因而对大量数据写入等情况不适合,另外从库挂掉了也会导致主库写入数据失败。而异步流复制则没有上述问题。延迟通常也不会太多,网络良好的情况,一般不会超过1秒。
下面开始搭建两个数据库分别作为主库和从库,演示下配置异步流复制。
上图是用docker快速搭建的两个数据库。首先配置下主库:
1)修改 pg_hba.conf,允许从库从不同网络连接和复制
# allow replicationhost replication all 0.0.0.0/0 md5
2)修改 postgresql.conf,开启流复制模式
listen_addresses = '*'wal_level = replicamax_wal_senders = 8
以上配置完成后需要重启下数据库。
接下来,配置下从库:
1)从主库获取现有的数据到从库
# pg_basebackup -h [ip] -U [username] -p [port] -F p -P -R -D [pgdata file path]pg_basebackup -h 192.168.0.101 -U postgres -p 15446 -F p -P -R -D /home/master
2)拷贝到从库pg的data目录
cp -r /home/master/* /var/lib/postgresql/data/
3)赋予权限
chown -R postgres:postgres /var/lib/postgresql/data/
4) 修改postgresql.conf
hot_standby = on
以上配置完成后需要重启下数据库。
我们可以看到从库的数据和主库的数据是一样的。
我们新增下主库的数据,发现从库也同步了。
至此,pg的异步流复制已完成。下一篇,我们将继续介绍和学习pg高可用的其它内容,敬请期待。