5.3. Galera 클러스터 문제 해결
Galera 클러스터가 복원 절차의 일부로 복원되지 않으면 Galera를 수동으로 복원해야 합니다.
이 절차에서는 하나의 컨트롤러 노드에서 일부 단계를 수행해야 합니다. 절차를 진행하는 것과 동일한 컨트롤러 노드에서 다음 단계를 수행해야 합니다.
절차
Controller-0에서 Galera 클러스터 가상 IP를 검색합니다.
$ sudo hiera -c /etc/puppet/hiera.yaml mysql_vip모든 컨트롤러 노드에서 가상 IP를 통해 데이터베이스 연결을 비활성화합니다.
$ sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROPController-0에서 MySQL 루트 암호를 검색합니다.
$ sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_passwordController-0에서 Galera 리소스를
Unmanaged모드로 설정합니다.$ sudo pcs resource unmanage galera-bundle모든 컨트롤러 노드에서 MySQL 컨테이너를 중지합니다.
$ sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)모든 컨트롤러 노드에서 현재 디렉터리를 이동합니다.
$ sudo mv /var/lib/mysql /var/lib/mysql-save모든 컨트롤러 노드에서 새 디렉토리
/var/lib/mysq를 생성합니다.$ sudo mkdir /var/lib/mysql $ sudo chown 42434:42434 /var/lib/mysql $ sudo chcon -t container_file_t /var/lib/mysql $ sudo chmod 0755 /var/lib/mysql $ sudo chcon -r object_r /var/lib/mysql $ sudo chcon -u system_u /var/lib/mysql모든 컨트롤러 노드에서 MySQL 컨테이너를 시작합니다.
$ sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)모든 컨트롤러 노드에서 MySQL 데이터베이스를 생성합니다.
$ sudo docker exec -i $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql"모든 컨트롤러 노드에서 데이터베이스를 시작합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &모든 컨트롤러 노드에서
.my.cnfGalera 구성 파일을 이동합니다.$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"모든 컨트롤러 노드에서 Galera 루트 암호를 재설정합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -uroot -e'use mysql;update user set password=PASSWORD(\"$ROOTPASSWORD\")where User=\"root\";flush privileges;'"모든 컨트롤러 노드의 Galera 컨테이너 내부에
.my.cnfGalera 구성 파일을 복원합니다.$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"Controller-0에서 백업 데이터베이스 파일을
/var/lib/MySQL에 복사합니다.$ sudo cp $BACKUP_FILE /var/lib/mysql $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysql참고이러한 파일의 경로는 /home/heat-admin/입니다.
Controller-0에서 MySQL 데이터베이스를 복원합니다.
$ sudo docker exec $(docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_FILE \" " $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_GRANT_FILE \" "모든 컨트롤러 노드에서 데이터베이스를 종료합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"Controller-0에서 부트스트랩 노드를 시작합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql \ --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=gcomm:// &검증: Controller-0에서 클러스터 상태를 확인합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck""Galera 클러스터 노드가 동기화됨"이라는 메시지가 표시되는지 확인합니다. 그러지 않으면 노드를 다시 생성해야 합니다.
Controller-0에서 구성에서 클러스터 주소를 검색합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'나머지 각 컨트롤러 노드에서 데이터베이스를 시작하고 클러스터를 검증합니다.
데이터베이스를 시작합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock \ --datadir=/var/lib/mysql --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=$CLUSTER_ADDRESS &MYSQL 클러스터의 상태를 확인합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck""Galera 클러스터 노드가 동기화됨"이라는 메시지가 표시되는지 확인합니다. 그러지 않으면 노드를 다시 생성해야 합니다.
모든 컨트롤러 노드에서 MySQL 컨테이너를 중지합니다.
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdown모든 컨트롤러 노드에서 가상 IP 주소를 통한 데이터베이스 연결을 허용하도록 다음 방화벽 규칙을 제거합니다.
$ sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP모든 컨트롤러 노드에서 MySQL 컨테이너를 다시 시작합니다.
$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)모든 컨트롤러 노드에서
clustercheck컨테이너를 다시 시작합니다.$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)Controller-0에서 Galera 리소스를
관리모드로 설정합니다.$ sudo pcs resource manage galera-bundle