mysql - 6 节点 galera 集群冲突证书失败

标签 mysql session conflict galera

我们有一个 6 节点的 galera 集群和下表:

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

galera 调试显示许多冲突:

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

应用程序生成 session ID。有什么想法吗?
session ID 有什么问题以及如何解决冲突。

谢谢

最佳答案

A good description of "local cert failure"

session_id 从何而来?它非常长,看起来是十六进制,所以不应该是 utf8,也可能不是 varchar(255)。 UNHEX() 并放入 BINARY(16) 以显着缩小数据大小。

SELECT 是否正在尝试查看记录是否已存在?在您有机会执行此操作之前,另一个节点是否可以INSERTing session_id?有多种解决方法,每种都有问题。另一个节点会将其他列设置为相同的值吗?

关于mysql - 6 节点 galera 集群冲突证书失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945086/

相关文章:

javascript - 防止 WordPress javascript 冲突的好习惯?

git - 当在同一位置添加不同的方法(等)时,如何避免 merge 冲突?

ruby - 冲突的 ruby

mysql - sqlfiddle.com 5.5.30 和 MariaDB 5.5.31 中的不同结果

session - 我正在尝试将 PassportJs 与多种类型的用户一起使用(每种用户都有不同的模型)。我究竟做错了什么?

mysql - innodb事务和用户定义变量?

php - Laravel session 立即过期 (Laravel 5.5)

PHP crypt()、更新和比较

python - 在 python 中形成 MySQL 查询的正确方法是什么?

php - For 循环中的 If 条件