(8.0.27)
OS: CentOS7
メモリ2G/ディスク60G
https://blog.s-style.co.jp/2021/11/8297/
https://dev.mysql.com/doc/mysql-shell/8.0/en/innodb-clusterset.html
https://www.mysql.com/jp/why-mysql/presentations/mysql-innodb-clusterset-doc-jp/
※InnoDB cluster と binlog_replicationの組み合わせや、InnoDB clusterと InnoDB ReplicaSetの組み合わせはサポートされていない模様のため、
8.0.27からの新機能である InnoDB ClusterSet を使用する
プライマリサイト
mmm121 mysql_router mysql_shell
mmm122 node1
mmm123 node2
mmm124 node3
DRサイト
mmm125 mysql_router mysql_shell
mmm126 node1
mmm127 node2
mmm128 node3
-- 1. リポジトリインストール[mmm121,mmm122,mmm123,mmm124,mmm125,mmm126,mmm127,mmm128]
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
-- 2. MySQL Shell のセットアップ[mmm121,mmm125]
python -V
yum install -y mysql-shell
-- 3. MySQL のインストール[mmm122,mmm123,mmm124,mmm126,mmm127,mmm128]
yum install -y mysql-community-server
systemctl start mysqld
systemctl status mysqld
mysql -u root -p`grep 'temporary password' /var/log/mysqld.log | awk -e '{print $13}'`
ALTER USER root@localhost IDENTIFIED BY 'password';
create user 'root'@'%' identified by 'password';
grant all on *.* to 'root'@'%' with grant option;
-- 4. MySQL Group Replication の各インスタンスの設定[mmm121]
mysqlsh
dba.checkInstanceConfiguration('root@192.168.137.122')
dba.configureInstance('root@192.168.137.122')
dba.configureInstance('root@192.168.137.123')
dba.configureInstance('root@192.168.137.124')
dba.configureInstance('root@192.168.137.126')
dba.configureInstance('root@192.168.137.127')
dba.configureInstance('root@192.168.137.128')
-- 5. InnoDB ClusterSetの設定[mmm121]
\c root@192.168.137.122
cluster1 = dba.createCluster('cluster1')
cluster1.addInstance('root@192.168.137.123')
cluster1.addInstance('root@192.168.137.124')
cluster1.status()
myclusterset = cluster1.createClusterSet('myclusterset')
myclusterset.status()
cluster2 = myclusterset.createReplicaCluster('root@192.168.137.126', 'cluster2')
cluster2.addInstance('root@192.168.137.127')
cluster2.addInstance('root@192.168.137.128')
myclusterset.status()
myclusterset.status({extended: 1})
-- 6. MySQL Router のインストール[mmm121,mmm125]
yum install -y mysql-router
-- 7. MySQL Router の初期設定[mmm121]
mysqlrouter --bootstrap root@192.168.137.122 --user=mysqlrouter
systemctl start mysqlrouter
systemctl status mysqlrouter
cat /var/log/mysqlrouter/mysqlrouter.log
mysqlsh --uri root@192.168.137.121:6446 --sql
select @@hostname;
mysqlsh --uri root@192.168.137.121:6447 --sql
select @@hostname;
-- 8. MySQL Router の初期設定[mmm125]
mysqlrouter --bootstrap root@192.168.137.126 --user=mysqlrouter
systemctl start mysqlrouter
systemctl status mysqlrouter
cat /var/log/mysqlrouter/mysqlrouter.log
mysqlsh --uri root@192.168.137.125:6446 --sql
select @@hostname;
mysqlsh --uri root@192.168.137.125:6447 --sql
select @@hostname;
-- 9. フェイルオーバーの動作確認
-- MySQL停止[mmm122,mmm123,mmm124]
systemctl stop mysqld
-- cluster2をプライマリー・クラスターに昇格[mmm125]
mysqlsh --uri root@192.168.137.126:3306
myclusterset=dba.getClusterSet()
myclusterset.status({extended: 1})
myclusterset.forcePrimaryCluster('cluster2')
myclusterset.status({extended: 1})
(19c)
https://blogs.oracle.com/otnjp/post/shibacho-058
RAC + Data Guard
OS: CentOS 7.9
mmm121: プライマリサイト RAC node1 メモリ:8G/ディスク:60G
mmm122: プライマリサイト RAC node2 メモリ:8G/ディスク:60G
mmm123: プライマリサイト iSCSIターゲット メモリ:2G/ディスク:60G + 40G + 40G
mmm124: スタンバイサイト RAC node1 メモリ:8G/ディスク:60G
mmm125: スタンバイサイト RAC node2 メモリ:8G/ディスク:60G
mmm126: スタンバイサイト iSCSIターゲット メモリ:2G/ディスク:60G + 40G + 40G
プライマリサイトSCAN 192.168.137.133
スタンバイサイトSCAN 192.168.137.136
プライマリサイトDB名: moon
スタンバイサイトDB名: moon
プライマリサイトDBユニーク名: moon
スタンバイサイトDBユニーク名: sun
プライマリサイト
mmm121
eth0 192.168.137.121 eth1 192.168.70.121 vip 192.168.137.131
mmm122
eth0 192.168.137.122 eth1 192.168.70.122 vip 192.168.137.132
mmm123
eth0 192.168.137.123
scan
192.168.137.133
スタンバイサイト
mmm124
eth0 192.168.137.124 eth1 192.168.70.124 vip 192.168.137.134
mmm125
eth0 192.168.137.125 eth1 192.168.70.125 vip 192.168.137.135
mmm126
eth0 192.168.137.126
scan
192.168.137.136
大文字小文字は以下のとおりとする
:小文字:
SID
DB名
DBユニーク名
インスタンス名
サービス名
:大文字:
TNSエイリアス名
LOG_ARCHIVE_DEST_3のSERVICE
FAL_CLIENT
FAL_SERVER
ASMのディレクトリ名のDB部分 <==自動で大文字になる模様
--------[1]事前準備--------
-- 1. OS設定[mmm121,mmm122,mmm124,mmm125]
※プライマリサイトとスタンバイサイトのDBノード4台で実施
--1.1 HOSTSファイル設定
vim /etc/hosts
192.168.137.121 mmm121.example.com mmm121
192.168.70.121 mmm121-priv.example.com mmm121-priv
192.168.137.131 mmm121-vip.example.com mmm121-vip
192.168.137.122 mmm122.example.com mmm122
192.168.70.122 mmm122-priv.example.com mmm122-priv
192.168.137.132 mmm122-vip.example.com mmm122-vip
192.168.137.124 mmm124.example.com mmm124
192.168.70.124 mmm124-priv.example.com mmm124-priv
192.168.137.134 mmm124-vip.example.com mmm124-vip
192.168.137.125 mmm125.example.com mmm125
192.168.70.125 mmm125-priv.example.com mmm125-priv
192.168.137.135 mmm125-vip.example.com mmm125
192.168.137.123 mmm123.example.com mmm123
192.168.137.126 mmm126.example.com mmm126
192.168.137.133 mmscan133.example.com mmscan133
192.168.137.136 mmscan136.example.com mmscan136
--1.2 ユーザ設定
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 racdba
useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
echo oracle | passwd --stdin oracle
groupadd -g 1001 asmadmin
groupadd -g 1002 asmdba
useradd -u 54322 -g oinstall -G asmadmin,asmdba grid
echo grid | passwd --stdin grid
----------------------------------------------
--1.3 preinstall.rpmをCentOS7で使用
https://bismarc256.hateblo.jp/entry/2022/01/18/200000
https://www.intellilink.co.jp/column/oracle/2015/110600.aspx
OL7.9(V1009690-01.iso)をSCP
mount -o ro,loop /root/V1009690-01.iso /mnt
ls /mnt
cd /etc/yum.repos.d
ls
vim /etc/yum.repos.d/ol79.repo
[ol79]
name=Oracle Linux 7.9 x86_64
baseurl=file:///mnt
gpgkey=file:///mnt/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
yum clean all
yum --disablerepo="*" --enablerepo=ol79 repolist
yum install oracle-database-preinstall-19c -y
umount /mnt
rm -i /root/V1009690-01.iso
----------------------------------------------
--1.4 PAM修正
vim /etc/pam.d/login
session required pam_limits.so
--1.5 NTP設定
systemctl enable chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service
--1.6 ディレクトリ作成
mkdir -p /u01/app/oracle
mkdir -p /u01/app/grid
mkdir -p /u01/app/19.0.0/grid
mkdir /u01/app/oraInventory
chown -R grid:oinstall /u01
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01
--1.7 ユーザ環境設定
vim /home/oracle/.bash_profile
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022
-- 2. プライマリサイト iSCSIターゲット設定[mmm123]
vim /etc/hosts
192.168.137.121 mmm121.example.com mmm121
192.168.70.121 mmm121-priv.example.com mmm121-priv
192.168.137.131 mmm121-vip.example.com mmm121-vip
192.168.137.122 mmm122.example.com mmm122
192.168.70.122 mmm122-priv.example.com mmm122-priv
192.168.137.132 mmm122-vip.example.com mmm122-vip
192.168.137.124 mmm124.example.com mmm124
192.168.70.124 mmm124-priv.example.com mmm124-priv
192.168.137.134 mmm124-vip.example.com mmm124-vip
192.168.137.125 mmm125.example.com mmm125
192.168.70.125 mmm125-priv.example.com mmm125-priv
192.168.137.135 mmm125-vip.example.com mmm125
192.168.137.123 mmm123.example.com mmm123
192.168.137.126 mmm126.example.com mmm126
192.168.137.133 mmscan133.example.com mmscan133
192.168.137.136 mmscan136.example.com mmscan136
fdisk /dev/sdb
fdisk /dev/sdc
yum -y install targetcli
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm123
targetcli
/> ls
o- / ....................................................................................... [...]
o- backstores ............................................................................ [...]
| o- block ................................................................ [Storage Objects: 2]
| | o- block0 ....................................... [/dev/sdb1 (40.0GiB) write-thru activated]
| | | o- alua ................................................................. [ALUA Groups: 1]
| | | o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized]
| | o- block1 ....................................... [/dev/sdc1 (40.0GiB) write-thru activated]
| | o- alua ................................................................. [ALUA Groups: 1]
| | o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized]
| o- fileio ............................................................... [Storage Objects: 0]
| o- pscsi ................................................................ [Storage Objects: 0]
| o- ramdisk .............................................................. [Storage Objects: 0]
o- iscsi .......................................................................... [Targets: 1]
| o- iqn.1994-05.com.redhat:mmm123 ................................................... [TPGs: 1]
| o- tpg1 ............................................................. [no-gen-acls, no-auth]
| o- acls ........................................................................ [ACLs: 2]
| | o- iqn.1994-05.com.redhat:mmm121 ...................................... [Mapped LUNs: 2]
| | | o- mapped_lun0 .............................................. [lun0 block/block0 (rw)]
| | | o- mapped_lun1 .............................................. [lun1 block/block1 (rw)]
| | o- iqn.1994-05.com.redhat:mmm122 ...................................... [Mapped LUNs: 2]
| | o- mapped_lun0 .............................................. [lun0 block/block0 (rw)]
| | o- mapped_lun1 .............................................. [lun1 block/block1 (rw)]
| o- luns ........................................................................ [LUNs: 2]
| | o- lun0 .................................. [block/block0 (/dev/sdb1) (default_tg_pt_gp)]
| | o- lun1 .................................. [block/block1 (/dev/sdc1) (default_tg_pt_gp)]
| o- portals .................................................................. [Portals: 1]
| o- 192.168.137.123:3260 ........................................................... [OK]
o- loopback ....................................................................... [Targets: 0]
systemctl enable target
systemctl start target
-- 3. スタンバイサイト iSCSIターゲット設定[mmm126]
vim /etc/hosts
192.168.137.121 mmm121.example.com mmm121
192.168.70.121 mmm121-priv.example.com mmm121-priv
192.168.137.131 mmm121-vip.example.com mmm121-vip
192.168.137.122 mmm122.example.com mmm122
192.168.70.122 mmm122-priv.example.com mmm122-priv
192.168.137.132 mmm122-vip.example.com mmm122-vip
192.168.137.124 mmm124.example.com mmm124
192.168.70.124 mmm124-priv.example.com mmm124-priv
192.168.137.134 mmm124-vip.example.com mmm124-vip
192.168.137.125 mmm125.example.com mmm125
192.168.70.125 mmm125-priv.example.com mmm125-priv
192.168.137.135 mmm125-vip.example.com mmm125
192.168.137.123 mmm123.example.com mmm123
192.168.137.126 mmm126.example.com mmm126
192.168.137.133 mmscan133.example.com mmscan133
192.168.137.136 mmscan136.example.com mmscan136
fdisk /dev/sdb
fdisk /dev/sdc
yum -y install targetcli
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm126
targetcli
/> ls
o- / ......................................................................................... [...]
o- backstores .............................................................................. [...]
| o- block .................................................................. [Storage Objects: 2]
| | o- block0 ......................................... [/dev/sdb1 (40.0GiB) write-thru activated]
| | | o- alua ................................................................... [ALUA Groups: 1]
| | | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| | o- block1 ......................................... [/dev/sdc1 (40.0GiB) write-thru activated]
| | o- alua ................................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| o- fileio ................................................................. [Storage Objects: 0]
| o- pscsi .................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................ [Storage Objects: 0]
o- iscsi ............................................................................ [Targets: 1]
| o- iqn.1994-05.com.redhat:mmm126 ..................................................... [TPGs: 1]
| o- tpg1 ............................................................... [no-gen-acls, no-auth]
| o- acls .......................................................................... [ACLs: 2]
| | o- iqn.1994-05.com.redhat:mmm124 ........................................ [Mapped LUNs: 2]
| | | o- mapped_lun0 ................................................ [lun0 block/block0 (rw)]
| | | o- mapped_lun1 ................................................ [lun1 block/block1 (rw)]
| | o- iqn.1994-05.com.redhat:mmm125 ........................................ [Mapped LUNs: 2]
| | o- mapped_lun0 ................................................ [lun0 block/block0 (rw)]
| | o- mapped_lun1 ................................................ [lun1 block/block1 (rw)]
| o- luns .......................................................................... [LUNs: 2]
| | o- lun0 .................................... [block/block0 (/dev/sdb1) (default_tg_pt_gp)]
| | o- lun1 .................................... [block/block1 (/dev/sdc1) (default_tg_pt_gp)]
| o- portals .................................................................... [Portals: 1]
| o- 192.168.137.126:3260 ............................................................. [OK]
o- loopback ......................................................................... [Targets: 0]
systemctl enable target
systemctl start target
-- 4. プライマリサイト 共有ディスク設定[mmm121,mmm122]
yum install -y iscsi-initiator-utils
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm121 ←mmm121の場合
InitiatorName=iqn.1994-05.com.redhat:mmm122 ←mmm122の場合
systemctl enable iscsi
systemctl enable iscsid
systemctl start iscsi
systemctl start iscsid
iscsiadm --mode discoverydb --type sendtargets --portal 192.168.137.123 --discover
iscsiadm --mode node --targetname iqn.1994-05.com.redhat:mmm123 --portal 192.168.137.123 --login
iscsiadm --mode session -P3
/usr/lib/udev/scsi_id -g -u -d /dev/sdb
/usr/lib/udev/scsi_id -g -u -d /dev/sdc
vim /etc/udev/rules.d/99-vmware-scsi-timeout.rules
ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="VMware ", ATTRS{model}=="Virtual disk ", RUN+="/bin/sh -c 'echo 180 > /sys$DEVPATH/timeout'"
KERNEL=="sdb", ENV{ID_SERIAL}=="36001405124dcb8d2abf4582be8206fe7", SYMLINK+="oracleasm/asmdata11", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc", ENV{ID_SERIAL}=="360014058f8772f07cf24585a8af99b57", SYMLINK+="oracleasm/asmdata12", OWNER="grid", GROUP="asmadmin", MODE="0660"
↑2,3行のラベルはscsi_idコマンドの結果で置き換える
cat /etc/udev/rules.d/99-vmware-scsi-timeout.rules
reboot
ll /dev/sd*
-- 5. スタンバイサイト 共有ディスク設定[mmm124,mmm125]
yum install -y iscsi-initiator-utils
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm124 ←mmm124の場合
InitiatorName=iqn.1994-05.com.redhat:mmm125 ←mmm125の場合
systemctl enable iscsi
systemctl enable iscsid
systemctl start iscsi
systemctl start iscsid
iscsiadm --mode discoverydb --type sendtargets --portal 192.168.137.126 --discover
iscsiadm --mode node --targetname iqn.1994-05.com.redhat:mmm126 --portal 192.168.137.126 --login
iscsiadm --mode session -P3
/usr/lib/udev/scsi_id -g -u -d /dev/sdb
/usr/lib/udev/scsi_id -g -u -d /dev/sdc
vim /etc/udev/rules.d/99-vmware-scsi-timeout.rules
ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="VMware ", ATTRS{model}=="Virtual disk ", RUN+="/bin/sh -c 'echo 180 > /sys$DEVPATH/timeout'"
KERNEL=="sdb", ENV{ID_SERIAL}=="36001405ab2cf542cf1640329731b9e52", SYMLINK+="oracleasm/asmdata21", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc", ENV{ID_SERIAL}=="360014053b9b5cb35b454faf8c9ed5c8d", SYMLINK+="oracleasm/asmdata22", OWNER="grid", GROUP="asmadmin", MODE="0660"
↑2,3行のラベルはscsi_idコマンドの結果で置き換える
cat /etc/udev/rules.d/99-vmware-scsi-timeout.rules
reboot
ll /dev/sd*
-- 6. プライマリサイト GIインストール[mmm121]
--gridユーザで実行
mkdir -p /u01/app/19.0.0/grid
chown grid:oinstall /u01/app/19.0.0/grid
cd /u01/app/19.0.0/grid
unzip /tmp/LINUX.X64_193000_grid_home.zip
su root
rpm -Uvh /u01/app/19.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm
※2号機にも転送してインストール
--------------------------------------------
-- インストール時のチェック対応
※1号機と2号機で実施
vim /etc/security/limits.conf
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
yum install compat-libstdc++-33
※パッケージgcc-c++はyumでエラーとなるので、無視
--------------------------------------------
exit
LANG=C /u01/app/19.0.0/grid/gridSetup.sh
/dev/sdbをDATAディスクグループに追加
asmca
/dev/sdcをFRAディスクグループに追加
vim /root/.bash_profile
※1号機と2号機で実施
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022
. /root/.bash_profile
crsctl stat res -t
-- 7. スタンバイサイト GIインストール[mmm124]
--gridユーザで実行
mkdir -p /u01/app/19.0.0/grid
chown grid:oinstall /u01/app/19.0.0/grid
cd /u01/app/19.0.0/grid
unzip /tmp/LINUX.X64_193000_grid_home.zip
su root
rpm -Uvh /u01/app/19.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm
※2号機にも転送してインストール
--------------------------------------------
-- インストール時のチェック対応
※1号機と2号機で実施
vim /etc/security/limits.conf
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
yum install compat-libstdc++-33
※パッケージgcc-c++はyumでエラーとなるので、無視
--------------------------------------------
exit
LANG=C /u01/app/19.0.0/grid/gridSetup.sh
/dev/sdbをDATAディスクグループに追加
asmca
/dev/sdcをFRAディスクグループに追加
vim /root/.bash_profile
※1号機と2号機で実施
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022
. /root/.bash_profile
crsctl stat res -t
-- 8. プライマリサイト Oracleソフトウェアインストール[mmm121]
--oracleユーザで実行
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
unzip /tmp/LINUX.X64_193000_db_home.zip
LANG=C ./runInstaller
-- 9. スタンバイサイト Oracleソフトウェアインストール[mmm124]
--oracleユーザで実行
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
unzip /tmp/LINUX.X64_193000_db_home.zip
LANG=C ./runInstaller
-- 10. プライマリサイト DB構築[mmm121]
export NLS_LANG=American_America.AL32UTF8
LANG=C dbca
※DB構築はプライマリサイトのみ。
-- 11. GI自動起動の無効化[mmm121,mmm122,mmm124,mmm125]
crsctl disable crs
-- 12. PDB自動起動設定[mmm121,mmm122]
export ORACLE_SID=moon1
export ORACLE_SID=moon2
sqlplus / as sysdba
show pdbs;
alter pluggable database pdb1 save state;
show pdbs;
-- 13. glogin.sql設定[mmm121,mmm122,mmm124,mmm125]
vim $ORACLE_HOME/sqlplus/admin/glogin.sql
set lines 1000
set pages 5000
set trims on
set sqlprompt "&_connect_identifier(&_user)> "
vim ~/.bashrc
alias cdh='cd $ORACLE_HOME'
alias cdb='cd $ORACLE_BASE'
alias sql='sqlplus / as sysdba'
. ~/.bashrc
-- 14. テストテーブル作成[mmm121]
export ORACLE_SID=moon1
sqlplus / as sysdba
alter session set container=pdb1;
create user test identified by test;
grant dba to test;
conn test/test@mmm121-vip.example.com:1521/pdb1
create table tab1(col1 int);
insert into tab1 values(1);
commit;
select * from tab1;
-- 15. ネットワーク設定[mmm121,mmm122,mmm124,mmm125]
cd $ORACLE_HOME/network/admin
vim tnsnames.ora
MOON =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip)(PORT = 1521) )
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = moon)
)
)
MOON1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = moon)
)
)
MOON2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = moon)
)
)
pdb1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmscan133.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
pdb11 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
pdb12 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
SUN=
(DESCRIPTION =
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip)(PORT = 1521) )
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip)(PORT = 1521) ) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sun)
)
)
SUN1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sun)
)
)
SUN2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sun)
)
)
PDB1RO =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmscan136.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
PDB11RO =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
PDB12RO =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip.example.com)(PORT = 1521) )
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
cat tnsnames.ora
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@MOON as sysdba
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@MOON1 as sysdba
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@MOON2 as sysdba
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB1
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB11
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB12
--------[2]RACデータガード構築--------
-- 1. データガード前提条件の確認と設定[mmm121]
export ORACLE_SID=moon1
sqlplus / as sysdba
show pdbs
archive log list
select FORCE_LOGGING from V$DATABASE ;
select flashback_on from v$database ;
select GROUP#, THREAD#, BYTES/1024/1024, MEMBERS from V$LOG order by 1, 2 ;
select GROUP#, THREAD#, BYTES/1024/1024 from V$STANDBY_LOG order by 1, 2;
col FILE_NAME for a60
select FILE_NAME, FORMAT, IS_ASM from V$PASSWORDFILE_INFO ;
alter database force logging ;
select FORCE_LOGGING from V$DATABASE ;
alter database flashback on;
select flashback_on from v$database ;
-- スタンバイREDOは(REDOグループ数+1)個作成、メンバー数は1固定
alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 2 size 200M;
alter database add standby logfile thread 2 size 200M;
alter database add standby logfile thread 2 size 200M;
select GROUP#, THREAD#, BYTES/1024/1024 from V$STANDBY_LOG order by 1, 2;
-- 2. プライマリDBの初期化パラメータ修正[mmm121]
export ORACLE_SID=moon1
sqlplus / as sysdba
set lines 300 pages 50000 tab off trim on
col NAME for a30
col VALUE for a150
select INST_ID, NAME, VALUE from GV$PARAMETER
where upper(NAME) in (
'LOG_ARCHIVE_CONFIG',
'LOG_ARCHIVE_DEST_1',
'LOG_ARCHIVE_DEST_2',
'LOG_ARCHIVE_DEST_3',
'LOG_ARCHIVE_DEST_STATE_1',
'LOG_ARCHIVE_DEST_STATE_2',
'LOG_ARCHIVE_DEST_STATE_3',
'LOG_ARCHIVE_FORMAT',
'REMOTE_LOGIN_PASSWORDFILE',
'DB_RECOVERY_FILE_DEST',
'DB_RECOVERY_FILE_DEST_SIZE',
'FAL_CLIENT',
'FAL_SERVER',
'STANDBY_FILE_MANAGEMENT',
'DB_NAME',
'DB_UNIQUE_NAME',
'AUDIT_FILE_DEST',
'DIAGNOSTIC_DEST',
'REMOTE_LISTENER',
'CLUSTER_INTERCONNECTS')
order by 2, 1 ;
-- パラメータ変更
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(moon,sun)' scope=both sid='*' ;
alter system set LOG_ARCHIVE_DEST_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) MAX_FAILURE=1 REOPEN=5 DB_UNIQUE_NAME=moon ALTERNATE=LOG_ARCHIVE_DEST_2' scope=both sid='*' ;
alter system set LOG_ARCHIVE_DEST_2='location=+DATA valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=moon ALTERNATE=LOG_ARCHIVE_DEST_1' scope=both sid='*' ;
alter system set LOG_ARCHIVE_DEST_3='SERVICE=SUN ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sun' scope=both sid='*' ;
alter system set log_archive_dest_state_2='ALTERNATE' scope=both sid='*' ;
alter system set FAL_CLIENT='MOON' scope=both sid='*' ;
alter system set FAL_SERVER='SUN' scope=both sid='*' ;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=both sid='*' ;
-- 3. バックアップを格納するディレクトリを作成[mmm121,mmm124]
export ORACLE_SID=+ASM1
asmcmd
cd +DATA
mkdir BKUP
-- 4. バックアップ取得[mmm121]
-- oracleユーザで実行
export ORACLE_SID=moon1
export NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS"
rman target /
※DBIDは後で使用するため、記録しておく
ターゲット・データベース: MOON (DBID=2849016951)に接続されました
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 ;
delete noprompt force archivelog all;
delete noprompt force backup of archivelog all ;
delete noprompt force backup of database ;
delete noprompt force backup of controlfile ;
delete noprompt force datafilecopy all ;
BACKUP
DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
ARCHIVELOG ALL ;
BACKUP
DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update'
DATABASE ;
BACKUP
DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U' TAG 'controlfile'
CURRENT CONTROLFILE ;
BACKUP
DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U' TAG 'spfile'
SPFILE ;
BACKUP
DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
ARCHIVELOG ALL ;
list backup summary;
list datafilecopy all ;
list backup of archivelog all ;
list backupset 18;
list backupset 20;
-- 5. バックアップファイルをStandby Database側へコピー[mmm121]
export ORACLE_SID=+ASM1
asmcmd
cp +FRA/MOON/DATAFILE/system.274.1094855165 sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.bk
cp +FRA/MOON/DATAFILE/sysaux.271.1094855165 sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.bk
cp +FRA/MOON/DATAFILE/undotbs1.275.1094855179 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.bk
cp +FRA/MOON/DATAFILE/undotbs2.264.1094855199 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs2.bk
cp +FRA/MOON/DATAFILE/users.279.1094855203 sys/oracle@mmm124.+ASM1:+DATA/BKUP/users.bk
cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/system.265.1094855195 sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.s.bk
cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/sysaux.270.1094855199 sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.s.bk
cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/undotbs1.272.1094855181 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.s.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/system.273.1094855197 sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/sysaux.282.1094855203 sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/undotbs1.266.1094855187 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/undo_2.267.1094855189 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undo_2.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/users.278.1094855205 sys/oracle@mmm124.+ASM1:+DATA/BKUP/users.p.bk
-- 制御ファイル、SPFILE、アーカイブログのバックアップも同様にリモート・コピー
cp +DATA/BKUP/0s0k4afn_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/0s0k4afn_1_1.bk
cp +DATA/BKUP/0r0k4afn_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/0r0k4afn_1_1.bk
cp +DATA/BKUP/1g0k4ahj_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/1g0k4ahj_1_1.bk
cp +DATA/BKUP/1h0k4ahj_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/1h0k4ahj_1_1.bk
cp +DATA/BKUP/1c0k4ah9_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/1c0k4ah9_1_1.bk
cp +DATA/BKUP/1e0k4ahe_1_1 sys/oracle@mmm124.+ASM1:+DATA/BKUP/1e0k4ahe_1_1.bk
-- 6. パスワードファイルをスタンバイ側へコピー[mmm121]
-- gridユーザ
export ORACLE_SID=+ASM1
asmcmd
cp +DATA/MOON/PASSWORD/pwdmoon.258.1094764905 /tmp/orapwsun
exit
-- oracleユーザ
cd /tmp
scp orapwsun mmm124:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun1
scp orapwsun mmm125:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun2
-- 7. 監査ファイルの保存先の作成[mmm124,mmm125]
-- スタンバイDB1号機で実施
mkdir -p /u01/app/oracle/admin/sun/adump
mkdir -p /u01/app/oracle/diag/rdbms/sun/sun1
-- スタンバイDB2号機で実施
mkdir -p /u01/app/oracle/admin/sun/adump
mkdir -p /u01/app/oracle/diag/rdbms/sun/sun2
-- 8. 補助インスタンス用の初期化パラメータ・ファイルの作成[mmm124]
vim /tmp/pfileAUX.ora
*.DB_NAME='moon'
*.DB_UNIQUE_NAME='sun'
*.DB_BLOCK_SIZE=8192
*.MEMORY_TARGET=2g
*.REMOTE_LOGIN_PASSWORDFILE='EXCLUSIVE'
-- 9. 補助インスタンス起動[mmm124]
export ORACLE_SID=sun1
env | grep ORA
sqlplus / as sysdba
startup nomount pfile='/tmp/pfileAUX.ora' ;
-- Password Fileを読み込んでいることを確認
set lines 160 pages 50000 tab off trim on
col FILE_NAME for a60
select FILE_NAME, FORMAT, IS_ASM from V$PASSWORDFILE_INFO ;
-- 10. RMANバックアップからスタンバイDBの作成[mmm124]
export ORACLE_SID=sun1
rman auxiliary /
duplicate database 'moon' DBID 2849016951 for standby
backup location '+DATA/BKUP/'
dorecover
spfile
set DB_UNIQUE_NAME='sun'
set LOG_ARCHIVE_DEST_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) MAX_FAILURE=1 REOPEN=5 DB_UNIQUE_NAME=sun ALTERNATE=LOG_ARCHIVE_DEST_2'
set LOG_ARCHIVE_DEST_2='location=+DATA valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sun ALTERNATE=LOG_ARCHIVE_DEST_1'
set LOG_ARCHIVE_DEST_3='SERVICE=MOON ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=moon'
set FAL_SERVER='MOON'
set FAL_CLIENT='SUN'
set AUDIT_FILE_DEST='/u01/app/oracle/admin/sun/adump'
set INSTANCE_NUMBER='1'
set CONTROL_FILES='+DATA/SUN/CONTROLFILE/standby_controlfile.ctl'
set remote_listener='mmscan136.example.com:1521'
;
-- 複製されたデータベースの名前、インスタンス名、ロールを確認
export ORACLE_SID=sun1
sqlplus / as sysdba
select NAME, DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE, FLASHBACK_ON from V$DATABASE ;
alter database flashback on ;
select NAME, DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE, FLASHBACK_ON from V$DATABASE ;
-- 11. SPFILE作成[mmm124]
create pfile='/tmp/pfileSTB.ora' from spfile ;
shutdown immediate ;
cp /tmp/pfileSTB.ora /tmp/pfileSTB.ora.bk
vim /tmp/pfileSTB.ora
アンダースコアで始まるパラメータを削除
次のパラメータが存在している場合は削除
*.instance_number
*.thread
*.undo_tablespace
インスタンス名を修正
moon1 -> sun1
moon2 -> sun2
*.dispatchers='(PROTOCOL=TCP) (SERVICE=moonXDB)'
↓
*.dispatchers='(PROTOCOL=TCP) (SERVICE=sunXDB)'
-- 12. SPFILEのASM配置[mmm124]
SPFILE格納用ディレクトリを作成
export ORACLE_SID=+ASM1
asmcmd
mkdir +DATA/SUN/parameterfile
export ORACLE_SID=sun1
sqlplus / as sysdba
create spfile='+DATA/SUN/parameterfile/spfilesun.ora' from pfile='/tmp/pfileSTB.ora' ;
-- 13. PFILE作成[mmm124,mmm125]
-- スタンバイDB1号機で実施
rm -rf $ORACLE_HOME/dbs/spfilesun1.ora
echo "SPFILE='+DATA/SUN/parameterfile/spfilesun.ora'" > $ORACLE_HOME/dbs/initsun1.ora
-- スタンバイDB2号機で実施
rm -rf $ORACLE_HOME/dbs/spfilesun2.ora
echo "SPFILE='+DATA/SUN/parameterfile/spfilesun.ora'" > $ORACLE_HOME/dbs/initsun2.ora
-- 14. 第 2 制御ファイルの作成[mmm124]
export ORACLE_SID=+ASM1
asmcmd
mkdir +FRA/SUN/controlfile
export ORACLE_SID=sun1
sqlplus / as sysdba
startup nomount;
alter system set control_files='+DATA/SUN/controlfile/current','+FRA/SUN/controlfile/current' scope=spfile sid='*' ;
shutdown immediate;
startup nomount;
export ORACLE_SID=sun1
rman target /
restore controlfile from '+DATA/SUN/controlfile/standby_controlfile.ctl';
shutdown immediate;
-- 15. パスワードファイルのASM配置[mmm124]
export ORACLE_SID=+ASM1
asmcmd
mkdir +DATA/SUN/password
cp /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun1 +DATA/SUN/password/orapwsun
-- 16. GIへのリソース登録[mmm124]
srvctl add database -db sun -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 -dbtype RAC -dbname sun -role physical_standby -spfile "+DATA/SUN/parameterfile/spfilesun.ora" -pwfile "+DATA/SUN/password/orapwsun"
srvctl add instance -db sun -instance sun1 -node mmm124
srvctl add instance -db sun -instance sun2 -node mmm125
srvctl config database -db sun -all
-- 17. スタンバイDBの起動[mmm124]
srvctl start database -db sun -startoption mount
-------------------------------------
※エラー発生
PRCD-1332 : データベースsunの起動に失敗しました
PRCR-1079 : リソースora.sun.dbの起動に失敗しました
CRS-5017: リソース・アクション"ora.sun.db start"に次のエラーが発生しました:
ORA-01565: error in identifying file '+DATA/SUN/parameterfile/spfilesun.ora'
ORA-17503: ksfdopn:2 Failed to open file +DATA/SUN/parameterfile/spfilesun.ora
ORA-15001: diskgroup "DATA" does not exist or is not mounted
ORA-15040: diskgroup is incomplete
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/mmm125/crs/trace/crsd_oraagent_oracle.trc")を参照してください。
CRS-2674: 'ora.sun.db'('mmm125')の起動に失敗しました
CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.sun.db'の配置を試行するサーバーはありません
-------------------------------------
srvctl stop database -db sun
srvctl start database -db sun -startoption mount
DBを再起動するとエラーは発生しなくなった
export ORACLE_SID=sun1
sqlplus / as sysdba
alter database recover managed standby database disconnect from session ;
set linesize 170 pages 50000 tab off trim on
col VALUE for a32
select PROCESS,PID,STATUS,THREAD#,SEQUENCE# from V$MANAGED_STANDBY where PROCESS='MRP0';
select SOURCE_DB_UNIQUE_NAME, NAME, VALUE, UNIT from V$DATAGUARD_STATS ;
-- 18. Data Guard構成確認[mmm121]
set linesize 250 pages 5000 tab off
col FORCE_LOGGING for a6
col FLASHBACK_ON for a6
select DBID, NAME, DB_UNIQUE_NAME, DATABASE_ROLE, PROTECTION_MODE, CURRENT_SCN, FLASHBACK_ON, FORCE_LOGGING from V$DATABASE ;
select * from V$DATAGUARD_CONFIG ;
set linesize 200 pages 5000 tab off
col DEST_NAME for a20
col DB_UNIQUE_NAME for a8
col TARGET for a8
col RECOVERY_MODE for a25
col GAP_STATUS for a10
select A.DEST_ID, A.DEST_NAME, A.DB_UNIQUE_NAME, B.DATABASE_MODE, B.RECOVERY_MODE,
A.TRANSMIT_MODE, A.AFFIRM, A.TARGET, A.STATUS, A.LOG_SEQUENCE, A.APPLIED_SCN,
B.GAP_STATUS, A.ERROR, B.ERROR
from V$ARCHIVE_DEST A, V$ARCHIVE_DEST_STATUS B
where A.DEST_ID=B.DEST_ID
and A.TARGET in ('STANDBY', 'REMOTE') ;
set linesize 200 pages 5000 tab off
col PID for a10
select NAME, PID, TYPE, ROLE, ACTION, CLIENT_PID, CLIENT_ROLE, THREAD#, SEQUENCE#, BLOCK#, BLOCK_COUNT, DELAY_MINS, DEST_ID, DBID, DGID, INSTANCE
from V$DATAGUARD_PROCESS
order by 1 ;
-- 19. Data Guard構成確認[mmm124,mmm125]
set linesize 200 pages 5000 tab off
col PID for a10
select NAME, PID, TYPE, ROLE, ACTION, CLIENT_PID, CLIENT_ROLE, THREAD#, SEQUENCE#, BLOCK#, BLOCK_COUNT, DELAY_MINS, DEST_ID, DBID, DGID, INSTANCE
from V$DATAGUARD_PROCESS
order by 1 ;
-- 読み取りオープン
※スタンバイDB1号機とスタンバイDB2号機のそれぞれで実行する
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
alter pluggable database pdb1 open;
alter pluggable database pdb1 save state; --> スタンバイ側ではエラーとなる
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@SUN as sysdba
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@SUN1 as sysdba
echo "select instance_name from v\$instance;" | sqlplus sys/oracle@SUN2 as sysdba
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB1RO
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB11RO
echo "select instance_name from v\$instance;" | sqlplus test/test@PDB12RO
(14)
【1】ストリーミングレプリケーション+Pgpool-Ⅱ(負荷分散)
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/pgpool2/
https://qiita.com/isobecky74/items/1420155715a85eb8748f
https://www.conversion.co.jp/technology/blog/-/detail/=/blog_id=7802823
https://www.pgpool.net/docs/latest/ja/html/index.html
https://qiita.com/mkyz08/items/91a883a9876125123da5
OS: CentOS7
メモリ2G/ディスク60G
pgpool-II version 4.3.0 (tamahomeboshi)
プライマリサイト
mmm121 Pgpool-Ⅱ(負荷分散機能のみ使用)
mmm122 node1
mmm123 node2
DRサイト
mmm125 Pgpool-Ⅱ(負荷分散機能のみ使用)
mmm126 node1
mmm127 node2
※下記のようにカスケードレプリケーションを設定する
mmm122
↓
mmm123
↓
↓
mmm126
↓
mmm127
※pgpoolでmd5認証を使用したい場合、postgreSQLの初期化パラメータで設定が必要
password_encryption = md5
-- 1. postgreSQLインストール[mmm122,mmm123,mmm126,mmm127]
-- リポジトリの追加
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info postgresql14-server
-- インストール
yum install -y epel-release centos-release-scl
yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version
-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb
-- DB起動
systemctl start postgresql-14
systemctl status postgresql-14
-- DB接続
su - postgres
psql
-- postgresDBユーザのパスワード設定
SET password_encryption = 'md5';
alter user postgres with encrypted password 'postgres';
-- pgpool用DBユーザの作成
SET password_encryption = 'md5';
CREATE user pgpool with superuser encrypted password 'pgpool';
-- visudoでpostgresユーザ追加
visudo
postgres ALL=(ALL) NOPASSWD: ALL
-- 2. mmm122 -> mmm123 のレプリケーション設定
-- レプリケーション用のユーザーを作成する[mmm122]
CREATE USER repl_user REPLICATION PASSWORD 'repl_user';
-- マスターとスレーブが接続できるように設定する[mmm122]
vim /var/lib/pgsql/14/data/pg_hba.conf
↓記述追加
host replication repl_user 127.0.0.1/32 md5
host replication repl_user 192.168.137.0/24 md5
host all all 192.168.137.0/24 md5
local all all peer
↓
local all all trust
-- postgres.confの設定[mmm122]
mkdir -p /var/lib/pgsql/14/archive
cp /var/lib/pgsql/14/data/postgresql.conf /var/lib/pgsql/14/data/postgresql.conf.bk`date +"%Y%m%d%H%M%S"`
vim /var/lib/pgsql/14/data/postgresql.conf
wal_level = replica
synchronous_commit = on
max_wal_senders = 10
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/14/archive/%f && cp %p /var/lib/pgsql/14/archive/%f'
hot_standby = on
log_filename = 'postgresql-%Y-%m-%d.log'
listen_addresses = '*'
hot_standby_feedback = on
max_replication_slots = 10
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm122'
primary_slot_name = 'slot_123'
password_encryption = md5
sudo systemctl restart postgresql-14
-- スロットの作成[mmm122]
SELECT * FROM pg_create_physical_replication_slot('slot_122');
-- ベースバックアップをスレーブに転送する[mmm123]
su - postgres
sudo systemctl stop postgresql-14
mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.122 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R
-- スレーブDBの設定[mmm123]
cd /var/lib/pgsql/14/data
vim /var/lib/pgsql/14/data/postgresql.conf
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm122'
primary_slot_name = 'slot_123'
↓
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.122 port=5432 application_name=mmm123'
primary_slot_name = 'slot_122'
-- スレーブDBの起動[mmm123]
sudo systemctl start postgresql-14
-- スロットの作成[mmm123]
SELECT * FROM pg_create_physical_replication_slot('slot_123');
-- レプリケーションの状態を確認[mmm122]
select * from pg_stat_replication;
-- スロット使用確認[mmm122]
SELECT slot_name, active FROM pg_replication_slots;
-- コンフリクトの確認[mmm123]
select * from pg_stat_database_conflicts;
-- 3. mmm123 -> mmm126 のレプリケーション設定
-- ベースバックアップをスレーブに転送する[mmm126]
su - postgres
sudo systemctl stop postgresql-14
mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.123 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R
-- スレーブDBの設定[mmm126]
cd /var/lib/pgsql/14/data
vim /var/lib/pgsql/14/data/postgresql.conf
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.122 port=5432 application_name=mmm123'
primary_slot_name = 'slot_122'
↓
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm126'
primary_slot_name = 'slot_123'
-- スレーブDBの起動[mmm126]
sudo systemctl start postgresql-14
-- スロットの作成[mmm126]
SELECT * FROM pg_create_physical_replication_slot('slot_126');
-- レプリケーションの状態を確認[mmm123]
select * from pg_stat_replication;
-- スロット使用確認[mmm123]
SELECT slot_name, active FROM pg_replication_slots;
-- コンフリクトの確認[mmm126]
select * from pg_stat_database_conflicts;
-- 4. mmm126 -> mmm127 のレプリケーション設定
-- ベースバックアップをスレーブに転送する[mmm127]
su - postgres
sudo systemctl stop postgresql-14
mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.126 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R
-- スレーブDBの設定[mmm127]
cd /var/lib/pgsql/14/data
vim /var/lib/pgsql/14/data/postgresql.conf
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm126'
primary_slot_name = 'slot_123'
↓
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.126 port=5432 application_name=mmm127'
primary_slot_name = 'slot_126'
-- スレーブDBの起動[mmm127]
sudo systemctl start postgresql-14
-- スロットの作成[mmm127]
SELECT * FROM pg_create_physical_replication_slot('slot_127');
-- レプリケーションの状態を確認[mmm126]
select * from pg_stat_replication;
-- スロット使用確認[mmm126]
SELECT slot_name, active FROM pg_replication_slots;
-- コンフリクトの確認[mmm127]
select * from pg_stat_database_conflicts;
-- 5. プライマリサイトのPgpool-Ⅱの設定
-- psqlクライアントのインストール[mmm121]
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql14
-- Pgpool-Ⅱのインストール[mmm121]
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v
-- pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org
vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載
--------
backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
backend_hostname0 = '192.168.137.122'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm122'
backend_hostname1 = '192.168.137.123'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'mmm123'
load_balance_mode = on
connection_cache = on
num_init_children = 32
max_pool = 4
sr_check_user = 'postgres'
sr_check_password = ''
sr_check_database = 'postgres'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
--------
pg_md5 --md5auth --username=pgpool pgpool
cat /etc/pgpool-II/pool_passwd
-- pg_hba.conf設定
vim /etc/pgpool-II/pool_hba.conf
追加
host all all 192.168.137.0/24 md5
host all all 127.0.0.1/24 md5
systemctl restart pgpool
systemctl status pgpool
-- 動作確認
psql -h 192.168.137.121 -p 9999 -U pgpool -d postgres
show pool_nodes;
-- 6. DRサイトのPgpool-Ⅱの設定
-- psqlクライアントのインストール[mmm125]
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql14
-- Pgpool-Ⅱのインストール[mmm125]
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v
-- pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org
vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載
--------
backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
backend_hostname0 = '192.168.137.126'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm126'
backend_hostname1 = '192.168.137.127'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'mmm127'
load_balance_mode = on
connection_cache = on
num_init_children = 32
max_pool = 4
sr_check_user = 'postgres'
sr_check_password = ''
sr_check_database = 'postgres'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
--------
pg_md5 --md5auth --username=pgpool pgpool
cat /etc/pgpool-II/pool_passwd
-- pg_hba.conf設定
vim /etc/pgpool-II/pool_hba.conf
追加
host all all 192.168.137.0/24 md5
host all all 127.0.0.1/24 md5
systemctl restart pgpool
systemctl status pgpool
-- 動作確認
psql -h 192.168.137.125 -p 9999 -U pgpool -d postgres
show pool_nodes;
(14)
【2】Pgpool-Ⅱクラスタ+サイト間レプリケーション
https://www.pgpool.net/docs/latest/ja/html/example-cluster.html
OS: CentOS7
メモリ2G/ディスク60G
pgpool-II version 4.3.0 (tamahomeboshi)
プライマリサイト
mmm121 192.168.137.121 postgreSQL Pgpool-Ⅱ
mmm122 192.168.137.122 postgreSQL Pgpool-Ⅱ
mmm123 192.168.137.123 postgreSQL Pgpool-Ⅱ
Pgpool-Ⅱ VIP 192.168.137.129
DRサイト
mmm124 192.168.137.124 postgreSQL Pgpool-Ⅱ
mmm125 192.168.137.125 postgreSQL Pgpool-Ⅱ
mmm126 192.168.137.126 postgreSQL Pgpool-Ⅱ
Pgpool-Ⅱ VIP 192.168.137.130
サイト間レプリケーション
VIP
↓
↓
mmm124
サイト間レプリケーションはレプリケーションスロットを作成しない
サイト間レプリケーション送信元としてプライマリサイトのVIPを使用する
DRサイト内は3台ともスタンバイとなる
DRサイト内はmmm124を固定でプライマリとする
---------------------------------------------
-- [1] プライマリサイトのPgpool-IIクラスタの構成
-- 1. postgreSQLインストール[mmm121,mmm122,mmm123]
-- リポジトリの追加
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info -y postgresql14-server
-- インストール
yum install -y epel-release centos-release-scl
yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version
-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb
-- DB起動
systemctl start postgresql-14
systemctl status postgresql-14
-- DB接続
su - postgres
psql
-- visudoでpostgresユーザ追加
visudo
postgres ALL=(ALL) NOPASSWD: ALL
-- postgres OSユーザのパスワード設定
echo postgres | passwd --stdin postgres
-- 2. Pgpool-Ⅱのインストール[mmm121,mmm122,mmm123]
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-devel-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-extensions-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v
-- 3. WALを格納するディレクトリの作成[mmm121,mmm122,mmm123]
su - postgres
mkdir /var/lib/pgsql/archivedir
-- 4. ストリーミングレプリケーションの設定[mmm121]
vim $PGDATA/postgresql.conf
listen_addresses = '*'
archive_mode = always
archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"'
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
wal_log_hints = on
SET password_encryption = 'scram-sha-256';
CREATE ROLE pgpool WITH LOGIN;
CREATE ROLE repl WITH REPLICATION LOGIN;
\password pgpool
\password repl
\password postgres
GRANT pg_monitor TO pgpool;
vim $PGDATA/pg_hba.conf
host all all 192.168.137.0/24 scram-sha-256
host replication all 192.168.137.0/24 scram-sha-256
-- 5. パスワードなし接続設定[mmm121,mmm122,mmm123]
cd /root/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm121
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm122
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm123
su - postgres
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm121
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm122
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm123
ssh postgres@mmm121 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm122 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm123 -i ~/.ssh/id_rsa_pgpool hostname
su - postgres
vim /var/lib/pgsql/.pgpass
mmm121:5432:replication:repl:repl
mmm122:5432:replication:repl:repl
mmm123:5432:replication:repl:repl
mmm121:5432:postgres:postgres:postgres
mmm122:5432:postgres:postgres:postgres
mmm123:5432:postgres:postgres:postgres
chmod 600 /var/lib/pgsql/.pgpass
-- 6. pgpool_node_idファイルの作成[mmm121,mmm122,mmm123]
-- mmm121の場合
echo 0 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- mmm122の場合
echo 1 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- mmm123の場合
echo 2 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- 7. 自動フェイルオーバ用のサンプルスクリプトの設定[mmm121,mmm122,mmm123]
cp -p /etc/pgpool-II/failover.sh{.sample,}
cp -p /etc/pgpool-II/follow_primary.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh}
echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool-II/pcp.conf
su - postgres
echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass
chmod 600 ~/.pcppass
-- 8. オンラインリカバリ用のサンプルスクリプトの設定[mmm121]
cp -p /etc/pgpool-II/recovery_1st_stage.sample /var/lib/pgsql/14/data/recovery_1st_stage
cp -p /etc/pgpool-II/pgpool_remote_start.sample /var/lib/pgsql/14/data/pgpool_remote_start
chown postgres:postgres /var/lib/pgsql/14/data/{recovery_1st_stage,pgpool_remote_start}
su - postgres
psql template1 -c "CREATE EXTENSION pgpool_recovery"
-- 9. Watchdog用のサンプルスクリプトの設定[mmm121,mmm122,mmm123]
cp -p /etc/pgpool-II/escalation.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/escalation.sh
vim /etc/pgpool-II/escalation.sh
PGPOOLS=(server1 server2 server3)
VIP=192.168.137.150
DEVICE=enp0s8
↓
PGPOOLS=(mmm121 mmm122 mmm123)
VIP=192.168.137.129
DEVICE=ens192
-- 10. Pgpool-IIのクライアント認証パスワードファイルの設定[mmm121,mmm122,mmm123]
su - postgres
echo 'postgres' > ~/.pgpoolkey
chmod 600 ~/.pgpoolkey
pg_enc -m -k ~/.pgpoolkey -u pgpool -p
pg_enc -m -k ~/.pgpoolkey -u postgres -p
cat /etc/pgpool-II/pool_passwd
-- 11. ログ格納ディレクトリの作成[mmm121,mmm122,mmm123]
mkdir /var/log/pgpool_log/
chown postgres:postgres /var/log/pgpool_log/
-- 12. Pgpool-IIの設定[mmm121]
mmm121で設定したファイルをmmm122,mmm123へコピーする
-- 12.1 pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org
vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載
socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
wd_ipc_socket_dir = '/var/run/postgresql'
backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
sr_check_user = 'pgpool'
sr_check_password = ''
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = ''
health_check_max_retries = 3
backend_hostname0 = 'mmm121'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'mmm122'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = 'mmm123'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/14/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm121'
backend_application_name1 = 'mmm122'
backend_application_name2 = 'mmm123'
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'recovery_1st_stage'
enable_pool_hba = on
use_watchdog = on
delegate_IP = '192.168.137.129'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens192 label ens192:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens192'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens192'
hostname0 = 'mmm121'
wd_port0 = 9000
pgpool_port0 = 9999
hostname1 = 'mmm122'
wd_port1 = 9000
pgpool_port1 = 9999
hostname2 = 'mmm123'
wd_port2 = 9000
pgpool_port2 = 9999
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
heartbeat_hostname0 = 'mmm121'
heartbeat_port0 = 9694
heartbeat_device0 = ''
heartbeat_hostname1 = 'mmm122'
heartbeat_port1 = 9694
heartbeat_device1 = ''
heartbeat_hostname2 = 'mmm123'
heartbeat_port2 = 9694
heartbeat_device2 = ''
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
wd_escalation_command = '/etc/pgpool-II/escalation.sh'
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
scp -p /etc/pgpool-II/pgpool.conf root@mmm122:/etc/pgpool-II/pgpool.conf
scp -p /etc/pgpool-II/pgpool.conf root@mmm123:/etc/pgpool-II/pgpool.conf
-- 12.2 pool_hba.confの設定
cp -p /etc/pgpool-II/pool_hba.conf /etc/pgpool-II/pool_hba.conf.org
vim /etc/pgpool-II/pool_hba.conf
追加
host all pgpool 192.168.137.0/24 scram-sha-256
host all postgres 192.168.137.0/24 scram-sha-256
scp -p /etc/pgpool-II/pool_hba.conf root@mmm122:/etc/pgpool-II/pool_hba.conf
scp -p /etc/pgpool-II/pool_hba.conf root@mmm123:/etc/pgpool-II/pool_hba.conf
-- 13. /etc/sysconfig/pgpoolの設定[mmm121,mmm122,mmm123]
vim /etc/sysconfig/pgpool
OPTS=" -n"
↓
OPTS=" -D -n"
-- 14. システムの起動と停止[mmm121,mmm122,mmm123]
Pgpool-IIを起動する前に、 PostgreSQLを起動する必要があります。
PostgreSQLを停止する前に、 Pgpool-IIを停止する必要があります。
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start
systemctl stop pgpool
systemctl status pgpool
systemctl start pgpool
PostgreSQLは全号機起動
Pgpool-Ⅱは全号機起動
★PostgreSQLのサービス制御はpg_ctlを使用する
-- 15. PostgreSQL スタンバイサーバを構築[mmm121]
-------------------
★pcp_recovery_nodeコマンド実行時、下記のようなエラーが出たため、シェル修正。
ERROR: recovery is checking if postmaster is started
DETAIL: postmaster on hostname:"mmm122" database:"template1" user:"postgres" failed to start in 90 second
★シェル修正
su - postgres
vim $PGDATA/pgpool_remote_start
$PGHOME/bin/pg_ctl -l /dev/null -w -D ${DEST_NODE_PGDATA} status
if [ $? -eq 0 ]; then
exit 0
fi
↓
$PGHOME/bin/pg_ctl -l /dev/null -w -D ${DEST_NODE_PGDATA} status && exit 0
-------------------
pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 1
pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 2
psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"
-- 16. 動作確認
-- 16.1 Watchdogアクティブ/スタンバイの切り替え
pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool
systemctl stop pgpool.service
systemctl status pgpool.service
pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool
systemctl start pgpool.service
systemctl status pgpool.service
pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool
-- 16.2 自動フェイルオーバ
PGPASSWORD=pgpool psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"
su - postgres
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data -m immediate stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"
psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
-- 16.3 オンラインリカバリ
pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 0
psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"
PGPASSWORD=pgpool psql -h 192.168.137.121 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.129 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.121 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.129 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=postgres psql -h 192.168.137.121 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.122 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.123 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.129 -p 5432 -U postgres test -c "select * from tab1"
---------------------------------------------
-- [2] DRサイトのPgpool-IIクラスタとサイト間レプリケーションの構成
-- 1. postgreSQLインストール[mmm124,mmm125,mmm126]
-- リポジトリの追加
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info -y postgresql14-server
-- インストール
yum install -y epel-release centos-release-scl
yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version
-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb
-- visudoでpostgresユーザ追加
visudo
postgres ALL=(ALL) NOPASSWD: ALL
-- postgres OSユーザのパスワード設定
echo postgres | passwd --stdin postgres
-- 2. Pgpool-Ⅱのインストール[mmm124,mmm125,mmm126]
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-devel-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-extensions-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v
-- 3. WALを格納するディレクトリの作成[mmm124,mmm125,mmm126]
su - postgres
mkdir /var/lib/pgsql/archivedir
-- 4. パスワードなし接続設定[mmm124,mmm125,mmm126]
cd /root/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm124
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm125
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm126
su - postgres
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm124
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm125
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm126
ssh postgres@mmm124 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm125 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm126 -i ~/.ssh/id_rsa_pgpool hostname
※サイト間レプリ対応
su - postgres
vim /var/lib/pgsql/.pgpass
mmm124:5432:replication:repl:repl
mmm125:5432:replication:repl:repl
mmm126:5432:replication:repl:repl
mmm124:5432:postgres:postgres:postgres
mmm125:5432:postgres:postgres:postgres
mmm126:5432:postgres:postgres:postgres
192.168.137.129:5432:replication:repl:repl
192.168.137.129:5432:postgres:postgres:postgres
chmod 600 /var/lib/pgsql/.pgpass
-- 5. pgpool_node_idファイルの作成[mmm124,mmm125,mmm126]
-- mmm124の場合
echo 0 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- mmm125の場合
echo 1 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- mmm126の場合
echo 2 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id
-- 6. 自動フェイルオーバ用のサンプルスクリプトの設定[mmm124,mmm125,mmm126]
cp -p /etc/pgpool-II/failover.sh{.sample,}
cp -p /etc/pgpool-II/follow_primary.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh}
echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool-II/pcp.conf
su - postgres
echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass
chmod 600 ~/.pcppass
-- 7. Watchdog用のサンプルスクリプトの設定[mmm124,mmm125,mmm126]
cp -p /etc/pgpool-II/escalation.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/escalation.sh
vim /etc/pgpool-II/escalation.sh
PGPOOLS=(server1 server2 server3)
VIP=192.168.137.150
DEVICE=enp0s8
↓
PGPOOLS=(mmm124 mmm125 mmm126)
VIP=192.168.137.130
DEVICE=ens192
-- 8. Pgpool-IIのクライアント認証パスワードファイルの設定[mmm124,mmm125,mmm126]
su - postgres
echo 'postgres' > ~/.pgpoolkey
chmod 600 ~/.pgpoolkey
pg_enc -m -k ~/.pgpoolkey -u pgpool -p
pg_enc -m -k ~/.pgpoolkey -u postgres -p
cat /etc/pgpool-II/pool_passwd
-- 9. ログ格納ディレクトリの作成[mmm124,mmm125,mmm126]
mkdir /var/log/pgpool_log/
chown postgres:postgres /var/log/pgpool_log/
-- 10. Pgpool-IIの設定[mmm124]
mmm124で設定したファイルをmmm125,mmm126へコピーする
-- 10.1 pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org
vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載
socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
wd_ipc_socket_dir = '/var/run/postgresql'
backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
sr_check_user = 'pgpool'
sr_check_password = ''
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = ''
health_check_max_retries = 3
backend_hostname0 = 'mmm124'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALWAYS_PRIMARY'
backend_hostname1 = 'mmm125'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = 'mmm126'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/14/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm124'
backend_application_name1 = 'mmm125'
backend_application_name2 = 'mmm126'
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
recovery_user = 'postgres'
recovery_password = ''
recovery_1st_stage_command = 'recovery_1st_stage'
enable_pool_hba = on
use_watchdog = on
delegate_IP = '192.168.137.130'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens192 label ens192:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens192'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens192'
hostname0 = 'mmm124'
wd_port0 = 9000
pgpool_port0 = 9999
hostname1 = 'mmm125'
wd_port1 = 9000
pgpool_port1 = 9999
hostname2 = 'mmm126'
wd_port2 = 9000
pgpool_port2 = 9999
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
heartbeat_hostname0 = 'mmm124'
heartbeat_port0 = 9694
heartbeat_device0 = ''
heartbeat_hostname1 = 'mmm125'
heartbeat_port1 = 9694
heartbeat_device1 = ''
heartbeat_hostname2 = 'mmm126'
heartbeat_port2 = 9694
heartbeat_device2 = ''
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
wd_escalation_command = '/etc/pgpool-II/escalation.sh'
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
scp -p /etc/pgpool-II/pgpool.conf root@mmm125:/etc/pgpool-II/pgpool.conf
scp -p /etc/pgpool-II/pgpool.conf root@mmm126:/etc/pgpool-II/pgpool.conf
-- 10.2 pool_hba.confの設定
cp -p /etc/pgpool-II/pool_hba.conf /etc/pgpool-II/pool_hba.conf.org
vim /etc/pgpool-II/pool_hba.conf
追加
host all pgpool 192.168.137.0/24 scram-sha-256
host all postgres 192.168.137.0/24 scram-sha-256
scp -p /etc/pgpool-II/pool_hba.conf root@mmm125:/etc/pgpool-II/pool_hba.conf
scp -p /etc/pgpool-II/pool_hba.conf root@mmm126:/etc/pgpool-II/pool_hba.conf
-- 11. /etc/sysconfig/pgpoolの設定[mmm124,mmm125,mmm126]
vim /etc/sysconfig/pgpool
OPTS=" -n"
↓
OPTS=" -D -n"
-- 12. PostgreSQL スタンバイサーバ構築
-- 12.1 サイト間レプリケーション設定 [mmm124]
su - postgres
/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data status
rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*
/usr/pgsql-14/bin/pg_basebackup -h 192.168.137.129 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream
sed -i -e "/^include_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'/d" /var/lib/pgsql/14/data/postgresql.conf
sed -i -e "\$aprimary_conninfo = 'host=192.168.137.129 port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''" \
-e "/^primary_conninfo = .*/d" /var/lib/pgsql/14/data/postgresql.conf
touch /var/lib/pgsql/14/data/standby.signal
/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data start
/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data status
-- 12.2 レプリケーション設定[mmm125]
su - postgres
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*
/usr/pgsql-14/bin/pg_basebackup -h mmm124 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream
cat > /var/lib/pgsql/14/data/myrecovery.conf << EOT
primary_conninfo = 'host=mmm124 port=5432 user=repl application_name=mmm125 passfile=''/var/lib/pgsql/.pgpass'''
recovery_target_timeline = 'latest'
restore_command = 'scp mmm124:/var/lib/pgsql/archivedir/%f %p'
EOT
sed -i "/^primary_conninfo = 'host=192.168.137.129 port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''/d" /var/lib/pgsql/14/data/postgresql.conf
sed -i -e "\$ainclude_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'" \
-e "/^include_if_exists = .*/d" /var/lib/pgsql/14/data/postgresql.conf
touch /var/lib/pgsql/14/data/standby.signal
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
-- 12.3 レプリケーション設定[mmm126]
su - postgres
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*
/usr/pgsql-14/bin/pg_basebackup -h mmm124 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream
cat > /var/lib/pgsql/14/data/myrecovery.conf << EOT
primary_conninfo = 'host=mmm124 port=5432 user=repl application_name=mmm126 passfile=''/var/lib/pgsql/.pgpass'''
recovery_target_timeline = 'latest'
restore_command = 'scp mmm124:/var/lib/pgsql/archivedir/%f %p'
EOT
sed -i "/^primary_conninfo = 'host=192.168.137.129 port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''/d" /var/lib/pgsql/14/data/postgresql.conf
sed -i -e "\$ainclude_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'" \
-e "/^include_if_exists = .*/d" /var/lib/pgsql/14/data/postgresql.conf
touch /var/lib/pgsql/14/data/standby.signal
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
-- 13. システムの起動と停止[mmm124,mmm125,mmm126]
Pgpool-IIを起動する前に、 PostgreSQLを起動する必要があります。
PostgreSQLを停止する前に、 Pgpool-IIを停止する必要があります。
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start
systemctl stop pgpool
systemctl status pgpool
systemctl start pgpool
PostgreSQLは全号機起動
Pgpool-Ⅱは全号機起動
★PostgreSQLのサービス制御はpg_ctlを使用する
PGPASSWORD=pgpool psql -h 192.168.137.130 -p 9999 -U pgpool postgres -c "show pool_nodes"
→3台ともスタンバイ
pcp_watchdog_info -h 192.168.137.130 -p 9898 -U pgpool
PGPASSWORD=pgpool psql -h 192.168.137.124 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.125 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.126 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.130 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.124 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.125 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.126 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.130 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=postgres psql -h 192.168.137.124 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.125 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.126 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.130 -p 5432 -U postgres test -c "select * from tab1"
-- PostgreSQL再起動後、show pool_nodesでstatusがdownとなる。これを復旧するコマンド
pcp_attach_node -h 192.168.137.130 -p 9898 -U pgpool -n 1
pcp_attach_node -h 192.168.137.130 -p 9898 -U pgpool -n 2
(2019)
【1】Always On Failover Cluster Instance + Always On 可用性グループ
https://docs.microsoft.com/ja-jp/sql/database-engine/availability-groups/windows/failover-clustering-and-always-on-availability-groups-sql-server?view=sql-server-ver15
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2012/jj215886(v=msdn.10)
https://www.mssqltips.com/sqlservertip/4967/fixing-error-19405-when-configuring-sql-server-availability-groups/
OS:Windows Server2019
メモリ4G/ディスク60G
mmm191 (プライマリサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193
mmm194 (DRサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.194
mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196
ルートドメイン名 contoso.local (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197 (プライマリサイトとDRサイトで共通)
プライマリサイト SQL Serverのネットワーク名 network01
プライマリサイト SQL ServerのVIP 192.168.137.198
DRサイト SQL Serverのネットワーク名 network02
DRサイト SQL ServerのVIP 192.168.137.199
可用性グループリスナーのDNS名 testlistener
可用性グループリスナーIP 192.168.137.200
※すでにクラスターに参加しているホストは別のクラスターに参加できない
---------------------------------------------
-- [1] プライマリサイトのAlways On Failover Cluster Instanceの構成
mmm191 (プライマリサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193
ルートドメイン名 contoso.local (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197 (プライマリサイトとDRサイトで共通)
SQL Serverのネットワーク名 network01
SQL ServerのVIP 192.168.137.198
1. ActiveDirecotryのインストール[mmm191]
サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーに昇格
2. ドメインへの参加[mmm192,mmm193]
mmm192,mmm193のDNSとしてADマシンのIPを指定
システムのプロパティからドメインに参加
3. SQL Server実行ユーザーの作成[mmm191]
ActiveDirectoryユーザーとコンピューターから、ユーザー(sqlservice)を追加
4. iSCSIターゲットの構成[mmm191]
iSCSIターゲットサーバー役割サービスをインストールする
iSCSI仮想ディスクを追加し、iSCSIターゲットを構成する
Cドライブから以下を割り当てる
DISK1: クォーラムディスク 1GB 容量固定
ターゲット名: target01
接続許可:mmm192,mmm193
ターゲット作成後、下記iSCSI仮想ディスクを追加
DISK2: 共有ディスク 30GB 容量固定
5. iSCSIイニシエーターの構成[mmm192,mmm193]
コントロールパネルの小さいアイコンから「iSCSIイニシエーター」を選択
mmm191のIPアドレスを入力して、クイック接続
コンピュータの管理からiSCSI仮想ディスクを初期化して、シンプルボリュームを作成
※ドライブレターはプライマリとDRで一致させる
DISK1 → E
DISK2 → F
6. フェールオーバークラスタリングの追加[mmm192,mmm193]
役割と機能の追加で、フェールオーバークラスタリングを追加
フェールオーバークラスター構成の検証
フェールオーバークラスター構成の作成
※「使用可能な記憶域をすべてクラスターに追加する」をチェックする
→DISK1とDISK2が共有ディスクとして設定される
7. SQL Serverフェールオーバークラスターのインストール[mmm192]
機能の選択: データベースエンジンサービス
名前付きインスタンス: instance01
インスタンスID: instance01
SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
認証モード: 混合認証モード
SQL Server管理者: CONTOSO\administrator
データルートディレクトリ: F:\
メモリ: 推奨
8. SQL Serverフェールオーバークラスターのノード追加[mmm193]
9. 接続確認
sqlcmd -S 192.168.137.198\instance01
---------------------------------------------
-- [2] DRサイトのAlways On Failover Cluster Instanceの構成
mmm194 (DRサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.194
mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196
ルートドメイン名 contoso.local (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197 (プライマリサイトとDRサイトで共通)
SQL Serverのネットワーク名 network02
SQL ServerのVIP 192.168.137.199
1. ActiveDirecotryのインストール[mmm194]
サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
DNSとしてmmm191のIPを指定
「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーとして既存ドメインに追加
2. ドメインへの参加[mmm195,mmm196]
mmm195,mmm196のDNSとしてmmm194のIPを指定
システムのプロパティからドメインに参加
3. iSCSIターゲットの構成[mmm194]
iSCSIターゲットサーバー役割サービスをインストールする
iSCSI仮想ディスクを追加し、iSCSIターゲットを構成する
Cドライブから以下を割り当てる
DISK1: クォーラムディスク 1GB 容量固定
↑作成はするが使用しない
ターゲット名: target02
接続許可:mmm195,mmm196
ターゲット作成後、下記iSCSI仮想ディスクを追加
DISK2: 共有ディスク 30GB 容量固定
4. iSCSIイニシエーターの構成[mmm195,mmm196]
コントロールパネルの小さいアイコンから「iSCSIイニシエーター」を選択
mmm194のIPアドレスを入力して、クイック接続
コンピュータの管理からiSCSI仮想ディスクを初期化して、シンプルボリュームを作成
※ドライブレターはプライマリとDRで一致させる
DISK1 → E
DISK2 → F
5. フェールオーバークラスタリングの追加[mmm195,mmm196]
役割と機能の追加で、フェールオーバークラスタリングを追加
フェールオーバークラスター構成の検証
※既存のクラスターmyclusterに接続してノード追加
※「使用可能な記憶域をすべてクラスターに追加する」をチェックする
→DISK1とDISK2が共有ディスクとして設定される
6. Set the NodeWeight of the disaster recovery data center WSFC nodes to a 0 (zero) weight[mmm195]
Get-ClusterNode | fl NodeName, NodeWeight
(Get-ClusterNode "mmm195").NodeWeight=0
(Get-ClusterNode "mmm196").NodeWeight=0
Get-ClusterNode | fl NodeName, NodeWeight
7. SQL Serverフェールオーバークラスターのインストール[mmm195]
※クラスター構成の検証でエラーがあるとされた場合、再度構成の検証を行う
機能の選択: データベースエンジンサービス
名前付きインスタンス: instance02
インスタンスID: instance02
SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
認証モード: 混合認証モード
SQL Server管理者: CONTOSO\administrator
データルートディレクトリ: F:\
メモリ: 推奨
8. SQL Serverフェールオーバークラスターのノード追加[mmm196]
※ instance02が選択リストに表示されない場合、役割「instance01」を一時的に停止する
9. 接続確認
sqlcmd -S 192.168.137.199\instance02
---------------------------------------------
-- [3] Always On 可用性グループの構成
Always On 可用性グループ
リスナーのDNS名 testlistener
リスナーIP 192.168.137.200
リスナーポート 1433
DB名 testdb
可用性グループ名 testag
※可用性グループのプロパティ (たとえば、有効な所有者、優先所有者) を変更しないでください。
これらのプロパティは、可用性グループによって自動的に設定されます
※フェールオーバー クラスター マネージャーを使用して可用性グループを他のノードに移動したり
可用性グループをフェールオーバーしたりしないでください。
1. SSMSインストール[mmm192,mmm195]
日本語版をインストール
2. 優先所有者と実行可能な所有者の設定[mmm192]
フェールオーバークラスターマネージャ
左ペインで役割を選択、上ペインでINSTANCE01を選択して右クリック→プロパティ
優先所有者: mmm192
左ペインで役割を選択、上ペインでINSTANCE02を選択して右クリック→プロパティ
優先所有者: mmm195
左ペインで役割を選択、上ペインでINSTANCE01を選択、下ペインのリソースタブで各種リソースを右クリック→プロパティ→詳細なポリシー
実行可能な所有者: mmm192,mmm193
左ペインで役割を選択、上ペインでINSTANCE02を選択、下ペインのリソースタブで各種リソースを右クリック→プロパティ→詳細なポリシー
実行可能な所有者: mmm195,mmm196
※各種リソース→ サーバー名、その他のリソース、役割、記憶域
※設定していない場合、可用性グループ作成時に下記のようなエラーがでる
可用性グループ 'testag' の作成、結合、またはレプリカ追加に失敗しました。
ノード 'MMM195' が、レプリカ 'NETWORK01\INSTANCE01' および 'NETWORK02\INSTANCE03' の
両方に対して実行可能な所有者であるためです。
1 つのレプリカがフェールオーバー クラスター インスタンスである場合は、
実行可能な所有者から重複するノードを削除して再実行してください。
(Microsoft SQL Server、エラー: 19405)
3. AlwaysOn可用性グループの有効化[mmm192,mmm195]
SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
SQL Server再起動(再起動はクラスターマネージャの役割の停止→役割の開始で行う
4. データおよびログファイル格納場所の作成[mmm192,mmm195]
データおよびログファイルの保存フォルダ作成(F:\SQL_AO_Data)
sqlserviceユーザーの読み書き権限を付与
5. バックアップデータ共有フォルダの設定[mmm192]
初期データを同期するための共有フォルダを作成(C:\SQL_AO_Share)
共有許可し、sqlserviceユーザーの読み書き権限を付与
6. DBの作成[mmm192]
データとログの保存位置→F:\SQL_AO_Data\
7. DBのバックアップ[mmm192]
バックアップ保存先→C:\SQL_AO_Share\testdb.bak
8. 可用性グループの作成[mmm192]
SSMSのAlways On高可用性から「新しい可用性グループウイザード」を起動
クラスターの種類: Windows Server フェールオーバークラスター
データベースレベルの正常性検出 YES
データベースごとのDTCサポート NO
データベースを選択
レプリカの追加でNETWORK02\INSTANCE02を追加
自動フェールオーバー NO ※自動フェイルオーバーは不可
可用性モード 非同期コミット
読み取り可能なセカンダリ YES
データの同期設定では、「完全なデータベースとログバックアップ」を選択
ファイル共有のパス: \\MMM192\SQL_AO_Share
9. 可用性グループへの結合[mmm195]
レプリカ側で「DBが復元しています」のままの場合
可用性データベースから「可用性グループへの結合」を実施
10. リスナー追加[mmm192]
リスナー追加のウイザードを開く
11. 包含データベースの設定[mmm192,mmm195]
SQL Server全体のプロパティにて、「包含データベース」を"true"にします
12. 包含データベースの設定[mmm192]
DBのプロパティにて「包含の種類」を"部分"に設定
※ロックエラーとなる場合、一度SSMSを閉じて再接続してから実行
13. 包含データベースユーザの作成[mmm192]
データベースのセキュリティ、ユーザーから、新しいユーザーを追加(パスワードが設定されたSQLユーザー)
14. 接続確認
sqlcmd -S 192.168.137.200 -U user01 -d testdb -P password
select * from sys.availability_groups;
select * from sys.availability_replicas;
select * from sys.dm_hadr_availability_group_states;
select * from sys.dm_hadr_availability_replica_states;
select * from sys.dm_hadr_database_replica_states;
select * from sys.dm_hadr_database_replica_cluster_states;
select * from sys.dm_hadr_cluster;
select * from sys.dm_hadr_cluster_members;
【2】分散型可用性グループ
https://docs.microsoft.com/ja-jp/sql/database-engine/availability-groups/windows/distributed-availability-groups?view=sql-server-ver15
https://blog.engineer-memo.com/2016/04/24/sql-server-2016-rc3-%E3%81%AE%E5%88%86%E6%95%A3%E5%8F%AF%E7%94%A8%E6%80%A7%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/
OS:Windows Server2019
メモリ4G/ディスク60G
mmm191 (ドメインコントローラ) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193
mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196
ルートドメイン名 contoso.local (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO (プライマリサイトとDRサイトで共通)
プライマリサイト クラスタ名 cluster01
プライマリサイト クラスタIP 192.168.137.197
DRサイト クラスタ名 cluster02
DRサイト クラスタIP 192.168.137.198
プライマリサイト 可用性グループリスナーのDNS名 listener01
プライマリサイト 可用性グループリスナーIP 192.168.137.199
プライマリサイト 可用性グループリスナーポート 1433
DRサイト 可用性グループリスナーのDNS名 listener02
DRサイト 可用性グループリスナーIP 192.168.137.200
DRサイト可用性グループリスナーポート 1433
DB名 testdb
プライマリサイト 可用性グループ名 ag1
DRサイト 可用性グループ名 ag2
分散型可用性グループ名 distributedag
---------------------------------------------
-- [1] プライマリサイトのAlways On 可用性グループの構成
1. ActiveDirecotryのインストール[mmm191]
サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーに昇格
2. ドメインへの参加[mmm192,mmm193]
mmm192,mmm193のDNSとしてADマシンのIPを指定
システムのプロパティからドメインに参加
3. SQL Server実行ユーザーの作成[mmm191]
ActiveDirectoryユーザーとコンピューターから、ユーザー(sqlservice)を追加
4. フェールオーバークラスタリングの追加[mmm192,mmm193]
役割と機能の追加で、フェールオーバークラスタリングを追加
フェールオーバークラスター構成の検証
フェールオーバークラスター構成の作成
5. SQLサーバのインストール[mmm192,mmm193]
機能の選択: データベースエンジンサービス
インスタンス: 規定のインスタンス
SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
認証モード: 混合認証モード
SQL Server管理者: CONTOSO\administrator
メモリ: 推奨
6. SSMSインストール[mmm192,mmm193]
日本語版をインストール
7. AlwaysOn可用性グループの有効化[mmm192,mmm193]
SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
SQL Server再起動
8. エンドポイントの作成[mmm192,mmm193]
※mmm192,mmm193のそれぞれで実行
CREATE LOGIN [contoso\sqlservice] FROM WINDOWS;
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\sqlservice];
GO
9. DBの作成[mmm192]
CREATE DATABASE testdb;
BACKUP DATABASE testdb TO DISK=N'NUL';
GO
10. 可用性グループの作成[mmm192]
CREATE AVAILABILITY GROUP [ag1]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE,
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0)
FOR DATABASE [testdb]
REPLICA ON
N'mmm192' WITH (ENDPOINT_URL = N'TCP://mmm192.contoso.local:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = AUTOMATIC),
N'mmm193' WITH (ENDPOINT_URL = N'TCP://mmm193.contoso.local:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = AUTOMATIC);
GO
11. 可用性グループリスナーの作成[mmm192]
ALTER AVAILABILITY GROUP [ag1]
ADD LISTENER N'listener01' ( WITH IP ( (N'192.168.137.199', N'255.255.255.0') ), PORT=1433);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO
12. 可用性グループに参加[mmm193]
ALTER AVAILABILITY GROUP [ag1] JOIN;
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO
---------------------------------------------
-- [2] DRサイトのAlways On 可用性グループの構成
1. ドメインへの参加[mmm195,mmm196]
mmm195,mmm196のDNSとしてADマシンのIPを指定
システムのプロパティからドメインに参加
2. フェールオーバークラスタリングの追加[mmm195,mmm196]
役割と機能の追加で、フェールオーバークラスタリングを追加
フェールオーバークラスター構成の検証
フェールオーバークラスター構成の作成
3. SQLサーバのインストール[mmm195,mmm196]
機能の選択: データベースエンジンサービス
インスタンス: 規定のインスタンス
SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
認証モード: 混合認証モード
SQL Server管理者: CONTOSO\administrator
メモリ: 推奨
4. SSMSインストール[mmm195,mmm196]
日本語版をインストール
5. AlwaysOn可用性グループの有効化[mmm195,mmm196]
SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
SQL Server再起動
6. エンドポイントの作成[mmm195,mmm196]
※mmm195,mmm196のそれぞれで実行
CREATE LOGIN [contoso\sqlservice] FROM WINDOWS;
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\sqlservice];
GO
7. 可用性グループの作成[mmm195]
CREATE AVAILABILITY GROUP [ag2]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE,
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0)
FOR
REPLICA ON
N'mmm195' WITH (ENDPOINT_URL = N'TCP://mmm195.contoso.local:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = AUTOMATIC),
N'mmm196' WITH (ENDPOINT_URL = N'TCP://mmm196.contoso.local:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = AUTOMATIC);
GO
8. 可用性グループリスナーの作成[mmm195]
ALTER AVAILABILITY GROUP [ag2]
ADD LISTENER N'listener02' ( WITH IP ( (N'192.168.137.200', N'255.255.255.0') ), PORT=1433);
ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE;
GO
9. 可用性グループに参加[mmm196]
ALTER AVAILABILITY GROUP [ag2] JOIN;
ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE;
GO
---------------------------------------------
-- [3] 分散型可用性グループの構成
1. 分散型可用性グループの作成[mmm192]
CREATE AVAILABILITY GROUP [distributedag]
WITH (DISTRIBUTED)
AVAILABILITY GROUP ON
N'ag1' WITH
(
LISTENER_URL = N'tcp://listener01.contoso.local:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
N'ag2' WITH
(
LISTENER_URL = N'tcp://listener02.contoso.local:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
2. 分散型可用性グループに参加[mmm195]
ALTER AVAILABILITY GROUP [distributedag]
JOIN
AVAILABILITY GROUP ON
N'ag1' WITH
(
LISTENER_URL = N'tcp://listener01.contoso.local:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
N'ag2' WITH
(
LISTENER_URL = N'tcp://listener02.contoso.local:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
※当初リスナー名に誤りがありDRサイトが同期できなかった。SQL実行自体は正常終了していた。