DOCKER İLE RAC KURULUMU

Caner AYSAN
6 min readNov 10, 2022

--

Oracle Real Application Clusters (Oracle RAC), ödüllü Oracle Database Enterprise Edition için bir seçenektir. Oracle RAC, tüm iş uygulamaları için yüksek düzeyde ölçeklenebilir ve kullanılabilir veritabanı çözümleri sağlamak için geleneksel paylaşılan hiçbir şey ve paylaşılan disk yaklaşımlarının sınırlamalarının üstesinden gelen, paylaşılan bir önbellek mimarisine sahip bir küme veritabanıdır. Oracle RAC, bağımsız sunucuların tek bir sistem olarak işbirliği yapmaları için kümelenmesini sağlayan taşınabilir bir küme yazılımı olarak Oracle Clusterware’i ve tüm sunucular ve depolama platformları arasında tutarlı olan basitleştirilmiş depolama yönetimi sağlamak için Oracle Otomatik Depolama Yönetimi’ni (Oracle ASM) kullanır. Oracle Clusterware ve Oracle ASM, her iki çözümü de kurulumu kolay bir yazılım paketinde bir araya getiren Oracle Grid Infrastructure’ın bir parçasıdır.

Docker Kurulumu


sudo yum update
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum update
vi /etc/yum.repos.d/docker-ce.repo #(En üste eklenir)

[centos-extras]
name=Centos extras — $basearch
baseurl=http://mirror.centos.org/centos/7/extras/x86_64
enabled=1
gpgcheck=1
gpgkey=http://centos.org/keys/RPM-GPG-KEY-CentOS-7

sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
/usr/sbin/groupadd -g 54321 oinstall
/usr/sbin/groupadd -g 54322 dba
useradd -u 501 -c "oracle" -g oinstall -G dba,docker -d /home/oracle/ -m oracle
docker login container-registry.oracle.com
#oracle mail adresi
#şifresi
#docker-hub a bağlanmak isterseniz
#docker login
#docker username
#şifre

#https://container-registry.oracle.com/ > Bu adrese gidip Enterprise izni verilmesi gerekli

Docker ile Rac Database Kurulumu

# bu siteden gerekli dosyaları Dockerfile içerisindeki INSTALL_FILE_1=”LINUX.X64_213000_client.zip” gibi aynı isme sahip yükleme dosyasını /tmp dizin altına indirin
#https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html

#LINUX.X64_213000_db_home.zip
#LINUX.X64_213000_grid_home.zip
#LINUX.X64_213000_client.zip

Bu anlatımımızda networkunuz SSL bağlantısı ile kontrol edilme durumuyla birlikte anlatıldı. Eğer bu şekilde bir durumunuz yoksa SSL dosyalarını kopyalama ve SSL adımlarını geçebilirsiniz.

cd /tmp/
git clone https://github.com/oracle/docker-images.git
cp LINUX.X64_213000_client.zip /tmp/docker-images/OracleDatabase/RAC/OracleConnectionManager/dockerfiles/21.3.0/
cp LINUX.X64_213000_grid_home.zip /tmp/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/21.3.0/
cp LINUX.X64_213000_db_home.zip /tmp/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/21.3.0/
#x cert dosyasını Dockerfile dosyalarının yanına koyun (sertifika kullanmıyorsanız sertifikaya ait tüm aşamaları atlayınız)
cp /etc/pki/ca-trust/source/anchors/x_root_ca_linux.crt /tmp/docker-images/OracleDatabase/RAC/OracleConnectionManager/dockerfiles/21.3.0/
cp /etc/pki/ca-trust/source/anchors/x_root_ca_linux.crt /tmp/docker-images/OracleDatabase/RAC/OracleDNSServer/dockerfiles/latest/
cp /etc/pki/ca-trust/source/anchors/x_root_ca_linux.crt /tmp/docker-images/OracleDatabase/RAC/OracleRACStorageServer/dockerfiles/19.3.0/
cp /etc/pki/ca-trust/source/anchors/x_root_ca_linux.crt /tmp/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/21.3.0/
vi /tmp/docker-images/OracleDatabase/RAC/OracleConnectionManager/dockerfiles/21.3.0/Dockerfile

