Я только что установил один главный и один подчиненный сервер, но он не работает.
На своем веб-сайте я подключаюсь к подчиненному серверу и вставляю несколько строк, но они не отображаются на главном сервере и наоборот .. Что не так?
Вот что я сделал:
Master:
-> /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-master-bin
server-id=1
# bind-address = 127.0.0.1
binlog-do-db = test_db
Slave:
-> /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-slave-bin
server-id=2
# bind-address = 127.0.0.1
replicate-do-db = test_db
Slave:
terminal 0 >
mysql> STOP SLAVE; // and drop tables
Master:
terminal 1 >
mysql> CREATE USER 'repl_slave'@'slave_ip' IDENTIFIED BY 'repl_pass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_slave'@'slave_ip';
mysql> FLUSH PRIVILEGES;
mysql> FLUSH TABLES WITH READ LOCK;
-- leave terminal open
terminal 2 >
shell> mysqldump -u root -pPASSWORD test_db --lock-all-tables > dump.sql
mysql> SHOW MASTER STATUS;
Slave:
terminal 3 >
shell> mysql -u root -pPASSWORD test_db < dump.sql
terminal 0 >
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='master_ip',
mysql> MASTER_USER='repl_slave',
mysql> MASTER_PASSWORD='repl_pass',
mysql> MASTER_PORT=3306,
mysql> MASTER_LOG_FILE='mysql-master-bin.000003', // terminal 2 > SHOW MASTER STATUS
mysql> MASTER_LOG_POS=4, // terminal 2 > SHOW MASTER STATUS
mysql> MASTER_CONNECT_RETRY=10;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;
Вот статус раба:
Array
(
[Slave_IO_State] => Waiting for master to send event
[Master_Host] => xx.xx.xx.xx
[Master_User] => repl_slave
[Master_Port] => 3306
[Connect_Retry] => 10
[Master_Log_File] => mysql-master-bin.000003
[Read_Master_Log_Pos] => 106
[Relay_Log_File] => mysqld-relay-bin.000002
[Relay_Log_Pos] => 258
[Relay_Master_Log_File] => mysql-master-bin.000003
[Slave_IO_Running] => Yes
[Slave_SQL_Running] => Yes
[Replicate_Do_DB] => test_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] => 106
[Relay_Log_Space] => 414
[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] =>
)
В зависимости от вашего ведомого статуса репликация запущена и работает правильно. Ваши ожидания могут не оправдаться. Репликация MySQL - это односторонняя репликация от ведущего устройства к ведомому без проверки согласованности на ведомом устройстве. Строки, измененные на ведомом устройстве третьей стороной, будут не будут реплицированы обратно на мастер, но это, очевидно, повлияет на согласованность данных ведомого.
В большинстве случаев вы не заметите измененных строк данных на ведомом устройстве без выполнения дополнительных ручных проверок - взгляните на Набор инструментов Percona (ранее Maatkit) для инструментов действительно облегчают эту задачу.
Вы также должны удалить replicate_do_db из своей конфигурации, поскольку этот параметр фильтрации вероятно, не делаю того, что ты думаешь. Помимо этого, он должен работать из коробки. Если это не так, опубликуйте свои операторы SQL, используемые для проверки репликации данных.
На своем веб-сайте я подключаюсь к подчиненному серверу и вставляю несколько строк, но они не отображаются на главном ...
Это произойдет только при репликации с несколькими мастерами. В такой настройке обе серверы мастера. Это сложно, и легко ошибиться. Вам не захочется делать мульти-мастер в первый раз.
Таким образом, при обычной настройке master -> slave вы не можете вставлять строки в slave. Подчиненное устройство доступно только для чтения. Единственный способ получения новых данных на ведомом устройстве - это их репликация с ведущего устройства.
... и наоборот.
Если вы вставили строки на ведущем устройстве, но они не появились на ведомом устройстве, проблема. Статус раба мне кажется нормальным, задержки нет. Я не вижу ничего, что могло бы заставить его не работать, если вы не вставите его в другую базу данных, кроме test_db
.