11gR2新特性---Gpnp守护进程

在这篇文章中,我们会对11gR2 新的守护进程(资源名称ora.gpnpd)进行介绍,其中包含的gpnp的功能,启动顺序和基本的诊断方法。 

gpnp全称为grid plug and play,该组件的功能由gpnpd.bin守护进程实现。

 
gpnp目的主要有以下两个:
1,将集群的基本配置信息保存在本地,以便在启动集群的时候能够从本地文件中获得足够的信息,而不是需要完全依赖于OCR。
2,通过和mdnsd进行通信,能够更灵活地识别集群中的节点,使集群结构更加灵活,不再需要从OCR中获取节点列表。

我们知道,在10gR2和11gR1的版本中,当启动集群的时候,所有的配置信息都要从OCR进行读取,而OCR有存放在共享内存中,这样做实际上并不是很好,因为我们相当于把集群所有的配置信息都存放到了共享存储上,而一旦某个节点对共享存储的访问出现了问题,这个节点就不能加入集群,对集群的影响是很大的,所以,从11gR2开始,GI(Grid Infrastructure) 开始把集群的配置信息进行本地化,例如:OLR,gpnp profile 被引入。随着我们将集群中重要的信息分别存放到了各个节点,我们也会发现,从11gR2开始,如果OCR出现了问题,仅仅是某些集群的资源(由CRSD管理的资源)会出现问题,而集群(cssd层面)仍然可以正常运行。


接下来,我们对gpnp profile和 gpnpd守护进程进行一些介绍。首先,gpnp profile(这是个xml文件)用于存放构建集群的bootstrap 信息,或者可以称为构建集群的最基本的信息,其中包括,集群名称,集群GUID, ASM discovery string, 公网和私网信息等等。所以,当我们在启动集群的某一个节点时,需要读取这个文件(默认文件名为<gi_home>/gpnp/<node_name>/profiles/peer/profile.xml),从而获得构建集群的基本信息。另外,由于这个文件中保存的是整个集群的基本信息,所以这个文件在所有节点之间都应该是相同的。同时,我们还需要一个守护进程,也就是gpnpd.bin(资源名为 ora.gpnpd) 来对gpnp profile 进行维护。举个例子,一个3节点的集群,其中节点3由于一些问题暂时没有启动,而在此期间,集群的私网配置发生了改变,之后,节点3启动,在启动的过程中,节点3的gpnpd进程需要和其他节点的gpnpd进程通信,获得最新版本的gpnp profile。

 

gpnp wallet的功能是保存需要访问gpnp profile文件的客户签名信息,当客户访问gpnp时通过wallet中的签名信息进行验证,以确保只有指定的客户能够访问profile文件。这部分内容是不需要用户配置的,在安装GI时,Oracle会自动完成签名信息的初始化。另外wallet文件可以在路径<GI_HOME>/gpnp/wallets/peer下找到。
 
gpnpd主要线程包括:
gpnp主线程(clsgpnpd_MainWork):该线程主要负责完成主要的工作,例如,访问gpnp prpfile,对该文件进行读取。
push线程(clsgpnpd_pushThread):当本地的gpnp prpfile发生改变或者需要向远程节点推送gpnp profile时,该线程负责传输gpnp profile。
派遣进程(clsgpnpd_dispatchThread):该线程负责接收gpnpd收到的各种消息并分派给对应的线程。
OCR进程(clsgpnpd_ocrDetectThread):该线程在发现OCR中相关的信息发生该表时通知派遣线程。
 
但集群的重要配置信息发生改变时,首先,本地gpnpd派遣线程通知所有远程节点派遣进程发生了配置改变;然后,本地gpnpd的push线程将新版本的gpnp profile发送给所有的远程节点;接着,远程节点的派遣线程在接收到该消息后开始接收新版本的gpnp profile。而当gpnpd被启动时,会发生以下的过程:
1,gpnpd的主线程访问gpnp profile,并加载到cache当中打开。如果本地节点的gpnp prpfile已经丢失,gpnpd可以通过OLR中的信息重新构建gpnp profile。
2,派遣进程向集群的所有节点发送消息,并确定最新版本的gpnp profile位置。
3,拥有最先版本gpnp profile的节点向该节点发送信息。
4,本地节点接收到最新版本的gpnp profile后,开始向外提供服务。
 

下面,我们对 gpnpd守护进程的功能进行一些介绍。


  1. 1. 这个进程是由ohasd 的oraagent 负责管理的。
  2. 2. 通过gpnp 的wallet文件进行验证并负责读取gpnp prfofile。当然,如果gpnpd发现本地的gpnp profile 无法读取,会尝试从OLR的信息中重建gpnp profile。
  3. 3. 对gpnp profile的客户(例如ocssd.bin)发布信息。
  4. 4. 发现集群中其他节点的gpnpd 守护进程,如果有需要,通过mdns 同步在节点间同步gpnp profile。
  5. 5. 如果集群的配置发生改变,有必要的话,修改gpnp profile.





接下来,我们通过启动集群过程中的一段gpnpd.log来对以上的内容进行进一步的了解。


2013-07-26 21:31:44.208: [ default][4143449792]gpnpd
START pid=<xxxx> Oracle Grid Plug-and-Play Daemon <<<<<< gpnpd.bin 守护进程被启动。


……


2013-07-26 21:31:45.234: [ GPNP][4143449792]clsgpnpkwf_initwfloc: [at
clsgpnpkwf.c:399] Using FS Wallet Location : <gi_home>/gpnp/<node_name>/wallets/peer/
<<<<<<<<<< gpnp的 wallet 文件被访问


……


2013-07-26 21:31:45.349: [ default][4143449792]GPNPD
started on node XXXXX.


2013-07-26 21:31:45.350: [ GPNP][4143449792]clsgpnpd_MainWork: [at
clsgpnpd.c:4836] --- Local best profile:


2013-07-26 21:31:45.350: [ GPNP][4143449792]clsgpnpd_MainWork:
<?xml version="1.0"
encoding="UTF-8"?><gpnp:GPnP-Profile Version[cont]


……


2013-07-26 21:31:45.350: [ GPNP][4143449792]clsgpnpd_MainWork:
usterName="XXXXXX"
PALocation=""><gpnp:Network-Profile><[cont]


2013-07-26 21:31:45.351: [ GPNP][4143449792]clsgpnpd_MainWork:
gpnp:HostNetwork id="gen" HostName="*"><gpnp:Network
id="net1" I[cont]


2013-07-26 21:31:45.351: [ GPNP][4143449792]clsgpnpd_MainWork:
P="XXX.XXX.XXX.XXX" Adapter="eth1"
Use="cluster_interconnect"/><gpn[cont]


2013-07-26 21:31:45.351: [ GPNP][4143449792]clsgpnpd_MainWork:
p:Network id="net2" IP="XXX.XXX.XXX.XXX "
Adapter="eth0" Use="public[cont]
<<<<<<<<<< gpnp pofile 被读取。


……


2013-07-26 21:31:46.162: [ GPNP][4143449792]clsgpnpdRCB: [at
clsgpnpd.c:3933] GPnPD endpoint url "mdns:gpnp._tcp://XXXXX:27230/agent=gpnpd,cname=xxxxx,host=xxxxx,pid=xxxx/gpnpd
h:****** c:*******" successfully advertised with RD <<<<<< gpnpd 通过mdns发布了本地节点的endpoint.


2013-07-26 21:31:51.375: [ GPNP][120384416]clsgpnp_profileCallUrlInt:
[at clsgpnp.c:2104] put-profile call to url "tcp://xxxxx:56182" disco
"mdns:service:gpnp._tcp.local.://xxxxxx:56182/agent=gpnpd,cname=xxxxxxxxx,guid=6de9b87c2edadf6fbf4bb1fcf61e2fa0,host=xxxxxxx,pid=xxxxxx/gpnpd
h:****c:****u:6de9b87c2edadf6fbf4bb1fcf61" [f=0 claimed- host:****
cname:****** seq:4 auth:CN=GPnP_peer] <<<<<<<< 同时,gpnpd也通过mdns,在网络中搜索其他的节点。如果,网络中有多个集群(版本为11gR2 或者12c),那么其他集群的节点也会被发现,但是,gpnpd会通过集群的GUID进行区分。


……


2013-07-26 21:32:00.954: [ GPNP][120384416]clsgpnp_profileCallUrlInt:
[at clsgpnp.c:2104] put-profile call to url "tcp://xxxxx:32774" disco
"mdns:service:gpnp._tcp.local.://xxxxxx:32774/agent=gpnpd,cname=xxxxxxxxx,host=xxxxxx,pid=8023/gpnpd
h:*** c:****" [f=0 claimed- host:**** cname:***** seq:4
auth:CN=GPnP_peer] <<<<<<<<< 集群的另外一个节点XXXXX被发现,gpnpd 确认是否有必要在两个节点间同步gpnp profile.


……


2013-07-26 21:32:06.625: [ GPNP][120384416]clsgpnpd_pushThread: [at
clsgpnpd.c:4770] START gpnpd start serving clients after profile updates <<<<<<<<<< push
thread被启动。如果需要,这个线程负责把本地的gpnp profile发送给其他节点。


……


2013-07-26 21:32:55.562: [ GPNP][79473568]clsgpnp_ocrDetectThread: [at
clsgpnp0.c:4508] OCR client init SUCCEEDED. OCR shared cache is now available
<<<<< gpnpd开始监控OCR cache以便在集群的配置信息发生改变,而且有必要更新gpnp profile时进行修改。 


最后,我们对和gpnpd相关的问题的诊断进行简单的描述。


1. 如果问题是本地的gpnp无法启动,那么根据gpnp的启动过程,需要察看。


1.1 Gpnpd 的pid 文件是否存在而且可以被访问


1.2 mdnsd 是否启动


1.3 gpnp 的wallet 文件是否存在,gpnp profile是否能够被grid 用户访问。


1.4 两个节点之间的网络连接是否正常。


1.5 其他节点的gpnpd.bin 是否正常。因为,在启动本地gpnpd.bin之后,它需要和集群其他节点的gpnpd.bin进行通信,以便确认集群中最新的gpnp profile。


2. gpnpd的问题也会导致其他依赖于gpnpd的资源无法启动,例如ocssd.bin,这个进程需要访问gpnp profile获取集群的基本信息,例如 VF的位置,集群私网信息等。


3. 如果我们发现问题是gpnp profile中的信息出现了错误,可以使用工具gpnptool 进行修正。


4.对于诊断gpnpd问题所需要的信息,一般是


4.1 gpnpd.log, 这个日志能够告诉我们gpnpd 是否被启动,以及,启动过程已经到达了哪一步,问题是在哪里出现的。


4.2 命令”crsctl stat res –t -init”的输出,它可以告诉我们ora.gpnpd资源的状态,以及集群中其他init资源的状态。


4.3 mdnsd.log, 如果我们发现问题出现在mdns无法发现集群中的其他节点,那么,这个文件很有帮助。


4.4 OSW 报告,它能够告诉我们OS当时的负载状况,集群网络统计信息等等。

 

原文地址:https://www.cnblogs.com/l10n/p/9418046.html