Erinevus lehekülje "Mysql Replication" redaktsioonide vahel

Allikas: Kuutõrvaja
 
(ei näidata sama kasutaja 35 vahepealset redaktsiooni)
1. rida: 1. rida:
Antud pala räägib mysql'i ühest serverist teise replikeerimisest
+
===Sissejuhatus===
näiteks failover puhuks kui master server katki
 
  
installime mõlemasse serverisse mysql'i
+
TODO
  
oletame ,et esimene server on 192.168.1.1 ja teine 192.168.1.2
+
===Master to Slave replikeerimine===
  
 +
Replikeerime ühe töötava mysql serveri sisu teise
  
Serveripoolne seadistus on väga lihtne
+
Esimene '''master''' sever 192.168.1.1
  
 +
ja teine '''backup''' 192.168.1.2
  
===Master conf===
+
====Master serveri conf====
  
 
my.cnf
 
my.cnf
22. rida: 23. rida:
 
loome master serverile replikeerimiseks vajaliku kasutaja
 
loome master serverile replikeerimiseks vajaliku kasutaja
  
mysql> GRANT REPLICATION SLAVE, SUPER, RELOAD, SELECT ON *.* TO 'user_name'@'192.168.1.2' IDENTIFIED BY 'parool';
+
mysql> GRANT REPLICATION SLAVE, SUPER, RELOAD, SELECT ON *.* TO 'user_name'@'192.168.1.2' IDENTIFIED BY 'parool';
 
 
 
 
 
 
replikatsioon siiski veel ei toimi
 
 
 
  
 
logime mysql'i
 
logime mysql'i
  
 +
mysql> FLUSH TABLES WITH READ LOCK;
 
  mysql> show master status;
 
  mysql> show master status;
 
  +----------------+----------+--------------+------------------+
 
  +----------------+----------+--------------+------------------+
39. rida: 36. rida:
 
  1 row in set (0.00 sec)
 
  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;
  
jätame mällu ServerA.000024 ja 136208
+
====Slave serveri konf====
  
===Backup 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
 
teeme mysql'is sellise käsu
  
mysql> change master to master_host='192.168.1.1',
+
mysql> change master to  
  ->    master_user='user_name',
 
  ->    master_password='parool',
 
 
   ->    master_log_file='ServerA.000024',
 
   ->    master_log_file='ServerA.000024',
 
   ->    master_log_pos=136208;  
 
   ->    master_log_pos=136208;  
58. rida: 69. rida:
  
 
kui replikatsioon peaks mingil juhul katkema saab seda uuesti startida käsuga
 
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;  
 
  mysql> change master to master_log_file='ServerA.000024', master_log_pos=136208;  
  
logi nimi ja pos tuleb eelnevalt taas masterist vaadata
+
logi nimi ja pos tuleb taaskord masterist vaadata
 
 
  
 
kontrollime backupis kas ühendus on saavutatud kahe serveri vahel
 
kontrollime backupis kas ühendus on saavutatud kahe serveri vahel
 
  
 
  mysql> SHOW SLAVE STATUS \G
 
  mysql> SHOW SLAVE STATUS \G
106. rida: 114. rida:
  
  
rida Slave_IO_State: Waiting for master to send event
+
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
 
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
 +
 +
[[Pilt:Circular 2nodes.jpg.png]]
 +
 +
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
 +
 +
http://maatkit.sourceforge.net/
 +
 +
* http://code.google.com/p/php-mysql-master-slave-replication-monitor/wiki/InstallationAndStandardUseCase
 +
 +
* http://exchange.nagios.org/directory/Plugins/Databases/MySQL/check_mysql-2Dreplication-2Epl/details
 +
 +
* http://blog.secaserver.com/2011/06/the-best-way-to-setup-mysq-replication/

Viimane redaktsioon: 24. aprill 2012, kell 13:54

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

Circular 2nodes.jpg.png

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

http://maatkit.sourceforge.net/