MySQL cluster: Difference between revisions

From Hobbynet Admin Wiki
Jump to navigation Jump to search
 
(55 intermediate revisions by 3 users not shown)
Line 2: Line 2:
Om te zorgen dat onze database server ook volledig redundant is hebben we hier een cluster gemaakt, onze loadbalancer zorgt er voor dat verkeer of op db01 of op db02 terecht komt.
Om te zorgen dat onze database server ook volledig redundant is hebben we hier een cluster gemaakt, onze loadbalancer zorgt er voor dat verkeer of op db01 of op db02 terecht komt.
=opzet=
=opzet=
== normale situatie ==
Dit geeft weer hoe in normale situaties het verkeer loopt.<br>
[[File:DBnormaal.png]]


[[File:DBnormaal.dia]]
= loadbalancing =
Onze servers zijn opgezet in een master-master setup, dus er kan op beide gemuteerd worden, de loadbalancer verspreid de mutatie naar de andere server.<br>
'''belangrijk'''<br>
Op alle clusters moet database lbtest aanwezig zijn met tabel lbtest. Deze tabel moet minimaal 1 record hebben, hier test de loadbalancer namelijk op. De usernaam voor loadbalancer en nagios is lbtest met ww Testing123! deze gebruiker heeft alleen select rechten op deze database


== Loadbalancer faalt ==
= database clusters =
Dit geeft weer hoe in een situatie het verkeer loopt als er een loadbalancer faalt.<br>
== dbclus01-int ==
[[File:DBlbfaalt.png]]
Dit cluster bestaat uit mysql01 en mysql02


[[File:DBlbfaalt.dia]]
== hcc-dbclus02-int ==
Dit cluster bestaat uit mysql03 en mysql04


== Database server faalt ==
== dbclus04-int ==
Dit geeft weer hoe in een situatie het verkeer loopt als er een Database server faalt.<br>
Dit cluster bestaat uit mysql05 en mysql06
[[File:DBdbfaalt.png]]
== dbclus05-int ==
Dit cluster bestaat uit mysql07 en mysql08


[[File:DBdbfaalt.dia]]
=configuratie =


= database cluster 01 (hobbynet) dbclus01-int =
== configuratie files ==  
== configuratie ==
al deze bestanden bevinden zich in /etc/mysql/mysql.conf.d
De twee server staan in de master master replicatie, dit wil zeggen als er mutatie wordt gedaan op server 1 dat deze wordt door gevoerd op server 2.
De loadbalancer zorgt er voor dat server 1 altijd wordt aangesproken, is server 1 down dat wordt er omgeschakeld naar server2 zonder dat gebruiker hier iets van merkt.


== config files ==
=== mysqld.cnf ===
=== db01 ===
In deze file hebben we 1 aanpassing gedaan we hebben
de config aanpassingen die gedaan zijn op standaard config zijn:
bind-address          = 127.0.0.1
<pre>
voorzien van commentaar
server-id              = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1


master-host = 172.31.1.214
=== ssl.cnf ===
master-user = repl
Mysql beschikt over ssl daarom is dit ook geconfigureerd, onder andere de replicatie gebruikt het. De ssl.cnf file ziet er zo uit:
master-password = fxq5jLqWDYXYKhPD
[mysqld]
master-connect-retry = 60
ssl-ca=/disk/site/etc/ssl/hobby.nl/CA-bundel.crt
log_bin                = /var/log/mysql/mysql-bin.log
ssl-cert=/disk/site/etc/ssl/hobby.nl/hobby.nl.crt
expire_logs_days        = 10
ssl-key=/disk/site/etc/ssl/hobby.nl/hobby.nl.key
max_binlog_size        = 100M
binlog_do_db            = bas
# lbtest mag nooit weg ivm loadbalancing test of mysql nog werkt!
binlog_do_db            = lbtest
binlog_do_db            = xibo
binlog_do_db            = groepentest
binlog_do_db            = groepen
binlog_do_db            = groepen-test
binlog_do_db            = watersport
binlog_do_db            = watersport-test
binlog_do_db            = z-drenthe
binlog_do_db            = z-drenthe-test
binlog_do_db            = z-drenthe-hulp
binlog_do_db            = z-drenthe-hulp-test
binlog_do_db            = vandenbussche
binlog_do_db            = vandenbussche-test
binlog_do_db            = mz-limburg
binlog_do_db            = mz-limburg-test
binlog_do_db            = hccm-gg
binlog_do_db            = hccm-gg-test
binlog_do_db            = afd-gouda
binlog_do_db            = afd-gouda-test
binlog_do_db            = flightsimulator
binlog_do_db            = flightsimulator-test
binlog_do_db            = deventer
binlog_do_db            = deventer-test
binlog_do_db            = basic
binlog_do_db            = basic-test
binlog_do_db            = afd-arnhem
binlog_do_db            = afd-arnhem-test
binlog_do_db            = afd-almere
binlog_do_db            = afd-almere-test
binlog_do_db            = hcc-dagen
binlog_do_db            = basd
binlog_do_db            = basd-test
binlog_do_db            = int-nlb
binlog_do_db            = int-nlb-test
binlog_ignore_db        = mysql


