리눅스용 HP MCSG 설치, 설정 하기.

클러스터 구성 환경
Node1:
OS: CentOS6.6
eth0: 192.168.0.79
eth1: 10.10.10.1
hostname: fox1

Node2
OS: CentOS6.6
eth0: 192.168.0.80
eth1: 10.10.10.2
hostname: fox2

ServiceIP: 192.168.0.81

Shared Storage
1GB: lock lun용
53GB: data 용

MCSG vsrsion: A.12.00.00_Base_for_Red_Hat_Enterprise_Linux_6_BB094-11001

아래 그림과 같이 구성.

hp_cmcluster

1. mc service guard 설치전 필요한 패키지 설치

# yum install lm_sensors tog-pegasus authd krb5-libs zlib libblkid net-snmp sg3_utils sg3_utils-libs xinetd libnl mdadm udev lsscsi

커널이 2.6.18.128 이상이면 libnl 도 설치한다.

# yum install libnl

컴파일러 설치: 모듈을 설치할때 컴파일러가 필요하다.

# yum groupinstall "Development tools"

2. 클러스터들 사이에 시간 동기호를 위해 ntp를 설치 , 설정한다.

# yum install ntp
# ntpdate -u time.nist.gov

3. /etc/hosts 화일에 아래 내용을 추가한다
[root@fox1 ~]# cat /etc/hosts

192.168.0.79    fox1
192.168.0.80    fox2
192.168.0.81    foxs

10.10.10.1      fox1_h  # MCSG heartbeat
10.10.10.2      fox2_h  # MCSG heartbeat

4. 패키지 설치
cd 또는 image 화일을 마운트 하고 MCSG 패키지를 설치한다.

# cd /mnt/RedHat/RedHat6/Serviceguard/x86_64
# rpm -ivh *.rpm

5. .bashrc 화일에 아래 내용을 추가하고, 적용한다.

# vi /root/.bashrc
PATH=$PATH:/usr/local/cmcluster/bin
. /etc/cmcluster.conf

# source .bashrc

6. 클러스터 노드를 등록한다.

# vi /usr/local/cmcluster/conf/cmclnodelist
fox1 root
fox2 root

7. Lock LUN 만들기(Node1 에서)
디스크확인(1GB 디스크를 lock lun으로 만든다).

# fdisk /dev/sdb
Command (m for help): p
Command (m for help): n
Partition number (1-4): 1
Last cylinder, +cylinders or +size{K,M,G} (1-1011, default 1011): 1011
Command (m for help): w

다른노드에서도 변경된 파티션을 읽기위해 아래 커맨드를 실행한다.

# sfdisk -R /dev/sdb

8. Quorum server 설치, 설정

# cd /mnt/RedHat/RedHat6/QuorumServer/x86_64
# rpm -ivh serviceguard-qs-A.12.00.00-0.rhel6.x86_64.rpm
# vi /usr/local/qs/conf/qs_authfile
fox1
fox2

9. MCSG saftiy timer module 컴파일, 설치

# cd /usr/local/cmcluster/drivers
# make modules
  CC [M]  /usr/local/cmcluster/drivers/deadman.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/local/cmcluster/drivers/deadman.mod.o
  LD [M]  /usr/local/cmcluster/drivers/deadman.ko.unsigned
  NO SIGN [M] /usr/local/cmcluster/drivers/deadman.ko

# make modules_install
  INSTALL /usr/local/cmcluster/drivers/deadman.ko
  DEPMOD  2.6.32-504.8.1.el6.x86_64

설치한 모듈을 커널에 로드한다.

# modprobe deadman

9. 클러스터 설정.
아래 커맨드로 클러스터 설정화일을 생성한다.

# cd /usr/local/cmcluster/conf
# cmquerycl -n fox1 -n fox2 -C cluster1.conf.dist
# grep -v -e ^# -e ^$ cluster1.conf.dist > cluster1.conf

cluster1.conf에 LOCK LUN을 추가해준다.

# vi cluster1.conf
CLUSTER_NAME            fox_cluster
HOSTNAME_ADDRESS_FAMILY         IPV4

NODE_NAME               fox1
  NETWORK_INTERFACE     eth0
    HEARTBEAT_IP        192.168.0.79
  NETWORK_INTERFACE     eth1
    HEARTBEAT_IP        10.10.10.1
CLUSTER_LOCK_LUN        /dev/sdb1

NODE_NAME               fox2
  NETWORK_INTERFACE     eth0
    HEARTBEAT_IP        192.168.0.80
  NETWORK_INTERFACE     eth1
    HEARTBEAT_IP        10.10.10.2
