ORACLE RAC CSS(集群同步服务)

ocssd启动流程
1)操作系统被启动,并调用/etc/inittab文件中GI相关的脚本。

2)ohasd.bin守护进程被启动,该进程负责启动所有的代理进程,包括oracssdagent_root代理进程。

3)oracssdagent_root代理进程启动ocssd.bin守护进程。

4)ocssd.bin和gpnpd.bin通信,获得构建集群的基本信息。

5)ocssd.bin和gipcd.bin通信,获得本地节点和远程节点的私网连接信息。

6)在获得了步骤4与5中提到的信息后,ocssd.bin和远程节点的ocssd.bin通信,并通过访问vf的lease block获得本地节点的节点编号。

7)该节点加入集群。


集群一致性就是指集群中每个成员能够了解其他成员的状态,而且每个成员获得的集群中其他节点的状态和集群中节点成员列表信息是一致的。

实现集群一致性的三种心跳机制
1)确认节点与节点间的连通性,节点之间能够了解彼此的状态(网络心跳)。
2)用一个共享的位置来保存节点之间的连通性信息,在集群需要进行重新配置时,能够做出正确的决定并记录集群最新的状态(磁盘心跳)。
3)本地节点自我监控,当本地节点出现问题时能够主动离开集群,避免不一致的产生(本地心跳)。


网络心跳(NHB)
ocssd.bin守护进程每秒钟会向集群的其他节点发送网络心跳,例如一个4节点集群,集群的每一个节点每一秒都会向集群中的其他三个节点发送网络心跳信息,
这也意味着每个节点每一秒也会收到集群中其他节点发送的网络心跳。

ocssd.bin的线程实现
1)发送线程负责每秒钟发送网络心跳到其他远程节点。

2)派遣线程负责接收从远程节点发送过来的网络心跳信息,并分发收到的信息给其他相关的线程。

3)分析线程会处理派遣线程接收到的网络心跳信息,确认节点之间的连通性。

4)当分析线程发现某些节点的连通性出现问题时,集群就会进行重新配置,而重新配置的结果就是某一个节点离开集群,称为节点驱逐。


丢失网络心跳导致的重新配置步骤

1)当集群的某一个节点连续一段时间(misscount)丢失网络心跳之后,分析线程决定发起集群重新配置。

2)集群的重新配置管理节点(简称RM节点,通常是集群中节点号最小的节点)向集群中的所有节点发送重新配置消息,所有收到此

消息的节点会回复该消息,并通知RM节点自己的状态。

3)接下来,RM节点基于每个节点的状态进行投票并检查是否有脑裂会发生。

4)对于检查脑裂,RM会查看网络心跳无法访问的节点的磁盘心跳信息,确认这个节点的状态,如果发现无法访问的节点状态也是正

常的,那么就可能发生脑裂,需要避免  。

5)RM节点向表决盘的kill block中写入有毒(poison package)的信息,需要重启的节点在访问表决盘时读取到有毒信息,完成对

本节点的重启。   (君让臣死,臣不得不死)

6)RM节点修改集群节点列表(主要是在表决盘中),重新配置完成。


脑裂是指集群的某些节点间的网络心跳丢失,但是节点的磁盘心跳正常的情况。当脑裂出现后,集群会分裂成为若干个子集群,对于

这种情况的出现,集群需要进行重新配置,基本原则是:节点数多的子集群存活,如果子集群包含的节点数相同,那么包含最小编号

节点的子集群存活。 (一山不容二虎)


磁盘心跳(DHB)

磁盘心跳的主要目的是当集群发送脑裂时帮助制定脑裂解决方案,集群的每一个节点每秒钟都会向集群的所有vf注册本地节点的磁盘

心跳信息,同时也会将自己能够联系到的集群中其他信息,或者说本地节点认为集群中的成员列表信息写入vf中,一旦发生脑裂,

css的重新配置线程可以通过vf中的信息了解集群中节点之间的连通性,从而决定集群分裂成几个子集群,以及每个子集群包含的节

点情况和每个节点的状态。


ocssd.bin线程实现

磁盘心跳线程:该线程负责向集群的vf中发送磁盘心跳信息,同时,该线程也负责读取vf中的kill block信息,以确定本地节点是否

需要重新启动。

磁盘心跳监控线程:该线程负责确定磁盘心跳线程是否能够正确地发送磁盘心跳,并且能够正确地读取kill block中的信息。

kill block线程:该线程负责监控vf的kill block信息。


如果某个节点在short i/o timeout时间内一直无法访问某一个vf,对应的vf会被离线,当大多数的vf(vf数量/2+1)被离线时,该

节点会被自动重启,因此oracle建议配置奇数个vf。


本地心跳(LHB)

本地心跳的主要目的是监控ocssd.bin进程以及本地节点的状态,在每一秒钟,在发送网络心跳的同时(同一个线程)向caadagent和

cssdmonitor发送本地ocssd.bin进程的状态,如果本地心跳没有问题,cssdagent就认为ocssd.bin进程正常,反之,如果ocssd.bin

持续丢失本地心跳(misscount),ocssdagent就认为本地节点的ocssd.bin进程出现了问题,并重启该节点。





猜你喜欢

转载自blog.51cto.com/13598811/2135555