</pre>
=== replicatie.cnf ===
Bij de replicatie is het belangrijk dat de oneven servers het server id 1 hebben en de even server id 2. Er mogen nooit 2 de zelfde id's zijn. Ook is de waarde van auto-increment-offset belangrijk; bij de oneven server is dat 1 en bij even 2. <br>


=== db02 ===
Voor oneven server ziet hij er zo uit:
de config aanpassingen die gedaan zijn op standaard config zijn:
#sql mode uit voor toestaan lege velden
<pre>
sql-mode                        =      ""
server-id               = 2
server-id                       =       1
replicate-same-server-id = 0
replicate-same-server-id       =       0
auto-increment-increment = 2
auto-increment-increment       =       2
auto-increment-offset = 1
auto-increment-offset           =       1
relay-log                      =      mysql01-relay-bin
binlog_format                  =      "STATEMENT"
replicate-ignore-db            =      information_schema
replicate-ignore-db            =      mysql
binlog-ignore-db                =      information_schema
binlog-ignore-db                =      mysql
log_bin                        =      /var/log/mysql/mysql-bin.log
slave-skip-errors = 1062


master-host = 172.31.1.213
=== credentials.cnf ===
master-user = repl
Op de server is root voor localhost voorzien van een wachtwoord om toch mysqldump en het mysql commando te kunnen gebruiken. De eigenaar van deze file is root:mysql met permissies 640.
master-password = fxq5jLqWDYXYKhPD
master-connect-retry = 60


log_bin                = /var/log/mysql/mysql-bin.log
=== tunning.cnf ===
expire_logs_days        = 10
Deze file bevat performance tuning. Dit is server specifiek, maar er moet in ieder geval deze regel in staan :
max_binlog_size        = 100M
[mysqld]
binlog_do_db            = bas
skip-name-resolve    =       1
# lbtest mag nooit weg ivm loadbalancing test of mysql nog werkt!
binlog_do_db            = lbtest
binlog_do_db            = xibo
binlog_do_db            = groepentest
binlog_do_db            = groepen
binlog_do_db            = groepen-test
binlog_do_db            = watersport
binlog_do_db            = watersport-test
binlog_do_db            = z-drenthe
binlog_do_db            = z-drenthe-test
binlog_do_db            = z-drenthe-hulp
binlog_do_db            = z-drenthe-hulp-test
binlog_do_db            = vandenbussche
binlog_do_db            = vandenbussche-test
binlog_do_db            = mz-limburg
binlog_do_db            = mz-limburg-test
binlog_do_db            = hccm-gg
binlog_do_db            = hccm-gg-test
binlog_do_db            = afd-gouda
binlog_do_db            = afd-gouda-test
binlog_do_db            = flightsimulator
binlog_do_db            = flightsimulator-test
binlog_do_db            = deventer
binlog_do_db            = deventer-test
binlog_do_db            = basic
binlog_do_db            = basic-test
binlog_do_db            = afd-arnhem
binlog_do_db            = afd-arnhem-test
binlog_do_db            = afd-almere
binlog_do_db            = afd-almere-test
binlog_do_db            = hcc-dagen
binlog_do_db            = hcc-dagen-test
binlog_do_db            = basd
binlog_do_db            = basd-test
binlog_do_db            = int-nlb
binlog_do_db            = int-nlb-test
binlog_ignore_db        = mysql


