--スイッチオーバできるか確認(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 オンライン ブックを参照してください。