1.一种postgresql高可用性的实现方法,其特征在于,该方法基于客户端、哨兵单元、代理单元、postgresql集群和存储单元五个部分;
所述客户端通过代理单元读取存储单元上的信息,从而访问数据库集群;
哨兵单元实时监控主库和从库存活状态,如果主库宕机,实现主库故障自动切换,并且在切换过程中,补偿差异数据,从而保证在主库故障时不丢失数据;
所述数据库集群为层级数据库主从复制集群,主库处理读写请求,从库作为备库,或接收读请求。
2.根据权利要求1所述的一种postgresql高可用性的实现方法,其特征在于,所述哨兵单元包含以下模块:
哨兵节点初始化模块,用于实现哨兵节点的初始化;
初始化哨兵集群模块,用于实现哨兵集群模块的初始化;
哨兵节点状态检测模块,用于对哨兵节点的状态进行检测;
选择领导哨兵模块,用于选择领导哨兵;
管理主库节点模块,用于管理主库节点;
管理从库节点模块,用于管理从库节点;
选举新主库模块,用于选举新主库;
获取差异数据模块,用于获取差异数据;
补偿差异数据模块,用于补偿差异数据;
重建从库服务模块,用于冲减从库服务。
3.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,基于权利要求1所述的系统,所述哨兵节点初始化模块的步骤如下:
启动每个哨兵节点时,需要传入以下参数:哨兵端口,主库ip和端口,用户名密码以及主库标识符;
启动后,该哨兵节点和主库建立通信,获取到主库和从库节点信息,保存在存储单元里;其中,存储单元保存了主库ip,端口,主库标识符,状态和增量日志文件名;从库的ip,端口,从库标识符,状态,增量日志文件名和同步偏移量。
4.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述初始化哨兵集群模块的步骤如下:
哨兵节点初始化模块运行结束后,执行如下操作:根据传入的存储单元标识符信息,读取主库和从库信息后与主库从库进行通讯,在指定时间内收到回复,表示状态为存活,否则为故障。
5.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述哨兵节点状态检测模块的步骤如下:
根据哨兵列表,每个哨兵节点周期性检测其他哨兵节点状态,并更新哨兵列表,检测方式是执行ping命令,在限定时间内返回成功结果,表示存活,否则表示故障;
选择领导哨兵模块的步骤如下:
功能:首先调用哨兵节点状态检测模块,检测和主库同机部署的哨兵的存活状态,如果状态为存活,那么该哨兵的角色就是领导哨兵;否则,从哨兵列表里选择第一个存活哨兵节点,作为领导哨兵,如果没有获取到领导哨兵,返回错误;否则返回领导哨兵节点的ip和端口。
6.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述管理主库节点模块的步骤如下:
首先调用选择领导哨兵模块,得到领导哨兵,然后,领导哨兵周期性执行该模块,比对主库节点和主库列表,如果不一致,则更新主库信息;如果主库状态为存活,返回成功,否则调用选举新主库模块,选择新主库;
管理从库节点模块的步骤如下:
领导哨兵周期性执行该模块,该模块功能如下:该模块首先调用管理主库节点模块,获取主库ip和端口信息,然后根据层级数据库自身的接口,获取到所有从库的ip和端口,状态和同步偏移量信息,并比对从库列表,如果不一致,则更新从库列表信息;从库列表里未匹配到的从库节点,将其从列表里删除。
7.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述选举新主库模块的步骤如下:
领导哨兵调用管理从库节点模块,在从库列表中选择同步偏移量最大的从库,如果多个从库的同步偏移量都等于最大同步偏移量,选择从库列表的第一个符合条件的从库作为新主库,然后调用补偿差异数据模块,否则返回错误;
获取差异数据模块的步骤如下:
领导哨兵根据存储单元主库列表中增量日志文件名,获取其最新的偏移量,比对新主库的最大同步偏移量,如果一样,表示不需要补偿增量日志,返回空值;否则,解析最大同步偏移量和故障主库最新偏移量之间的增量日志,称之为差异增量日志,返回差异增量日志信息。
8.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述补偿差异数据模块的步骤如下:
调用获取差异数据模块,如果存在差异数据,那么,调用层级数据库自身接口,同步这部分数据到新主库;否则跳过此模块,调用重建从库服务模块;
重建从库服务模块的步骤如下:
领导哨兵调用补偿差异数据模块后,根据层级数据库自身接口,所有从库重新指向新主库,重新同步新主库的数据;故障主库自动切换过程完成。
9.根据权利要求2所述的一种postgresql高可用性的实现方法,其特征在于,所述代理单元与主库建立连接函数,用于扫描存储单元主库列表,选择主库标识符对应的主库ip和端口,如果状态为故障,返回错误给客户端;否则,与主库建立连接,如果身份验证通过,建立主库连接并返回给客户端;否则,返回错误给客户端。