ENV CERT=x_root_ca_linux.crt \
CERTPATH=/etc/pki/ca-trust/source/anchors
COPY $CERT $CERTPATH/
RUN update-ca-trust

vi /tmp/docker-images/OracleDatabase/RAC/OracleDNSServer/dockerfiles/latest/Dockerfile

ENV CERT=x_root_ca_linux.crt \
CERTPATH=/etc/pki/ca-trust/source/anchors
COPY $CERT $CERTPATH/
RUN update-ca-trust

vi /tmp/docker-images/OracleDatabase/RAC/OracleRACStorageServer/dockerfiles/19.3.0/Dockerfile

ENV CERT=x_root_ca_linux.crt \
CERTPATH=/etc/pki/ca-trust/source/anchors
COPY $CERT $CERTPATH/
RUN update-ca-trust

vi /tmp/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/21.3.0/Dockerfile

ENV CERT=x_root_ca_linux.crt \
CERTPATH=/etc/pki/ca-trust/source/anchors
COPY $CERT $CERTPATH/
RUN update-ca-trust

Şuan ki işlemimiz uzun olduğu için bir script oluşturarak script bitene kadar bir mola verebiliriz.(gerçekten çok uzun sürüyor:) )

#!/bin/bashcd /tmp/docker-images/OracleDatabase/RAC/OracleConnectionManager/dockerfiles/
./buildContainerImage.sh -v 21.3.0 >/tmp/docker-images/OracleDatabase/RAC/ConMan.log
sleep 5
cd /tmp/docker-images/OracleDatabase/RAC/OracleDNSServer/dockerfiles/
./buildContainerImage.sh -v latest >/tmp/docker-images/OracleDatabase/RAC/DNS.log
sleep 5
cd /tmp/docker-images/OracleDatabase/RAC/OracleRACStorageServer/dockerfiles/
./buildDockerImage.sh -v 19.3.0 >/tmp/docker-images/OracleDatabase/RAC/Storage.log
sleep 5
cd /tmp/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/
./buildContainerImage.sh -v 21.3.0 >/tmp/docker-images/OracleDatabase/RAC/App.log
sleep 5

Tüm container lar oluştuktan sonra asıl kurulum burada başlamaktadır.

RAC için public ağ oluşturma : rac_pub1_nw

docker network create --driver=bridge --subnet=172.16.1.0/24 rac_pub1_nw

oluşturulan rac_pub1_nw ile racnode-cman1 oluşturma.

/usr/bin/docker run -d --hostname racnode-cman1 --dns-search=example.com \
--network=rac_pub1_nw --ip=172.16.1.15 \
-e DOMAIN=example.com -e PUBLIC_IP=172.16.1.15 \
-e PUBLIC_HOSTNAME=racnode-cman1 -e SCAN_NAME=racnode-scan \
-e SCAN_IP=172.16.1.70 --privileged=false \
-p 1521:1521 --name racnode-cman oracle/client-cman:21.3.0

log kontrol

docker logs racnode-cman

racdns container oluşturma.

docker run -d  --name racdns \
--hostname rac-dns \
--dns-search="example.com" \
--cap-add=SYS_ADMIN \
--network rac_pub1_nw \
--ip 172.16.1.25 \
--sysctl net.ipv6.conf.all.disable_ipv6=1 \
--env SETUP_DNS_CONFIG_FILES="setup_true" \
--env DOMAIN_NAME="example.com" \
--env RAC_NODE_NAME_PREFIX="racnode" \
oracle/rac-dnsserver:latest

log kontrol

docker logs -f racdns

RAC için private ağ oluşturma : rac_priv1_nw

docker network create --driver=bridge --subnet=192.168.57.0/24 rac_priv1_nw

NFS kullanacağımız için gerekli paket yüklenir.

yum -y install nfs-utils

racnode-storage oluşturma.

