| | 1 | |
| | 2 | == **Складирање и репликација** |
| | 3 | === **Логичка репликација** |
| | 4 | \\ |
| | 5 | Логичка репликација претставува процес на репродуцирање на податоците помеѓу повеќе јазли (инстанци) на база на податоци, при што промените направени на изворниот сервер се запишуваат во бинарни логови и потоа се репродуцираат на реплика-серверите.\\Во пракса, тоа претставува копирање на INSERT, UPDATE, DELETE и DDL операции од еден сервер кон друг, а не директно копирање на физичките датотеки.\\ |
| | 6 | Овој метод овозможува систем отпорен на грешки (fault tolerant), бидејќи секоја промена што се случува на примарната база се пресликува и на репликите.\\ |
| | 7 | Дополнително, може да се користи за load-balancing - операции за читање се насочуваат кон реплика-инстанците, а write-операциите кон примарниот сервер,\\ |
| | 8 | \\ |
| | 9 | |
| | 10 | ---- |
| | 11 | |
| | 12 | === **Подесување на MySQL GTID-базирана репликација со Docker** |
| | 13 | Во овој чекор ќе конфигурираме **GTID(Global Transaction Identifier)**-базирана логичка репликација во MySQL, користејќи две Docker инстанци - **source и replica.**\\ |
| | 14 | Секоја трансакција што се извршува во Source серверот добива GTID, кој обезбедува прецизно и автоматско следење и примена на промените во Replica.\\ |
| | 15 | Во MySQL се користат бинарни log датотеки (binlog files) за да се запише секоја промена врз базата - **INSERT, UPDATE, DELETE и DDL**.\\ |
| | 16 | // |
| | 17 | GTID структурата се гледа преку binlog, пример:\\ |
| | 18 | |
| | 19 | {{{ |
| | 20 | |
| | 21 | SET @@SESSION.GTID_NEXT='4e89b248–2c8e-11ed-af3b-020017000790:1'; |
| | 22 | |
| | 23 | }}} |
| | 24 | \\ |
| | 25 | Со **GTID** можеме да го користиме **AUTO_POSITION = 1**, што значи:\\ |
| | 26 | > replica сама знае која трансакција ѝ недостига\\ |
| | 27 | > не следиме BINLOG позиции рачно\\ |
| | 28 | > можеме да рестартираме replica без губење на sync\\ |
| | 29 | \\ |
| | 30 | |
| | 31 | ---- |
| | 32 | |
| | 33 | ==**Конфигурација на Source и Replica Docker инстанци** |
| | 34 | Се одлучивме за конфигурација преку Docker затоа што добиваме изолирана и лесно пренослива средина, каде секоја MySQL инстанца е одвоена, конфигурирана со сопствени параметри и може да се стартува, стопира или реконфигурира без да влијае на остатокот од системот.\\ |
| | 35 | ===**Конфигурирање replica user** |
| | 36 | |
| | 37 | {{{ |
| | 38 | |
| | 39 | CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpass'; |
| | 40 | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; |
| | 41 | FLUSH PRIVILEGES; |
| | 42 | |
| | 43 | }}} |
| | 44 | |
| | 45 | Овој корисник е потребен за да се воспостави безбедна комуникација меѓу двата сервери. Привилегијата **REPLICATION SLAVE** дозволува читање на bin-log записите и нивно пренесување кон репликата, без да се доделуваат пошироки непотребни администраторски права.\\ |
| | 46 | \\ |
| | 47 | Во replica ја поставуваме врската кон изворниот MySQL инстанцa со следната команда:\\ |
| | 48 | |
| | 49 | {{{ |
| | 50 | |
| | 51 | CHANGE REPLICATION SOURCE TO |
| | 52 | SOURCE_HOST = 'mysql_source', |
| | 53 | SOURCE_PORT = 3306, |
| | 54 | SOURCE_USER = 'repl', |
| | 55 | SOURCE_PASSWORD = 'replpass', |
| | 56 | SOURCE_AUTO_POSITION = 1; |
| | 57 | |
| | 58 | START REPLICA; |
| | 59 | |
| | 60 | }}} |
| | 61 | |
| | 62 | SQL-конфигурацијата ја одвоивме во посебни .sql фајлови кои автоматски се извршуваат преку docker-entrypoint, затоа што:\\ |
| | 63 | > конфигурацијата станува репродуцибилна и повторно извршлива\\ |
| | 64 | > setup-от на репликација е целосно автоматизиран (без рачно внесување команди)\\ |
| | 65 | > ако се создадат контејнерите повторно, MySQL сам ќе ја примени истата конфигурација без дополнителна интервенција\\ |
| | 66 | > документацијата, миграцијата и version-control стануваат чисти и управливи\\ |
| | 67 | \\ |
| | 68 | ===Некои конфигурациски параметри за MySQL GTID-базирана репликација |
| | 69 | [[Image(mysql-parameters.png)]] |
| | 70 | |
| | 71 | За подигнување на GTID-базирана репликација, користиме docker-compose.yml во кој дефинираме две MySQL инстанци:\\ |
| | 72 | >**source** → примарен сервер (прифаќа WRITE операции)\\ |
| | 73 | >**replica** → сервер кој ги реплицира состојбите од source (READ-only)\\ |
| | 74 | |
| | 75 | |
| | 76 | |
| | 77 | |