Πώς κάνουμε εγκατάσταση ένα Oracle Real Application Cluster (RAC) σε Linux με την χρήση Direct NFS
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Σε αυτό το άρθρο θα δούμε βήμα βήμα πως κάνουμε εγκατάσταση μίας Oracle Database που ανήκει σε Real Application Cluster (RAC) σε λειτουργικό σύστημα Linux (Oracle Linux 7.7) με κοινόχρηστους δίσκους NFS χωρίς την χρήση Oracle ASM (Automatic Storage Management). Η συνδεσιμότητα μεταξύ της Oracle Database και του NFS Server γίνεται απευθείας μέσω της τεχνολογίας της Oracle Direct NFS, βελτιώνοντας την απόδοση σε επίπεδο I/O αλλά και των υπολοίπων resources (CPU, RAM).
Στο παράδειγμα που θα δούμε θα φτιάξουμε ένα 2 node Oracle RAC που περιέχει δύο Database Servers με λειτουργικό σύστημα Oracle Linux 7.7 και έναν NFS Server με Windows Server 2019. Θα κάνουμε εγκατάσταση το λογισμικό του Oracle Grid Infrastructure και της Oracle Database σε ένα κοινόχρηστο NFS share αν και θα μπορούμε λόγο redundancy να τα κάνουμε και σε ξεχωριστά, είτε σε local είτε σε NFS Shares.
Τι είναι το Oracle Real Application Cluster (RAC)
Το Oracle RAC είναι ένα λογισμικό που μας επιτρέπει να συνδέσουμε πολλαπλούς servers (έως 100) σε ένα cluster για Oracle Database το οποίο εμφανίζεται σαν ένας server στον τελικό χρήστη ή την εφαρμογή. Μας παρέχει την συνδυαστική ισχύ όλων των server και έχουμε την δυνατότητα Read/Write από οποιονδήποτε server-node που ανήκουν στο cluster αυτό. Οπότε είναι μια πολύ καλή λύση για High Availability και Load Balancing.
Αναλυτικές πληροφορίες για το Oracle RAC και το πώς λειτουργει υπάρχουν στο άρθρο εδώ.
Τα προαπαιτούμενα
Για αρχή κατεβάσουμε το λογισμικό για το Oracle Database Grid Infrastructure (Oracle Database Grid Infrastructure 12.1.0.2.0 for Linux x86-64) και το λογισμικό για Oracle Database (Oracle Database 12.1.0.2.0 for Linux x86-64) από τον τον σύνδεσμο εδώ.
Χρειαζόμαστε έναν NFS Server με διάφορα NFS shares. Τουλάχιστον ένα για το λογισμικό του Grid Infrastructure και για το Oracle Database το οποίο για το παράδειγμα θα το πούμε “/oracle/nfs” (εκτός αν κάνουμε εγκατάσταση το software τοπικά και στους δύο servers). Ένα NFS share για τα αρχεία της βάσεις “/oracle/oradata” και ένα για το fast_recovery_area (FRA) “/oracle/fra“. Το πώς στήνουμε έναν Windows Server 2019 ως NFS Share και πώς κάνουμε mount του δίσκους στο Linux περιγράφεται αναλυτικά στο άρθρο εδώ.
Θα πρέπει να εγκαταστήσουμε στο λειτουργικό μας σύστημα τις βιβλιοθήκες που απαιτούνται. Για να το κάνουμε αυτό τρέχουμε το παρακάτω στον κάθε Oracle Linux Server:
yum install oracle-rdbms-server-12cR1-preinstall -y
Αν δεν είχαμε από πριν χρήστη στο λειτουργικό oracle θα πρέπει να του ορίσουμε το password:
passwd oracle
Σε επίπεδο λειτουργικού συστήματος έχουμε όρισει τα ονόματα oracledev1
και oracledev2
ως hostname:
su root vi /etc/hostname
oracledev1
Αντίστοιχα:
oracledev2
Έπειτα κάνουμε disable το firewall και στα δύο μηχανήματα:
systemctl stop firewalld systemctl disable firewalld
Επίσης αλλάζουμε την εγραφή για το SELINUX σε permissive στο παρακάτω αρχείο:
vi /etc/selinux/config
SELINUX=permissive
Για το δίκτυο έχουμε δύο network adapters ένα με public ip και ένα με την private ip.
Στο oracledev1
βάζουμε public ip 172.25.94.41 και private 192.168.10.101:
Στο oracledev2
βάζουμε public ip 172.25.94.42 και private 192.168.10.102:
Στη συνέχεια προσθέτουμε στο κάθε Linux στο αρχείο /etc/hosts
την IP του NFS Server (win-nfs), τις public και private IP. Επίσης ορίζουμε και μία VIP(Virtual Internet Protocol) IP για το καθένα που ανήκει στο ίδιο subnet που είναι και η public IP:
vi /etc/hosts
#public
172.25.94.41 oracledev1
172.25.94.42 oracledev2
#private
192.168.10.101 oracledev1-priv
192.168.10.102 oracledev2-priv
#vip
172.25.94.43 oracledev1-vip
172.25.94.44 oracledev2-vip
#nfs
172.25.94.95 win-nfs
Στη συνέχεια θα πρέπει να ορίσουμε σε DNS Server στο ίδιο subnet με την public IP, 3 διαφορετικές IP με ένα όνομα SCAN (Single Client Access Name) σε round-robin για τον SCAN listener:
172.25.94.45 oracledev-scan
172.25.94.46 oracledev-scan
172.25.94.47 oracledev-scan
Επειδή στο παράδειγμα δεν κάνω χρήση DNS Server θα προσθέσω την πρώτη από τις 3 SCAN IP και αυτή στο /etc/hosts
:
Αφότου έχουμε φτιάξει τα NFS Shares στον NFS Server για να τα κάνουμε mount πάμε στο κάθε Oracle Linux server και κάνουμε τις παρακάτω ενέργειες.
Φτιάχνουμε τους φακέλους με owner τον χρήστη oracle και τα παρακάτω δικαιώματα:
su root mkdir -p /oracle/nfs mkdir -p /oracle/oradata mkdir -p /oracle/fra chown -R oracle:oinstall /oracle/nfs chown -R oracle:oinstall /oracle/oradata chown -R oracle:oinstall /oracle/fra chmod -R 775 /oracle/nfs chmod -R 775 /oracle/oradata chmod -R 775 /oracle/fra
Για να είμαστε σίγουροι ότι δεν θα μας κόβουν τα δικαιώματα προς τον NFS Server παμε στο αρχείο exports και προσθέτουμε μία εγγραφή για το κάθε NFS Share όπως παρακάτω:
vi /etc/exports
/oracle/nfs *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
/oracle/oradata *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
/oracle/fra *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
Έπειτα κάνουμε restart το NFS service:
chkconfig nfs on
service nfs restart
Προσθέτουμε στο αρχείο /etc/fstab
μία εγγραφή για το κάθε NFS Share ώστε να γίνονται μόνοι τους mount με το που ξεκινήσει το κάθε μηχάνημα:
vi /etc/fstab
win-nfs:/nfs /oracle/nfs nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0
win-nfs:/oradata /oracle/oradata nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0
win-nfs:/fra /oracle/fra nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0
Τώρα είμαστε έτοιμοι να τους κάνουμε mount:
mount /oracle/nfs mount /oracle/oradata mount /oracle/fra df
Αφότου γίνουν mount τα NFS Shares φτιάχνουμε τοπικά τον παρακάτω φάκελο σε όλους τους servers:
mkdir -p /oracle/oraInventory chown -R oracle:oinstall /oracle/oraInventory chmod -R 775 /oracle/oraInventory
Και τους παρακάτω μια φορά από έναν από τους δύο servers, καθώς είναι κοινόχρηστοι:
mkdir -p /oracle/nfs/app/grid
mkdir -p /oracle/nfs/app/oracle/product/12.1.0.2/dbhome_1
mkdir -p /oracle/nfs/crs_config
chown -R oracle:oinstall /oracle/nfs
chmod -R 775 /oracle/nfs
Σε αυτό το σημείο θα πρέπει να φτιάξουμε το bash_profile
με τις παραμέτρους για το περιβάλλον του κάθε χρήστη.
Στον oracledev1
αλλάζουμε το bash_profile
στον oracle χρήστή:
su oracle cd $HOME vi .bash_profile
export ORACLE_BASE=/oracle/nfs/app/oracle
export DB_HOME=/oracle/nfs/app/oracle/product/12.1.0.2/dbhome_1
export GRID_HOME=/oracle/nfs/app/12.1.0/grid
export ORACLE_HOME=$DB_HOME
export ORACLE_SID=racdb1
export ORACLE_UNQNAME=racdevdb
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export TNS_ADMIN=$ORACLE_HOME/network/admin
export BASE_PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$BASE_PATH,
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
Στον oracledev1
αλλάζουμε το bash_profile
στον root χρήστή:
su root cd $HOME vi .bash_profile
export ORACLE_BASE=/oracle/nfs/app/oracle
export DB_HOME=/oracle/nfs/app/oracle/product/12.1.0.2/dbhome_1
export GRID_HOME=/oracle/nfs/app/12.1.0/grid
export ORACLE_HOME=$GRID_HOME
export ORACLE_SID=racdb1
export ORACLE_UNQNAME=racdevdb
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export TNS_ADMIN=$ORACLE_HOME/network/admin
export BASE_PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$BASE_PATH,
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
Επαναλαμβάνουμε την ίδια διαδικασία για το oracledev2 και στον χρήστη root και στον oracle μονο που αλλάζουμε την τιμή στο ORACLE_SID
σε racdb2:
export ORACLE_SID=racdb2
Για να φορτωθούν οι αλλαγές ή πρέπει να κάνουμε login / logout ή τρέχουμε με τον ανάλογο χρήστη που είμαστε κάθε φορά την παρακάτω εντολή:
source ~/.bash_profile
Η εγκατάσταση
Για το Oracle Grid Infrastructure
Για την εγκατάσταση του Oracle Grid Infrastructure συνδεόμαστε με τον χρήστη oracle (εκτός αν θέλουμε να φτιάξουμε χρήστη με όνομα grid και να ορίσουμε αυτόν σαν administrator) και πάμε στον φάκελο που το έχουμε κατεβάζει και έχουμε κάνει unzip το software:
su oracle source ~/.bash_profile cd /home/oracle/Downloads/grid chmod -R 775 /home/oracle/Downloads/grid
Πριν τρέξουμε το setup ορίζουμε ως ORACLE_HOME
το GRID_HOME
που είναι το path που θέλουμε να γίνει η εγκατάσταση:
export ORACLE_HOME=$GRID_HOME
Έπειτα τρέχουμε το setup:
./runInstaller
Στην πρώτη οθόνη επιλέγουμε Install and Configure Oracle Grid Infrastructure for a Cluster:
Έπειτα ως cluster type, Configure a Standard cluster:
Στην επόμενη καρτέλα επιλέγουμε Advanced Installation:
Στη συνέχεια ορίζουμε ένα όνομα για το cluster, ως SCAN Name το όνομα που είχαμε ορίζει στην αρχή ως SCAN και την πόρτα που θα χρησιμοποιεί ο listener. Τέλος βγάζουμε την επιλογή Configure GNS:
Στην επόμενη οθόνη επιλέγουμε Add… και προσθέτουμε τους servers με το public όνομα και το VIP όνομα που ορίσαμε στο /etc/hosts
:
Στην ίδια οθόνη επιλέγουμε SSH connectivity, βάζουμε τον κωδικό του oracle χρήστη και επιλέγουμε Setup:
Στην επόμενη καρτέλα ορίζουμε ποιο subnet θα είναι το public και ποιο το private όπως το ορίσαμε στο /etc/hosts
:
Στην καρτέλα Storage Option, επιλέγουμε Use Share File System καθώς δεν θέλουμε να κάνουμε χρήση ASM:
Στην επόμενη οθόνη για το OCR Storage επιλέγουμε External Redundancy και ορίζουμε το NFS Share path για το αρχείο:
Στην επόμενη οθόνη κάνουμε πάλι το ίδιο, επιλέγουμε External Redundancy και ορίζουμε το NFS Share path για το αρχείο:
Έπειτα ορίζουμε το ORACLE_BASE
και το GRID_HOME
όπως τα προσθέσαμε στο bash_profile
, στην προκειμένη περίπτωση διαλέξαμε να είναι Shared NFS και για τους δύο servers:
Δεν διαλέγουμε να τρέξει αυτόματα το root script:
Πριν ξεκινήσει η εγκατάσταση θα κάνει κάποιο έλεγχο τι χρειάζεται διόρθωση, επιλέγοντας Fix & Check Again θα κάνει προσπαθεία να διορθώσει κάποια αν είναι εφικτό. Στην περίπτωση μας δεν εμφάνισε κάτι σοβαρό πέρα από Warnings οπότε επιλέγουμε Ignore All και Next:
Έπειτα ξεκινάει η εγκατάσταση:
Λίγο πριν ολοκληρωθεί η εγκατάσταση μας ζητάει να συνδεθούμε ως root στον καθέ server και να τρέξουμε τα παρακάτω scripts ξεκινώντας πρώτα από τον server που ξεκινήσαμε την εγκατάσταση:
Εκτελώντας το root.sh script στον oracledev1, αν πάνε όλα καλά θα δούμε τα παρακάτω μηνύματα:
Επιτέλους ολοκληρώθηκε η εγκατάσταση του Oracle Grid:
Για το Oracle Database software
Αφού ολοκληρώθηκε η εγκατάσταση του Grid πάμε να προχωρήσουμε στην εγκατάσταση του Oracle Database Software. Πάμε στον φάκελο που το έχουμε κατεβάζει και έχουμε κάνει unzip το software:
cd /home/oracle/Downloads/database chmod -R 775 /home/oracle/Downloads/database
Και εκτελούμε το setup:
./runInstaller
Με το που ανοίξει το setup στην πρώτη καρτέλα βγάζουμε την επιλογή για τα security updates:
Επιλέγουμε να κάνει μόνο εγκατάσταση το software (θα φτιάξουμε την βάση δεδομένων μετά):
Στην επόμενη οθόνη επιλέγουμε Oracle Real Application Clusters database installation:
Επιλέγουμε όλους τους servers που θέλουμε να συμμετέχουν στο cluster:
Έπειτα ορίζουμε το ORACLE_BASE
και το DB_HOME
όπως τα προσθέσαμε στο .bash_profile
, στην προκειμένη περίπτωση διαλέξαμε να είναι Shared NFS και για τους δύο servers:
Πριν ξεκινήσει η εγκατάσταση θα κάνει κάποιο έλεγχο τι χρειάζεται διόρθωση, επιλέγοντας Fix & Check Again θα κάνει προσπαθεία να διορθώσει κάποια αν είναι εφικτό. Το μήνυμα για το SCAN που εμφανίζει είναι φυσιολογικό καθώς δεν κάναμε χρήση DNS Server με 3 IP round-robin, αλλά βάλαμε μόνο μία στο /etc/hosts
οπότε επιλέγουμε Ignore All και Next:
Έπειτα ξεκινάει η εγκατάσταση:
Λίγο πριν ολοκληρωθεί η εγκατάσταση μας ζητάει να συνδεθούμε ως root στον καθέ server και να τρέξουμε τα παρακάτω scripts ξεκινώντας πρώτα από τον server που ξεκινήσαμε την εγκατάσταση:
Επιτέλους ολοκληρώθηκε και η εγκατάσταση του Oracle Database software:
Για την εγκατάσταση του Direct NFS
Από την έκδοση Oracle Database 12c και έπειτα το Direct NFS ενεργοποιείται από default μόνο του! Τις πληροφορίες για τα NFS Shares τις παίρνει από το /etc/fstab
(mtab).
Για να δούμε ότι έχει ενεργοποιηθεί όταν δημιουργήσουμε την βάση δεδομένων τρέχουμε το παρακάτω select, να δούμε αν θα φέρει εγγραφές:
select * from v$dnfs_servers;
Ένας άλλος τρόπος για να δούμε αν έχει ενεργοποιηθεί, είναι να δούμε το alert log
της Oracle Database όταν ξεκινάει αν εμφανίζει αυτό το μήνυμα:
tail -1000 $ORACLE_BASE/diag/rdbms/racdb/racdb1/trace/alert*
Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.0
Περισσότερα για το Direct NFS υπάρχουν στο άρθρο εδώ.
Δημιουργία της βάσης δεδομένων
Για να φτιάξουμε την βάση δεδομένων, ξεκινάμε το setup με το παρακάτω:
su oracle cd $HOME source ~/.bash_profile dbca
Επιλέγουμε Create Database:
Για το παράδειγμα δεν πάμε σε Advanced Mode αλλά ορίζουμε το όνομα της βάσης δεδομένων, ως Storage Type: File System, τα NFS Shares oradata / fra, την κωδικοποίηση της βάσης δεδομένων σε AL32UTF8
(για το παράδειγμα), τον κωδικό και βγάζουμε την επιλογή Create As Container Database:
Έπειτα θα μας εμφανίσει τι προβλήματα έχει βρει ο installer, τα προβλήματα στο Cluster Validation αφορούν το SCAN name που δεν το έχουμε περάσει σε DNS Server με 3 IP round-robin. Οπότε το αγγνοούμε επιλέγοντας Ignore All και Next:
Μετά από κάποια ώρα αν πάνε όλα καλα θα ολοκληρωθεί η δημιουργία της Oracle Database:
Χρήσιμες Εντολές
Για το Clusterware (crsctl)
Για να δούμε την κατάσταση του Cluster με όλα τα Resources τρέχουμε με τον χρήστη root το παρακάτω command:
su root cd $HOME source ~/.bash_profile crsctl status resource -t
Βλέπουμε ότι το status της βάσης δεδομένων είναι Open και στα δύο instances.
Για να σταματήσουμε τα cluster resources τρέχουμε στον κάθε server με τον root χρήστη:
crsctl stop crs
Αντίστοιχα για να τα ξεκινήσουμε:
crsctl start crs
Για την Oracle Database (srvctl)
Για να δούμε το configuration της βάσης τρέχουμε με τον oracle χρήστη το παρακάτω:
su oracle cd $HOME source ~/.bash_profile srvctl config database -d racdb
Αν θέλουμε να σταματήσουμε την βάση δεδομένων και από τα 2 instances τρέχουμε με τον oracle χρήστη:
srvctl stop database -d racdb
Ενώ για να την ξεκινήσουμε:
srvctl start database -d racdb
Για να συνδεθούμε στην Oracle Database
Για να συνδεθούμε στη βάση, πάμε στο tnsnames.ora του client και προσθέτουμε απλά το SCAN name:
RACDB = (DESCRIPTION = (LOAD_BALANCE = ON) (CONNECT_TIMEOUT=5) (TRANSPORT_CONNECT_TIMEOUT=3) (RETRY_COUNT=3) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracledev-scan)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = racdb) ) )
Αφου το κάνουμε αυτό μπορούμε να συνδεθούμε με sqlplus
με το tnsname:
sqlplus "sys/Password@racdb as sysdba"
ή χωρίς την χρήση tnsname, με EZconnect
:
sqlplus "sys/Password@oracledev-scan:1521/racdb as sysdba"
Για να δούμε το status των instances με SQL
Με το παρακάτω query μπορούμε να δούμε το status των instances:
select host_name,instance_name,status,sys_context('USERENV', 'CURRENT_USER') "User",sys_context('USERENV', 'INSTANCE_NAME') "Connected to",startup_time,version,sysdate from gv$instance;
Για το Direct NFS
Για να δούμε αν γίνονται χρήση τα NFS Shares με το αυξημένο performance του Direct NFS πρέπει το παρακάτω query να μας επιστρέφει αποτελέσματα:
select * from v$dnfs_servers;
Επίσης μπορούμε να δούμε τα αρχεία που το κάνουν χρήση το Direct NFS με το παρακάτω query:
select * from v$dnfs_files;