docker run -d -t --hostname racnode-storage \
--dns-search=example.com --cap-add SYS_ADMIN \
--volume /docker_volumes/asm_vol/$ORACLE_SID:/oradata --init \
--network=rac_priv1_nw --ip=192.168.57.25 --tmpfs=/run \
--volume /sys/fs/cgroup:/sys/fs/cgroup:ro \
--name racnode-storage oracle/rac-storage-server:19.3.0

log kontrol

docker logs -f racnode-storage

#nfs Volume IMPORTANT: If you are not using 192.168.57.0/24 subnet then you need to change addr=192.168.57.25 based on your environment.

NFS için docker volume oluşturuyoruz.

docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.57.0,rw,bg,hard,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 \
--opt device=:/oradata \
racstorage

Gereken RAM kullanımı için yapılandırmaları yapıyoruz.

cat >> /etc/sysctl.conf <<EOF
fs.file-max = 6815744
net.core.rmem_max = 4194304
net.core.rmem_default = 262144
net.core.wmem_max = 1048576
net.core.wmem_default = 262144
net.core.rmem_default = 262144
EOF
sysctl -a
sysctl -p

Yukarıda public ve private ağ oluşturduk fakat bu kısım diğer tüm kısımları etkilediği için kontrol ediniz. Buradaki fark farklı şekilde ağ oluşturmamızın mümkün olması.

docker network create --driver=bridge --subnet=172.16.1.0/24 rac_pub1_nw
docker network create --driver=bridge --subnet=192.168.57.0/24 rac_priv1_nw
docker network create -d macvlan --subnet=172.16.1.0/24 --gateway=172.16.1.1 -o parent=ens33 rac_pub1_nw
docker network create -d macvlan --subnet=192.168.57.0/24 --gateway=192.168.57.1 -o parent=ens34 rac_priv1_nw
vi /usr/lib/systemd/system/docker.service

— cpu-rt-runtime=950000

systemctl daemon-reload
systemctl stop docker
systemctl start docker

Docker container ların şifrelerini belirleme adımları

mkdir /opt/containers
touch /opt/containers/rac_host_file
mkdir /opt/.secrets/
openssl rand -hex 64 -out /opt/.secrets/pwd.key
vi /opt/.secrets/common_os_pwdfile
'caner'
openssl enc -aes-256-cbc -salt -in /opt/.secrets/common_os_pwdfile -out /opt/.secrets/common_os_pwdfile.enc -pass file:/opt/.secrets/pwd.key
rm -f /opt/.secrets/common_os_pwdfile
chmod 400 /opt/.secrets/common_os_pwdfile.enc
chmod 400 /opt/.secrets/pwd.key
sh /opt/scripts/startup/resetOSPassword.sh --help
sh /opt/scripts/startup/resetOSPassword.sh --op_type reset_grid_oracle --pwd_file common_os_pwdfile.enc --secret_volume /run/secrets --pwd_key_file pwd.key

Burada oluşturduğumuz storage yapısına uygun şekilde racnode1 i oluşturuyoruz 2 çeşit oluşum yapabiliriz ilkinde reel ikincisinde ise docker da oluşturduğumuz nfs volume ile yapabiliriz. Biz ikincisini kullanmış olduk fakat birincisinide gösteriyoruz.

docker create -t -i \
--hostname racnode1 \
--volume /boot:/boot:ro \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets:ro \
--dns=172.16.1.25 \
--dns-search=example.com \
--device=/dev/xvde:/dev/asm_disk1 \
--device=/dev/xvdf:/dev/asm_disk2 \
--privileged=false \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e DNS_SERVERS="172.16.1.25" \
-e NODE_VIP=172.16.1.160 \
-e VIP_HOSTNAME=racnode1-vip \
-e PRIV_IP=192.168.57.150 \
-e PRIV_HOSTNAME=racnode1-priv \
-e PUBLIC_IP=172.16.1.150 \
-e PUBLIC_HOSTNAME=racnode1 \
-e SCAN_NAME=racnode-scan \
-e OP_TYPE=INSTALL \
-e DOMAIN=example.com \
-e ASM_DEVICE_LIST=/dev/asm_disk1,/dev/asm_disk2 \
-e ASM_DISCOVERY_DIR=/dev \
-e CMAN_HOSTNAME=racnode-cman1 \
-e CMAN_IP=172.16.1.15 \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--restart=always --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 --ulimit rtprio=99 \
--name racnode1 \
oracle/database-rac:21.3.0

