2014-04-14 76 views
1

我有一个3 percona xtradb 5.5.34-55服务器的集群,因为它们都是可写的,所以在任何实质负载下我都会遇到死锁错误。在一定程度上增加了wsrep_retry_autocommit变量,但ER_LOCK_DEADLOCK没有完全消失。所以,我试过设置wsrep_retry_autocommit 10000(似乎是最大的),认为它将使一些查询很慢,但没有人会失败,ER_LOCK_DEADLOCK即使设置wsrep_retry_autocommit真的很高,我仍然会死锁吗?

mysql-shm -ss -e 'show global variables like "%wsrep_retry_auto%"' 
wsrep_retry_autocommit 10000 

------------------------ 
LATEST DETECTED DEADLOCK 
------------------------ 
140414 10:29:23 
*** (1) TRANSACTION: 
TRANSACTION 72D8, ACTIVE 0 sec inserting 
mysql tables in use 1, locked 1 
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1 
MySQL thread id 34, OS thread handle 0x7f11840d4700, query id 982 localhost shm update 
REPLACE INTO metric(host, name, userid, sampleid, type, priority) VALUES 
('localhost','cpu-3/cpu-nice',8,0,0,0),('localhost','cpu-3/cpu-system',8,0,0,0), 
('localhost','cpu-3/cpu-idle',8,0,0,0),('localhost','cpu-3/cpu-wait',8,0,0,0), 
('localhost','cpu-3/cpu-interrupt',8,0,0,0),('localhost','cpu-3/cpu-softirq',8,0,0,0), 
('localhost','cpu-3/cpu-steal',8,0,0,0),('localhost','cpu-4/cpu-user',8,0,0,0), 
('localhost','cpu-4/cpu-nice',8,0,0,0),('localhost','cpu-4/cpu-system',8,0,0,0), 
('localhost','cpu-4/cpu-idle',8,0,0,0),('localhost','cpu-4/cpu-wait',8,0,0,0), 
('localhost','cpu-4/cpu-interrupt',8,0,0,0),('localhost','cpu-4/cpu-softirq',8,0,0,0), 
('localhost','cpu-4/cpu-steal',8,0,0,0) 
*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 0 page no 344 n bits 488 index `unique-metric` of 
table `shm`.`metric` trx id 72D8 lock_mode X waiting 
*** (2) TRANSACTION: 
TRANSACTION 72D7, ACTIVE 0 sec updating or deleting 
mysql tables in use 1, locked 1 
7 lock struct(s), heap size 3112, 141 row lock(s), undo log entries 40 
MySQL thread id 50, OS thread handle 0x7f1184115700, query id 980 localhost shm update 
REPLACE INTO metric(host, name, userid, sampleid, type, priority) VALUES 
('localhost','cpu-3/cpu-nice',8,0,0,0),('localhost','cpu-3/cpu-system',8,0,0,0), 
('localhost','cpu-3/cpu-idle',8,0,0,0),('localhost','cpu-3/cpu-wait',8,0,0,0), 
('localhost','cpu-3/cpu-interrupt',8,0,0,0),('localhost','cpu-3/cpu-softirq',8,0,0,0), 
('localhost','cpu-3/cpu-steal',8,0,0,0),('localhost','cpu-4/cpu-user',8,0,0,0), 
('localhost','cpu-4/cpu-nice',8,0,0,0),('localhost','cpu-4/cpu-system',8,0,0,0), 
('localhost','cpu-4/cpu-idle',8,0,0,0),('localhost','cpu-4/cpu-wait',8,0,0,0), 
('localhost','cpu-4/cpu-interrupt',8,0,0,0),('localhost','cpu-4/cpu-softirq',8,0,0,0), 
('localhost','cpu-4/cpu-steal',8,0,0,0),('localhost','cpu-3/cpu-nice',8,0,0,0), 
('localhost','cpu-3/cpu-system',8,0,0,0),('localhost','cpu-3/cpu-idle',8,0,0,0), 
('localhost','cpu-3/cpu-wait',8,0,0,0),('localhost','cpu-3/cpu-interrupt',8,0,0,0), 
('localhost','cpu-3/cpu-softirq',8,0,0,0),('localhost' 
*** (2) HOLDS THE LOCK(S): 
RECORD LOCKS space id 0 page no 344 n bits 488 index `unique-metric` of table 
`shm`.`metric` trx id 72D7 lock_mode X 
*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 0 page no 344 n bits 504 index `unique-metric` of table 
`shm`.`metric` trx id 72D7 lock_mode X locks gap before rec insert intention waiting 
*** WE ROLL BACK TRANSACTION (1) 

它不应该代替重试?有没有一种方法来验证percona实际重试查询10000次?

回答

1

对于你的问题没有确切的答案,但是对于任何写入密集型负载(如果你试图插入与该Drupal相同的数据),那么会发生死锁,并且对我来说唯一的解决方案(仍在等待以确认这是100%正确的解决方案) - 在galera节点前使用haproxy,并定义要使用的第一个节点(haproxy后端定义),并将其他2个节点用作备份。

这样所有的mysql流量都将从客户端流经haproxy到单个galera节点,如果该节点失败,则会使用其他节点。

希望有帮助... Andrija

相关问题