Multimaster replikation er når en eller flere database servere er koblet sammen og ændringer på en vilkårlig maskine effektueres på samtlige. Metoden beskrevet i dette indlæg er basseret på en tredieparts patch til MySQL og jeg vil demonstrere hvordan man laver det simplest mulige setup, nemlig et setup hvor vi kun benytter to servere.
Først starter jeg med mine to nyinstallerede maskiner lab1.mikjaer.com og lab2.mikjaer.com og installere lidt software på dem begge:
wget https://launchpad.net/codership-mysql/0.8/0.8.2/+download/mysql-server-wsrep-5.1.57-0.8.2-amd64.deb wget https://code.launchpad.net/galera/0.8/0.8.2/+download/galera-0.8.2-amd64.deb apt-get -y install libdbi-perl libdbd-mysql-perl mysql-client-5.1 libmysqlclient16 mysql-common libplrpc-perl libnet-daemon-perl vim dpkg -i galera-0.8.2-amd64.deb mysql-server-wsrep-5.1.57-0.8.2-amd64.deb
Derefter starter vi begge MySQL servere og laver nogle basale adgangsindstillinger før vi starter replikatoren:
/etc/init.d/mysql start /usr/bin/mysql_secure_installation mysql -pPASSWORD -e "SET wsrep_on = OFF; grant all on *.* to 'root'@'%' identified by 'PASSWORD';" /etc/init.d/mysql stop
Efter kommando nr 2 bliver du guidet igennem MySQL opsætningen, husk og vælg et sikkert password, brug det samme på begge maskiner og anvend samme pasword i kommando nr 3 istedet for de to steder hvor der står PASSWORD.
Nu skal vi ha MySQL til at lytte på internettet efter indkomne forbindelser, rediger /etc/mysql/my.cnf og kommenter flg. linie ud (det betyder at sætte et #-mærke i starten af linie):
bind-address = 127.0.0.1
Du kan evt. teste forbindelsen, du skal fra en prompt på lab1 kunne forbinde til lab2 og vica versa:
root@lab1:~# mysql -pPASSWORD -h lab2.mikjaer.com -e "select 5+5\G" *************************** 1. row *************************** 5+5: 10 root@lab2:~# mysql -pPASSWORD -h lab1.mikjaer.com -e "select 5+5\G" *************************** 1. row *************************** 5+5: 10
Som du kan se virkede det udemærket, og vi kan nu gå videre med at sætte replikering op, stop mysql på begge servere:
root@lab1:~# /etc/init.d/mysql stop root@lab2:~# /etc/init.d/mysql stop
Derefter redigerer du /etc/mysql/conf.d/wsrep.cnf og sætter flg. værdier ind de rigtige steder (de er spredt lidt ned igennem filen)
wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_sst_auth=root:PASSWORD
og på den første server(lab1), i samme fil:
wsrep_cluster_address="gcomm://"
og på den anden(lab2):
wsrep_cluster_address="gcomm://192.168.0.10"
Her er det selvfølgelig lab1’s ip adresse jeg har brugt, slutteligt starter jeg begge servere igen:
root@lab1:~# /etc/init.d/mysql start Starting MySQL database server: mysqld. root@lab2:~# /etc/init.d/mysql start Starting MySQL database server: mysqld.
Herefter skulle replikering gerne køre, her er testen fra mit test-setup:
root@lab1:~# mysql -pPASSWORD -e "show databases"; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | +--------------------+ root@lab2:~# mysql -pPASSWORD -e "create database foobar;"; root@lab1:~# mysql -pPASSWORD -e "show databases"; +--------------------+ | Database | +--------------------+ | information_schema | | foobar | | mysql | +--------------------+ root@lab1:~# mysql -pPASSWORD -e "create database foobar2;"; root@lab2:~# mysql -pPASSWORD -e "show databases"; +--------------------+ | Database | +--------------------+ | information_schema | | foobar | | foobar2 | | mysql | +--------------------+
Et klassisk “ingen-ting-her-ingen-ting-der-scenario” 😉
Håber i kan bruge det … og hvis i overvejer at smide det i produktion så læs lige manualen først 🙂