Docker Volume ile racnode1 oluşturma

docker create -t -i \
--hostname racnode1 \
--volume /boot:/boot:ro \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets:ro \
--dns=172.16.1.25 \
--dns-search=example.com \
--privileged=false \
--volume racstorage:/oradata \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e DNS_SERVERS="172.16.1.25" \
-e NODE_VIP=172.16.1.160 \
-e VIP_HOSTNAME=racnode1-vip \
-e PRIV_IP=192.168.57.150 \
-e PRIV_HOSTNAME=racnode1-priv \
-e PUBLIC_IP=172.16.1.150 \
-e PUBLIC_HOSTNAME=racnode1 \
-e SCAN_NAME=racnode-scan \
-e OP_TYPE=INSTALL \
-e DOMAIN=example.com \
-e ASM_DISCOVERY_DIR=/oradata \
-e ASM_DEVICE_LIST=/oradata/asm_disk01.img,/oradata/asm_disk02.img,/oradata/asm_disk03.img,/oradata/asm_disk04.img,/oradata/asm_disk05.img \
-e CMAN_HOSTNAME=racnode-cman1 \
-e CMAN_IP=172.16.1.15 \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--restart=always \
--tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 \
--ulimit rtprio=99 \
--name racnode1 \
oracle/database-rac:21.3.0

Başlatmadan önce tekrardan bir network ayarlarını kontrol edelim.

docker network disconnect bridge racnode1
docker network connect rac_pub1_nw --ip 172.16.1.150 racnode1
docker network connect rac_priv1_nw --ip 192.168.57.150 racnode1
docker start racnode1
docker logs -f racnode1

1. node da sıkıntı olmadığı durumda artık 2. node u çalıştırabiliriz. Docker NFS volume ile oluşturuldu.

docker create -t -i \
--hostname racnode2 \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /boot:/boot:ro \
--dns-search=example.com \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets:ro \
--dns=172.16.1.25 \
--dns-search=example.com \
--privileged=false \
--volume racstorage:/oradata \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e DNS_SERVERS="172.16.1.25" \
-e EXISTING_CLS_NODES=racnode1 \
-e NODE_VIP=172.16.1.161 \
-e VIP_HOSTNAME=racnode2-vip \
-e PRIV_IP=192.168.57.151 \
-e PRIV_HOSTNAME=racnode2-priv \
-e PUBLIC_IP=172.16.1.151 \
-e PUBLIC_HOSTNAME=racnode2 \
-e DOMAIN=example.com \
-e SCAN_NAME=racnode-scan \
-e ASM_DISCOVERY_DIR=/oradata \
-e ASM_DEVICE_LIST=/oradata/asm_disk01.img,/oradata/asm_disk02.img,/oradata/asm_disk03.img,/oradata/asm_disk04.img,/oradata/asm_disk05.img \
-e ORACLE_SID=ORCLCDB \
-e OP_TYPE=ADDNODE \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 \
--ulimit rtprio=99 \
--restart=always \
--name racnode2 \
oracle/database-rac:21.3.0

Tekrardan racnode2 için network kontrolü

docker network disconnect bridge racnode2
docker network connect rac_pub1_nw --ip 172.16.1.151 racnode2
docker network connect rac_priv1_nw --ip 192.168.57.151 racnode2
docker start racnode2
docker logs -f racnode2

Node un içerisine girmek için aşağıdaki komutu kullanabilirsiniz.

docker exec -i -t racnode2 /bin/bash

Connection String;

system/<password>@//<docker_host>:1521/<ORACLE_SID>
(sqlplus sys@racnode1:1521/ORCLCDB as sysdba)

--

--