CLUSTER_LOCK_LUN        /dev/sdb1

MEMBER_TIMEOUT          14000000
AUTO_START_TIMEOUT      600000000
NETWORK_POLLING_INTERVAL        2000000
SUBNET 192.168.0.0
  IP_MONITOR OFF
SUBNET 10.10.10.0
  IP_MONITOR OFF
MAX_CONFIGURED_PACKAGES         3
USER_NAME       ANY_USER
USER_HOST       ANY_SERVICEGUARD_NODE
USER_ROLE       MONITOR

설정화일을 node2로 복사한다.

# scp cmclnodelist fox2:/usr/local/cmcluster/conf
# scp cluster1.conf fox2:/usr/local/cmcluster/conf
# scp cmcluster.rc fox2:/usr/local/cmcluster/conf

주의)
module이 설치되지 않았을경우에, 아래와 같은 오류가 발생한다.

# cmquerycl -n fox1 -n fox2 -C cluster1.conf.dist > /dev/null
Unable to receive reply from local cmclconfd. Connection timed out
Unable to initialize HOSTNAME_ADDRESS_FAMILY.

아래와 같은 오류가 발생했다면, iptables(방화벽)가 실행중인지 확인한다.

# cmquerycl -n fox1 -n fox2 -C cluster1.conf.distx
Warning: Unable to determine local domain name for fox1
ERROR: Node fox2 is refusing Serviceguard communication.
Please make sure that the proper security access is configured on node
fox2 through either file-based authorization(pre-A.11.16 version) or
access control policies (version A.11.16 or higher)
and/or that the host name lookup on node fox2
resolves the IP address correctly.
Please make sure that cmclnodelist on node fox2 has entries
for all the nodes in the cluster.
Failed to gather configuration information.

10. 클러스터 데몬 실행
클러스터 설정을 확인하고, 적용한다.

# cmcheckconf -C cluster1.conf
# cmapplyconf -k -C cluster1.conf

자동으로 클러스터에 join 하기 위해 /usr/local/cmcluster/conf/cmcluster.rc 화일에 아래 내용을 수정한다.

#AUTOSTART_CMCLD=0
AUTOSTART_CMCLD=1

양쪽 노드에서 동시에 아래 커맨드로 클러스터 데몬을 실행한다.

# /etc/init.d/cmcluster.init start

주의)
설정확인에 아래와 같은 오류가나온다면, 재부팅한다.

# cmcheckconf -C cluster1.conf
MAX_CONFIGURED_PACKAGES configured to 3.
MAX_CONFIGURED_PACKAGES configured to 3.
WARNING: Unable to obtain host IO timeout setting. Assigning the most conservative value 70000000...
WARNING: Unable to obtain host IO timeout setting. Assigning the most conservative value 70000000...
ERROR: /dev/sdb1 is not a valid device. Validation failed.
ERROR: Invalid data for cluster lock LUN configuration
cmcheckconf: Unable to verify cluster file: cluster1.conf.

11. Shared VG 만들기
남아있는 /dev/sda에 LV를 만들고, 화일시스템을 생성하여 shared storage로 사용한다. 10GB lv를 만들고 xfs 화일시스템을 만든다.
만든 화일시스템을 /fox 에 마운트 해 보고, vg를 비활성으로 만든다.

# pvcreate /dev/sda
# vgcreate vg00 /dev/sda
# lvcreate -L 10G -n foxlv vg00
# mkfs -t xfs /dev/vg00/foxlv
# mkdir /fox
# mount /dev/vg00/foxlv /fox
# umount /fox
# vgchange -a n /dev/vg00

12. PKG 설정
cmmakepkg 커맨드로 템플릿 패키지를 만든다.

# cd /usr/local/cmcluster/conf/pkg
# cmmakepkg pkg1.conf

설정항목이 많고, 복잡하므로 자세한 사항은 문서를 참고해야 한다. 꼭 필요한 부분만 발췌하면 아래와 비슷할 것이다.

