Diferència entre revisions de la pàgina «ASIX/M10/UF2/A04/E2»
m (Guillem ha mogut M10/UF2/A04/E2 a ASIX/M10/UF2/A04/E2 sense deixar una redirecció: Crear subnivell ASIX) |
|||
| (Hi ha 37 revisions intermèdies del mateix usuari que no es mostren) | |||
| Línia 1: | Línia 1: | ||
| + | [[category:M10]] | ||
{{titol|Pt42-Cluster amb balanceig}} | {{titol|Pt42-Cluster amb balanceig}} | ||
{{capcalera|Guillem Solà i Boeck|22}} | {{capcalera|Guillem Solà i Boeck|22}} | ||
| − | ==Crear un cluster de MariaDB amb 3 nodes i 1 | + | ==Crear un cluster de MariaDB amb 3 nodes i 1 balancejador de càrrega== |
===Disseny preliminar=== | ===Disseny preliminar=== | ||
*'''node1'''{{fletxadreta}}192.168.56.'''101''' | *'''node1'''{{fletxadreta}}192.168.56.'''101''' | ||
| Línia 33: | Línia 34: | ||
DELIMIT | DELIMIT | ||
</source> | </source> | ||
| − | *Necessitarem instal·lar MariaDB '''10.x''' ja que incorpora el sistema ''Galera'' que permet muntatge de clústers. Com que CentOS 7 inclou per defecte el repositori per a MariaDB 5, haurem d'afegir manualment el repositori de la versió 10 com s'indica a la [https://downloads.mariadb.org/mariadb/repositories/#mirror=tedeco&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.2 pàgina oficial]. | + | *Necessitarem instal·lar MariaDB '''10.x''' ja que incorpora el sistema ''Galera'' que permet muntatge de clústers. Com que CentOS 7 inclou per defecte el repositori per a MariaDB 5, haurem d'afegir manualment el repositori de la versió 10 com s'indica a la [https://downloads.mariadb.org/mariadb/repositories/#mirror=tedeco&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.2 pàgina oficial]: |
| + | <source>nano /etc/yum.repos.d/MariaDB.repo</source> | ||
| + | <source> | ||
| + | # MariaDB 10.2 CentOS repository list - created 2018-05-14 16:48 UTC | ||
| + | # http://downloads.mariadb.org/mariadb/repositories/ | ||
| + | [mariadb] | ||
| + | name = MariaDB | ||
| + | baseurl = http://yum.mariadb.org/10.2/centos7-amd64 | ||
| + | gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB | ||
| + | gpgcheck=1 | ||
| + | </source> | ||
| + | |||
*'''OPCIONAL''': podem optar per instal·lar les ''network-tools'' i l'editor de text ''nano'' si ens hi sentim més còmodes. Encara que hi ha l'editor ''vi'' per defecte i també tenim la comanda <code>ip a</code> per a saber l'adreça IP d'aquella màquina en cas de necessitar-ho. | *'''OPCIONAL''': podem optar per instal·lar les ''network-tools'' i l'editor de text ''nano'' si ens hi sentim més còmodes. Encara que hi ha l'editor ''vi'' per defecte i també tenim la comanda <code>ip a</code> per a saber l'adreça IP d'aquella màquina en cas de necessitar-ho. | ||
| Línia 40: | Línia 52: | ||
Mentre s'instal·la, aprofitant que podem obrir vàries connexions SSH, podem desactivar el SELinux per a evitar problemes per culpa de permisos: posarem '''disabled''' a la línia 6 de l'arxiu. | Mentre s'instal·la, aprofitant que podem obrir vàries connexions SSH, podem desactivar el SELinux per a evitar problemes per culpa de permisos: posarem '''disabled''' a la línia 6 de l'arxiu. | ||
<source>vi /etc/selinux/config</source> | <source>vi /etc/selinux/config</source> | ||
| − | <source highlight="6" | + | <source line start="1" highlight="6" line> |
# This file controls the state of SELinux on the system. | # This file controls the state of SELinux on the system. | ||
# SELINUX= can take one of these three values: | # SELINUX= can take one of these three values: | ||
| Línia 124: | Línia 136: | ||
<source>vi /etc/my.cnf.d/server.cnf</source> | <source>vi /etc/my.cnf.d/server.cnf</source> | ||
Editarem la secció [galera] i la deixarem de la següent forma: | Editarem la secció [galera] i la deixarem de la següent forma: | ||
| − | < | + | <source highlight="4-6"> |
[galera] | [galera] | ||
# Mandatory settings | # Mandatory settings | ||
| Línia 159: | Línia 171: | ||
wsrep_slave_threads=1 | wsrep_slave_threads=1 | ||
innodb_flush_log_at_trx_commit=0 | innodb_flush_log_at_trx_commit=0 | ||
| − | </ | + | </source> |
Les línies marcades (5 i 6) són les que s'han de modificar i posar l'adreça IP del node que estem configurant. | Les línies marcades (5 i 6) són les que s'han de modificar i posar l'adreça IP del node que estem configurant. | ||
| Línia 166: | Línia 178: | ||
Una vegada clonades 2 màquines més, haurem d'engegar-les '''una per una''' perquè no hi hagi conflicte de IPs i executarem l'script d'abans per a configurar el hostname i l'adreça que li pertoqui. També haurem d'editar l'arxiu <code>/etc/mysql.cnf.d/server.cnf</code> per a adaptar l'adreça del node a la que correspongui. | Una vegada clonades 2 màquines més, haurem d'engegar-les '''una per una''' perquè no hi hagi conflicte de IPs i executarem l'script d'abans per a configurar el hostname i l'adreça que li pertoqui. També haurem d'editar l'arxiu <code>/etc/mysql.cnf.d/server.cnf</code> per a adaptar l'adreça del node a la que correspongui. | ||
| + | Quan ho tinguem tot a punt, tornarem al node 1 i arrencarem el servei amb la comanda <code>galera_new_cluster</code> i esperarem que engegui sense problemes. Llavors, quan hagi arrencat, podrem anar als altres 2 nodes i engegar el servidor SQL normalment <code>systemctl start mysql</code>. Si tot va bé, tindrem el cluster en funcionament. | ||
| + | ====Comprovació de funcionament==== | ||
| + | Per tal de comprovar que estigui funcionant podem executar la consulta següent al node principal: | ||
| + | <source lang="mysqle">show status like '%wsrep_cluster_size%';</source> | ||
| + | I ens retornarà el tamany del clúster (quantitat de nodes connectats) | ||
| + | {{imatge|cluster1.png||thumb|Veiem la mida que és 3, corresponent als 3 nodes que hem configurat}} | ||
| + | Aleshores, podem provar de crear una base de dades de prova des d'un lloc i esborrar-la des d'un altre node i visualitzar-ho: | ||
| + | {{imatge|cluster2.png||thumb|Creo una base de dades "Guillem" des del node2}} | ||
| + | {{imatge|cluster3.png||thumb|Llisto i elimino la base de dades "Guillem" des del node3}} | ||
| + | {{imatge|cluster4.png||thumb|Llisto les bases de dades des del node1 i veig que s'ha eliminat la que he creat i eliminat anteriorment}} | ||
| + | ===Creació i configuració del balancejador de càrrega=== | ||
| + | En aquesta pràctica utilitzarem el programa HAProxy per a desenvolupar aquesta tasca. Utilitzarem un CentOS 7 com a base amb les interfícies de xarxa configurades tal com a l'apartat de disseny i utilitzant l'script de configuració definit al principi de la pràctica. | ||
| + | ====Instal·lació==== | ||
| + | El programari HAProxy està disponible als repositoris per defecte del sistema, per tant, l'instal·larem com de costum: | ||
| + | <source>yum install haproxy</source> | ||
| + | Després editarem el fitxer <code>/etc/hosts</code> per a resoldre els hostnames cap a IPs dels nodes del cluster: | ||
| + | <source>nano /etc/hosts</source> | ||
| + | <source> | ||
| + | 192.168.56.101 node1 | ||
| + | 192.168.56.102 node2 | ||
| + | 192.168.56.103 node3 | ||
| + | 192.168.56.100 haproxy | ||
| + | </source> | ||
| + | ====Configuració==== | ||
| + | Descarregarem l'[https://github.com/olafz/percona-clustercheck/blob/master/clustercheck script] de ''clustercheck'' que permet a HAProxy saber si un node està operatiu o no i el copiarem a <code>/usr/bin/clustercheck</code> i el farem executable amb <code>chmod 755 /usr/bin/clustercheck</code> | ||
| + | <source>#!/bin/bash | ||
| + | # | ||
| + | # Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly | ||
| + | # | ||
| + | # Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com> | ||
| + | # Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com> | ||
| + | # | ||
| + | # Documentation and download: https://github.com/olafz/percona-clustercheck | ||
| + | # | ||
| + | # Based on the original script from Unai Rodriguez | ||
| + | # | ||
| + | |||
| + | if [[ $1 == '-h' || $1 == '--help' ]];then | ||
| + | echo "Usage: $0 <user> <pass> <available_when_donor=0|1> <log_file> <available_when_readonly=0|1> <defaults_extra_file>" | ||
| + | exit | ||
| + | fi | ||
| + | |||
| + | # if the disabled file is present, return 503. This allows | ||
| + | # admins to manually remove a node from a cluster easily. | ||
| + | if [ -e "/var/tmp/clustercheck.disabled" ]; then | ||
| + | # Shell return-code is 1 | ||
| + | echo -en "HTTP/1.1 503 Service Unavailable\r\n" | ||
| + | echo -en "Content-Type: text/plain\r\n" | ||
| + | echo -en "Connection: close\r\n" | ||
| + | echo -en "Content-Length: 51\r\n" | ||
| + | echo -en "\r\n" | ||
| + | echo -en "Percona XtraDB Cluster Node is manually disabled.\r\n" | ||
| + | sleep 0.1 | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | MYSQL_USERNAME="${1-clustercheckuser}" | ||
| + | MYSQL_PASSWORD="${2-clustercheck}" | ||
| + | AVAILABLE_WHEN_DONOR=${3:-0} | ||
| + | ERR_FILE="${4:-/dev/null}" | ||
| + | AVAILABLE_WHEN_READONLY=${5:-1} | ||
| + | DEFAULTS_EXTRA_FILE=${6:-/etc/my.cnf} | ||
| − | + | #Timeout exists for instances where mysqld may be hung | |
| + | TIMEOUT=10 | ||
| − | === | + | EXTRA_ARGS="" |
| − | + | if [[ -n "$MYSQL_USERNAME" ]]; then | |
| − | + | EXTRA_ARGS="$EXTRA_ARGS --user=${MYSQL_USERNAME}" | |
| − | [ | + | fi |
| − | + | if [[ -n "$MYSQL_PASSWORD" ]]; then | |
| − | + | EXTRA_ARGS="$EXTRA_ARGS --password=${MYSQL_PASSWORD}" | |
| − | + | fi | |
| − | + | if [[ -r $DEFAULTS_EXTRA_FILE ]];then | |
| − | + | MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE --connect-timeout=$TIMEOUT \ | |
| − | + | ${EXTRA_ARGS}" | |
| − | + | else | |
| + | MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT ${EXTRA_ARGS}" | ||
| + | fi | ||
# | # | ||
| − | # | + | # Perform the query to check the wsrep_local_state |
# | # | ||
| − | + | WSREP_STATUS=$($MYSQL_CMDLINE -e "SHOW STATUS LIKE 'wsrep_local_state';" \ | |
| − | + | 2>${ERR_FILE} | tail -1 2>>${ERR_FILE}) | |
| − | + | ||
| − | + | if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]] | |
| + | then | ||
| + | # Check only when set to 0 to avoid latency in response. | ||
| + | if [[ $AVAILABLE_WHEN_READONLY -eq 0 ]];then | ||
| + | READ_ONLY=$($MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" \ | ||
| + | 2>${ERR_FILE} | tail -1 2>>${ERR_FILE}) | ||
| + | |||
| + | if [[ "${READ_ONLY}" == "ON" ]];then | ||
| + | # Percona XtraDB Cluster node local state is 'Synced', but it is in | ||
| + | # read-only mode. The variable AVAILABLE_WHEN_READONLY is set to 0. | ||
| + | # => return HTTP 503 | ||
| + | # Shell return-code is 1 | ||
| + | echo -en "HTTP/1.1 503 Service Unavailable\r\n" | ||
| + | echo -en "Content-Type: text/plain\r\n" | ||
| + | echo -en "Connection: close\r\n" | ||
| + | echo -en "Content-Length: 43\r\n" | ||
| + | echo -en "\r\n" | ||
| + | echo -en "Percona XtraDB Cluster Node is read-only.\r\n" | ||
| + | sleep 0.1 | ||
| + | exit 1 | ||
| + | fi | ||
| + | fi | ||
| + | # Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200 | ||
| + | # Shell return-code is 0 | ||
| + | echo -en "HTTP/1.1 200 OK\r\n" | ||
| + | echo -en "Content-Type: text/plain\r\n" | ||
| + | echo -en "Connection: close\r\n" | ||
| + | echo -en "Content-Length: 40\r\n" | ||
| + | echo -en "\r\n" | ||
| + | echo -en "Percona XtraDB Cluster Node is synced.\r\n" | ||
| + | sleep 0.1 | ||
| + | exit 0 | ||
| + | else | ||
| + | # Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503 | ||
| + | # Shell return-code is 1 | ||
| + | echo -en "HTTP/1.1 503 Service Unavailable\r\n" | ||
| + | echo -en "Content-Type: text/plain\r\n" | ||
| + | echo -en "Connection: close\r\n" | ||
| + | echo -en "Content-Length: 44\r\n" | ||
| + | echo -en "\r\n" | ||
| + | echo -en "Percona XtraDB Cluster Node is not synced.\r\n" | ||
| + | sleep 0.1 | ||
| + | exit 1 | ||
| + | fi</source> | ||
| + | Ara entrarem al cluster de mariadb i crearem un usuari per a aquest script: | ||
| + | <source lang="mysqle">GRANT PROCESS ON *.* TO 'clustercheckuser'@'%' IDENTIFIED BY 'clustercheck';</source> | ||
| + | Llavors instal·larem xinetd amb <code>yum install xinetd</code> en tots els nodes que formen el cluster. | ||
| + | Afegirem el fitxer a tots els nodes: | ||
| + | <source>nano /etc/xinetd.d/mysqlcheck</source> | ||
| + | <source> | ||
| + | # default: on | ||
| + | # description: mysqlchk | ||
| + | service mysqlchk | ||
| + | { | ||
| + | disable = no | ||
| + | flags = REUSE | ||
| + | socket_type = stream | ||
| + | port = 9200 | ||
| + | wait = no | ||
| + | user = nobody | ||
| + | server = /usr/bin/clustercheck | ||
| + | log_on_failure += USERID | ||
| + | only_from = 0.0.0.0/0 | ||
| + | per_source = UNLIMITED | ||
| + | } | ||
| + | </source> | ||
| + | A l'arxiu <code>/etc/services</code> buscarem les entrades pel port 9200, les comentarem i hi afegirem una de nova, de manera que quedi així: | ||
| + | <source> | ||
| + | mysqlchk 9200/tcp # Galera Clustercheck | ||
| + | # wap-wsp 9200/tcp # WAP connectionless session service | ||
| + | # wap-wsp 9200/udp # WAP connectionless session service | ||
</source> | </source> | ||
| − | + | Un cop tots els nodes estiguin configurats, engegarem el servei xinetd <code>systemctl start xinetd</code> | |
| + | Llavors podem executar <code>clustercheck</code> a cada un dels nodes per comprovar que donin un 200 OK. | ||
| + | Ara és qüestió d'editar l'arxiu de configuració de HAProxy i deixar-lo d'aquesta manera: | ||
| + | <source> | ||
| + | global | ||
| + | log 127.0.0.1 local0 | ||
| + | log 127.0.0.1 local1 notice | ||
| + | maxconn 1024 | ||
| + | user haproxy | ||
| + | group haproxy | ||
| + | daemon | ||
| + | |||
| + | defaults | ||
| + | log global | ||
| + | mode http | ||
| + | option tcplog | ||
| + | option dontlognull | ||
| + | retries 3 | ||
| + | option redispatch | ||
| + | timeout connect 5000ms | ||
| + | timeout client 50000ms | ||
| + | timeout server 50000ms | ||
| + | |||
| + | listen m10cluster 192.168.56.100:3306 | ||
| + | balance roundrobin | ||
| + | mode tcp | ||
| + | option mysql-check user haproxy | ||
| + | server node1 192.168.56.101 check weight 1 | ||
| + | server node2 192.168.56.102 check weight 1 | ||
| + | server node3 192.168.56.103 check weight 1 | ||
| − | ====Comprovació==== | + | listen stats 0.0.0.0:9000 |
| + | mode http | ||
| + | stats enable | ||
| + | stats uri /haproxy | ||
| + | stats realm HAProxy\ Statistics | ||
| + | stats auth haproxy:haproxy | ||
| + | stats admin if TRUE | ||
| + | </source> | ||
| + | Una vegada configurat el HAProxy, haurem de crear un usuari 'haproxy' per l'SQL i un usuari 'root' des de qualsevol host per a fer el test de connexions: | ||
| + | <source lang="mysqle">create user 'haproxy'@'192.168.56.100';</source> | ||
| + | <source lang="mysqle">grant all on *.* to 'root'@'%' identified by 'asix' with grant option;</source> | ||
| + | No ens hem de descuidar de deshabilitar el firewall <code>systemctl stop firewalld && systemctl disable firewalld</code> i editar l'arxiu <code>/etc/selinux/config</code> per a deshabilitar el SELinux i evitar problemes de connectivitat. Reiniciar per aplicar els canvis de SELinux. | ||
| + | =====Comprovació de funcionament===== | ||
| + | Des del host anfitrió faré connexions amb consulta de la variable <code>@@hostname</code> per a saber a quin node del cluster estic connectat de manera que, al configurar HAProxy amb balanceig tipus ''round robin'', veurem com va redirigint les connexions per ordre dels nodes en cicle: | ||
| + | {{imatge|HAProxy1.png||thumb|Fent la consulta sobre el host de haproxy veiem com ens va redirigint cap a cada un dels nodes disponibles del cluster en l'ordre 1-3-2}} | ||
| − | == | + | ==Recursos web== |
| − | + | *http://techbrotherstutorials.com/pages/tutorials/MariaDB-Administration-_126/How-To-Create-a-Galera-Cluster-with-MariaDB--on-CentOS-Servers_1004 | |
Revisió de 11:30, 15 abr 2020
Contingut
Guillem Solà i Boeck (host A10BPC22)
Crear un cluster de MariaDB amb 3 nodes i 1 balancejador de càrrega
Disseny preliminar
- node1 →192.168.56.101
- node2 →192.168.56.102
- node3 →192.168.56.103
- haproxy →192.168.56.100
Requeriments
- Necessitarem tenir instal·lat el programa rsync, que és en el qual es recolza Galera per a fer la sincronització entre nodes amb
yum install rsync -y - Farem servir un script simple per a fer la configuració de la xarxa: adreça IP i nom de host
NEWIP=$1 NEWHOSTNAME=$2 rm -f /etc/udev/rules.d/70-persistent-net.rules cat > /etc/sysconfig/network-scripts/ifcfg-enp0s8 <<DELIMIT DEVICE=enp0s8 ONBOOT=yes BOOTPROTO=static IPADDR=$NEWIP DELIMIT cat > /etc/sysconfig/network <<DELIMIT NETWORKING=yes HOSTNAME=$NEWHOSTNAME DELIMIT cat > /etc/hostname <<DELIMIT $NEWHOSTNAME DELIMIT
- Necessitarem instal·lar MariaDB 10.x ja que incorpora el sistema Galera que permet muntatge de clústers. Com que CentOS 7 inclou per defecte el repositori per a MariaDB 5, haurem d'afegir manualment el repositori de la versió 10 com s'indica a la pàgina oficial:
nano /etc/yum.repos.d/MariaDB.repo
# MariaDB 10.2 CentOS repository list - created 2018-05-14 16:48 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
- OPCIONAL: podem optar per instal·lar les network-tools i l'editor de text nano si ens hi sentim més còmodes. Encara que hi ha l'editor vi per defecte i també tenim la comanda
ip aper a saber l'adreça IP d'aquella màquina en cas de necessitar-ho.
Creació i configuració del cluster
Una vegada acomplerts els requeriments, actualitzarem el sistema amb yum update -y i instal·larem MariaDB 10.x amb yum install MariaDB (parar atenció amb les majúscules, perquè sinó, instal·larem la versió 5).
Mentre s'instal·la, aprofitant que podem obrir vàries connexions SSH, podem desactivar el SELinux per a evitar problemes per culpa de permisos: posarem disabled a la línia 6 de l'arxiu.
vi /etc/selinux/config
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
També desactivarem el firewalld amb systemctl disable firewalld i així ens estalviem d'obrir ports.
Així doncs, quan estigui tot a punt, podem reiniciar la màquina perquè s'apliquin els canvis del SeLinux i el Firewall.
Un cop reiniciat, posarem a punt el servei MariaDB amb la comanda mysql_secure_installation i escollirem les opcions adequades:
[root@node1 ~]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
... skipping.
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Després aturarem el servei systemctl stop mariadb per a poder editar sense problemes l'arxiu de configuració per a, més endavant, poder posar en marxa el cluster.
vi /etc/my.cnf.d/server.cnf
Editarem la secció [galera] i la deixarem de la següent forma:
[galera] # Mandatory settings wsrep_on=ON wsrep_cluster_address=gcomm://192.168.56.101,192.168.56.102,192.168.56.103 wsrep_node_address=192.168.56.101 wsrep_node_incoming_address=192.168.56.101 # wsrep_sst_donor = binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_buffer_pool_size=122M wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_name="m10cluster" wsrep_slave_threads=1 wsrep_certify_nonPK=1 wsrep_max_ws_rows=0 wsrep_max_ws_size=2147483647 wsrep_debug=0 wsrep_convert_LOCK_to_trx=0 wsrep_retry_autocommit=1 wsrep_auto_increment_control=1 wsrep_drupal_282555_workaround=0 wsrep_causal_reads=0 wsrep_notify_cmd= # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 # # Optional setting wsrep_slave_threads=1 innodb_flush_log_at_trx_commit=0
Les línies marcades (5 i 6) són les que s'han de modificar i posar l'adreça IP del node que estem configurant.
Ara ja podem agafar aquesta màquina virtual, apagar-la i fer-ne 2 clons per als altres 2 nodes.
Una vegada clonades 2 màquines més, haurem d'engegar-les una per una perquè no hi hagi conflicte de IPs i executarem l'script d'abans per a configurar el hostname i l'adreça que li pertoqui. També haurem d'editar l'arxiu /etc/mysql.cnf.d/server.cnf per a adaptar l'adreça del node a la que correspongui.
Quan ho tinguem tot a punt, tornarem al node 1 i arrencarem el servei amb la comanda galera_new_cluster i esperarem que engegui sense problemes. Llavors, quan hagi arrencat, podrem anar als altres 2 nodes i engegar el servidor SQL normalment systemctl start mysql. Si tot va bé, tindrem el cluster en funcionament.
Comprovació de funcionament
Per tal de comprovar que estigui funcionant podem executar la consulta següent al node principal:
show status like '%wsrep_cluster_size%';
I ens retornarà el tamany del clúster (quantitat de nodes connectats)
Aleshores, podem provar de crear una base de dades de prova des d'un lloc i esborrar-la des d'un altre node i visualitzar-ho:
Creació i configuració del balancejador de càrrega
En aquesta pràctica utilitzarem el programa HAProxy per a desenvolupar aquesta tasca. Utilitzarem un CentOS 7 com a base amb les interfícies de xarxa configurades tal com a l'apartat de disseny i utilitzant l'script de configuració definit al principi de la pràctica.
Instal·lació
El programari HAProxy està disponible als repositoris per defecte del sistema, per tant, l'instal·larem com de costum:
yum install haproxy
Després editarem el fitxer /etc/hosts per a resoldre els hostnames cap a IPs dels nodes del cluster:
nano /etc/hosts
192.168.56.101 node1 192.168.56.102 node2 192.168.56.103 node3 192.168.56.100 haproxy
Configuració
Descarregarem l'script de clustercheck que permet a HAProxy saber si un node està operatiu o no i el copiarem a /usr/bin/clustercheck i el farem executable amb chmod 755 /usr/bin/clustercheck
#!/bin/bash
#
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
#
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
# Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com>
#
# Documentation and download: https://github.com/olafz/percona-clustercheck
#
# Based on the original script from Unai Rodriguez
#
if [[ $1 == '-h' || $1 == '--help' ]];then
echo "Usage: $0 <user> <pass> <available_when_donor=0|1> <log_file> <available_when_readonly=0|1> <defaults_extra_file>"
exit
fi
# if the disabled file is present, return 503. This allows
# admins to manually remove a node from a cluster easily.
if [ -e "/var/tmp/clustercheck.disabled" ]; then
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 51\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is manually disabled.\r\n"
sleep 0.1
exit 1
fi
MYSQL_USERNAME="${1-clustercheckuser}"
MYSQL_PASSWORD="${2-clustercheck}"
AVAILABLE_WHEN_DONOR=${3:-0}
ERR_FILE="${4:-/dev/null}"
AVAILABLE_WHEN_READONLY=${5:-1}
DEFAULTS_EXTRA_FILE=${6:-/etc/my.cnf}
#Timeout exists for instances where mysqld may be hung
TIMEOUT=10
EXTRA_ARGS=""
if [[ -n "$MYSQL_USERNAME" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --user=${MYSQL_USERNAME}"
fi
if [[ -n "$MYSQL_PASSWORD" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --password=${MYSQL_PASSWORD}"
fi
if [[ -r $DEFAULTS_EXTRA_FILE ]];then
MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE --connect-timeout=$TIMEOUT \
${EXTRA_ARGS}"
else
MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT ${EXTRA_ARGS}"
fi
#
# Perform the query to check the wsrep_local_state
#
WSREP_STATUS=$($MYSQL_CMDLINE -e "SHOW STATUS LIKE 'wsrep_local_state';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
then
# Check only when set to 0 to avoid latency in response.
if [[ $AVAILABLE_WHEN_READONLY -eq 0 ]];then
READ_ONLY=$($MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${READ_ONLY}" == "ON" ]];then
# Percona XtraDB Cluster node local state is 'Synced', but it is in
# read-only mode. The variable AVAILABLE_WHEN_READONLY is set to 0.
# => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 43\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is read-only.\r\n"
sleep 0.1
exit 1
fi
fi
# Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
# Shell return-code is 0
echo -en "HTTP/1.1 200 OK\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 40\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is synced.\r\n"
sleep 0.1
exit 0
else
# Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 44\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
sleep 0.1
exit 1
fi
Ara entrarem al cluster de mariadb i crearem un usuari per a aquest script:
GRANT PROCESS ON *.* TO 'clustercheckuser'@'%' IDENTIFIED BY 'clustercheck';
Llavors instal·larem xinetd amb yum install xinetd en tots els nodes que formen el cluster.
Afegirem el fitxer a tots els nodes:
nano /etc/xinetd.d/mysqlcheck
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED
}
A l'arxiu /etc/services buscarem les entrades pel port 9200, les comentarem i hi afegirem una de nova, de manera que quedi així:
mysqlchk 9200/tcp # Galera Clustercheck # wap-wsp 9200/tcp # WAP connectionless session service # wap-wsp 9200/udp # WAP connectionless session service
Un cop tots els nodes estiguin configurats, engegarem el servei xinetd systemctl start xinetd
Llavors podem executar clustercheck a cada un dels nodes per comprovar que donin un 200 OK.
Ara és qüestió d'editar l'arxiu de configuració de HAProxy i deixar-lo d'aquesta manera:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 1024
user haproxy
group haproxy
daemon
defaults
log global
mode http
option tcplog
option dontlognull
retries 3
option redispatch
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen m10cluster 192.168.56.100:3306
balance roundrobin
mode tcp
option mysql-check user haproxy
server node1 192.168.56.101 check weight 1
server node2 192.168.56.102 check weight 1
server node3 192.168.56.103 check weight 1
listen stats 0.0.0.0:9000
mode http
stats enable
stats uri /haproxy
stats realm HAProxy\ Statistics
stats auth haproxy:haproxy
stats admin if TRUE
Una vegada configurat el HAProxy, haurem de crear un usuari 'haproxy' per l'SQL i un usuari 'root' des de qualsevol host per a fer el test de connexions:
create user 'haproxy'@'192.168.56.100';
grant all on *.* to 'root'@'%' identified by 'asix' with grant option;
No ens hem de descuidar de deshabilitar el firewall systemctl stop firewalld && systemctl disable firewalld i editar l'arxiu /etc/selinux/config per a deshabilitar el SELinux i evitar problemes de connectivitat. Reiniciar per aplicar els canvis de SELinux.
Comprovació de funcionament
Des del host anfitrió faré connexions amb consulta de la variable @@hostname per a saber a quin node del cluster estic connectat de manera que, al configurar HAProxy amb balanceig tipus round robin, veurem com va redirigint les connexions per ordre dels nodes en cicle: