Mysql Replication
Sisukord
Sissejuhatus
TODO
Master to Slave replikeerimine
Replikeerime ühe töötava mysql serveri sisu teise
Esimene master sever 192.168.1.1
ja teine backup 192.168.1.2
Master serveri conf
my.cnf
[mysqld] log-bin = ServerA.bin.log server-id = 1
ja kõik. Stardime serverid
loome master serverile replikeerimiseks vajaliku kasutaja
mysql> GRANT REPLICATION SLAVE, SUPER, RELOAD, SELECT ON *.* TO 'user_name'@'192.168.1.2' IDENTIFIED BY 'parool';
logime mysql'i
mysql> FLUSH TABLES WITH READ LOCK; mysql> show master status; +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | ServerA.000024 | 136208 | | | +----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
jätame meelde ServerA.000024 ja 136208
# mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql # scp snapshot.sql root@192.168.0.101:/tmp
Seejärel:
> UNLOCK TABLES; > quit;
Slave serveri konf
# /usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave
# mysql -u root -p my_database </home/my_home_dir/database.sql
server-id=2 master-host=192.168.0.100 master-user=slave_user master-password=secret master-connect-retry=60
teeme mysql'is sellise käsu
mysql> change master to -> master_log_file='ServerA.000024', -> master_log_pos=136208;
ja stardime replikatsiooni
mysql> slave start;
kui replikatsioon peaks mingil juhul katkema saab seda uuesti startida käsuga
mysql> change master to master_log_file='ServerA.000024', master_log_pos=136208;
logi nimi ja pos tuleb taaskord masterist vaadata
kontrollime backupis kas ühendus on saavutatud kahe serveri vahel
mysql> SHOW SLAVE STATUS \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.2 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: ServerA.000024 Read_Master_Log_Pos: 136396 Relay_Log_File: -relay-bin.000012 Relay_Log_Pos: 136531 Relay_Master_Log_File: ServerA.000024 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: 136396 Relay_Log_Space: 136531 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 1 row in set (0.00 sec)
rida Slave_IO_State: Waiting for master to send event
näitab ,et kõik on läinud nagu vaja ja slave ootab master'ilt infot
Multimaster replikatsioon
Vajalik oleks samas sageli ,et replikatsioon toimuks automaatselt mõlemas suunas. Nii ,et muudatusi saaks teha mõlemas serveris baasi.
Serverid 192.168.1.1 ja 192.168.1.2 On siin näites mõlemad nii master kui slave rollis
Esimene server 192.168.1.1 my.cnf
[mysqld] server-id = 10 auto_increment_increment = 10 auto_increment_offset = 1 master-host = 192.168.1.1 master-user = kasutaja master-password = parool log-bin = mysql-bin relay-log = relay-log relay-log-index=relay-log-index
Mysql käsureal lubame mysql ligipääsu serveril 192.168.1.2
GRANT REPLICATION SLAVE, SUPER, RELOAD, SELECT ON *.* TO 'user_name'@'192.168.1.2' IDENTIFIED BY 'parool';
masin 192.168.1.2 my.cnf
[mysqld] server-id = 20 auto_increment_increment = 10 auto_increment_offset = 2 master-host = 192.168.1.2 master-user = kasutaja master-password = parool log-bin = mysql-bin relay-log = relay-log relay-log-index=relay-log-index
Mysql käsureal lubame ligipääsu serveril 192.168.1.1
GRANT REPLICATION SLAVE, SUPER, RELOAD, SELECT ON *.* TO 'user_name'@'192.168.1.1' IDENTIFIED BY 'parool';
read
auto_increment_increment = 10 auto_increment_offset = 1
ja
auto_increment_increment = 10 auto_increment_offset = 2
Vaikimisi replikeeritakse kõiki andmebaase. Kui vaja ainult ühte või mitut kindlat võib kirjutada my.cnf'i
replicate-do-db=test replicate-do-db=proov
Või kui on soov mitte replikeerida mõnd baasi siis lisada
replicate-ignore-db=test
Probleemidega tegelemine
On vajalikud selleks ,et kui masinate replikeerimine on mingil põhjusel katkenud ei tekiks duplicated key'sid kuna mõlemad serverid üritavad üksteist replikeerida näiteks peale vahepeal toimunud võrgukatkestus täpselt sarnaseks.
Juhul kui replikeerimine on seiskunud või ei toimi tasub proovida
mysql data kaustas kustutada failid master.info ja relay-log.info milledes säilitatakse infot replikeerimise hetkeseisu. Master log nime ja positsiooni kohta ning seejärel restartida mysql deemon
testimine
192.168.1.1
mysql> CREATE DATABASE test;
192.168.1.2
mysql> show databases; +--------------------+ | Database | +--------------------+ | test | +--------------------+ 1 rows in set (0.00 sec)
Ja seejärel võib ka teises masinate järjekorras korrata katset.
Selleks ,et katkist replikeerimist parandada on tarkvara