package_name pkg1
package_description                     "Serviceguard Package"
module_name                     sg/basic
module_version                  1
module_name                     sg/all
module_version                  2
module_name                     sg/failover
module_version                  1
module_name                     sg/priority
module_version                  1
#module_name                    sg/pr_cntl     
#module_version                 2
module_name                     sg/dependency
module_version                  1
module_name                     sg/weight
module_version                  1
module_name                     sg/monitor_subnet
module_version                  1
module_name                     sg/package_ip
module_version                  1
module_name                     sg/service
module_version                  1
module_name                     sg/generic_resource
module_version                  1
module_name                     sg/volume_group
module_version                  1
module_name                     sg/filesystem
module_version                  1
module_name                     sg/pev
module_version                  1
module_name                     sg/external_pre
module_version                  1
module_name                     sg/external
module_version                  1
module_name                     sg/acp
module_version                  1
package_type                    failover
node_name       fox1
node_name       fox2
auto_run                        yes
node_fail_fast_enabled                  no
run_script_timeout                      no_timeout
halt_script_timeout                     no_timeout
successor_halt_timeout                  no_timeout
script_log_file                 $SGRUN/log/$SG_PACKAGE.log
operation_sequence                      $SGCONF/scripts/sg/external_pre.sh
#operation_sequence                     $SGCONF/scripts/sg/pr_cntl.sh
operation_sequence                      $SGCONF/scripts/sg/volume_group.sh
operation_sequence                      $SGCONF/scripts/sg/filesystem.sh
operation_sequence                      $SGCONF/scripts/sg/package_ip.sh
operation_sequence                      $SGCONF/scripts/sg/external.sh
operation_sequence                      $SGCONF/scripts/sg/service.sh
failover_policy                 configured_node
failback_policy                 manual
priority                        no_priority
monitored_subnet        192.168.0.0
monitored_subnet_access full
ip_subnet       192.168.0.0
ip_subnet_node  fox1
ip_subnet_node  fox2
ip_address      192.168.0.81 # SERVICE IP
vgchange_cmd                    "vgchange -a y"
vxvol_cmd                       "vxvol -g \${DiskGroup} startall"
vg vg00
vxvm_dg_retry                   no
deactivation_retry_count                        2
kill_processes_accessing_raw_devices                    no
concurrent_fsck_operations                      1
concurrent_mount_and_umount_operations                  1
fs_mount_retry_count                    0
fs_umount_retry_count                   1
fs_name         /dev/vg00/foxlv
fs_server       ""
fs_directory    /fox
fs_type         "xfs"
fs_mount_opt    ""
fs_umount_opt   ""
fs_fsck_opt     ""

설정을 마쳤으면, 설정을 검사하고, 적용한다.

# cmcheckconf -v -P pkg.conf
# cmapplyconf -P pkg.conf

주의)
이때, 다음과 같은 오류가 발생하여 PR_mode를 사용하지 않도록 pkg1.conf 을 수정했다.

ERROR: In package pkg1 :/dev/sda1 does not support Persistent Reservations
       Persistent Reservations disabled for package pkg1
       In some configurations this may result in data
       corruption under certain conditions.  Please
       check the documentation for more details.
PR_mode:DISABLED

이 오류는 LUN device가 WERO를 지원하지 않아서 발생한다.

#module_name                    sg/pr_cntl     
#module_version                 2
#operation_sequence                     $SGCONF/scripts/sg/pr_cntl.sh

또는 sg_persist 커맨드로 pr_mode를 disable 할 수 있는듯 하다.(확실하지 않음)

13. 클러스터 실행
아래 커맨드로 클러스터 상태를 확인한다.

# cmviewcl

CLUSTER STATUS
fox_cluster down

NODE STATUS STATE
fox1 down unknown
fox2 down unknown

UNOWNED_PACKAGES

PACKAGE STATUS STATE AUTO_RUN NODE
pkg1 down halted enabled unowned

클러스터를 실행하고, 확인한다.

# cmruncl -f
cmruncl: Validating network configuration...
cmruncl: Network validation complete
cmruncl: Validating cluster lock disk .... Done
Checking for license.........
Found Valid Instant ON License
Days Remaining before Expiration:88
Waiting for cluster to form .... done
Cluster successfully formed.
Check the syslog files on all nodes in the cluster to verify that no warnings occurred during startup.
# cmviewcl

CLUSTER        STATUS
fox_cluster    up

  NODE           STATUS       STATE
  fox1           up           running

    PACKAGE        STATUS           STATE            AUTO_RUN    NODE
    pkg1           up               running          enabled     fox1

  NODE           STATUS       STATE
  fox2           up           running

14. 클러스터에 서비스 등록하기(여기서는 apache 웹서버)
방법은 apache웹서버 와 데이터 모두 shared storage를 사용하는 방법과, 데이터만 shared storage에 사용하는 방법이 있다. 나는 간단하게 데이터만 shared storage를 사용하기로 했다. 이경우는, 양쪽 노드에 httpd를 설치해야한다. 설치는 yum으로 설치했으며 방법은 생략한다.

아파치 웹서버의 DocumentRoot를 shared storage 로 설정한다(httpd.conf 수정). 나는 아래와 같이 설정했다.

DocumentRoot "/fox/html/"

