スイッチオーバー

--スイッチオーバできるか確認(node1)
select switchover_status from v$database;

--スイッチオーバー(node1)
alter database commit to switchover to physical standby with session shutdown;
startup mount;
select name, db_unique_name, open_mode, database_role from v$database;

--プライマリに切り替えられるか確認(node2)
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

--スイッチオーバ(node2)
alter database commit to switchover to primary with session shutdown;
select name, db_unique_name, open_mode, database_role from v$database;
alter database open;

--ログ適用サービスを開始(node1)
alter database recover managed standby database using current logfile disconnect from session;

MySQL Utilitiesのmysqlrpladmin


--1.ユーザ追加[1号機で実行]
CREATE USER 'root'@'192.168.137.%' identified by 'Aaa!1234';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.137.%' WITH GRANT OPTION;

create user 'repl'@'mmm052' identified by 'repl';
grant replication slave on *.* to 'repl'@'mmm052';

create user 'repl'@'mmm053' identified by 'repl';
grant replication slave on *.* to 'repl'@'mmm053';

 

--2.MySQL Utilitiesのインストール[1号機と2号機で実行]
yum install -y mysql-utilities

ln -s /usr/lib/python2.7/site-packages/mysql/utilities /usr/lib64/python2.7/site-packages/mysql/utilities


--3.GTID有効化等[1号機と2号機で実行]

vi /etc/my.cnf

[mysqld]

log_bin
log_slave_updates
gtid-mode=ON
enforce-gtid-consistency

master_info_repository = TABLE
relay_log_info_repository = TABLE

 

--4.スイッチオーバー[1号機で実行]
mysqlrpladmin --master=root:'Aaa!1234'@mmm052 --slave=root:'Aaa!1234'@mmm053 health

mysqlrpladmin -vv --master=root:'Aaa!1234'@mmm052 --slave=root:'Aaa!1234'@mmm053 elect

mysqlrpladmin -vv --master=root:'Aaa!1234'@mmm052 --slave=root:'Aaa!1234'@mmm053 --new-master=root:'Aaa!1234'@mmm053 --demote-master switchover

mysqlrpladmin --master=root:'Aaa!1234'@mmm053 --slave=root:'Aaa!1234'@mmm052 health

 

--5.スイッチバック[2号機で実行]
mysqlrpladmin --master=root:'Aaa!1234'@mmm053 --slave=root:'Aaa!1234'@mmm052 health

mysqlrpladmin -vv --master=root:'Aaa!1234'@mmm053 --slave=root:'Aaa!1234'@mmm052 elect

mysqlrpladmin -vv --master=root:'Aaa!1234'@mmm053 --slave=root:'Aaa!1234'@mmm052 --new-master=root:'Aaa!1234'@mmm052 --demote-master switchover

mysqlrpladmin -vv --master=root:'Aaa!1234'@mmm052 --slave=root:'Aaa!1234'@mmm053 health

 

 

--repmgr
https://qiita.com/U_ikki/items/81ad07e9dc93853bc225
https://repmgr.org/

プライマリ:CentOS8 mmm165
スタンバイ:CentOS8 mmm166
PostgreSQL 12.3
repmgr v.5.1.0


(1) hostsの設定 [両ノードで実行]

vim /etc/hosts

192.168.137.165 mmm165
192.168.137.166 mmm166


(2) PostgreSQL12インストール [両ノードで実行]

-- リポジトリ追加
dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm


-- インストール
dnf module disable postgresql
dnf clean all

dnf info postgresql12-server

dnf install postgresql12-server postgresql12-contrib postgresql12-devel postgresql12-libs
/usr/pgsql-12/bin/postgres --version

-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-12/bin/postgresql-12-setup initdb

 

-- DB起動
systemctl start postgresql-12
systemctl status postgresql-12


-- DB接続
su - postgres
psql -c "select version();"

 

(3) ssh鍵設定 [両ノードで実行]


visudo
postgres ALL=(ALL) NOPASSWD: ALL

echo postgres | passwd --stdin postgres

su - postgres
ssh-keygen

-- mmm165で実行する場合
ssh-copy-id mmm166

-- mmm166で実行する場合
ssh-copy-id mmm165


(4) repmgrインストール [両ノードで実行]


dnf search repmgr
dnf install repmgr12


(5) PostgreSQL設定 [mmm165で実行]


vim postgresql.conf

listen_addresses = '*'
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
archive_mode = on
archive_command = '/bin/true'