</pre>
= starten/herstellen replicatie =
== herstel ==
Bij herstellen moet je op beide servers de volgende sql commando's uitvoeren:
stop slave;
reset slave;
Op de '''defecte''' server verwijder je vervolgens alle databases '''nadat je eerst een backup hebt gemaakt'''


= database cluster 02 (hcc.nl) hcc-dbclus02-int=
=== start replicatie ===  
== configuratie ==
Zorg er voor dat de database niet meer benaderd/gemuteerd wordt. Zet hem uit in de loadbalancer, zowel voor IPv4 als voor IPv6<br>
De twee server staan in de master master replicatie, dit wil zeggen als er mutatie wordt gedaan op server 1 dat deze wordt door gevoerd op server 2.
Haal bij de '''goede''' server de log positie op:
De loadbalancer zorgt er voor dat server 1 altijd wordt aangesproken, is server 1 down dat wordt er omgeschakeld naar server2 zonder dat gebruiker hier iets van merkt.
mysql> show master status\G
== config files ==
=== hcc-db03 ===
de config aanpassingen die gedaan zijn op standaard config zijn:
<pre>
server-id              = 3
log_bin                = /var/log/mysql/mysql-bin.log
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
master-host = 172.31.1.216
master-user = repl
master-password = fxq5jLqWDYXYKhPD
master-connect-retry = 60
expire_logs_days        = 10
max_binlog_size        = 100M
binlog_do_db            = bas
# lbtest mag nooit weg ivm loadbalancing test of mysql nog werkt!
binlog_do_db            = lbtest
binlog_do_db            = www-prod
binlog_do_db            = www-test
binlog_do_db            = hcc-gebruikers
binlog_do_db            = hcc-gebruikers-test
binlog_ignore_db        = mysql


</pre>
*************************** 1. row ***************************
              File: mysql-bin.000057
          Position: 71061044
      Binlog_Do_DB:
  Binlog_Ignore_DB: information_schema,mysql
Executed_Gtid_Set:
1 row in set (0.00 sec)
Noteer de file en position<br>
maak mysqldump en pipe die naar de gefaalde server
  mysqldump --all-databases |mysql -h mysql0*-int -u jegebruikersnaam -p
Vul je wachtwoord in en de database wordt gedump naar de ander server (dit kan effe duren).


=== hcc-db04 ===
Op de andere server log je nu in en geef je het volgende commando's in mysql, vul dan het password in van repl user en position bij master_log_pos en de file bij master_log_file
de config aanpassingen die gedaan zijn op standaard config zijn:
CHANGE MASTER TO MASTER_HOST='mysql0*-int.hobby.nl', MASTER_USER='repl', '''MASTER_PASSWORD='******',''' '''MASTER_LOG_FILE='mysql-bin.000057',''' '''MASTER_LOG_POS=71061044,''' MASTER_SSL = 1, MASTER_SSL_CA = '/disk/site/etc/ssl/hobby.nl/CA-bundel.crt', MASTER_SSL_CERT = '/disk/site/etc/ssl/hobby.nl/hobby.nl.crt', MASTER_SSL_KEY = '/disk/site/etc/ssl/hobby.nl/hobby.nl.key';
<pre>
start slave;
server-id              = 4
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2


master-host = 172.31.1.215
Nu moeten we controleren of de replicatie deze kant op loopt, dit doe je met het commando  
master-user = repl
mysql> show slave status\G
master-password = fxq5jLqWDYXYKhPD
*************************** 1. row ***************************
master-connect-retry = 60
                Slave_IO_State: Waiting for master to send event
log_bin                = /var/log/mysql/mysql-bin.log
                  Master_Host: mysql02-int.hobby.nl
expire_logs_days        = 10
                  Master_User: repl
