【Oracle 12c Flex Cluster专题 】— Leaf Node的故障迁移

原文链接 http://allthingsoracle.com/oracle-flex-cluster-leaf-node-failover/ 译者 周天鹏

Oracle 在12c中使用hub-and-spoken技术实现了Flex Cluster的功能(即RAC集群中的每个节点不再需要既运行ASM实例又运行DB实例,各节点可以扮演不同的角色)。相比12c以前的版本,该功能使集群规模的扩大和缩减变得更加靠谱。原因如下:

  • 集群中各节点间网络的互相干扰变得更少。
  • 关键的集群组件争用更少,如OCR, VOTING DISK。

一个Flex Cluster中可以包含两类节点,分别是hub node和leaf node。

Hub Node

  • 这种节点几乎完全等价于12c以前版本的传统RAC节点,在12c中这种节点就是集群的核心(为什么说是核心呢?因为后面会介绍12c flex cluster中的非核心节点——leaf node)。
  • 每个hub node之间通过私网连接,而且需要配置ssh对等性。
  • 每个节点需要访问共享存储,因为ocr voting都依赖于共享存储。
  • hub node上既运行ASM实例又运行db实例。
  • 每个flex cluster至少一个hub node最多64个hub node。

Leaf Node

  • 相比hub node , leaf node对于集群来说不是那么核心,与集群耦合度很低,而且leaf node之间不需要互联。
  • 每个leaf node通过一个hub node连接集群并获取数据。
  • 虽然leaf node不要求直接访问共享存储,但最好还是连上共享存储,因为说不准未来哪天就要把这个leaf node转为hub node使用。 (这里译者补充下:虽然leaf node启动集群件是不依赖共享存储的,但当leaf node以只读打开了某数据库时,也就是这个leaf node上运行着数据库实例时,这个leaf node就变成了reader node,官方明确说了reader node是必须连接共享存储的。官方连接:http://docs.oracle.com/database/122/RILIN/running-database-instances-on-leaf-nodes.htm#RILIN-GUID-35BDCD41-375D-4EB2-B0FC-49345AF6C572)
  • 他们上面运行着轻量版的集群件。
  • leaf node上面不能运行ASM实例,也不能在上面建库,因为上面运行的实例打开方式只能是只读的。
  • leaf node上可运行多种应用,例如中间件、EBS、IDM等,leaf node上的应用会在leaf node挂掉后自动切换到其他leaf node。
  • 一个flex cluster中可包含0个或多个leaf node。
  • leaf node和hub node拥有相同的公网和私网。

即使flex cluster中没有一个leaf node, hub node也可以正常的像传统rac节点一样工作。但如果flex cluster中只有leaf node没有一个hub node是万万不可的,因为leaf node需要通过hub node上的asm实例获取数据。

当集群件启动在leaf node上时,leaf node就会根据GNS信息查找所有hub node,然后选择其中一个hub node来获取数据(配置GNS是使用leaf node的重要前提)。一个hub node同时可能被0个或多个leaf node连接,而一个leaf node同时只能连接一个hub node。hub node和leaf node之间也会交换心跳信息,只有这样leaf node才能加入集群并作为集群的一部分。

标准集群可无痛转换为flex cluster,但flex cluster无法转为标准集群,除非你重新配置(约等于重装)。

当作为集群的一部分的某hub node挂了,将发生什么?

当发生如下情况时,hub node会被从集群中移除:

  • 被驱逐
  • 服务器关机
  • 手动停止Oracle集群件

这种情况发生时,连接着这个hub node的leaf node会自动挑一个活着的hub node来作为数据源。 这篇文章中,我会论证:

  • 如何确定leaf node连的是那个hub node?
  • 当leaf node连接的hub node挂了后,这个leaf node如何进行故障迁移?

现状:

为了更好的阐述,我搭建了如下结构的12.1.0.2c的flex cluster:

  • hub node
  • host01
  • host02
  • host03
  • leaf node
  • host04
  • host05

论证:

确定hub node host01和leaf node host04是活着的:

[root@host01 log]# crsctl get node role status -all
Node 'host01' active role is 'hub'
Node 'host04' active role is 'leaf'

因为当前host01是集群中唯一活着的hub node,所以host04一定连的是host01。而且,host04的警告日志中也可以证明这个事实:

这时启动host02和host05:

[root@host01 log]# crsctl get node role status -all
Node 'host01' active role is 'hub'
Node 'host02' active role is 'hub'
Node 'host04' active role is 'leaf'
Node 'host05' active role is 'leaf'

为了确定host05连得是那个hub node,我们看下ocssdrim进程的trace文件:

[root@host05 trace]#export ORACLE_BASE=/u01/app/grid
[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:12:01.008283 :    CSSD:1086187840: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host01, number 1, using handle (0x14055d0) last msg to hub at 4294948750, connection timeout at 11454, current time 4294951260]]