sudo systemctl restart postgresql-12


(6) repmgrユーザとDBの作成 [mmm165で実行]

create user repmgr superuser;

create database repmgr owner = repmgr;

\du
\l

(7) pg_hba.conf設定 [mmm165で実行]

vim pg_hba.conf

local replication repmgr trust
host replication repmgr 127.0.0.1/32 trust
host replication repmgr 192.168.137.0/24 trust

local repmgr repmgr trust
host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 192.168.137.0/24 trust

sudo systemctl restart postgresql-12


(8) スタンバイの準備 [mmm166で実行]


sudo systemctl stop postgresql-12
sudo systemctl status postgresql-12

cd /var/lib/pgsql/12
rm -rf data

psql -U repmgr -d repmgr -h mmm165 -c "select version();"


(9) repmgrコンフィグファイルの作成 [mmm165で実行]


vim /etc/repmgr/12/repmgr.conf

node_id=1
node_name='mmm165'
conninfo='host=mmm165 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/12/data'


(10) プライマリの登録 [mmm165で実行]

su - postgres

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf primary register

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show

psql -U repmgr -d repmgr -h mmm165 -c "SELECT * FROM repmgr.nodes;" -x

psql -U repmgr -d repmgr -h mmm165 -c "\dx" -x

→repmgr extensionがインストールされる


(11) スタンバイのクローニング [mmm166で実行]

vim /etc/repmgr/12/repmgr.conf

node_id=2
node_name='mmm166'
conninfo='host=mmm166 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/12/data'

su - postgres


/usr/pgsql-12/bin/repmgr -h mmm165 -U repmgr -d repmgr -f /etc/repmgr/12/repmgr.conf standby clone --dry-run

/usr/pgsql-12/bin/repmgr -h mmm165 -U repmgr -d repmgr -f /etc/repmgr/12/repmgr.conf standby clone


sudo systemctl start postgresql-12
sudo systemctl status postgresql-12


(12) レプリケーションの確認

-- mmm165で実行
psql -U repmgr -d repmgr -h mmm165 -c "SELECT * FROM pg_stat_replication;" -x

-- mmm166で実行
psql -U repmgr -d repmgr -h mmm166 -c "SELECT * FROM pg_stat_wal_receiver;" -x

(13) スタンバイの登録 [mmm166で実行]

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf standby register

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show

 


------------スイッチオーバする場合------------

(14) スイッチオーバの準備 [両ノードで実行]

vim /etc/repmgr/12/repmgr.conf

service_start_command = 'sudo systemctl start postgresql-12'
service_stop_command = 'sudo systemctl stop postgresql-12'
service_restart_command = 'sudo systemctl restart postgresql-12'


/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf node service --list-actions --action=stop
/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf node service --list-actions --action=start
/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf node service --list-actions --action=restart


(15) スイッチオーバ [mmm166で実行]

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf standby switchover --siblings-follow --dry-run

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf standby switchover --siblings-follow

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show


------------フェイルオーバする場合------------

(14) スタンバイのpromote

-- mmm166で実行
psql -U repmgr -d repmgr -h mmm166 -c "SELECT pg_is_in_recovery();" -x

-- mmm165で実行
sudo systemctl stop postgresql-12
sudo systemctl status postgresql-12

-- mmm166で実行

/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf standby promote
/usr/pgsql-12/bin/repmgr -f /etc/repmgr/12/repmgr.conf cluster show

psql -U repmgr -d repmgr -h mmm166 -c "SELECT pg_is_in_recovery();" -x

 

 

--スイッチオーバー先で実行する
use master
go

ALTER AVAILABILITY GROUP [TEST_AG] FAILOVER;
GO

※同期している場合だけ実行可能
-- 非同期コミットの場合、下記のようなメッセージが出る
メッセージ 41142、レベル 16、状態 34、行 1
この SQL Server インスタンスの可用性グループ 'ag1' の可用性レプリカをプライマリ レプリカにすることはできません。
1 つ以上のデータベースが同期されていないか、可用性グループを結合していません。
可用性レプリカが非同期コミット モードを使用している場合は、強制手動フェールオーバーを実行することを検討してください
 (データの欠落が起きる可能性があります)。そうでない場合は、すべてのローカル セカンダリ データベースが結合および同期されたら、
 計画的な手動フェールオーバーをこのセカンダリ レプリカに実行できます (データの欠落は起きません)。
 詳細については SQL Server オンライン ブックを参照してください。