max_binlog_size        = 100M
                  Master_Port: 3306
binlog_do_db            = bas
                Connect_Retry: 60
# lbtest mag nooit weg ivm loadbalancing test of mysql nog werkt!
              Master_Log_File: mysql-bin.000026
binlog_do_db            = lbtest
          Read_Master_Log_Pos: 72292974
binlog_do_db            = www-prod
                Relay_Log_File: mysql01-relay-bin.000056
binlog_do_db            = www-test
                Relay_Log_Pos: 72293189
binlog_do_db            = hcc-gebruikers
        Relay_Master_Log_File: mysql-bin.000026
binlog_do_db            = hcc-gebruikers-test
              '''Slave_IO_Running: Yes'''
binlog_ignore_db        = mysql
            '''Slave_SQL_Running: Yes'''
 
              Replicate_Do_DB:
</pre>
          Replicate_Ignore_DB: information_schema,mysql
 
            Replicate_Do_Table:
= database aan replicatie toevoegen =
        Replicate_Ignore_Table:
Op beide database servers moet in /etc/mysql/my.cnf het volgende regeltje worden toegevoegd
      Replicate_Wild_Do_Table:
<pre>
  Replicate_Wild_Ignore_Table:
binlog_do_db            = databasenaam
                    Last_Errno: 0
</pre>
                    Last_Error:
Hierna moet je op db01 en db02 mysql herstarten dit kan zonder probleem door de loadbalancing.<br>
                  Skip_Counter: 0
Hierna moet je op db01 en db02 de database aanmaken en user met bijbehorende rechten aanmaken.<br>
          Exec_Master_Log_Pos: 72292974
'''rechten worden niet gerepliceerd'''
              Relay_Log_Space: 72293447
 
              Until_Condition: None
= database uit replicatie verwijderen =
                Until_Log_File:
Op beide database servers moet in /etc/mysql/my.cnf het volgende regeltje worden verwijderd:
                Until_Log_Pos: 0
<pre>
            Master_SSL_Allowed: Yes
binlog_do_db            = databasenaam
            Master_SSL_CA_File: /disk/site/etc/ssl/hobby.nl/CA-bundel.crt
</pre>
            Master_SSL_CA_Path:
Hierna moet je op db01 en db02 mysql herstarten dit kan zonder probleem door de loadbalancing.<br>
              Master_SSL_Cert: /disk/site/etc/ssl/hobby.nl/hobby.nl.crt
Hierna moet je op db01 en db02 de database eventueel verwijderen en eventueel de user met bijbehorende rechten verwijderen/aanpassen.<br>
            Master_SSL_Cipher:
= herstel van replicatie =
                Master_SSL_Key: /disk/site/etc/ssl/hobby.nl/hobby.nl.key
== automatische ==
        Seconds_Behind_Master: 0
Als als goed gaat wordt nadat een server weer online komt hij weer helemaal upd2date gebracht.
Master_SSL_Verify_Server_Cert: No
== handmatig ==
                Last_IO_Errno: 0
Op het moment dat server niet automatische up2date wordt gebracht, moet dit handmatig gebeuren
                Last_IO_Error:
=== replicatie stop zetten ===
                Last_SQL_Errno: 0
Dan moet op beide server het commando "stop slave;" gegeven worden.<br>
                Last_SQL_Error:
De host die niet up2date is moet in de loadbalancer worden uitgeschakeld, indien mogelijk beide voorkomt fouten.
  Replicate_Ignore_Server_Ids:
=== replicatie herstellen ===
              Master_Server_Id: 2
==== voor de gefaalde host ====
                  Master_UUID: f0de239e-2c10-11eb-b1d1-005056a982be
Maak eerst backup van de gefaalde en goede host je weet maar nooit<br>
               Master_Info_File: mysql.slave_master_info
Hierna drop je alle databases die gerepliceerd worden '''dus niet MYSQL!!!!'''<br>
                    SQL_Delay: 0
Daar doe je eerst op de master een "show master status \g" op de goede host. De gegevens hier uit hebben we nodig om de replicatie naar de gefaalde host weer op gang te brengen 
          SQL_Remaining_Delay: NULL