아파치 웹서버 시작 스크립트를 만든다.(템플릿 화일을 원하는 이름으로 복사한 후 아파시 시작/종료 스크립트를 넣어주면 된다)

# cp /usr/local/cmcluster/conf/pkg/external_script.template /usr/local/cmcluster/conf/pkg/apache
# chmod 755 /usr/local/cmcluster/conf/pkg/apache
# scp /usr/local/cmcluster/conf/pkg/apache fox2:/usr/local/cmcluster/conf/pkg/apache

아래부분에 해당 스크립트를 넣어준다.

# vi /usr/local/cmcluster/conf/pkg/apache
 function start_command
{
    sg_log 5 "start_command"
    # ADD your package start steps here
    /etc/init.d/httpd start
    return 0
}
function stop_command
{
    sg_log 5 "stop_command"
    # ADD your package halt steps here
    /etc/init.d/httpd stop
    return 0
}

설정값을 적용한다.

# cmcheckconf -P pkg.conf
On node fox1, validation of package pkg1 succeeded with:
Verifying if the IP addresses could be added to corresponding subnets
On node fox2, validation of package pkg1 succeeded with:
Verifying if the IP addresses could be added to corresponding subnets
Checking for license.........
Found Valid Instant ON License
Days Remaining before Expiration:88
Use the cmapplyconf command to apply the configuration.

# cmapplyconf -P pkg.conf
On node fox2, validation of package pkg1 succeeded with:
Verifying if the IP addresses could be added to corresponding subnets
On node fox1, validation of package pkg1 succeeded with:
Verifying if the IP addresses could be added to corresponding subnets
Checking for license.........
Found Valid Instant ON License
Days Remaining before Expiration:88

One or more of the specified packages are running.
After command completion, check the following to ensure
the configuration changes completed successfully:
1. Any failures logged in syslog and package log files.
2. Packages for which configuration changes failed will have
   online_modification_failed flag set to "yes" in cmviewcl -f line output
Modify the package configuration ([y]/n)? y
Completed the cluster update

15. 테스트
클러스터 확인하고, 서비스(httpd)를 확인한 후, 노드 fox1을 정지시켜 서비스가 fox2로 이전되는지 확인한다.

# cmviewcl

CLUSTER        STATUS
fox_cluster    up

  NODE           STATUS       STATE
  fox1           up           running

    PACKAGE        STATUS           STATE            AUTO_RUN    NODE
    pkg1           up               running          enabled     fox1

  NODE           STATUS       STATE
  fox2           up           running

# cmhaltnode -f fox1
Disabling all packages from starting on nodes to be halted.
Warning:  Do not modify or enable packages until the halt operation is completed.
Disabling automatic failover for failover packages to be halted.
Halting package pkg1
Successfully halted package pkg1
Waiting for nodes to halt ..... done
Successfully halted all nodes specified.
Halt operation complete.

# cmviewcl

CLUSTER        STATUS
fox_cluster    up

  NODE           STATUS       STATE
  fox1           down         halted
  fox2           up           running

    PACKAGE        STATUS           STATE            AUTO_RUN    NODE
    pkg1           up               running          enabled     fox2
# cmviewcl

CLUSTER        STATUS
fox_cluster    up

  NODE           STATUS       STATE
  fox1           up           running

    PACKAGE        STATUS           STATE            AUTO_RUN    NODE
    pkg1           up               running          enabled     fox1

  NODE           STATUS       STATE
  fox2           up           running

node fox2에서 서비스 확인

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1             7.8G  1.3G  6.2G  17% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/mapper/vg00-foxlv
                       10G   33M   10G   1% /fox
# ps -ef | grep -i http
root      4152     1  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4154  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4155  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4157  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4158  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4159  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4160  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4161  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
apache    4162  4152  0 16:05 ?        00:00:00 /usr/sbin/httpd
root      4173  2175  0 16:07 pts/0    00:00:00 grep -i http

16. MCSG manager 설치
MCSG 매니저는 fox1에 설치한다.
iso 이미지는 /mnt에 마운트되어 있다.
먼저, sun java를 설치한 후

# yum install jre-8u40-linux-x64.rpm
# rpm -ivh /mnt/RedHat/RedHat6/SGManager/x86_64/serviceguard-manager-B.12.00.00-0.linux.noarch.rpm
Preparing...                ########################################### [100%]
   1:serviceguard-manager   ########################################### [100%]
Please run /opt/hp/cmcluster/serviceguardmanager/Serviceguard_manager_setup [-u] [-l {jetty location}]> [-o config] | [-l {jetty location}] [-o config]
If LDAP setup is not available then export the sgmgr user password to SGMGR_ENV variable and then run the above script with -u option

