master slave replication

master slave replication master slave replication
И так у нас есть 2 сервера:
1
2
51.254.225.149 # master
51.254.225.155 # slave
В идеале на обеих серверах у вас уже должен быть настроен веб-сервер (nginx + apache к примеру), mysql, phpmyadmin У меня все это есть, я для теста перенес на 2 эти сервера свой сайт, создал одинаковые БД, одинаковые пользователи БД и пароли. Теперь переходим к настройке master slave репликации:

на сервере master

Заходим в конфиг mysql:
1
vi /etc/my.cnf
Добавляем следующие строки:
1
2
3
4
5
6
7
log-bin             = /var/log/mysql/mysql-bin.log
binlog_format       = mixed
binlog-do-db        = admin_db
max_binlog_size     = 100M
expire_logs_days    = 30
sync_binlog         = 1
server-id           = 1
Создадим папочку для лог-файлика Mysql.
1
2
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
Перегружаем mysql-server на master:
1
/etc/init.d/mysqld restart
Потом заходим под рутом в консоль mysql и выполняем действия из листинга ниже:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@master:~# mysql -p
password:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_pass';
mysql> FLUSH PRIVILEGES;
mysql> use admin_db;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |    334   | admin_db         |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql> quit
Тут важно запомнить/сохранить/скопировать имя bin-файла и позицию, в моем случае:
— файл mysql-bin.000002
— позиция 334
На слейве эти данные необходимо ввести чтобы mysql знал откуда начинать репликацию.
Создаем дамп базы которую хотим реплицировать:
1
mysqldump -u root -p --opt admin_db > admin_db.sql
Опять идем в админку mysql и разблокируем таблицы базы:
1
2
3
4
root@master:~# mysql -p
password:
mysql> use admin_db;
mysql> UNLOCK TABLES;
Копируем SQL дамп на slave
1
rsync -Pva admin_db.sql root@51.254.225.155:~
Теперь заходим на сервер slave

на сервере slave

Обязательное требование к mysql — версия не ниже чем на сервере master. Правим конфиг mysqld
1
2
3
4
relay-log       = /var/log/mysql/relay-bin.log
server-id       = 3
binlog_do_db    = admin_db
binlog_format   = mixed
Создадим папочку для лог-файлика Mysql.
1
2
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
Перегружаем mysql-server на slave-сервере чтобы применить изменения в конфиге:
1
/etc/init.d/mysqld restart
Идем в админку mysql:
1
mysql -p
Там просто создадим пустую базу данных, с таким же именем как на master (я уже создал БД раньше, просто не заливал дамп), тут показываю как создать БД новую на всякий случай:
1
2
mysql> create database mydb;
mysql> quit
Заливаем dump базы admin_db скопированной с master-сервера
1
mysql -p admin_db < admin_db.sql
Опять идем в админку mysql и выполняем следующее:
1
2
3
4
mysql -p
password:
mysql> CHANGE MASTER TO MASTER_HOST='51.254.225.149',MASTER_USER='slave_user', MASTER_PASSWORD='slave_pass', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=334;
mysql> start slave;
Теперь смотрим статус, особое внимание уделяем Slave_IO_Running и Slave_SQL_Running, оба в нормальном рабочем состоянии должны быть Yes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
mysql> SHOW SLAVE STATUS\G;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    242
Current database: *** NONE ***
 
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 51.254.225.149
                  Master_User: slave_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 5068
               Relay_Log_File: relay-bin.000003
                Relay_Log_Pos: 2205
        Relay_Master_Log_File: mysql-bin.000002
             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: 5068
              Relay_Log_Space: 5283
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)
 
ERROR:
No query specified
 
mysql> quit
Теперь делаем следующее если у вас есть фаервол и он мешает подключению: На слейве:

1
2
3
4
iptables -A INPUT -p tcp -s 51.254.225.149 --dport 3306 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart
iptables -L -n -v # проверить правила
На мастере:

1
2
3
4
iptables -A INPUT -p tcp -s 51.254.225.155 --dport 3306 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart
iptables -L -n -v # проверить правила
Вот и все, теперь все должно работать.
More
hit.ua: посетителей за сегодня