Πώς να στήσετε ένα Galera Cluster σε Debian 8 Servers

07/02/2017 / MySQL
galera-cluster

Τ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 .

Εγκατάσταση

Βήμα 1 Προσθέτουμε το Galera Repository σε όλους τους server

Αρχικά , προσθέτουμε το κλειδί του 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

 

Βήμα 2 Κάνουμε Εγκατάσταση την MySQL και το Galera σε κάθε server

Εκτελούμε τις παρακάτω εντολές για να εγκατασταθεί το Galera , η MySQL όπως και κάποια addons που θα χρειαστούν στη συνέχεια . Για την MySQL θα ζητηθεί ένα administrative password . 

sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

sudo apt-get install rsync

 

Βήμα 3 Διαμορφώνουμε τον πρώτο κόμβο

 Για να λειτουργήσει το 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 .

 

Βήμα 4 Διαμορφώνουμε τους υπόλοιπους κόμβους

 Σε κάθε έναν απο τους υπόλοιπους κόμβους , ανοίγουμε το 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 .

 

Βήμα 5 Ρύθμιση του firewall σε κάθε server

 Σε κάθε 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

 

Βήμα 6  Εκκίνηση του Cluster

 Για να ξεκινήσουμε το 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     |
+--------------------+-------

 

Βήμα 7 Ρυθμίζουμε το maintenance στα Debian

 Στους 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 κόμβους.

 

Βήμα 8 Τεστάρουμε Το Cluster που μόλις φτιάξαμε

 Για να τεστάρουμε ότι απο έναν κόμβο , γίνεται σωστά ο διαμοιρασμός και στους υπόλοιπος (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 δουλεύει κανονικά και είμαστε έτοιμοι!

ΣΥΝΔΕΣΗ

Αίτηση επικοινωνίας

ΠΑΝΩ