<pre>
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
mysql> show master status \g
             Master_Retry_Count: 86400
+------------------+----------+-----------------------------------------------------------------+------------------+
                  Master_Bind:
| File            | Position | Binlog_Do_DB                                                    | Binlog_Ignore_DB |
      Last_IO_Error_Timestamp:
+------------------+----------+-----------------------------------------------------------------+------------------+
      Last_SQL_Error_Timestamp:
| mysql-bin.000012 |  4154828 | bas,lbtest,www-prod,www-test,hcc-gebruikers,hcc-gebruikers-test | mysql            |
                Master_SSL_Crl:
+------------------+----------+-----------------------------------------------------------------+------------------+
            Master_SSL_Crlpath:
1 row in set (0.00 sec)
            Retrieved_Gtid_Set:
</pre>
            Executed_Gtid_Set:
Hier moet de huidige stand van zaken overbrengen naar de gefaalde host dat doe je als volgt:
                 Auto_Position: 0
<pre>
           Replicate_Rewrite_DB:
mysqldump --all-databases | mysql -h hostgefaalt-int -u bas -pjegeheimewachtwoord
                  Channel_Name:
</pre>
             Master_TLS_Version:
Gebruik hier natuurlijk je mysql credentials met volledige rechten.<br>
         Master_public_key_path:
daarna login met mysql in op de gefaalde host en geef je volgende query in.<br>
        Get_master_public_key: 0
<pre>
            Network_Namespace:
CHANGE MASTER TO MASTER_HOST='IP goede DB server', MASTER_USER='repl', MASTER_PASSWORD='fxq5jLqWDYXYKhPD', MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4154828 ;
1 row in set, 1 warning (0.00 sec)
</pre>
Controleer of '''Slave_IO_Running''' en '''Slave_SQL_Running''' op yes staan.<br>
De master_log_file en _master_log_pos haal je op van de eerder gedaane show master status<br>
Als dit is het geval moeten we de replicatie naar de 1e server ook herstellen. Dit doe je door dezelfde stappen te herhalen vanaf 'show master status'
Hier na geef je het commando start slave;<br>
Hier na ga je met commando show slave status\G zien of alles weer loopt als goed is ziet er dan ongeveer zo uit.
<pre>
mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.31.1.214
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000023
          Read_Master_Log_Pos: 23081
              Relay_Log_File: db01-int-relay-bin.000135
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000023
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
          Replicate_Do_Table:
      Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                  Last_Errno: 0
                  Last_Error:
                Skip_Counter: 0
          Exec_Master_Log_Pos: 23081
              Relay_Log_Space: 554
              Until_Condition: None
              Until_Log_File:
                Until_Log_Pos: 0
          Master_SSL_Allowed: No
          Master_SSL_CA_File:
          Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
              Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
              Last_SQL_Errno : 0
              Last_SQL_Error:
1 row in set (0.00 sec)
</pre>
Het belangrijkste is dat dat state op Waiting for master to send event en de volgende beide op yes staan. (let op de state kan even duren voor dat hij deze status krijgt)
<pre>
          Slave_IO_State: Waiting for master to send event
          Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
