フェールオーバー(自動)

--1.Oracle Data Guard Brokerのインストール(node1,node2)

show parameter dg
show parameter log;

alter system set dg_broker_start=true scope=both sid='*';

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='';

 

--2.構成の作成(node1)

dgmgrl
connect sys/oracle


CREATE CONFIGURATION 'DRSolution' AS
PRIMARY DATABASE IS 'orcl'
CONNECT IDENTIFIER IS orcl;

SHOW CONFIGURATION;

ADD DATABASE 'stb' AS
CONNECT IDENTIFIER IS stb;

ENABLE CONFIGURATION;

show configuration verbose;
show database verbose 'orcl';
show database verbose 'stb';


--3.DGMGRLサービスの追加

LANG=C netmgr

ListenersのDatabase Servicesに下記を追加
プライマリ側→orcl_DGMGRL.example.com
スタンバイ側→stb_DGMGRL.example.com

lsnrctl stop listener
lsnrctl start listener
lsnrctl service


--4.ファスト・スタート・フェイルオーバーの有効化とオブザーバの起動(node1)

EDIT DATABASE 'orcl' SET PROPERTY 'LogXptMode'='SYNC';
EDIT DATABASE 'stb' SET PROPERTY 'LogXptMode'='SYNC';

EDIT DATABASE 'orcl' SET PROPERTY FastStartFailoverTarget='stb';
EDIT DATABASE 'stb' SET PROPERTY FastStartFailoverTarget='orcl';

EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;

 

--5.フラッシュバックデータベースの有効化(node1,node2)

mkdir -p /u01/app/oracle/oradata/orcl/fra

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM SET db_recovery_file_dest_size=10G;
ALTER SYSTEM SET db_recovery_file_dest='/u01/app/oracle/oradata/orcl/fra';
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;

--6.オブザーバを起動(node2)

dgmgrl
connect sys/oracle

START OBSERVER;

--7.ファスト・スタート・フェイルオーバーを有効化(node1)
dgmgrl
connect sys/oracle

ENABLE FAST_START FAILOVER;
SHOW FAST_START FAILOVER;

(5.6)

--mysqlfailover
https://tkn4416.hatenablog.com/entry/2018/04/13/072210
https://www.s-style.co.jp/blog/2017/10/1147/
https://bugs.mysql.com/bug.php?id=88376


mysqlfailoverでは、GTIDモードのレプリケーションのみ対応しています。
また、マスターからスレーブの情報を取得するため、report-host、report-port、master-info-repository=TABLEの設定が必要


--1. レプリケーション設定の変更

--マスターとスレーブで実施

vim /etc/my.cnf

# レプリケーション設定
server_id=101 # ノードごとに値を変える
log_bin
log_slave_updates
gtid-mode=ON
enforce-gtid-consistency

# mysqlfailoverで必要な設定
report-host=mmm052 # ノードごとにノード名を記載
report-port=3306
master-info-repository=TABLE

--スレーブで実施
stop slave;
reset slave all;


CHANGE MASTER TO
MASTER_HOST='192.168.137.52',
MASTER_PORT = 3306,
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_AUTO_POSITION = 1;

START SLAVE;
show slave status\G


--2. MySQL Utilitiesのインストール


--監視用サーバで実施
yum install -y http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

yum install -y mysql-utilities mysql-community-client

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

 


--3. 監視用ユーザを作成と接続確認
--監視用サーバで実施

useradd dbmon
echo dbmon | passwd --stdin dbmon


--マスターで実施

CREATE USER 'utilities'@'192.168.137.%' identified by 'utilities';
GRANT ALL PRIVILEGES ON *.* TO 'utilities'@'192.168.137.%' WITH GRANT OPTION;

--監視用サーバで実施

su - dbmon
mysql -u utilities -h 192.168.137.52 -p
mysql -u utilities -h 192.168.137.53 -p

--4. MySQL Utilitiesの動作確認
--監視用サーバで実施

mysqlrpladmin --master=utilities:utilities@192.168.137.52:3306 \
--slaves=utilities:utilities@192.168.137.53:3306 \
health


--5. mysqlfailoverの監視用デーモン起動
--監視用サーバで実施

mysqlfailover \
--master=utilities:utilities@192.168.137.52:3306 \
--slaves=utilities:utilities@192.168.137.53:3306 \
--log=/home/dbmon/mysqlfailover.log \
--pidfile=/home/dbmon/failover_daemon.pid \
--rpl-user=repl:repl \
--failover-mode=auto \
--daemo=start \
-v

ps aux | grep mysqlfailover

tail -f /home/dbmon/mysqlfailover.log


--6. マスターを停止してフェイルオーバーを発動させる

systemctl stop mysqld.service


--7. 監視デーモンの停止

--マスターで実施
DROP TABLE IF EXISTS mysql.failover_console;

--監視用サーバで実施

mysqlfailover --daemo=stop --pidfile=/home/dbmon/failover_daemon.pid


----------------------------------------
MySQL MHA
詳細は下記参照
https://qiita.com/KyojiOsada/items/3c135cd80a55d899719d

 

--pg_keeper
https://qiita.com/sawada_masahiko/items/3b1776af52b95b318a5d

マスタ1台、スタンバイ1台で同期レプリケーションを使用した場合のみ対応


バージョン9.6をソースコンパイルした構成で確認

--インストール[プライマリとスタンバイで実施]

unzip pg_keeper-REL1_0_STABLE.zip

cd pg_keeper-REL1_0_STABLE
make USE_PGXS=1
su
make USE_PGXS=1 install
exit

--設定[プライマリで実施]
vim $PGDATA/postgresql.conf

max_worker_processes = 8 # pg_keeper requires one worker on each side
max_wal_senders = 8 # must be more than 1

shared_preload_libraries = 'pg_keeper'
pg_keeper.keepalive_time = 5
pg_keeper.keepalive_count = 3
pg_keeper.my_conninfo = 'host=127.0.0.1 port=5432 dbname=postgres'
pg_keeper.partner_conninfo = 'host=192.168.137.69 port=5432 dbname=postgres'

 

--設定[スタンバイで実施]
vim $PGDATA/postgresql.conf

max_worker_processes = 8 # pg_keeper requires one worker on each side
max_wal_senders = 8 # must be more than 1

shared_preload_libraries = 'pg_keeper'
pg_keeper.keepalive_time = 5
pg_keeper.keepalive_count = 3
pg_keeper.my_conninfo = 'host=127.0.0.1 port=5432 dbname=postgres'
pg_keeper.partner_conninfo = 'host=192.168.137.68 port=5432 dbname=postgres'


--起動[プライマリとスタンバイで実施]

systemctl restart postgresql-9.6
ps -ef | grep pg_keeper | grep -v grep


スタンバイ側を停止するとalter system文を発行し、同期→非同期となる
スタンバイ側が起動しても非同期のまま

非同期→同期にもどす
ALTER SYSTEM RESET synchronous_standby_names;

サービス再起動

select * from pg_stat_replication;

マスタサーバが停止した場合、自動でスタンバイ側にフェールオーバする

 

フェールオーバモードを「自動」設定

同期モードの場合、セカンダリが停止してもプライマリで更新は可能
同期モードでプライマリが停止してセカンダリにフェールオーバした後プライマリが復活した場合、
自動ではフェールバックしない