【发布时间】:2015-10-10 03:20:53
【问题描述】:
我有一个运行 mariadb 10.0.21 的 4 机器 mysql 集群。我有两个主人设置,它们互相奴役。然后是分别从第一个和第二个数据库复制的两个只读从站。
简而言之,它的设置方式是这样的:
db1 replicates -> db2
db1 replicates -> db3
db2 replicates -> db1
db2 replicates -> db4
这是一个非常基本的 4 db 设置。
我遇到的问题是我设置了一个 nagios 用户来监控第一个数据库上的集群。
我检查了一下,我可以使用 nagios 用户登录前 3 个数据库,但不能登录第 4 个数据库。我可以做到这一点,而无需在每个数据库上创建 nagios 用户,因为我正在前两台数据库机器上复制我的 mysql 数据库。
但由于某种原因,在 db4 上从未像在 db2 上那样创建 nagios 用户,即使复制在所有节点上似乎都很好。
您可能还记得,我将 db 2 复制到第 4 个 db。
如果我在 db 2 上执行 show master status,我可以看到我正在复制 mysql db:
MariaDB [mysql]> show master status;
+--------------------+----------+------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+------------------------------+------------------+
| mariadb-bin.000078 | 376 | jfwiki,jokefire,bacula,mysql | |
+--------------------+----------+------------------------------+------------------+
1 row in set (0.00 sec)
如果我检查 nagios 用户是否在第二个数据库上,那就是。
MariaDB [mysql]> select User,Host,Password from user where user like 'nagios';
+--------+-------------+-------------------------------------------+
| User | Host | Password |
+--------+-------------+-------------------------------------------+
| nagios | 52.4.204.96 | *somepasswordhash |
+--------+-------------+-------------------------------------------+
1 row in set (0.00 sec)
此用户不是在 db2 上创建的,但由于复制而存在。
如果我检查 db4 上的从属状态,复制似乎完全没问题:
[root@db4:~] #mysql -e "show slave status\G" | egrep "Slave_IO_State|Master_Host|Slave_IO_Running|Slave_SQL_Running|Last_Errno|Seconds_Behind_Master"
Slave_IO_State: Waiting for master to send event
Master_Host: db2.example.com
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Seconds_Behind_Master: 0
如果我像在 db2 上那样检查 db4 上是否存在 nagios 用户,则该用户不存在:
MariaDB [mysql]> select User,Host from user where user like 'nagios';
Empty set (0.00 sec)
所以我的问题是,为什么 nagios 用户没有像从 db1 -> db2 和从 db1 -> db3 那样复制到 db4?即使 db4 上的从属复制似乎也可以?我可以使用来自监控主机的 nagios 用户登录所有这些主机。
这是 db4 上从属复制命令的完整输出,以防我之前错过了 grep 中的任何内容:
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: db2.example.com
Master_User: jf_slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000078
Read_Master_Log_Pos: 376
Relay_Log_File: db4-relay-bin.000044
Relay_Log_Pos: 537
Relay_Master_Log_File: mariadb-bin.000078
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: 376
Relay_Log_Space: 1121
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /opt/mysql/ca.crt
Master_SSL_CA_Path:
Master_SSL_Cert: /opt/mysql/db4.example.com.crt
Master_SSL_Cipher:
Master_SSL_Key: /opt/mysql/db4.example.com.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: 2
Master_SSL_Crl: /opt/mysql/ca.crt
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
1 row in set (0.00 sec)
我在 db4 上的 mariadb 日志中看到了一些错误,但是它们与我在 nagios 用户数据成功复制的第 3 个数据库上看到的错误没有什么不同。
151004 15:34:36 [Note] Error reading relay log event: slave SQL thread was killed
151004 15:34:36 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
151004 15:34:36 [Note] Slave I/O thread killed while reading event
151004 15:34:36 [Note] Slave I/O thread exiting, read up to log 'mariadb-bin.000078', position 376
151004 15:36:47 [Note] Slave SQL thread initialized, starting replication in log 'mariadb-bin.000078' at position 376, relay log './db4-relay-bin.000042' position: 537
151004 15:36:47 [Note] Slave I/O thread: connected to master 'jf_slave@db2.example.com:3306',replication started in log 'mariadb-bin.000078' at position 376
151007 4:24:12 [Note] Error reading relay log event: slave SQL thread was killed
151007 4:24:12 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
151007 4:24:12 [Note] Slave I/O thread killed while reading event
151007 4:24:12 [Note] Slave I/O thread exiting, read up to log 'mariadb-bin.000078', position 376
151007 4:28:20 [Note] Slave SQL thread initialized, starting replication in log 'mariadb-bin.000078' at position 376, relay log './db4-relay-bin.000043' position: 537
151007 4:28:20 [Note] Slave I/O thread: connected to master 'jf_slave@db2.example.com:3306',replication started in log 'mariadb-bin.000078' at position 376
那么,当所有复制指标看起来都正常时,为什么会出现这种数据库不一致呢?为什么 nagios 用户不能像在 1st 3 db 上那样登录到 db4?
谢谢
【问题讨论】:
-
所有节点都具有相同的硬件吗?你所有的节点都有不同的服务器ID吗? n 另外,如果您在 db4 上丢失连接,那么在创建 nagios 用户期间连接丢失通常是不可能的?你为什么不在从站上创建那个用户呢?很难确切知道为什么它没有在从站上创建...有从站漂移之类的东西...Percona 构建了一个完整的工具来重新同步 mysql 中的从站...
-
它们都来自 AWS 上的同一个 ami。在操作系统、内存、磁盘等方面都相同。我检查了所有节点上的服务器 ID,它们是唯一的:检查 db1 上的服务器 ID 服务器 ID = 1 检查 db2 上的服务器 ID 服务器 ID = 2 检查服务器db3 server-id=3 上的 id 检查 db4 server-id=4 上的服务器 id 我不只是在 db4 上创建 nagios 用户的原因是我以前见过这个问题。我使用数据库农场来运行一个 wiki。而且我注意到每隔一段时间,我会创建一个页面或更改一些文本。并且更改只会发生在一个 db 节点上。
-
当我去检查复制时,复制设置中的一切正常。例如,我将进入 wiki 站点的配置,而不是使用 db 数组,我将一次仅将配置指向一个 db 主机,直到找到“丢失”页面或更改的内容。那时我通常会从“好”数据库中转储数据库并将其导入到所有其他缺少我所追求的更改的主机上。所以,我之所以对这个 nagios 用户问题大加关注,是因为我认为它说明了我在丢失 wiki 页面时遇到的问题。
-
您如何建议在不向 Percona 花钱的情况下与奴隶漂移作斗争?谢谢!!
-
percona 重新同步从站工具是免费的...percona.com/software/mysql-tools/percona-toolkit
标签: mysql replication mariadb database-replication