</pre>
Nu kan de goede host weer worden bij geschakeld in de loadbalancer want hij stuurt zijn wijzigingen door naar de ander database server.<br>
Nu moet nog alleen replicatie van gefaalde host naar de goede host ook hersteld worden.
==== voor de goede host ====
Nu moeten we ook op de voormalig gefaalde host een  "show master status \g" doen. De gegevens van hier hebben we nodig om de replicatie naar de goede host weer op gang te brengen. ''' de waarde verschillen bijna elke keer als je het commando geeft'''
<pre>
mysql> show master status \g
+------------------+----------+-----------------------------------------------------------------+------------------+
| File            | Position | Binlog_Do_DB                                                    | Binlog_Ignore_DB |
+------------------+----------+-----------------------------------------------------------------+------------------+
| mysql-bin.000012 |  4154828 | bas,lbtest,www-prod,www-test,hcc-gebruikers,hcc-gebruikers-test | mysql            |
+------------------+----------+-----------------------------------------------------------------+------------------+
1 row in set (0.00 sec)
</pre>
Hier naar starten we op de goede host de replicatie weer op halen bij de voormalig gefaalde DB server.
<pre>
CHANGE MASTER TO MASTER_HOST='IP voormalig gefaalde DB server', MASTER_USER='repl', MASTER_PASSWORD='fxq5jLqWDYXYKhPD', MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4154828 ;
</pre>
De master_log_file en _master_log_pos haal je op van de eerder gedaane show master status<br>
Hier na geef je het commando start slave;<br>
Hier na ga je met commando show slave status\G zien of alles weer loopt als goed is ziet er dan ongeveer zo uit.
<pre>
mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.31.1.214
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
               Master_Log_File: mysql-bin.000023
          Read_Master_Log_Pos: 23081
              Relay_Log_File: db01-int-relay-bin.000135
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000023
            Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
          Replicate_Do_Table:
      Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                  Last_Errno: 0
                  Last_Error:
                 Skip_Counter: 0
           Exec_Master_Log_Pos: 23081
              Relay_Log_Space: 554
              Until_Condition: None
              Until_Log_File:
                Until_Log_Pos: 0
          Master_SSL_Allowed: No
          Master_SSL_CA_File:
          Master_SSL_CA_Path:
              Master_SSL_Cert:
             Master_SSL_Cipher:
              Master_SSL_Key:
         Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
              Last_SQL_Errno : 0
              Last_SQL_Error:
1 row in set (0.00 sec)
</pre>
Het belangrijkste is dat dat state op Waiting for master to send event en de volgende beide op yes staan. (let op de state kan even duren voor dat hij deze status krijgt)
<pre>
          Slave_IO_State: Waiting for master to send event
          Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
</pre>
Als ook dit in orde kan je ook deze host weer bijschakelen in de loadbalancer.
 
 
= links =
http://www.hbyconsultancy.com/blog/create-a-master-master-mysql-replication-ubuntu-server-10-04-x64.html de handleiding die ik gebruikt hebt in eerste instantie<br>
http://www.neocodesoftware.com/replication/ deze handleiding heb ik later gebruikt om het een en ander te verbeteren

Latest revision as of 12:15, 30 December 2020

doel

Om te zorgen dat onze database server ook volledig redundant is hebben we hier een cluster gemaakt, onze loadbalancer zorgt er voor dat verkeer of op db01 of op db02 terecht komt.

opzet

loadbalancing

Onze servers zijn opgezet in een master-master setup, dus er kan op beide gemuteerd worden, de loadbalancer verspreid de mutatie naar de andere server.
belangrijk
Op alle clusters moet database lbtest aanwezig zijn met tabel lbtest. Deze tabel moet minimaal 1 record hebben, hier test de loadbalancer namelijk op. De usernaam voor loadbalancer en nagios is lbtest met ww Testing123! deze gebruiker heeft alleen select rechten op deze database

database clusters

dbclus01-int

Dit cluster bestaat uit mysql01 en mysql02

hcc-dbclus02-int

Dit cluster bestaat uit mysql03 en mysql04

dbclus04-int

Dit cluster bestaat uit mysql05 en mysql06

dbclus05-int

Dit cluster bestaat uit mysql07 en mysql08

configuratie

configuratie files

al deze bestanden bevinden zich in /etc/mysql/mysql.conf.d

mysqld.cnf

In deze file hebben we 1 aanpassing gedaan we hebben

bind-address           = 127.0.0.1

voorzien van commentaar

ssl.cnf

Mysql beschikt over ssl daarom is dit ook geconfigureerd, onder andere de replicatie gebruikt het. De ssl.cnf file ziet er zo uit:

[mysqld]
ssl-ca=/disk/site/etc/ssl/hobby.nl/CA-bundel.crt
ssl-cert=/disk/site/etc/ssl/hobby.nl/hobby.nl.crt
ssl-key=/disk/site/etc/ssl/hobby.nl/hobby.nl.key

replicatie.cnf

