MySQL 서버 monitor_20000 노드 1에서 "실행되지 않음" - HA 클러스터 - Pacemaker-Corosync-DRBD

MySQL 서버 monitor_20000 노드 1에서 "실행되지 않음" - HA 클러스터 - Pacemaker-Corosync-DRBD

이 오류는 클러스터 구성을 완료한 후에 발생합니다. 노드 2에서 장애 복구를 시도한 후

mysql_service01_monitor_20000 on node1 'not running' (7): call=20, status=complete, exitreason='none'

클러스터를 종료하고 mariadb를 다시 시작하세요.

pcs cluster stop --all

service mariadb restart

service mariadb stop

pcs cluster start --all

모든 것이 온라인입니다.

pcs cluster standby node1

노드 2로 장애 조치합니다. 그런데 이런 오류가 또 나오네요...

mysql_service01_monitor_20000 on node1 'not running' (7): call=77, status=complete, exitreason='none'

node1로 장애 복구를 시도합니다.

pcs cluster unstandby node1
pcs cluster standby node2

오류 복구가 발생하지 않고 다음이 표시됩니다.

Failed Actions:
* mysql_service01_monitor_20000 on node2 'not running' (7): call=141, status=complete, exitreason='none',
last-rc-change='Mon Jun 13 20:33:36 2016', queued=0ms, exec=43ms
* mysql_service01_monitor_20000 on node1 'not running' (7): call=77, status=complete, exitreason='none',
last-rc-change='Mon Jun 13 20:31:23 2016', queued=0ms, exec=42ms
* mysql_fs01_start_0 on node1 'unknown error' (1): call=113, status=complete, exitreason='Couldn't mount filesystem /dev/drbd0 on /var/lib/mysql',
last-rc-change='Mon Jun 13 20:33:47 2016', queued=0ms, exec=53ms

클러스터를 종료하고 MariaDB를 다시 시작한 후두 개의 노드에서나는 그것을 다시 시작했다.

mysql_service01    (ocf::heartbeat:mysql): FAILED node1

PC 클러스터 중지 --all(성공)을 완료하고 재부팅한 후, PC 클러스터 시작 --all을 수행합니다. 모든 것이 정상입니다!

다소 임의적이지만 HA이고 장애 조치 설정에 대한 이메일 알림을 받았으므로 그날의 백업을 완료하고 노드 1에서 서비스를 종료하고 다시 시작할 수 있기를 바랍니다. 하지만 저는 무슨 일이 일어나고 있는지, 그리고 이를 방지하는 방법을 알고 싶습니다. 그러면 상사의 프레젠테이션이 확실히 안 좋아 보일 것입니다.

내 구성:

방화벽/SELinux 비활성화

sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config
systemctl disable firewalld.service
systemctl stop firewalld.service
iptables --flush
reboot

PaceMaker + Corosync(CentOS 7) 설치

