Det forudsættes at du har installeret MariaDB på både master og slave, ellers følg denne vejledning først:
Konfiguration af master
Konfigurer /etc/mysql/my.cnf på master.
1 2 3 4 5 6 7 8 9 10 11 |
server-id = 1 bind-address = 10.0.0.51 log_bin = /var/log/mysql/mariadb-bin max_binlog_size = 100M performance_schema = on skip-name-resolve = 1 binlog-ignore-db=mysql binlog-ignore-db=replication binlog-ignore-db=phpmyadmin binlog-ignore-db=information_schema binlog-ignore-db=performance_schema |
bind-address
bestemmer hvilket interface din master lytter på og det skal naturligvis være et din slave kan kommunikere med, og 127.0.0.1 du’r derfor ikke 😉
Din slave henter data fra de binære logs, og derfor bør du med binlog-ignore-db
ekskludere alle de databaser der IKKE skal replikeres. Man kan også gøre det modsatte, nemlig bruge binlog-do-db
til at angive de databaser der skal inkluderes… eller bruge en kombination. Jeg bruger kun binlog-ignore-db
for at sikre at eventuelle nye databaser der oprettes, automatisk bliver en del af replikeringen. Men det er en smagssag.
Genstart MariaDB:
1 |
$ sudo systemctl restart mysql |
Nu kan du indlæse data fra en evt. tidligere database server:
1 |
$ mysql -u root -p < mysqldump_data.sql |
… og oprette eventuelle tidligere brugere:
1 |
$ mysql -u root -p < mysqldump_grants.sql |
Forbind til MariaDB og opret en bruger til din slave. Erstat ‘10.0.0.49’ med IP adressen på din slave og ‘adgangskode’ med noget andet. Bemærk: Hvis du ønsker at bruge et hostnavn i stedet for IP skal du fjerne skip-name-resolve
i my.cnf og genstarte MariaDB.
1 2 3 4 5 6 7 8 9 10 |
$ mysql -u root -p MariaDB> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'10.0.0.49' IDENTIFIED BY 'adgangskode'; MariaDB> FLUSH PRIVILEGES; MariaDB> SHOW MASTER STATUS; +--------------------+----------+--------------+-------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+-------------------------+ | mariadb-bin.000012 | 242793 | | | mysql,replication [...] | +--------------------+----------+--------------+-------------------------+ |
SHOW MASTER STATUS
viser den aktuelle position i den binære log, dvs. det punkt hvorfra slaven skal starte med replikering. Disse oplysninger skal du derfor lige notere dig, da de skal bruges senere.
Fra dette øjeblik, bør du sikre dig at der ikke er noget der forbinder til din database og foretager ændringer i struktur eller data.
Nu er din master sådan set klar. Du mangler bare lige at lave et dump af data, som skal indlæses på slaven. :
1 |
$ mysqldump -u bruger -pkode -h hostnavn --lock-all-tables --skip-triggers --routines --databases db1 db2 db3 > mysqldump_data.sql |
En vigtig parameter her er --skip-triggers
. De ændringer triggers måtte foretage på masteren, havner nemlig også i masterens binære logs og afvikles dermed også på din slave. Hvis dine triggers også oprettes på slaven, bliver disse ændringer således afviklet 2 gange, med de fejl det må afstedkomme.
Konfiguration af slave
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[mysqld] server_id=2 bind-address=10.0.0.49 report_host = 10.0.0.49 # Skip duplicate entry errors, since they will stop the slave # You can skip more errors by commaseparating them. slave-skip-errors = 1032,1062,1146 # Ignore tables with temporary data that we do not need to backup replicate-ignore-table=database1.MassMail replicate-ignore-table=database1.mail_queue #Only users with SUPER privilege can write data read_only = 1 |
Genstart:
1 |
$ sudo systemctl restart mysql |
Indlæs data fra masteren:
1 |
mysql -u root -p < mysqldump_data.sql |
Opret bruger:
1 |
MariaDB> GRANT ALL PRIVILEGES ON *.* TO 'replicator'@'10.0.0.49' IDENTIFIED BY 'adgangskode'; |
Konfigurer den til at køre som slave:
MASTER_HOST
er ip adressen på din master. MASTER_LOG_FILE
og MASTER_LOG_POS
er værdierne fra den SHOW MASTER STATUS
forespørgsel vi kørte på masteren tidligere:
1 2 3 4 5 6 7 8 9 |
MariaDB> CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_USER='replicator', MASTER_PASSWORD='adgangskode', MASTER_PORT=3306, MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=314, MASTER_CONNECT_RETRY=10, MASTER_USE_GTID=slave_pos; |
Nu kan du starte slaven:
1 2 3 |
MariaDB> START SLAVE; MariaDB> SHOW SLAVE STATUS\G; Slave_IO_State: Waiting for master to send event |
Den første linie i status for slaven, skulle gerne vise at den venter på events fra masteren, som det ses herover.
Hvis du nogensinde skal genstarte slave-databasen eller hele slave serveren, så gør som følger:
1 2 |
MariaDB> STOP SLAVE; MariaDB> FLUSH TABLES; |
Genstart nu server eller database og derefter:
1 |
MariaDB> START SLAVE; |
Du kan bruge din slave til tunge forespørgsler, backup og ting generelt der ikke skal forstyrre de applikationer der kører på masteren. Du kan også lade alle “SELECT” statements gå til slaven og alt andet gå til masteren, men da bør du overveje at konfigurere din slave som read-only.
BEMÆRK: Replikering er ikke noget man sætter op, og så kører det bare. Det kræver overvågning og vedligeholdelse. Jeg har et script der jævnligt tjekker om alt er som det skal være, og hvis ikke, får jeg en notifikation. Derudover har jeg et job der jævnligt tjekker data, og fikser det hvis slaven mangler data. Dette er helt essentielt hvis din slave er backup.
Videre læsning: