zoukankan      html  css  js  c++  java
  • 【oracle 11G Grid 】Crsctl start cluster 和 crsctl start crs 有差别么?

    

    【oracle 11G Grid 】Crsctl start cluster 和 crsctl start crs 有差别么?


    q:Crsctl start cluster  11.2新特性和 crsctl start crs 有啥差别呢?


    Crsctl start/stop crs管理本地节点的clusterware stack的启停。包括启动ohasd进程。这个命令仅仅能用来管理本地节点

    [root@vmrac2 ~]# crsctl start crs -h

    Usage:

     crsctl start crs[-excl [-nocrs]|-nowait]

        Start OHAS onthis server

    where

        -excl        Start Oracle Clusterware in exclusivemode

        -nocrs       Start Oracle Clusterware in exclusivemode without starting CRS

        -nowait      Do not wait for OHAS to start


    crsctl start/stop cluster - Manage start/stop the Oracle Clusterware stack onlocal node if you do not specify either -all or -n and nodes remote if option-n or -all be specified ,NOT includingthe OHASD process. You can't start/stop clusterware stack without OHASD processrunning.

    crsctl strat/stop cluster既能够管理本地 clusterware stack,也能够管理整个集群

    指定–all 启动集群中全部节点的集群件,即启动整个集群。

    -n 启动指定节点的集群件

    可是不包括OHASD进程。You can't start/stop clusterware stack without OHASDprocess running.

     

    [root@vmrac2 ~]# crsctl start cluster -h

    Usage:

     crsctl startcluster [[-all]|[-n <server>[...]]]

       Start CRS stack

    where

       Default         Start local server

       -all            Start all servers

       -n              Start named servers

    server [...]   One or more blank-separated server names

     

     


    Despite crsctl start/stop crs manage entire Oracle Clusterware stack on localnode crsctl start/stop crs not allow you to manage remote nodes, unlike crsctlstart/stop cluster that allows you to manage all the nodes, but if the processOASH is runing.
    crsctl start/stop crs
    仅仅能管理本地节点的clusterware stack。并不同意我们管理远程节点。

    可是当远程或者本地节点OHASD process执行时(Oracle High AvailabilityServices服务必须可用),才干使用crsctl start/stop crs管理全部节点

     

    我们来做一个实验验证下

    我们先把节点2crs停掉,确保本地已经没有OHASD进程。

     

    [root@vmrac2 ~]# crsctl stop crs

    CRS-2791: Starting shutdown of Oracle High AvailabilityServices-managed resources on 'vmrac2'

    CRS-2673: Attempting to stop 'ora.crsd' on 'vmrac2'

    。。。

    。。

    CRS-2673: Attempting to stop 'ora.DATANEW.dg' on 'vmrac2'

    。。。。

    CRS-2677: Stop of 'ora.gipcd' on 'vmrac2' succeeded

    。。。

    。。

    CRS-2793: Shutdown of Oracle High AvailabilityServices-managed resources on 'vmrac2' has completed

    CRS-4133: Oracle High Availability Services has beenstopped.

    这里能够看到使用 crsctl stop crs已经本地的集群件所有停了下来。

     

    可是为了去确保万无一失。建议在os层面查看下 cluster的进程是否存在

    [root@vmrac2 ~]# ps -ef|grep ohasd

    root     3747     1  0Jun19 ?       00:00:00 /bin/sh/etc/init.d/init.ohasd run

     

    [root@vmrac2 ~]# ps -ef|grep d.bin

    root    3064427369  0 13:08 pts/2    00:00:00 grep d.bin

    ------到这里能够确认集群已经全宕下来了

     

     

    [root@vmrac2 ~]# ps -ef|grep ohasd

    root     3747     1  0Jun19 ?

           00:00:00 /bin/sh/etc/init.d/init.ohasd run

    ------当然这个脚本存在没有什么关系。假设没有这个sh进程,则 ohasd.bin就无法启动,

    这时须要去调查下Snncommd –S96ohasd脚本为什么不能运行

    这个后台脚本直接用kill去杀是无法杀掉的,会自己主动再生一个进程。

     

    [root@vmrac2 ~]# ps -ef|grep ohasd

    root     3747     1  0Jun19 ?

           00:00:00 /bin/sh/etc/init.d/init.ohasd run

    root     4888  4812  013:39 pts/1   00:00:00 grep ohasd

    [root@vmrac2 ~]# kill -9 3747

    [root@vmrac2 ~]# ps -ef|grep ohasd

    root     4895     1  013:39 ?       00:00:00 /bin/sh/etc/init.d/init.ohasd run

    root     4920  4812  013:39 pts/1   00:00:00 grep ohasd

    [root@vmrac2 ~]# kill -9 4895

    [root@vmrac2 ~]# ps -ef|grep ohasd

    root      4933     1  013:40 ?       00:00:00 /bin/sh/etc/init.d/init.ohasd run

    root     4958  4812  013:40 pts/1   00:00:00 grep ohasd

     

     

    详细測试例如以下:

    节点二的集群已经关闭,节点一的还在

     

    节点一操作:

    使用crsctl start cluster启动节点2的集群

    [root@vmrac1 ~]# crsctl start cluster -n vmrac2

    CRS-4405: The following nodes are unknown to Oracle HighAvailability Services:vmrac2

    ------报错非常明显啊,vmrac2节点上ohasd进程不存在。所以节点1无法启动节点2上的集群

     

    [root@vmrac1 ~]# crsctl start cluster -all

    CRS-4690: Oracle Clusterware is already running on 'vmrac1'

    CRS-4000: Command Start failed, or completed with errors.

    --------------还是由于vmrac2节点上ohasd进程不存在,所以节点1无法启动节点2上的集群

    [root@vmrac1 ~]#

     

     

     

     

     

    节点二操作:

    [root@vmrac2 ~]# crsctl start cluster

    CRS-4639: Could not contact Oracle High AvailabilityServices

    CRS-4000: Command Start failed, or completed with errors.

    ------crsctl start cluster缺省代表启动本地节点。还是由于vmrac2节点上ohasd进程不存在,所以无法启动节点2上的集群

     

    [root@vmrac2 ~]# crsctl start cluster -n vmrac1

    CRS-4639: Could not contact Oracle High AvailabilityServices

    CRS-4000: Command Start failed, or completed with errors.

    ------还是由于vmrac2节点上ohasd进程不存在,集群节点间无法通信,所以无法启动节点1上的集群(这里仅仅是測试下,实际节点1集群是已经启动的)

     

     

    [root@vmrac2 ~]# crsctl start cluster -all

    CRS-4639: Could not contact Oracle High AvailabilityServices

    CRS-4000: Command Start failed, or completed with errors.

    ------还是由于vmrac2节点上ohasd进程不存在,集群节点间无法通信。所以无法启动节点1上的集群(这里仅仅是測试下,实际节点1集群是已经启动的)

     



    通过上面的測试能够发现要想通过crsctl start cluster来管理远程集群节点,则ohasd (Oracle High AvailabilityServices Daemon)必须在全部集群节点上执行。假设没有执行,则会报出:

    CRS-4639: Could not contact Oracle High AvailabilityServices

    CRS-4000: Command Start failed, or completed with errors.

    类似的错误。

     

     

     

     

    这里我们再略微讨论下为什么必需要求ohasd进程,crsctl start cluster才干管理各个远程节点

    int socket(int domain, inttype,int protocol)

    domain:说明我们网络程序所在的主机採用的通讯协族(AF_UNIXAF_INET). AF_UNIX仅仅可以用于单一的Unix系统进程间通信,AF_INET是针对Internet,因而可以同意在远程主机之间通信

    type:我们网络程序所採用的通讯协议(SOCK_STREAM,SOCK_DGRAM) SOCK_STREAM表明我们用的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特流. SOCK_DGRAM 表明我们用的是UDP协议,这样仅仅会提供定长的,不可靠,无连接的通信.

     

    socket()系统调用,带有三个參数:  
        1、參数domain指明通信域,如PF_UNIX(unix)PF_INET(IPv4)  
          PF_INET6(IPv6)  
        2type指明通信类型,最经常使用的如SOCK_STREAM(面向连接可靠方式,  
         比方TCP)SOCK_DGRAM(非面向连接的非可靠方式,比方UDP)等。

      
        3、參数protocol指定须要使用的协议。尽管能够对同一个协议  
         家族(protocol family)(或者说通信域(domain))指定不同的协议  
         參数,可是通常仅仅有一个。对于TCP參数可指定为IPPROTO_TCP,对于  
          UDP能够用IPPROTO_UDP。你不必显式制定这个參数,使用0则依据前  
         两个參数使用默认的协议。

     

     

     

     

    这里对 crsctl startcluster启动跟踪下,trace文件例如以下:

    。。。。

    6009 socket(PF_INET6,SOCK_DGRAM, IPPROTO_IP) = 3

    6009 bind(3, {sa_family=AF_INET6, sin6_port=htons(0), inet_pton(AF_INET6,"::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0

    6009 getsockname(3, {sa_family=AF_INET6, sin6_port=htons(19527),inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0,sin6_scope_id=0}, [15812988179826343964]) = 0

    6009 getpeername(3, 0x7fff0257b028, [15812988179826343964]) = -1 ENOTCONN(Transport endpoint is not connected)

    6009 getsockopt(3, SOL_SOCKET, SO_SNDBUF, [168803484727246848], [4]) = 0

    6009 getsockopt(3, SOL_SOCKET, SO_RCVBUF, [168803484727246848], [4]) = 0

    6009 fcntl(3, F_SETFD, FD_CLOEXEC)    = 0

    6009 fcntl(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0

    6009 times({tms_utime=2, tms_stime=2, tms_cutime=0, tms_cstime=0}) =465828655

    6009 access("/var/tmp/.oracle", F_OK) = 0

    6009 chmod("/var/tmp/.oracle", 01777) = 0

    6009 socket(PF_FILE, SOCK_STREAM, 0)  = 4

    6009 access("/var/tmp/.oracle/sOHASD_UI_SOCKET", F_OK) = 0

    6009 connect(4, {sa_family=AF_FILE, path="/var/tmp/.oracle/sOHASD_UI_SOCKET"...}, 110)= -1 ECONNREFUSED (Connection refused)

    6009 access("/var/tmp/.oracle/sOHASD_UI_SOCKET", F_OK) = 0

    6009 nanosleep({0, 100000000}, {16, 140733232680592}) = 0

    6009 close(4)                         = 0

    6009 socket(PF_FILE, SOCK_STREAM, 0)  = 4

    。。。。。

    。。

     

    ------这里我们再节点以上观察下是谁会使用这个socket文件

    root@vmrac1 ~]# lsof/var/tmp/.oracle/sOHASD_UI_SOCKET

    COMMAND    PID USER  FD  TYPE            DEVICE SIZE   NODE NAME

    ohasd.bin    29191 root 634u unix    0xffff81005b939700     9176933 /var/tmp/.oracle/sOHASD_UI_SOCKET

     

     

    [root@vmrac1 ~]# ls -l/var/tmp/.oracle/sOHASD_UI_SOCKET

    srwxrwxrwx 1 root root 0 Jun 19 13:27/var/tmp/.oracle/sOHASD_UI_SOCKET

     

    那节点二上的状况如呢?

    [root@vmrac2 ~]# ls -l/var/tmp/.oracle/sOHASD_UI_SOCKET

    srwxrwxrwx 1 root root 0 Jun 19 13:27/var/tmp/.oracle/sOHASD_UI_SOCKET

    [root@vmrac2 ~]# lsof/var/tmp/.oracle/sOHASD_UI_SOCKET

     

     

    这时我使用crsctl start crs继续观察:

    [root@vmrac2 ~]# crsctl start crs

    lsof/var/tmp/.oracle/sOHASD_UI_SOCKETCRS-4123: Oracle High Availability Serviceshas been started.

    [root@vmrac2 ~]# ps -ef|grep 6560

    root     6560    1 214:53 ?

           00:00:01/u02/app/11.2.0.3/grid/bin/ohasd.bin reboot

    root     6877 4812 0 14:54 pts/1   00:00:00 grep 6560

     

    此时迅速在节点2的还有一个窗体观察/var/tmp/.oracle/sOHASD_UI_SOCKET这个socket

    [root@vmrac2 ~]# lsof/var/tmp/.oracle/sOHASD_UI_SOCKET

    [root@vmrac2 ~]# lsof/var/tmp/.oracle/sOHASD_UI_SOCKET

    [root@vmrac2 ~]# lsof/var/tmp/.oracle/sOHASD_UI_SOCKET

    COMMAND   PID USER  FD  TYPE            DEVICE SIZE     NODE NAME

    ohasd.bin 6560 root 631u unix 0xffff8100792f71c0     151906805 /var/tmp/.oracle/sOHASD_UI_SOCKET

     

     

    这里能够观察到 ohasd进程会使用/var/tmp/.oracle/sOHASD_UI_SOCKET这个socket文件来建立集群间节点通信,这也就解释了。为什么没有ohasd进程,我就不能使用 crsctl start cluster 命令来管理集群中远程节点。

  • 相关阅读:
    9.10 作业
    Day 03 作业
    Day02作业
    Day09 函数
    day08 简单习题
    Day04 python数据类型和词云的生成
    JAVA: 子类通过static块“覆盖”父类的成员变量风险
    JAVA: 子类“覆盖”父类的成员变量
    Java 访问控制权限
    Java数组类型转为集合类型
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6869415.html
Copyright © 2011-2022 走看看