CLOUD CONCEPT
Νερατζιωτίσσης 15, Μαρούσι, Αθήνα, 15124, Αττική
+30 211 8005 401
info@c2.gr
Τo clustering διευκολύνει την πρόσβαση σε μια βάση δεδομένων διανέμοντας μια αλλαγή που γίνεται σε αυτή σε διαφορετικούς servers-κόμβους . ‘Ετσι σε περίπτωση βλάβης σε έναν server , οι άλλοι έχουν ήδη λάβει τις αλλαγές που έχουν γίνει στη βάση του , και μπορόυν να συνεχίσουν να εξυπηρετούν τα requests χωρίς να υπάρχει downtime .
Το clustering γίνεται με 2 διαφορετικούς τρόπους , active-passive και active-active . Στο active-passive clustering, όλες οι εγγραφές γίνονται σε ένα μόνο active κόμβο και στη συνέχεια αντιγράφονται σε έναν ή περισσότερους passive . Οι passive είναι έτοιμοι να αναλάβουν μόνο σε περίπτωση σφάλματος στον active. Στο active-active clustering, κάθε αλλαγή που γίνεται στον έναν κόμβο , αυτόματα γίνεται και στους υπόλοιπους , και εξυπηρετούν requests παράλληλα .
Παρακάτω θα δόυμε πως μπορούμε να διαμορφώσουμε ένα active-active MySQL Galera Cluster . Αυτό θα γίνει με τη χρήση 3 διαφορετικών server που είναι ο ελάχιστος αριθμός που απαιτείται για αυτή τη διαρρύθμιση .
Προαπαιτούμενα
Για να ξεκινήσουμε , χρειαζόμαστε 3 Debian 8 Server ο καθένας με :
Τουλάχιστον 1 GB RAM
Έναν non-root-sudo χρήστη
Αν είναι δυνατό , οι 3 server να είναι συνδεδεμένοι σε ένα private network .
Εγκατάσταση
Αρχικά , προσθέτουμε το κλειδί του repository , το οποίο μετά η apt get θα χρησιμοποιήσει για να επαληθεύσει ότι το πακέτο είναι γνήσιο .
sudo apt-key adv --keyserver keyserver.debian.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA
Αφού προσθέσουμε το απο πάνω κλειδί σε κάθε server , προσθέτουμε το repository και κάνουμε update την apt get :
sudo add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/debian/ xenial main'
sudo apt-get update
Εκτελούμε τις παρακάτω εντολές για να εγκατασταθεί το Galera , η MySQL όπως και κάποια addons που θα χρειαστούν στη συνέχεια . Για την MySQL θα ζητηθεί ένα administrative password .
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6
sudo apt-get install rsync
Για να λειτουργήσει το clustering οι κόμβοι πρέπει να διαμορφωθόυν με παρόμοιο τρόπο . Για αυτό θα κάνουμε τις απαραίτητες ρυθμίσεις στον πρώτο κόμβο και θα τις αντιγράψουμε έπειτα στους αλλους 2 .
sudo vi /etc/mysql/conf.d/galera.cnf
Στο απο πάνω directory η MySQL δέχεται ρυθμίσεις .
Θα φτιάξουμε ένα configuration file και θα γράψουμε σε αυτό τα παρακάτω :
/etc/mysql/conf.d/galera.cnf on the first node
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
‘Επειτα ανοίγουμε το αρχείο
sudo vi /etc/mysql/my.cnf
. . .
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
. . .
Η κόκκινη # πρέπει να διαγραφεί για να ρυθμιστεί σωστά το Galera .
Σε κάθε έναν απο τους υπόλοιπους κόμβους , ανοίγουμε το configuration file.
sudo vi /etc/mysql/conf.d/galera.cnf
Αντιγράφουμε τις ρυθμίσεις του πρώτου κόμβου , και στους υπόλοιπους με μια μικρή διαφορά στο παρακάτω πεδίο .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
Απλά αλλάζουμε το ip και το name δηλαδή για τον κάθε κόμβο .
Επίσης ανοίγουμε παλι το αρχείο :
sudo vi /etc/mysql/my.cnf
Και διαγράφουμε την # μπροστά απτην εντολή bind-adress
Αφού γίνει και αυτό για όλους τους κόμβους είμαστε έτοιμοι α ρυθμισουμε το firewall .
Σε κάθε server τσεκάρουμε την κατάσταση του firewall με την εντολη :
sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Πιθανόν να υπάρχουν κ άλλες ρυθμίσεις πέραν του SSH . Εμείς αυτό που θέλουμε είναι να επιτρέπει το firewall τις 4 θύρες του Galera οι οποίες είναι :
3306
4567
4568
4444
Για να ανοίξουμε τις θύρες εκτελούμε τις εντολές :
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
Για να ξεκινήσουμε το cluster πρέπει πρώτα να σταματήσουμε την MySQL και στους 3 servers .
sudo systemctl stop mysql
Τσεκάρουμε αν τερματίστηκε :
sudo systemctl status mysql
Αν δούμε την παρακάτω γραμμή σημαίνει ότι η MySQL σταμάτησε επιτυχώς
Output
. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.
“Ετσι όπως έχουμε διαμορφώσει τους κόμβους , ο κάθε κόμβος περιμένει να πάρει την αρχική του κατάσταση απο κάποιον άλλον . Στην αρχή όμως δεν είναι κανένας κόμβος ενεργός . Για αυτό θα χρησιμοποιήσουμε ένα script για να ξεκινήσουμε τον πρώτο κόμβο , και τους υπόλοιπους θα τους ενεργοποιήσουμε πιο απλά , με την εκτέλεση της systemctl
Στον πρώτο κόμβο , τρέχουμε το παρακάτω script :
sudo /etc/init.d/mysql start --wsrep-new-cluster
Για να δούμε ότι έγινε η εκκίνηση σωστά τσεκάρουμε το status του cluster :
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Πρέπει να δούμε αυτό :
Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
Για τον δεύτερο κόμβο :
Ξεκινάμε την MySQL
sudo systemctl start mysql
Τσεκάρουμε πάλι αν η εκκίνηση έγινε σωστά
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
Για τον τρίτο κόμβο :
Απλά κάνουμε ότι και στον δεύτερο κόμβο . Στο τέλος το status του cluster πρέπει να έχει την ακόλουθη μορφή :
Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------
Στους server της MySQL στα Debian , υπάρχει ένας ειδικός χρήστης ο οποιός ανά διαστήματα πραγματοποιεί maintenance στο σύστημα . Τα στοιχεία αυτού του χρήστη βρίσκονται στο directory /etc/mysql/debian.cnf και έχουν χρησιμοποιηθεί ήδη στο database .
Όταν φτιάξαμε τον δεύτερο και τον τρίτο κόμβο έγινε αντιγραφή του κωδικού του πρώτου στους αλλους 2 . Αλλά αυτός ο κωδικός δουλεύει μόνο στον πρώτο αρα το maintenance δεν θα μπορεί να γίνει στον δεύτερο και τον τρίτο . Για να διορθώσουμε αυτό το πρόβλημα θα κάνουμε τα παρακάτω :
Ανοίγουμε το αρχείο debian.cnf με έναν text editor στον πρώτο κόμβο :
sudo vi /etc/mysql/debian.cnf
Θα δούμε κάτι τέτοιο :
[client]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Κάνουμε αντιγραφή τα παραπάνω .
Ανοίγουμε τώρα το αρχείο debian.cnf στον δεύτερο κόμβο :
sudo vi /etc/mysql/debian.cnf
Σβήνουμε τα πάντα και κάνουμε επικόλληση τα στοιχεία που αντιγράψαμε πριν .
Κάνουμε και το ίδιο στον τρίτο κόμβο .
Εν τέλει θέλουμε το debian.cnf να περιέχει ακριβώς τα ίδια στοιχεία και στους 3 κόμβους.
Για να τεστάρουμε ότι απο έναν κόμβο , γίνεται σωστά ο διαμοιρασμός και στους υπόλοιπος (active-active) θα φτιάξουμε στον πρώτο κόμβο μια βάση δεδομένων και μέσα σε αυτή έναν πίνακα :
mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
Τώρα θα πάμε στον δεύτερο κόμβο και θα δοκιμάσουμε να διαβάσουμε την βάση που φτιάξαμε στον πρώτο
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Κανονικά πρέπει να δούμε την ακόλουθη έξοδο
Output
+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
Τώρα από τον δεύτερο κόμβο θα κάνουμε κάποιες αλλαγές στην βάση :
sql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
Δοκιμάζουμε απο τον τρίτο να εμφανίσουμε την βάση :
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Κανονικά πρέπει να δούμε την έξοδο :
Output
+----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+
Τέλος θα κάνουμε απο τον τρίτο κόμβο πάλι μια αλλαγή :
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
Δοκιμάζουμε να την διαβάσουμε από τον πρώτο κόμβο
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output
+----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+
Αν δούμε την απο πάνω έξοδο σημαίνει οτι το Galera Cluster δουλεύει κανονικά και είμαστε έτοιμοι!