gpnp 全称为 grid plug and play ,是Oracle 11 gR2 版本集群管理软件新增的组件。该组件的功能由即npd.bin 守护进程实现的。Oracle 设计gpnp 的目的主要有以下两点:
目的1:将集群的基本配置信息保存在本地,以便在启动集群时能够从本地文件中获得足够的信息,而不再需要完全依赖于OCR。
目的2: 通过和mdnsd 进行通信,能够更加灵活地识别集群中的节点,使集群结构更加灵活,而不再需要从OCR 中获取节点列表。
gpnp 组件由两部分构成:gpnp wallet 和gpnp profile。
gpnp wallet
gpnp wallet 的功能是保存需要访问gpnp profile 文件的客户签名信息, 当客户访问 gpnp profile 时通过wallet 中的签名信息进行验证,以确保只有指定的客户能够访问profile 文件。
这部分内容是不需要用户配置的,在安装GI 时,Oracle 会自动完成签名信息的初始化。另外,gpnp 的wallet 文件可以在路径<GI_home>/gpnp/wallets/peer 下找到。例如:
-rwx—— 1 grid oinstall 6301 Sep 19 11:45 cwallet.sso
gpnp profile
gpnp profile 是gpnp组件的重要部分,它是一个XML 文件,用于保存启动( bootstrap )集群节点时所需的必要信息。换句话说,当GI 在启动时,所有必需的信息都保存在gpnp profile中,从某种意思上说 gpnp profile中的信息类似于数据库bootstrap时所需要的信息。
文件存在 < grid_home>/gpnp/profiles/peer 下:
cd $ORACLE_HOME/gpnp/profiles/peer
-rw-r–r– 1 grid oinstall 1890 Oct 12 12:56 profile.xml
接下来查看一下gpnp profile文件具体内容:
通过gpnptool 来获取gpnp profile内容,
[grid@node1.localdomain$]gpnptool get
1 . ProfileSequence 表示该gpnp profile 的序列号, 该文件每做一次修改, 序列号就会增加1 , 也就是说, 序列号最大的gpnp profile 包含的信息是最新的。
2 . ClusterUid 表示集群的Global ID。从版本12C 开始GI 通过ClusterUid 来唯一标识一个集群。这个Global ID 是在安装时随机产生的, 而且不能修改。
3 . ClusterName 表示集群名称。在版本12C 之前, GI 通过集群名称来标识集群, 也就是说在同一个子网中不能存在同名的集群。
4 . 即np:Network id=”net1” IP=”* .* . * .* ” Adapter=”eth0” Use=”public” 表示集群的公网信息。选项Use用于区分网络的用途, 这个选项只能为public 或者cluster_interconnect。
5 . gpnp:Network id=”net2” IP=’* * * *’ Adapter=”eth1 ” Use=”cluster_ interconnect” 表示集群的私网信息。选项id 表示网络资源的名称;选项IP指定子网信息;选项Adapter为网卡信息。
6 . orcl:CSS-Profile id=”css ” DiscoveryString=”+asm” LeaseDuation=”40。” , 其中id=”css ”表示这部分信息是css需要使用的。DiscoveryString=”+asm ” 表示表决盘( VF)保存的路径, cssd 在启动时会到这个路径下去扫描表决盘, 在这个例子中+asm 表示读者使用了asm, cssd 会扫描ASM 的disk_string来发现表决盘。LeaseDuration 定义了节点号的租借有效期。
7.orcl:ASM-Profile id=”asm” DiscoveryString=”/dev/asm-*” SPFile=”+DATA/node- cluster/asmparameterfile/registry.253.957185753” , 其中id=”asm ” 表示这部分信息是ASM需要使用的。SPFile指定了ASM实例启动时需要访问的SPFile位置。
那么当这些信息发生变化时, Oracle是如何实现信息的同步的呢?
gpnpd是一个多线程的进程, 主要的线程包括:
1 . gpnp主线程( clsgpnpd Main Work):该线程负责完成主要的工作, 例如, 访问gpnp profile , 对该文件进行读取。
2 . push 线程( clsgpnpd_pushThread):当本地的gpnp profile发生改变或者需要向远程节点推送gpnp profile 时, 该线程负责传输gpnp profile 。
3 . 派遣线程( clsgpnpd dispatch Thread):该线程负责接收gpnpd收到的各种消息并分派给对应的线程。
4 . OCR线程( clsgpnp ocrDetectThread):该线程在发现OCR中相关的信息发生改变时通知派遣线程。
首先, 本地gpnpd 的派遣线程通知所有远程节点的派遣线程发生了配置改变;然后, 本地gpnpd 的push 线程将新版本的gpnp profile发送给所有的远程节点;接着, 远程节点的派遣线程在收到该消息之后开始接收新版本的gpnp profile 。而当gpnpd被启动时, 会发生以下的过程。
过程1 : gpnpd 的主线程访问gpnp profile , 并加载到cache 当中打开。如果本地节点的gpnp profile 已经丢失, gpnpd 可以通过OLR 中的信息重新构建gpnp profile 。
过程2 :派遣线程向集群的所有节点发送消息, 并确认最新版本的gpnp profile 位置。
过程3 :拥有最新版本gpnp profile 的节点向该节点发送信息。
过程4 :本地节点接收到最新版本的gpnp profile 后, 开始向外提供服务。