我们可以看到host05连得也是host01。

让我们停掉host01上的集群件,来确定所有leaf node都能故障切换到集群中其他存活的hub node,在这里就是host02:

[root@host01 log]# crsctl stop crs
[root@host02 ~]# crsctl get node role status -all
Node 'host02' active role is 'hub'
Node 'host04' active role is 'leaf'
Node 'host05' active role is 'leaf'

确定host04切到了host02:

[root@host04 ~]# cat  $ORACLE_BASE/diag/crs/host04/crs/trace/ocssdrim.trc |grep 'Destroying connection' | tail -1
2016-05-04 11:17:31.932770 :    CSSD:1085761856: clssbnmConnDestroy: Destroying connection object (0x1061200) for host host01

[root@host04 ~]# cat  $ORACLE_BASE/diag/crs/host04/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:18:21.860771 :    CSSD:1085761856: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host02, number 2, using handle (0x17e2fe0) last msg to hub at 1404044, connection timeout at 1434044, current time 1405324

确定host05切到了host02:

[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Destroying connection' | tail -1
2016-05-04 11:17:31.873993 :    CSSD:1086187840: clssbnmConnDestroy: Destroying connection object (0x16979f0) for host host01

[root@host05 ~]# cat  $ORACLE_BASE/diag/crs/host05/crs/trace/ocssdrim.trc |grep 'Sending a ping msg to' | tail -1
2016-05-04 11:17:36.751628 :    CSSD:1086187840: clssbnmc_PeriodicPing_CB: Sending a ping msg to host host02, number 2, using handle (0x10950b0) last msg to hub at 318184, connection timeout at 348184, current time 319664

总 结

  • 12c引入的flex cluster有两种节点,hub node和leaf node。
  • 鉴于hub node可以访问共享存储,leaf node不直接访问共享存储,而是通过某个hub node连入集群。
  • 当leaf node上的集群件启动时,leaf node自动使用GNS来发现所有hub node,然后通过其中一个hub node连入集群。
  • 如果hub node挂了,那么通过这个hub node访问集群的leaf node会自动切换至某存活的hub node继续访问集群。

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2017-07-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

【亲测】前端如何写满你的硬盘?

今天偶然在网上看到一篇文章,说是前端如何机智的搞坏电脑。大意就是通过node搞一个服务,然后以get请求的方式通过localStorage,大量的向用户浏览器缓...

1334
来自专栏IT技术精选文摘

Java性能优化工具和技术

介绍 Java是当今软件开发世界中使用最广泛的编程语言之一。 Java应用程序在许多垂直领域(银行,电信,医疗保健等)中使用,在某些情况下,每个垂直方向都会...

3086
来自专栏软件开发 -- 分享 互助 成长

win10使用u盘装回win7

背景:一朋友要我帮忙把系统从win10装回到win7,因为做IT的嘛,想想也难不倒我,况且以前也经常重装系统,硬盘里就有win7的系统,于是很爽快的答应了。电脑...

2209
来自专栏FreeBuf

一则邮件攻击样本分析分享

通过邮件投递病毒文件是网络攻击常用的一种方式,因此防御邮件攻击是每个安全团队都需要重点考虑的内容。中兴通讯每天都会收到数万封外部邮件,为了及时检测每封邮件是否含...

1062
来自专栏杨建荣的学习笔记

了解一下CPU 第一篇(r4笔记第30天)

CPU可能对于我们来说是熟悉又陌生的,每天的工作基本都离不开CPU,CPU的消耗是系统负载的一个重要指标,每天都会不定时的来看看CPU的使用情况,但是对于它了解...

3434
来自专栏Small Code

XGBoost 在 Windows 10 和 Ubuntu 上的安装

关于什么是 XGBoost,我在这里不再解释,如果有时间的话再写一篇文章来解释,在数据科学里非常有用。大家可以参考 Tianqi Chen 的论文 XGBoos...

4247
来自专栏北京马哥教育

LVS详解及基于LVS实现web服务器负载均衡

前言 LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内...

4744
来自专栏IT笔记

记一次JavaWeb网站技术架构总结

题记 工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时...

46711
来自专栏指尖下的Android

内存和缓存的区别

今天看书的时候又看到了内存和缓存,之所以说又,是因为之前遇到过查过资料,但是现在又忘了(图侵删)。

7272
来自专栏Golang语言社区

大型服务端开发的反模式技巧

1. 用线程池执行异步任务 ? 为了减少阻塞时间,加快响应速度,把无需返回结果的操作变成异步任务,用线程池来执行,这是提高性能的一种手段。 你可能要惊讶了,这么...

3106

扫码关注云+社区

领取腾讯云代金券