Dec 30, 2013

Εγκατάσταση Oracle Database 12c σε Linux Containers (lxc) στο Ubuntu

Έχει περάσει καιρός από την τελευταία μου αναφορά στο lxc, την ελαφριά εκδοχή του virtualization που προσφέρεται από το Linux kernel με τη βοήθεια μικρών εργαλείων. Το lxc βασίζεται σε τεχνολογίες του πυρήνα που επιτρέπουν την απομόνωση διεργασιών (cgroups) και την οργάνωση πόρων σε namespaces. Στους τελευταίους μήνες έχω αποκτήσει μεγαλύτερη εμπειρία στην χρήση του lxc, σε σχέση με τα προϊόντα της Oracle (Fusion Middleware, Glassfish και Database) και θεωρώ πως πρόκειται για ένα πολύ ισχυρό περιβάλλον για virtualization provisioning ανάλογο ή και καλύτερο σε σχέση με άλλα ανταγωνιστικά (πχ Vagrant) με το σαφές πλεονέκτημα της λειτουργίας απευθείας στον πυρήνα του Linux. Το lxc πλησιάζει πια την σταθερή έκδοση 1.0 και όλο αυτό το διάστημα βλέπω δραστηριότητα και υποστήριξη εκ μέρους της Oracle, γεγονός που προοιωνίζει ακόμα πιο ενδιαφέρουσες καινοτομίες στο μέλλον. Σε κάθε περίπτωση, η σκοπιά μου παραμένει αυτή του developer, αν και το lxc φαντάζει ιδανικό για large scale virtualization provisioning.

Το development περιβάλλον που θα περιγράψω έχει να κάνει με ένα laptop που τρέχει Ubuntu (13.04 64-bit) και στο οποίο θα εγκαταστήσουμε το lxc. Έπειτα θα δημιουργήσουμε ένα container βασισμένο στο Oracle Enterprise Linux (OEL) 6.4, στο οποίο τελικά θα εγκαταστήσουμε την τελευταία έκδοση του Oracle RDBMS (12c - 12.1.0.1.0) Είναι πραγματικά συναρπαστικό να τρέχεις το OEL και μια Oracle Database σχεδόν εγγενώς πάνω στο Ubuntu. Ένα άλλο ενδιαφέρον της υπόθεσης είναι η επιλογή της ίδιας της έκδοσης της βάσης δεδομένων: η 12c έρχεται με την έννοια των container databases που αφορά την φιλοξενία πολλαπλών instances από ένα κεντρικοποιημένο στη διαχείριση instance. Αν το αναλογιστεί κανείς υπάρχουν αρκετές αναλογίες με το lxc, και κατά τη γνώμη μου είναι η σημαντικότερη καινοτομία της Oracle έπειτα από την έκδοση 9i που εισήγαγε το RAC.

Ας ξεκινήσουμε λοιπόν με την εγκατάσταση του lxc στο Ubuntu μας, καθώς και κάποιων βοηθητικών προγραμμάτων με μια εντολή:

sudo apt-get install lxc bridge-utils yum

Για τις ανάγκες του lxc, θα δημιουργηθεί ένας νέος network adapter για τις διευθύνσεις 10.0.3.x. Για να μπορούν να επικοινωνούν οι containers με τον έξω κόσμο και να μην τους κόβει το firewall του Ubuntu, βάζουμε στο αρχείο /etc/default/ufw την ακόλουθη δήλωση και επανεκκινούμε το ufw service:

DEFAULT_FORWARD_POLICY="ACCEPT"

Έπειτα από αυτό, ας δημιουργήσουμε τον container για την 12c με την εξής απλή εντολή:

sudo lxc-create -n ora12 -t oracle

Ως όνομα του container δίνουμε το ora12. Η εντολή αυτή θα αναλάβει να κάνει ένα minimal install του OEL στην διαδρομή /var/lib/lxc/ora12/rootfs. Στην εκτέλεση της, θα κατεβάσει διάφορα πακέτα από το δίκτυο. Θα δημιουργηθούν επίσης δυο χρήστες, root και oracle.

