世界上最遥远的距离,不是生与死。而是我们同一个集群的两个节点,你却听不到我的心跳。
必要性:维持集群的⼀致性
RAC⼼跳机制 – 集群⼼跳
基本机制:
1、 确定节点和节点间的连通性,达到彼此了解
2、⽤共享的位置保持节点的连通信息,及时记录和更新
3、本地节点的⾃我监控 (保证自己是可以对外提供服务的,正常运行的。如果能够自我监控,在自己遇到问题的时候能够自己处理,这样就可以更好的把握节点的一致性)
RAC⼼跳机制 – 集群⼼跳
基本机制:
1、 确定节点和节点间的连通性,达到彼此了解
2、⽤共享的位置保持节点的连通信息,及时记录和更新
3、本地节点的⾃我监控 (保证自己是可以对外提供服务的,正常运行的。如果能够自我监控,在自己遇到问题的时候能够自己处理,这样就可以更好的把握节点的一致性)
节点需要自己有一个自我监控的功能,所以通过本地心跳,将自己的状态发送给cssdagent,cssdmonitor两个进程实现自我监控。那么碰到问题的时候就不需要等待别人去发现。
⽹络⼼跳
介绍:⽹络⼼跳主要是确保集群节点间的连通性,以便节点之间能够了解彼此的状态。
原理: ocssd.bin进程每秒向其他节点发送⽹络⼼跳,通过⼼跳情况确认节点的连通性,以及当⽹络⼼跳出现问题时做出处理。
2018-07-23 22:59:07.495: [ CSSD][3535726336]clssnmSendingThread: sending status msg to all nodes
介绍:⽹络⼼跳主要是确保集群节点间的连通性,以便节点之间能够了解彼此的状态。
原理: ocssd.bin进程每秒向其他节点发送⽹络⼼跳,通过⼼跳情况确认节点的连通性,以及当⽹络⼼跳出现问题时做出处理。
2018-07-23 22:59:07.495: [ CSSD][3535726336]clssnmSendingThread: sending status msg to all nodes
相关进程:
这个功能主要是由守护进程 ocssd.bin 完成的。 ocssd.bin守护进程包含以下线程:
发送线程(clssnmSending Thread): 每秒向集群中其他节点发送⽹络⼼跳信息
这个功能主要是由守护进程 ocssd.bin 完成的。 ocssd.bin守护进程包含以下线程:
发送线程(clssnmSending Thread): 每秒向集群中其他节点发送⽹络⼼跳信息
(在ocssd的log里面可以看到:2018-07-23 23:08:17.727: [ CSSD][3535726336]clssnmSendingThread: sending status msg to all nodes)
分析线程(clssnmPolling Thread): 分析收到的⽹络⼼跳信息并进⾏处理,如果发现某⼀些节点持续丢失⽹络⼼跳,就会通知集群进⾏重新配置。
集群重新配置线程(clssnmRcfgMgrThread): 当接收到分析线程的重新配置的通知时,该进程进⾏重新配置。
派遣线程(clssnmClusterListener): 负责接收从远程传递过来的消息,之后,根据信息的种类发给相关的线程进⾏处理。 (需要接受节点其他节点传来的各种信息,在接受信息的时候如果发现接受的信息是网络心跳的信息,那么就会派给分析线程,如果是其他信息就会派发给相应的处理进程)
分析线程(clssnmPolling Thread): 分析收到的⽹络⼼跳信息并进⾏处理,如果发现某⼀些节点持续丢失⽹络⼼跳,就会通知集群进⾏重新配置。
集群重新配置线程(clssnmRcfgMgrThread): 当接收到分析线程的重新配置的通知时,该进程进⾏重新配置。
派遣线程(clssnmClusterListener): 负责接收从远程传递过来的消息,之后,根据信息的种类发给相关的线程进⾏处理。 (需要接受节点其他节点传来的各种信息,在接受信息的时候如果发现接受的信息是网络心跳的信息,那么就会派给分析线程,如果是其他信息就会派发给相应的处理进程)
磁盘⼼跳
脑裂就是节点1和节点2由于种种原因私有网络出现问题了,两个节点之间不能互相访问,如果各自的节点状态正常只是交互出现了问题,这个时候两个节点都会认为是这个集群当中唯一的幸存者,作为唯一的幸存者要承担管理集群的责任,那么所有的节点都会想要去修改磁盘上面的数据,通过修改数据来达到管理集群的目的,所以节点之间都想将对方踢出去达到自己管理集群。出现脑裂之后就会出现机制决定将谁踢出集群,这个时候就要通过磁盘心跳了。
脑裂就是节点1和节点2由于种种原因私有网络出现问题了,两个节点之间不能互相访问,如果各自的节点状态正常只是交互出现了问题,这个时候两个节点都会认为是这个集群当中唯一的幸存者,作为唯一的幸存者要承担管理集群的责任,那么所有的节点都会想要去修改磁盘上面的数据,通过修改数据来达到管理集群的目的,所以节点之间都想将对方踢出去达到自己管理集群。出现脑裂之后就会出现机制决定将谁踢出集群,这个时候就要通过磁盘心跳了。
介绍:如果由于⽹络⼼跳异常,导致集群出现脑裂的发⽣,磁盘⼼跳则帮助解决该问题。
原理: Oracle集群的每⼀个节点每秒都会向集群中所有的表决盘注册本地节点的磁盘⼼跳信息,也就是说,所有的VF的信息是相同的。同时会将⾃⼰能够联系的到的集群中的其他节点的信息,或者说本地节点认为集群中的成员列表信息填⼊到表决盘中。⼀旦发⽣脑裂, CSS的重新配置线程就会通过表决盘的信息了解集群节点间的连通性,从⽽决定集群会分裂成⼏个⼦集群,以及每个⼦集群所包含的节点情况和每个节点的状态。
原理: Oracle集群的每⼀个节点每秒都会向集群中所有的表决盘注册本地节点的磁盘⼼跳信息,也就是说,所有的VF的信息是相同的。同时会将⾃⼰能够联系的到的集群中的其他节点的信息,或者说本地节点认为集群中的成员列表信息填⼊到表决盘中。⼀旦发⽣脑裂, CSS的重新配置线程就会通过表决盘的信息了解集群节点间的连通性,从⽽决定集群会分裂成⼏个⼦集群,以及每个⼦集群所包含的节点情况和每个节点的状态。
相关进程(这些都是OCSSD.bin进程下面的线程完成的)
磁盘⼼跳线程(clssnmvDiskPing Thread): 该线程负责向集群的表决盘中发送磁盘⼼跳,同时,该线程也负责读取表决盘中的kill block的信息,以确定本地节点是否需要重新启动。
磁盘⼼跳监控线程(clssnmvDiskPingMonitor Thread): 监控磁盘⼼跳线程是否能够正常地发送⼼跳,是否能正确读取kill block的信息。
Kill block线程(clssnmv KillBlock Thread): 负责监控VF的 kill block信息(只负责监控,如果发现kill block信息是针对该节点的,那么就会告知磁盘心跳线程去读取kill block)
磁盘⼼跳线程(clssnmvDiskPing Thread): 该线程负责向集群的表决盘中发送磁盘⼼跳,同时,该线程也负责读取表决盘中的kill block的信息,以确定本地节点是否需要重新启动。
磁盘⼼跳监控线程(clssnmvDiskPingMonitor Thread): 监控磁盘⼼跳线程是否能够正常地发送⼼跳,是否能正确读取kill block的信息。
Kill block线程(clssnmv KillBlock Thread): 负责监控VF的 kill block信息(只负责监控,如果发现kill block信息是针对该节点的,那么就会告知磁盘心跳线程去读取kill block)
(kill bock:在一个集群当中当,如果节点之间交互出现了问题,会产生集群重新配置的主节点,集群配置的主节点是如何将部分集群杀掉呢?集群配置主节点也是一个节点,它不能够将其他节点干掉,如果要将节点驱逐出集群,做法就是向voting盘当中写入一些kill block的信息,这些kill block也可以称为Posion package有毒的信息,这个有毒的信息是有针对性的,针对要踢出的节点是有毒的,将谁给杀死,而不是对所有节点都是有效的)
(1)如果一个节点在规定的一段时间内,持续的不能访问多个voting盘里面的其中一个,那么voting盘会从节点中离线掉。
(2)如果一个节点和一半以上voting盘不能做交互,就认为这个节点出现了问题,会将该节点离线掉。
(3)在多个节点下不能确保都能访问到所有voting盘的时候,要确保集群中所有的节点都能访问到一块voting盘。当一块voting盘能被所有的节点访问到才能够记录到所有节点的互相连通的信息。节点向voting盘写入的信息包括自己节点的状态信息和其他可以连通节点的信息。所以任何时候都要有一块正常状态的可以被所有节点访问到的voting盘。任何时候都要保证这个机制。
如图,有两个节点,三个voting盘,在某一个时刻,node1和voting盘1不能交互了,即不能连通了。node2和voting盘3也不能交互了,这个时候最需要保证的是voting盘2可以和所有节点交互。
如果没有这个机制:当一个节点不能访问一半的以上的voting盘就将其挂掉,可能会产生什么问题呢?还是上面图,比如node1和voting盘1,2出现了问题,node2和voting盘3出现了问题,那么就导致集群当中任何一个voting盘都不能存放节点所有的信息,这样会出现严重的问题。不允许任何一个节点和超过一半以上的voting盘不能连通的情况并且节点还处于存活状态。
要将voting盘设置为奇数个,并且保证一半以上voting盘可以被访问到才认为该节点是正常的。
本地心跳是用来实现自我监控。通过自我监控OCSSD.bin进程状态来确认自己是否有问题。
本地⼼跳
介绍:监控ocssd.bin进程以及本地节点的状态
原理: Oracle每⼀秒在向远端节点发送⽹络⼼跳的同时,同⼀进程向cssdagentd代理和cssdmonitor代理发送本地ocssd.bin进程的状态。
相关进程:
实现过程
发送线程: 每秒向集群中其他节点发送⽹络⼼跳信息的同时,同⼀进程(clssnmsending Thread)发送本地ocssd.bin进程的状态)
------------>cssdagent
------------>cssdmonitor
10g+11.1
11.2+
介绍:监控ocssd.bin进程以及本地节点的状态
原理: Oracle每⼀秒在向远端节点发送⽹络⼼跳的同时,同⼀进程向cssdagentd代理和cssdmonitor代理发送本地ocssd.bin进程的状态。
相关进程:
实现过程
发送线程: 每秒向集群中其他节点发送⽹络⼼跳信息的同时,同⼀进程(clssnmsending Thread)发送本地ocssd.bin进程的状态)
------------>cssdagent
------------>cssdmonitor
10g+11.1
11.2+
集群节点重新配置
1.当集群中某⼀个节点连续⼀段时间丢失⽹络⼼跳之后,分析线程决定发起集群重新配置,在重新配置的过程当中会产生主节点来控制集群,网络心跳断了之后并不会立刻将有问题的节点踢出集群,而是产生RM,之后由RM来处理。
2.集群的重新配置管理节点(Reconfiguration Master)向集群中所有节点发送重新配置消息,所有收到此消息的节点会回复该消息,并通知RM节点⾃⼰的状态。
3.接下来, RM节点基于每个节点的状态进⾏投票并检查是否有脑裂发⽣
4.对于检查脑裂, RM会查看⽹络⼼跳⽆法访问的节点的磁盘⼼跳信息,以便确认这些节点的状态,如果这些状态本⾝是正常的,需要避免。
5. RM节点向表决盘中写⼊“有毒的(poison package) ”的信息,需要重启的节点在访问到表决盘的时候读取到该信息,完成本节点的重启,重启之后加入集群,也有可能踢出去了,不加入集群了。
6. RM节点修改集群节点列表,重新配置完成。 (集群被踢出去或者加入都是要重新分配资源的)
2.集群的重新配置管理节点(Reconfiguration Master)向集群中所有节点发送重新配置消息,所有收到此消息的节点会回复该消息,并通知RM节点⾃⼰的状态。
3.接下来, RM节点基于每个节点的状态进⾏投票并检查是否有脑裂发⽣
4.对于检查脑裂, RM会查看⽹络⼼跳⽆法访问的节点的磁盘⼼跳信息,以便确认这些节点的状态,如果这些状态本⾝是正常的,需要避免。
5. RM节点向表决盘中写⼊“有毒的(poison package) ”的信息,需要重启的节点在访问到表决盘的时候读取到该信息,完成本节点的重启,重启之后加入集群,也有可能踢出去了,不加入集群了。
6. RM节点修改集群节点列表,重新配置完成。 (集群被踢出去或者加入都是要重新分配资源的)
集群重新配置的几种情况:
丢失本地心跳:本地的一些进程出现了一些问题不需要等待别人来处理,会通过自己重启来保证集群的一致性。
RAC 节点管理
概念:负责维护数据库集群的节点列表,确保只有集群的节点能够数据库,并且在节点加⼊集群或者离开集群时,更新集群列表;负责数据库节点与集群管理软件的通信,向集群软件中注册数据库的信息。
节点列表:记录集群中节点的状态 (对集群节点的管理是怎么实现的呢?是通过节点列表的位图信息来确定节点是否正常,1代表正常,0代表不正常)
概念:负责维护数据库集群的节点列表,确保只有集群的节点能够数据库,并且在节点加⼊集群或者离开集群时,更新集群列表;负责数据库节点与集群管理软件的通信,向集群软件中注册数据库的信息。
节点列表:记录集群中节点的状态 (对集群节点的管理是怎么实现的呢?是通过节点列表的位图信息来确定节点是否正常,1代表正常,0代表不正常)
通过什么机制保证集群列表是实时更新的呢,比如一个节点的加入和节点的踢出。因为列表是放在共享存储上面,可以供所有节点访问,因为是共享的,为了保证在修改列表的过程是一致的,oracle控制机制就是当一个节点要加入到集群里面或者从集群里面出去,发生变化的这个节点会以独占的方式占用这个列表资源,修改完资源信息之后来分发给其他节点。这样就能保持集群的一致性。
实例的启动发生了什么?节点和节点之间要相互沟通,实例要和集群管理软件沟通,即要将实例信息注册到集群管理软件当中。
假如说实例1启动了,第一个步骤就是实例1向集群管理软件当中注册信息,即之前的视图上面增加了一位是1,之后集群管理软件通知实例2和实例3,告诉他们集群当中有新加进来的节点,通知完成之后,实例1,2,3都达成共识,都是集群当中的一员了,这个时候要进行资源的重新分配。
上面图中日志信息记入一个节点加入产生的信息。
---------------------
作者:风流搞技术
来源:CSDN
原文:https://blog.csdn.net/qq_34556414/article/details/81176679?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!