hostnamectl set-hostname $(uname -n | sed s/\\..*//)
yum install -y pcs policycoreutils-python psmisc
echo "passwd" | passwd hacluster --stdin
systemctl start pcsd.service
systemctl enable pcsd.service

Node1에 대한 승인

pcs cluster auth node1 node2 -u hacluster -p passwd
pcs cluster setup --force --name mysql_cluster node1 node2
pcs cluster start --all
pcs status | grep UNCLEAN

DRBD/MariaDB를 설치합니다:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum install -y kmod-drbd84 drbd84-utils mariadb-server mariadb
systemctl disable mariadb.service

cat << EOL > /etc/my.cnf
[mysqld]
symbolic-links=0
bind_address            = 0.0.0.0
datadir                 = /var/lib/mysql
pid_file                = /var/run/mariadb/mysqld.pid
socket                  = /var/run/mariadb/mysqld.sock

[mysqld_safe]
bind_address            = 0.0.0.0
datadir                 = /var/lib/mysql
pid_file                = /var/run/mariadb/mysqld.pid
socket                  = /var/run/mariadb/mysqld.sock

!includedir /etc/my.cnf.d
EOL

박사 연구 그룹:

cat << EOL >/etc/drbd.d/mysql01.res
resource mysql01 {
 protocol C;
 meta-disk internal;
 device /dev/drbd0;
 disk   /dev/sdb1;
 handlers {
  split-brain "/usr/lib/drbd/notify-split-brain.sh root";
 }
 net {
  allow-two-primaries no;
  after-sb-0pri discard-zero-changes;
  after-sb-1pri discard-secondary;
  after-sb-2pri disconnect;
  rr-conflict disconnect;
 }
 disk {
  on-io-error detach;
 }
 syncer {
  verify-alg sha1;
 }
 on node1 {
  address  192.168.1.216:7788;
 }
 on node2 {
  address  192.168.1.220:7788;
 }
}
EOL

fdisk /dev/sdb

drbdadm create-md mysql01
modprobe drbd
drbdadm up mysql01

drbdadm -- --overwrite-data-of-peer primary mysql01
drbdadm primary --force mysql01
watch cat /proc/drbd
mkfs.ext4 /dev/drbd0
mount /dev/drbd0 /mnt
df -h | grep drbd
umount /mnt
mount /dev/drbd0 /mnt # I Always get IO Errors so I just
drbdadm up mysql01 # Both nodes
watch cat /proc/drbd
mount /dev/drbd0 /mnt
df -h | grep drbd
systemctl start mariadb
mysql_install_db --datadir=/mnt --user=mysql
umount /mnt
systemctl stop mariadb

PaceMaker Corosync 구성:

pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd \
  drbd_resource=mysql01 \
  op monitor interval=30s
    pcs -f clust_cfg resource master MySQLClone01 mysql_data01 \
  master-max=1 master-node-max=1 \
  clone-max=2 clone-node-max=1 \
  notify=true
    pcs -f clust_cfg resource create mysql_fs01 Filesystem \
  device="/dev/drbd0" \
  directory="/var/lib/mysql" \
  fstype="ext4"
    pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql \
  binary="/usr/bin/mysqld_safe" \
  config="/etc/my.cnf" \
  datadir="/var/lib/mysql" \
  pid="/var/lib/mysql/mysql.pid" \
  socket="/var/lib/mysql/mysql.sock" \
  additional_parameters="--bind-address=0.0.0.0" \
  op start timeout=60s \
  op stop timeout=60s \
  op monitor interval=20s timeout=30s
    pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 \
 ip=192.168.1.215 cidr_netmask=32 nic=eth0 \
 op monitor interval=30s
    pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY
    pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY
    pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 INFINITY with-rsc-role=Master
    pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01
    pcs -f clust_cfg constraint location mysql_fs01 prefers node1=50
    pcs -f clust_cfg property set stonith-enabled=false
    pcs -f clust_cfg property set no-quorum-policy=ignore
    pcs -f clust_cfg resource defaults resource-stickiness=200
    pcs -f clust_cfg resource group add SQL-Group  mysql_service01  mysql_fs01 mysql_VIP01
    pcs cluster cib-push clust_cfg
    pcs status

업데이트된 댓글:

충분합니다. FS 이전에 복제본을 원하고 서비스 이전에 FS를 원한다고 가정합니다. 그리고 제가 복사한 Apache 구성에서는 웹서버보다 먼저 VIP를 시작했는데, 제가 따라한 SQL 가이드에서는 VIP를 먼저 시작하게 되어 있었습니다. 어떤 아이디어가 있나요?

pcs -f clust_cf constraint order promote MySQLClone01 then start mysql_fs01
pcs -f clust_cf constraint order mysql_fs01 then mysql_service01

테스트해보고 문제가 해결되면 다시 돌아오겠습니다! 감사해요

이렇게 하면 문제가 해결된 것 같고 장애 조치가 정상적으로 발생하지만 여전히 오류가 발생하지만 앞서 말했듯이 훌륭하게 작동합니다! 오류를 보고 싶지 않지만 장애 조치 시간은 약 2초입니다.

pcs constraint order promote MySQLClone01 then start mysql_fs01
pcs constraint order mysql_service01 then mysql_fs01

답변1

그룹은 질서와 위치를 의미합니다. 따라서 귀하의 그룹에서는 "mysql을 시작한 다음 파일 시스템을 마운트하고 VIP를 시작하십시오"라고 말합니다. 이는 잘못된 순서일 뿐만 아니라 주문 제약 조건과도 충돌합니다.

DRBD를 제외한 모든 것을 그룹에 넣은 다음 단일 순서 및 단일 공동 배치 제약 조건을 배치하여 그룹을 DRBD가 지배적인 위치에 연결해야 합니다.

제약 조건이 클러스터에 추가되는 순서는 결과에 전혀 영향을 미치지 않습니다.

여기에 무엇을 넣느냐에 따라 다음과 같이 됩니다.

# pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd \
  drbd_resource=mysql01 op monitor interval=30s
# pcs -f clust_cfg resource master MySQLClone01 mysql_data01 \
  master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 \
  notify=true
# pcs -f clust_cfg resource create mysql_fs01 Filesystem \
  device="/dev/drbd0" directory="/var/lib/mysql" fstype="ext4"
# pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql \
  binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" \
  datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" \
  socket="/var/lib/mysql/mysql.sock" \
  additional_parameters="--bind-address=0.0.0.0" \
  op start timeout=60s op stop timeout=60s \
  op monitor interval=20s timeout=30s
# pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 \
  ip=192.168.1.215 cidr_netmask=32 nic=eth0 op monitor interval=30s
# pcs -f clust_cfg resource group add SQL-Group mysql_fs01 \
  mysql_service01 mysql_VIP01
# pcs -f clust_cf constraint order promote MySQLClone01 \
  then start SQL-Group
# pcs -f clust_cfg constraint colocation add SQL-Group with MySQLClone01 INFINITY with-rsc-role=Master
# pcs cluster cib-push clust_cfg

답변2

pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 \
INFINITY with-rsc-role=Master
pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY
pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service0 INFINITY
pcs -f clust_cfg constraint order promote MySQLClone01 then start mysql_fs01
pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01
pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01

나에게 올바른 길을 알려준 Patrick에게 감사드립니다! , 그것을 알아내는 데 시간이 좀 걸렸습니다. 제약 조건을 입력하는 순서가 출력에 영향을 미치는 것 같습니다. 위의 제약 조건을 사용했지만 다른 순서로 입력했습니다.

관련 정보