Η καλή πρακτική λέει να δώσουμε μια στατική διεύθυνση στον database server μας. Ας το κάνουμε λοιπόν επηρεάζοντας (απευθείας!) διάφορα αρχεία του container μας που βρίσκεται στην διαδρομή /var/lib/lxc/ora12/rootfs/ και ας ορίσουμε την στατική διεύθυνση 10.0.3.2. Μην ξεχνάμε, ένας container δεν είναι παρά ένα directory στον δίσκο μας με όλα τα περιεχόμενα του (/dev, /home, κλπ) οπότε μπορούμε να τα αλλάζουμε οποιαδήποτε ώρα και στιγμή από το host σύστημα (ξεχνάμε τα shared directories του VirtualBox !)

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.3.2
NETMASK=255.255.255.0
DHCPCLASS=
ONBOOT=yes
HOSTNAME=ora12
NM_CONTROLLED=no
TYPE=Ethernet


# /etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=ora12
GATEWAY=10.0.3.1


# /etc/resolv.conf

; generated by /sbin/dhclient-script
nameserver 10.0.3.1


Είμαστε λίγο πριν την εκκίνηση του server. Για να δουλέψει η Oracle χρειάζεται shared memory στο σύστημα /dev/shm. Το /etc/fstab στο lxc ορίζεται εξωτερικά (όχι μέσα στον container) οπότε προσθέτουμε στο πρότυπο fstab (στην διαδρομή /var/lib/lxc/ora12/fstab) την γραμμή:

tmpfs   /var/lib/lxc/oraxe/rootfs/dev/shm  tmpfs  defaults 0 0

Ας ξεκινήσουμε τον container μας με την εντολή:

lxc-start -n ora12

O container θα ξεκινήσει αστραπιαία (2-4 δευτερόλεπτα) Στο πάνω μέρος βλέπουμε πως πρόκειται για το OEL. Ναι τρέχουμε το OEL στο kernel space του Ubuntu !! (γι' αυτό και έκδοση 3.8.0-34 του kernel)

Εμείς με την εντολή yum μπορούμε να εγκαταστήσουμε τα πακέτα που χρειαζόμαστε για το Oracle Linux 6.4 σύμφωνα με το installation guide. Ενδεικτικά κάποια πακέτα:

yum install xauth unzip xclock

Αφότου εγκαταστήσουμε τα πακέτα ας κάνουμε τις εξής αλλαγές στο /etc/sysctl.conf (/sbin/sysctl -p για να ενεργοποιηθούν):

kernel.sem = 250 32000 100 128
fs.file-max = 6815744
και επίσης στο /etc/security/limits.conf:

oracle         soft     nproc         2047
oracle         hard    nproc         16384

Ας ξεκινήσουμε λοιπόν τον installer:

Ένα σημείο θέλει προσοχή: να μην χτίσουμε απευθείας μια βάση δεδομένων, αλλά να κάνουμε install μόνο το software.

Στην οθόνη με τα prerequisites, τα local_port_range, rmem/wmem αποτυγχάνουν. Ο λόγος είναι πως αυτές οι ιδιότητες δεν μπορούν να οριστούν σε επίπεδο container. Ας το προσπεράσουμε αυτό το σημείο.


Προτού προχωρήσουμε στην δημιουργία της βάσης, τρέχουμε τον netca για τη δημιουργία ενός Oracle listener. Έπειτα, θα χρειαστούμε ένα τρικ. Πιο συγκεκριμένα:

echo "rootfs / rootfs rw 0 0" >> /etc/mtab

Αυτό θα μας εμποδίσει να δούμε το λάθος "[INS-08109] Unexpected error occurred while validating inputs at state 'storageLocationsPage'" στη συνέχεια. Ας ξεκινήσουμε το dbca και ας φτιάξουμε την βάση όπως εμείς θέλουμε.

 Όλα καλά στο τέλος.
Προτού επανεκκινήσουμε, αφαιρούμε την γραμμή που προσθέσαμε στο /etc/mtab. H Oracle 12c βρίσκεται σε εκτέλεση. Από το host λειτουργικό σύστημα τα processes φαίνονται κάπως έτσι. To user id 500 αντιστοιχεί στον oracle χρήστη στο περιβάλλον του container.
Για να τερματίσουμε το container εκτελούμε την εντολή:

sudo lxc-stop -n ora12

Με το lxc, η δημιουργία server-side containers, ειδικά για την Oracle, που βασίζονται στο OEL, είναι παιχνίδι. Αξίζει τον κόπο να το ερευνήσετε παραπάνω.


1 comment:

Pedro said...

Hi,

6 years after writing this post, am I the first one to comment?...

Anyway, just wanted to thank you for the tip of INS-08109, it was driving me crazy :)

Cheers!