[Из песочницы] Строим инфраструктуру Oracle Data Guard 12c из Oracle RAC баз данных с использованием Far Sync28.07.2015 15:48
Введение
Целью данной работы ставилось построение демо стенда для изучения возможностей Oracle Data Guard из узлов Oracle RAC 12.1.0.2.0.
Так как под рукой у меня не нашлось сервера, на котором я бы мог разместить все необходимые мне виртуальные машины (7 штук), то строить будем с использованием офисных PC.
Итого имеем:
3 PC с такими характеристиками: CPU i5, 16 GB RAM
Обычная офисная сеть 1Gbit/s
На двух PC разместятся два сайта Oracle Data Guard, в каждом из которых по 2 узла Oracle RAC 12c и один Far Sync экземпляр в отдельных виртульных машинах.
На третьем PC разместится одна виртуалка управления с Oracle Enterprise Manager Cloud Control 12c Release 5 (12.1.0.5). Насчет EM — дальше я о нем упоминать не буду ввиду того, что это отдельная тема в данном случае больше связанная не с построением стенда Data Guard, а с его использованием.
Необходимое программное обеспечение Oracle скачиваем с их сайта, а в качестве основной операционной системы я выбрал Fedora 22 с qemu-kvm + libvirt + openvswitch. В качестве гостевой ОС используем Oracle Linux 6.6.
Подготовка Fedora для хостинга виртуальных машин
Каждая из виртуальных машин будет иметь по 4 сетевых интерфейса. Назначение сетей:
192.168.100.0/24
#VLAN 100 Public Clusterware network
192.168.101.0/24
#VLAN 101 Interconnect 1
192.168.102.0/24
#VLAN 101 Interconnect 2
192.168.103.0/24
#VLAN 103 Data Guard
Interconnect кластера будет у нас дублирован, для трафика Data Guard выделена отдельная сеть. Есть еще внешняя сеть и один порт Open vSwitch на каждом PC использует физический интерфейс, которой получает IP адрес по DHCP из этой сети.
[root@prmy ~]# dnf install bind
[root@prmy ~]# systemctl enable named
В стандартный /etc/named.conf добавим следующие стрчки:
[root@prmy ~]# vi /etc/named.conf
Строки добавляемые в файл vi /etc/named.conf
listen-on port 53 { 192.168.100.1; };
allow-query { localhost; 192.168.100.0/24; };
allow-query-cache { localhost; 192.168.100.0/24; };
allow-recursion { localhost; 192.168.100.0/24; };
zone "example.com"
{
type master;
file "dynamic/example.zone";
allow-update { key "rndc-key"; };
notify yes;
};
zone "100.168.192.in-addr.arpa" IN
{
type master;
file "dynamic/192.168.100.zone";
allow-update { key "rndc-key"; };
notify yes;
};
zone "103.168.192.in-addr.arpa" IN
{
type master;
file "dynamic/192.168.103.zone";
allow-update { key "rndc-key"; };
notify yes;
};
Создаем зоны:
[root@prmy ~]# vi /var/named/dynamic/example.zone
Содержимое файла /var/named/dynamic/example.zone
$ORIGIN .
$TTL 86400 ; 1 day
example.com IN SOA dns.example.com. sysadmin.example.com. (
59 ; serial
28800 ; refresh (8 hours)
7200 ; retry (2 hours)
2419200 ; expire (4 weeks)
86400 ; minimum (1 day)
)
IN NS dns.example.com.
$ORIGIN example.com.
$TTL 10800 ; 3 hours
$TTL 86400 ; 1 day
dns A 192.168.100.1
prmy CNAME dns
prmy1 A 192.168.100.11
prmy2 A 192.168.100.12
prmy3 A 192.168.100.13
sby A 192.168.100.2
sby1 A 192.168.100.21
sby2 A 192.168.100.22
sby3 A 192.168.100.23
prmy1-dg A 192.168.103.11
prmy2-dg A 192.168.103.12
prmy3-dg A 192.168.103.13
sby1-dg A 192.168.103.21
sby2-dg A 192.168.103.22
sby3-dg A 192.168.103.23
em A 192.168.100.3
clu-prmy-gns A 192.168.100.51
clu-prmy NS clu-prmy-gns.example.com.
[root@prmy ~]# vi /var/named/dynamic/192.168.100.zone
Вместе с мостом создается внутренний порт и на нем внутренний интерфейс по имени совпадающем с имением моста ovsbr0. Этот интерфейс будет получать IP адрес с офисного DHCP через физический интерфейс enp3s0.
В свою очередь физический интерфейс enp3s0 подключим к этому мосту:
Конфигурируем порт (VLAN 100) и интерфейс на Open vSwitch для public сети кластеров. Через него будем раздавать IP адреса, DNS и NTP для вируалок кластеров и EM 12c.
Конфигурируем отдельный свич, порт (VLAN 101) и интерфейс на Open vSwitch для первого inetrconnect’а кластера.
# vi /etc/sysconfig/network-scripts/ifcfg-iconn1
DEVICE=iconn1
DEVICETYPE=ovs
TYPE=OVSBridge
OVS_EXTRA="set port $DEVICE tag=101"
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.101.1
PREFIX=24
DELAY=0
HOTPLUG=no
NOZEROCONF=yes
Конфигурируем отдельный свич, порт (VLAN 102) и интерфейс на Open vSwitch для второго inetrconnect’а кластеров.
# vi /etc/sysconfig/network-scripts/ifcfg-iconn2
DEVICE=iconn2
DEVICETYPE=ovs
TYPE=OVSBridge
OVS_EXTRA="set port $DEVICE tag=102"
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.102.1
PREFIX=24
DELAY=0
HOTPLUG=no
NOZEROCONF=yes
Конфигурируем отдельный свич, порт (VLAN 103) и интерфейс на Open vSwitch для трафика Data Guard.
# vi /etc/sysconfig/network-scripts/ifcfg-dg0
DEVICE=dg0
DEVICETYPE=ovs
TYPE=OVSBridge
OVS_EXTRA="set port $DEVICE tag=103"
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.103.1
PREFIX=24
DELAY=0
HOTPLUG=no
NOZEROCONF=yes
Создаем такие же определения интерфейсов на sby меняя HWADDR на актуальные и последнюю цифру в IP адресах для sby на 2. Свичи iconn1, iconn2 и dg0 получились у нас изолированными и их трафик не выходит наружу. Для того чтобы виртуальные машины на prmy могли обмениваться данными по всем внутренним сетям с виртуальными машинами на sby и наоборот, мы подключим эти свичи к ovsbr0, который имеет внешний физический порт.
Реализуем это соединением всех свичей «паровозиком» при помощи Patch портов на свичах.
Определения следующих интерфейсов идентичны на prmy и sby:
Соединеие свичей при помощи Patch портов
# vi /etc/sysconfig/network-scripts/ifcfg-patch-ovsbr0-iconn1
DEVICE=patch-ovsbr0-iconn1
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=ovsbr0
OVS_PATCH_PEER=patch-iconn1-ovsbr0
# vi /etc/sysconfig/network-scripts/ifcfg-patch-iconn1-ovsbr0
DEVICE=patch-iconn1-ovsbr0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=iconn1
OVS_PATCH_PEER=patch-ovsbr0-iconn1
# vi /etc/sysconfig/network-scripts/ifcfg-patch-iconn1-iconn2
DEVICE=patch-iconn1-iconn2
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=iconn1
OVS_PATCH_PEER=patch-iconn2-iconn1
# vi /etc/sysconfig/network-scripts/ifcfg-patch-iconn2-iconn1
DEVICE=patch-iconn2-iconn1
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=iconn2
OVS_PATCH_PEER=patch-iconn1-iconn2
# vi /etc/sysconfig/network-scripts/ifcfg-patch-iconn2-dg0
DEVICE=patch-iconn2-dg0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=iconn2
OVS_PATCH_PEER=patch-dg0-iconn2
# vi /etc/sysconfig/network-scripts/ifcfg-patch-dg0-iconn2
DEVICE=patch-dg0-iconn2
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=dg0
OVS_PATCH_PEER=patch-iconn2-dg0
Теперь перезагружаем prmy и sby.
Проверяем получившуюся конфигурацию openvswitch:
[root@prmy ~]# ovs-vsctl show
Результат выполения команды ovs-vsctl show
3d20f852-5b67-4a1c-b983-e2a8caa27de1
Bridge "dg0"
Port "patch-dg0-iconn2"
Interface "patch-dg0-iconn2"
type: patch
options: {peer="patch-iconn2-dg0"}
Port "dg0"
tag: 103
Interface "dg0"
type: internal
Bridge "iconn1"
Port "iconn1"
tag: 101
Interface "iconn1"
type: internal
Port "patch-iconn1-iconn2"
Interface "patch-iconn1-iconn2"
type: patch
options: {peer="patch-iconn2-iconn1"}
Port "patch-iconn1-ovsbr0"
Interface "patch-iconn1-ovsbr0"
type: patch
options: {peer="patch-ovsbr0-iconn1"}
Bridge "iconn2"
Port "iconn2"
tag: 102
Interface "iconn2"
type: internal
Port "patch-iconn2-iconn1"
Interface "patch-iconn2-iconn1"
type: patch
options: {peer="patch-iconn1-iconn2"}
Port "patch-iconn2-dg0"
Interface "patch-iconn2-dg0"
type: patch
options: {peer="patch-dg0-iconn2"}
Bridge "ovsbr0"
Port "pub0"
tag: 100
Interface "pub0"
type: internal
Port "ovsbr0"
Interface "ovsbr0"
type: internal
Port "enp3s0"
Interface "enp3s0"
Port "patch-ovsbr0-iconn1"
Interface "patch-ovsbr0-iconn1"
type: patch
options: {peer="patch-iconn1-ovsbr0"}
ovs_version: "2.3.2"
Конфигурация должна быть одинаковой на всех компьютерах.
Проверяем IP адреса:
[root@prmy ~]# ip addr show
Результат выполения команды ip addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp3s0: mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
link/ether 60:a4:4c:3c:93:06 brd ff:ff:ff:ff:ff:ff
inet6 fe80::62a4:4cff:fe3c:9306/64 scope link
valid_lft forever preferred_lft forever
3: ovs-system: mtu 1500 qdisc noop state DOWN group default
link/ether 0a:91:1b:82:ce:a9 brd ff:ff:ff:ff:ff:ff
4: iconn1: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether d6:22:60:7e:9f:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.101.1/24 brd 192.168.101.255 scope global iconn1
valid_lft forever preferred_lft forever
inet6 fe80::d422:60ff:fe7e:9f48/64 scope link
valid_lft forever preferred_lft forever
5: ovsbr0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 60:a4:4c:3c:93:06 brd ff:ff:ff:ff:ff:ff
inet 192.168.118.16/26 brd 192.168.118.63 scope global dynamic ovsbr0
valid_lft 62646sec preferred_lft 62646sec
inet6 fe80::62a4:4cff:fe3c:9306/64 scope link
valid_lft forever preferred_lft forever
6: pub0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether f2:c2:ba:85:a2:6e brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global pub0
valid_lft forever preferred_lft forever
inet6 fe80::f0c2:baff:fe85:a26e/64 scope link
valid_lft forever preferred_lft forever
7: iconn2: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether f2:e6:e8:93:f0:43 brd ff:ff:ff:ff:ff:ff
inet 192.168.102.1/24 brd 192.168.102.255 scope global iconn2
valid_lft forever preferred_lft forever
inet6 fe80::f0e6:e8ff:fe93:f043/64 scope link
valid_lft forever preferred_lft forever
8: dg0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether ae:bb:09:25:5c:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.103.1/24 brd 192.168.103.255 scope global dg0
valid_lft forever preferred_lft forever
inet6 fe80::acbb:9ff:fe25:5c4e/64 scope link
valid_lft forever preferred_lft forever
[root@sby ~]# ip addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp3s0: mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
link/ether 10:bf:48:e2:58:5e brd ff:ff:ff:ff:ff:ff
inet6 fe80::12bf:48ff:fee2:585e/64 scope link
valid_lft forever preferred_lft forever
3: ovs-system: mtu 1500 qdisc noop state DOWN group default
link/ether 66:9a:f8:af:48:b4 brd ff:ff:ff:ff:ff:ff
4: iconn1: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether da:85:ce:d4:36:4f brd ff:ff:ff:ff:ff:ff
inet 192.168.101.2/24 brd 192.168.101.255 scope global iconn1
valid_lft forever preferred_lft forever
inet6 fe80::d885:ceff:fed4:364f/64 scope link
valid_lft forever preferred_lft forever
5: ovsbr0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 10:bf:48:e2:58:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.118.28/26 brd 192.168.118.63 scope global dynamic ovsbr0
valid_lft 64250sec preferred_lft 64250sec
inet6 fe80::12bf:48ff:fee2:585e/64 scope link
valid_lft forever preferred_lft forever
6: pub0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether d6:2e:c7:82:d5:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.2/24 brd 192.168.100.255 scope global pub0
valid_lft forever preferred_lft forever
inet6 fe80::d42e:c7ff:fe82:d58c/64 scope link
valid_lft forever preferred_lft forever
7: iconn2: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether aa:e2:ca:f4:76:4c brd ff:ff:ff:ff:ff:ff
inet 192.168.102.2/24 brd 192.168.102.255 scope global iconn2
valid_lft forever preferred_lft forever
inet6 fe80::a8e2:caff:fef4:764c/64 scope link
valid_lft forever preferred_lft forever
8: dg0: mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether ca:cc:91:bd:20:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.103.2/24 brd 192.168.103.255 scope global dg0
valid_lft forever preferred_lft forever
inet6 fe80::c8cc:91ff:febd:2047/64 scope link
valid_lft forever preferred_lft forever
9: vnet0: mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 500
link/ether fe:16:3e:00:02:01 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:fe00:201/64 scope link
valid_lft forever preferred_lft forever
10: vnet1: mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 500
link/ether fe:16:3e:00:02:11 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:fe00:211/64 scope link
valid_lft forever preferred_lft forever
11: vnet2: mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 500
link/ether fe:16:3e:00:02:21 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:fe00:221/64 scope link
valid_lft forever preferred_lft forever
12: vnet3: mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 500
link/ether fe:16:3e:00:02:31 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc16:3eff:fe00:231/64 scope link
valid_lft forever preferred_lft forever
# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
dataguard active yes yes
interconnect1 active yes yes
interconnect2 active yes yes
public active yes yes
Запускаем Virtual Machine Manager и инсталлируем операционную систему любым удобным для вас способом. Сетевые интерфейсы должны получить свои IP адреса с нашего DHCP. 200MB отдаем для /boot, 8GB для swap и остальное для /. В качестве файловой системы для / и /boot используем, например ext3.
В состав пакетов для установки включим группы пакетов:
[root@prmy1 ~]# vi /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"
# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=no
# Additional options for ntpdate
NTPDATE_OPTIONS=""
[root@prmy1 ~]# vi /etc/ntp.conf
Содержимое файла/etc/ntp.conf
# For more information about this file, see the man pages
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).
driftfile /var/lib/ntp/drift
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1
restrict -6 ::1
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 192.168.100.1
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
broadcastdelay 0.008
# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys
Конфигурируем лимиты:
[root@prmy1 ~]# vi /etc/security/limits.conf
Добавленные строки в файл /etc/security/limits.conf
oracle soft nofile 131072
oracle hard nofile 131072
oracle soft nproc 131072
oracle hard nproc 131072
oracle soft core unlimited
oracle hard core unlimited
oracle soft memlock 3828161
oracle hard memlock 3828161
grid soft nofile 131072
grid hard nofile 131072
grid soft nproc 131072
grid hard nproc 131072
grid soft core unlimited
grid hard core unlimited
grid soft memlock 3828161
grid hard memlock 3828161
# Recommended stack hard limit 32MB for oracle installations
# oracle hard stack 32768
[root@prmy1 ~]# cd /etc/profile.d
[root@prmy1 profile.d]# vi oracle.sh
if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
if [ /bin/bash = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
На этом конфигурирование виртуалки можно считать законченным, теперь выключаем ее приступаем к ее клонированию. Но перед этим для облегчения клонирования скопируем с нее файлы, которые будут разными в каждой виртуалке.
[root@prmy ~]# ssh -X grid@prmy1
[grid@prmy1- ~]$ su -
[root@prmy1 ~]# mount prmy:/stage /stage
[root@prmy1 ~]# exit
[grid@prmy1- ~]$ /stage/grid/runInstaller
Flex Cluster нам не нужен.
Сконфигурируем GNS на домене, указанном в DNS при делегировании зоны.
Сконфигурируем Flex ASM, хотя он тут по большому счету не нужен. Впрочем это же стенд для изучения возможностей и можно ограничить количество узлов на которых стартует ASM двумя. При использовании стандартного ASM можно было сэкономить по памяти — его минимальные требования 300M вместо 1G у Flex ASM.