MCSG manager는 jetty WAS를 사용하므로, jetty가 먼저 설치되어야 한다.
jetty를 다운로드 받아서 /opt 아래에 압축을 푼다.

# cd /opt
# wget http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution-9.2.9.v20150224.tar.gz
mv jetty-distribution-9.2.9.v20150224 jetty

SG manager를 실행한다.

# /Serviceguard_manager_setup -o config -l /opt/jetty
Restarting Jetty Server
Could not create sgmgr user as the environment variable SGMGR_ENV is not set.Set the env variable and rerun the setup script.

sgmr user가 없으므로, 만들어준다.(id와 passwd를 모두 sgmgr로 만들었다)

# useradd sgmgr
# passwd sgmgr

SGMGR 설정하면, jetty 가 자동으로 실행된다.

# cd /opt/hp/cmcluster/serviceguardmanager
# ./Serviceguard_manager_setup -o config -l /opt/jetty
Restarting Jetty Server

# service-sgmgr status
# service jetty-sgmgr status
Checking arguments to Jetty:
START_INI      =  /opt/jetty/start.ini
JETTY_HOME     =  /opt/jetty
JETTY_CONF     =  /opt/jetty/etc/jetty.conf
JETTY_PID      =  /var/run/jetty.pid
JETTY_START    =  /opt/jetty/start.jar
JETTY_LOGS     =
CONFIGS        =  etc/jetty-logging.xml etc/jetty-started.xml
CLASSPATH      =
JAVA           =  /usr/bin/java
JAVA_OPTIONS   =  -Djetty.state=/opt/jetty/jetty.state -Djetty.home=/opt/jetty -Djava.io.tmpdir=/tmp
JETTY_ARGS     =
RUN_CMD        =  /usr/bin/java -Djetty.state=/opt/jetty/jetty.state -Djetty.home=/opt/jetty -Djava.io.tmpdir=/tmp -jar /opt/jetty/start.jar etc/jetty-logging.xml etc/jetty-started.xml
Jetty running pid=11625

ps 커맨드로 jetty 서버가 잘 실행되고 있는지 확인하고, 웹브라우저로 접속한다.

https://192.168.0.79:5522

이때 id/passwdord는 위에서 설정한 sgmgr 을 읿력한다. 그러면, 아래와 같은 화면을 볼 수 있다.
sgmgr

참고문서: http://h20565.www2.hp.com/hpsc/doc/public/display?docId=emr_na-c04403704-1

9 comments

Skip to comment form

    • gaeyong on 2023년 1월 18일 at 10:51 오후
    • Reply

    혹시 스토리지 대신에 서버로 iscsi 사용해서 볼륨 공유해주는 방법으로도 가능할까요??

    • gaeyong on 2023년 1월 19일 at 9:00 오전
    • Reply

    혹시 스토리지 대신 서버로 iscsi 사용해서 볼륨 공유해주는 방법으로도 가능 할까요??

    1. 가능합니다. 단, iSCSI 볼륨은 클러스터에 참여하지 않는 서버를 사용해야 failover 처리같은것에 문제 없습니다.

        • gaeyong on 2023년 1월 19일 at 3:19 오후
        • Reply

        넵 답변 감사합니다. 한 가지 더 여쭤볼게 있는데 혹시 A.12.00.00_Base_for_Red_Hat_Enterprise_Linux_6_BB094-11001.iso 파일은
        hp사이트에서 유료로 다운받아야 되는건가요??
        구글링 해봤는데 안나오는것 같아가지구요…

        1. 평가판 무료로 받았었습니다. 꽤 오래 전이라 지금은 어떤지 모르겠네요.

        2. 지금 찾아보니 이름이 바뀐거 같아요. SGLX로 hpe software center에서 검색 해 보셔요.

            • gaeyong on 2023년 1월 19일 at 3:49 오후

            감사합니다! 찾아서 다운받았습니다ㅎ

            • gaeyong on 2023년 1월 19일 at 4:43 오후

            한가지 더 여쭤볼게 있는데 다운받은 파일이 rhel 8, 9 용 이라서 rhel 8.1 에
            구성해보려고 하는데 위에 내용으로 똑같이 설정하면 될까요??
            버젼이 달라서 문제 될게 있는지 궁금합니다.

            • snowffox on 2023년 1월 19일 at 5:03 오후
              Author

            그것까지는 모르겠네요. 버전 올라가면서 크게 바뀌는 경우도 있어서… 일단 시도 해 보시고, 안되면 해당 버전 문서를 찾아 보셔야 할겁니다.

답글 남기기

Your email address will not be published.