2016-01-22 38 views
1

我们有一个6节点加莱拉集群,如下表:6节点加莱拉集群冲突证书失效

mysql> show create table sessions; 
| Table | Create Table 
+----------+-------------- 
| sessions | CREATE TABLE `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`session_id` varchar(255) NOT NULL, 
`data` text, 
`created_at` datetime DEFAULT NULL, 
`updated_at` datetime DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `index_sessions_on_session_id` (`session_id`), 
KEY `index_sessions_on_updated_at` (`updated_at`) 
) ENGINE=InnoDB AUTO_INCREMENT=260176483 DEFAULT CHARSET=utf8 | 


mysql> desc sessions; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| session_id | varchar(255) | NO | MUL | NULL |    | 
| data  | text   | YES |  | NULL |    | 
| created_at | datetime  | YES |  | NULL |    | 
| updated_at | datetime  | YES | MUL | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 

我们看到很多wsrep_local_cert_failures这样的节点上:

SHOW status like '%wsrep%'; 
| wsrep_local_cert_failures | 165419 

加莱拉调试陈列着许多冲突:

THD: 251130, mode: local, state: executing, conflict: cert failure, seqno: 92044718 

禁用二进制日志记录。我可以使用通用日志文件中的线程ID来标识查询:

251130 Query SHOW FIELDS FROM sessions 
251130 Query SELECT sessions.* FROM sessions WHERE sessions.session_id = 
'3d1d7f8638dbfd12ee58fa78d4f0998c' LIMIT 1 
251130 Query BEGIN 
251130 Query INSERT INTO sessions (session_id, data, created_at, 
updated_at) VALUES ('3d1d7f8638dbfd12ee58fa78d4f0998c', 
'BAh7BkkiDnJldHVybl90bwY6BkVGIgYv\n', '2016-01-04 10:48:52', '2016-01-04 
10:48:52') 
251130 Query COMMIT 

应用程序生成会话标识。任何想法?
会话ID有什么问题以及如何解决冲突。

感谢

回答

0

交换主机是原因。设置正确的innodb_buffer_pool_size并重新启动后,我们没有错误。

感谢您的帮助。

0

A good description of "local cert failure"

在什么地方SESSION_ID从何而来?它非常长,看起来十六进制,所以不应该是utf8,可能不是varchar(255)。 UNHEX()并投入BINARY(16)以获得数据大小的显着缩减。

SELECT正试图查看记录是否已经存在?另一个节点INSERTing可能是session_id,然后你才有机会做到这一点?有多种解决方法,每个都有问题。其他节点将其他列设置为相同的值吗?

+0

session_id来自ruby应用程序。可能是另一个节点插入相同的session_id,但session_id类型为MUL。它不会导致冲突。 – user2683906

+0

'MUL'仅仅意味着有一个索引;它不是'独特'。 –