|
|
Line 10: |
Line 10: |
| == hcc-dbclus02-int == | | == hcc-dbclus02-int == |
| == dbclus04-int == | | == dbclus04-int == |
| | | =configuratie = |
| = database aan replicatie toevoegen = | | == configuratie files == |
| * maak zo nodig de database user aan op '''beide database servers'''
| | === ssl.cnf === |
| * ken rechten toe op '''beide database servers'''
| | === replicatie.cnf === |
| | | === credentials.cnf === |
| LET OP: ''de gebruiker en de rechten worden niet gerepliceerd, die moeten dus echt zoals hier beschreven '''dubbel''' worden aangemaakt!''
| | === tuning.cnf === |
| | | == herstellen replicatie == |
| = database uit replicatie verwijderen = | |
| * verwijder database op 1 van beide database servers
| |
| * verwijder zo nodig bij behorende user op '''beide database servers'''
| |
| | |
| = status replicatie bekijken =
| |
| == goede status ==
| |
| Een goede status ziet er als volgt 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>
| |
| Zowel Slave_IO_Running als Slave_SQL_Running staan op 'yes', en Slave_IO_State staat op 'Waiting for master to send event'
| |
| | |
| == foute status ==
| |
| Zo ziet een foute status er uit.
| |
| <pre>
| |
| mysql> show slave status\G
| |
| *************************** 1. row ***************************
| |
| Slave_IO_State: Reconnecting after a failed master event read
| |
| 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.000136
| |
| Relay_Log_Pos: 251
| |
| Relay_Master_Log_File: mysql-bin.000023
| |
| Slave_IO_Running: No
| |
| 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: NULL
| |
| Master_SSL_Verify_Server_Cert: No
| |
| Last_IO_Errno: 2013
| |
| Last_IO_Error: error reconnecting to master 'repl@172.31.1.214:3306' - retry-time: 60 retries: 86400
| |
| Last_SQL_Errno: 0
| |
| Last_SQL_Error:
| |
| 1 row in set (0.00 sec)
| |
| </pre>
| |
| zoals je kan zien staat Slave_IO_Running op 'No' en staat er een melding bij Last_IO_Error. In dit geval staat de ander db server gewoon uit voor bijvoorbeeld een OS update. Dit probleem zal zich daarom vanzelf weer herstellen.
| |
| | |
| = herstel van replicatie = | |
| == automatisch == | |
| Als als goed gaat wordt nadat een server weer online komt hij weer helemaal upd2date gebracht.
| |
| == handmatig == | |
| Op het moment dat een server niet automatisch up2date wordt gebracht, moet dit handmatig gebeuren.
| |
| === replicatie stop zetten === | |
| Dan moet op beide server het commando "stop slave;" gegeven worden.<br>
| |
| De host die niet up2date is moet in de loadbalancer worden uitgeschakeld, indien mogelijk beide servers, dat voorkomt fouten.
| |
| Zolang directe toegang tot de servers mogelijk is (load-banlancer probleem) moet de firewall even aangepast worden.
| |
| | |
| === replicatie herstellen ===
| |
| ==== voor de gefaalde host ==== | |
| Maak eerst backup van de gefaalde en goede host je weet maar nooit.<br>
| |
| Hierna drop je alle databases die gerepliceerd worden. '''dus niet MYSQL!!!!'''<br>
| |
| Daar doe je eerst op de master een "show master status \g" op de goede host. De gegevens hieruit hebben we nodig om de replicatie naar de gefaalde host weer op gang te brengen.
| |
| <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 moet de huidige stand van zaken overbrengen naar de gefaalde host dat doe je als volgt:
| |
| <pre>
| |
| mysqldump --all-databases | mysql -h hostgefaald-int -u bas -pjegeheimewachtwoord
| |
| </pre>
| |
| Gebruik hier natuurlijk je mysql credentials met volledige rechten.<br>
| |
| daarna login met mysql in op de gefaalde host en geef je volgende query in.<br>
| |
| <pre>
| |
| CHANGE MASTER TO MASTER_HOST='IP goede DB server', MASTER_USER='repl', MASTER_PASSWORD='*******', 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 gedane 'show master status'<br>
| |
| Hierna geef je het commando 'start slave;'<br>
| |
| Hierna ga je het commando 'show slave status\G' om te zien of alles weer loopt, als het goed is ziet het 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 voordat 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 bijgeschakeld in de loadbalancer, want hij stuurt zijn wijzigingen door naar de ander database server.<br>
| |
| Nu moet nog alleen de replicatie van de gefaalde host naar de goede host ook hersteld worden. Op het inlezen van e database na is dit het zelfde concept. Denk eraan het IP adres in de CHANGE_MASTER goed te zetten!
| |
| | |
| ==== 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>
| |
| Hierna starten we op de goede host de replicatie weer op halen bij de voormalig gefaalde DB server.
| |
| ''(??wat wordt hier bedoeld??)''
| |
| | |
| <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 gedane 'show master status'<br>
| |
| Hierna geef je het commando 'start slave;'<br>
| |
| Hierna kan je met het commando 'show slave status\G' zien of alles weer loopt, als het 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 is kan je ook deze host weer bijschakelen in de loadbalancer.
| |
| | |
| = maximaal aantal connecties = | |
| Op db01 en db02 berperken we het aantal connecties per gebruiker omdat nog wat gebruikers heel veel connecties blijven open en daar door de mysql server voor iedereen onbereikbaar maken.
| |
| Daarnaast is er ook ingesteld, dat als 180 seconden connectie niks doet hij getermineerd wordt.
| |
| | |
| De config die voor nodig is:
| |
| <pre>
| |
| #maximaal aantal connecties en hum time out waarde
| |
| max_connections = 1000
| |
| interactive_timeout = 180
| |
| wait_timeout = 180
| |
| </pre>
| |
| = offset =
| |
| Om te zorgen dat er tijdens de replicatie geen dubbele key's ontstaan (omdat beide server theoretisch precies tegelijk een mutatie kunnen uitvoeren) zit er een offset ingebouwd.<br>
| |
| Dit houdt in dat db01-int alle '''oneven''' nrs gebruikt en db02-int alle '''even''' nrs voor auto increment.
| |
| Db01 begint bij 1 en volgende 3 etcetera
| |
| Db02 begint bij 2 en volgende 4 etcetera
| |
| | |
| | |
| = Betekenis van de mysql-bin bestanden = | |
| De bin log files zijn nodig voor replicatie en juist als er een down is geweest voor controle.
| |
| | |
| En dat de aantallen per server afwijken dat kan heel goed, het gaat er om hoeveel mutaties er op 1 server zijn uit gevoerd, dus het aantal kan en zal verschillen per server.
| |
| | |
| Het aantal bestanden wordt zelf door mysql gereguleerd en hangt vanaf van het aantal en grootte mutaties.
| |
| Log files ouder dan 10 dagen worden verwijderd.
| |
| | |
| Zeker als er veel Joomla updates zijn geweest en die zijn tegen 1 server aangehouden bijvoorbeeld op 22 october dan zullen daar veel meer en grote logs zijn.
| |
| | |
| root@mail-lb1:/var/log/mysql# ls -l | grep bin
| |
| -rw-r----- 1 mysql mysql 1180363 Oct 17 06:25 mysql-bin.000811
| |
| -rw-r----- 1 mysql mysql 1548726 Oct 18 06:25 mysql-bin.000812
| |
| -rw-r----- 1 mysql mysql 147778 Oct 18 17:59 mysql-bin.000813
| |
| -rw-r----- 1 mysql mysql 1045 Oct 18 18:11 mysql-bin.000814
| |
| | |
| = links =
| |
| http://www.hbyconsultancy.com/blog/create-a-master-master-mysql-replication-ubuntu-server-10-04-x64.html de handleiding die ik gebruikt heb in eerste instantie<br>
| |
| http://www.neocodesoftware.com/replication/ deze handleiding heb ik later gebruikt om het een en ander te verbeteren
| |