Bij de replicatie is het belangrijk dat de oneven servers het server id 1 hebben en de even server id 2. Er mogen nooit 2 de zelfde id's zijn. Ook is de waarde van auto-increment-offset belangrijk; bij de oneven server is dat 1 en bij even 2.

Voor oneven server ziet hij er zo uit:

#sql mode uit voor toestaan lege velden
sql-mode                        =       ""
server-id                       =       1
replicate-same-server-id        =       0
auto-increment-increment        =       2
auto-increment-offset           =       1
relay-log                       =       mysql01-relay-bin
binlog_format                   =       "STATEMENT"
replicate-ignore-db             =       information_schema
replicate-ignore-db             =       mysql
binlog-ignore-db                =       information_schema
binlog-ignore-db                =       mysql
log_bin                         =       /var/log/mysql/mysql-bin.log
slave-skip-errors = 1062

credentials.cnf

Op de server is root voor localhost voorzien van een wachtwoord om toch mysqldump en het mysql commando te kunnen gebruiken. De eigenaar van deze file is root:mysql met permissies 640.

tunning.cnf

Deze file bevat performance tuning. Dit is server specifiek, maar er moet in ieder geval deze regel in staan :

[mysqld]
skip-name-resolve    =       1

starten/herstellen replicatie

herstel

Bij herstellen moet je op beide servers de volgende sql commando's uitvoeren:

stop slave;
reset slave;

Op de defecte server verwijder je vervolgens alle databases nadat je eerst een backup hebt gemaakt

start replicatie

Zorg er voor dat de database niet meer benaderd/gemuteerd wordt. Zet hem uit in de loadbalancer, zowel voor IPv4 als voor IPv6
Haal bij de goede server de log positie op:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000057
         Position: 71061044
     Binlog_Do_DB:
 Binlog_Ignore_DB: information_schema,mysql
Executed_Gtid_Set:
1 row in set (0.00 sec)

Noteer de file en position
maak mysqldump en pipe die naar de gefaalde server

 mysqldump --all-databases |mysql -h mysql0*-int -u jegebruikersnaam -p

Vul je wachtwoord in en de database wordt gedump naar de ander server (dit kan effe duren).

Op de andere server log je nu in en geef je het volgende commando's in mysql, vul dan het password in van repl user en position bij master_log_pos en de file bij master_log_file

CHANGE MASTER TO MASTER_HOST='mysql0*-int.hobby.nl', MASTER_USER='repl', MASTER_PASSWORD='******', MASTER_LOG_FILE='mysql-bin.000057', MASTER_LOG_POS=71061044, MASTER_SSL = 1, MASTER_SSL_CA = '/disk/site/etc/ssl/hobby.nl/CA-bundel.crt', MASTER_SSL_CERT = '/disk/site/etc/ssl/hobby.nl/hobby.nl.crt', MASTER_SSL_KEY = '/disk/site/etc/ssl/hobby.nl/hobby.nl.key';
start slave;

Nu moeten we controleren of de replicatie deze kant op loopt, dit doe je met het commando

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql02-int.hobby.nl
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000026
          Read_Master_Log_Pos: 72292974
               Relay_Log_File: mysql01-relay-bin.000056
                Relay_Log_Pos: 72293189
        Relay_Master_Log_File: mysql-bin.000026
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB: information_schema,mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 72292974
              Relay_Log_Space: 72293447
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /disk/site/etc/ssl/hobby.nl/CA-bundel.crt
           Master_SSL_CA_Path:
              Master_SSL_Cert: /disk/site/etc/ssl/hobby.nl/hobby.nl.crt
            Master_SSL_Cipher:
               Master_SSL_Key: /disk/site/etc/ssl/hobby.nl/hobby.nl.key
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2
                  Master_UUID: f0de239e-2c10-11eb-b1d1-005056a982be
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set, 1 warning (0.00 sec)

Controleer of Slave_IO_Running en Slave_SQL_Running op yes staan.
Als dit is het geval moeten we de replicatie naar de 1e server ook herstellen. Dit doe je door dezelfde stappen te herhalen vanaf 'show master status'