MySQL 插入时的 Percona 集群 WSREP
MySQL Percona cluster WSREP on INSERT
我遇到了一个我不理解的 WSREP 错误问题。如果有人解释发生了什么以及如何解决它,我会很高兴。
我的应用程序有一个用于创建帐户的端点。在端点中,有几个对数据库的请求,检查帐户是否已经存在,并在必要时创建一个新帐户。新“帐户”有两部分 - 用户和身份。用户和相应身份的创建不会在事务中发生,但两个数据库请求都应用于集群的同一个节点(但其他用户和身份创建可能发生在其他节点上)。
出于某种原因,有时我会在身份创建(插入)时收到 WSREP(检测到 deadlock/conflict)错误。我确定没有任何冲突的插入请求与相同的数据,因为之后我在数据库中没有身份。为什么会这样?会不会是一些 index/foreign 关键问题?
我在这里完全不知所措。感谢您的帮助!
配置:
mysqld Ver 5.7.23-23-57 for Linux on x86_64 (Percona XtraDB Cluster (GPL), Release rel23, Revision f5578f0, WSREP version 31.31, wsrep_31.31)
表格(有点简化):
create table users
(
id bigint auto_increment
primary key,
profile json null,
is_active tinyint(1) default 1 null,
is_email_confirmed tinyint(1) default 0 null,
is_phone_confirmed tinyint(1) default 0 null,
created_at datetime default CURRENT_TIMESTAMP null,
modified_at datetime null,
email varchar(200) null,
);
create index ix_users_email
on users (email);
create index ix_users_phone_number
on users (phone_number);
create table identities
(
id bigint auto_increment
primary key,
user_id bigint null,
provider_id bigint null,
email varchar(200) null,
password varchar(200) null,
first_name varchar(200) null,
last_name varchar(200) null,
last_login datetime(6) null,
created_at datetime(6) default CURRENT_TIMESTAMP(6) null,
modified_at datetime(6) default CURRENT_TIMESTAMP(6) null,
is_deleted tinyint(1) default 0 null,
constraint identities_ibfk_1
foreign key (user_id) references users (id),
);
create index provider_id
on identities (provider_id);
create index user_id
on identities (user_id);
(but other user and identity creations may be happening on other nodes)
这很可能是您的问题。写入应该转到单个节点。不要 load-balance 你的文章。问题是您向 node1 发送了一个写操作,而另一个向 node2 发送了一个写操作。 tx1 将在 tx2 之前执行并在 tx2 执行之前更改数据库的“视图”,这会导致您看到的错误。
我遇到了一个我不理解的 WSREP 错误问题。如果有人解释发生了什么以及如何解决它,我会很高兴。
我的应用程序有一个用于创建帐户的端点。在端点中,有几个对数据库的请求,检查帐户是否已经存在,并在必要时创建一个新帐户。新“帐户”有两部分 - 用户和身份。用户和相应身份的创建不会在事务中发生,但两个数据库请求都应用于集群的同一个节点(但其他用户和身份创建可能发生在其他节点上)。
出于某种原因,有时我会在身份创建(插入)时收到 WSREP(检测到 deadlock/conflict)错误。我确定没有任何冲突的插入请求与相同的数据,因为之后我在数据库中没有身份。为什么会这样?会不会是一些 index/foreign 关键问题?
我在这里完全不知所措。感谢您的帮助!
配置:
mysqld Ver 5.7.23-23-57 for Linux on x86_64 (Percona XtraDB Cluster (GPL), Release rel23, Revision f5578f0, WSREP version 31.31, wsrep_31.31)
表格(有点简化):
create table users
(
id bigint auto_increment
primary key,
profile json null,
is_active tinyint(1) default 1 null,
is_email_confirmed tinyint(1) default 0 null,
is_phone_confirmed tinyint(1) default 0 null,
created_at datetime default CURRENT_TIMESTAMP null,
modified_at datetime null,
email varchar(200) null,
);
create index ix_users_email
on users (email);
create index ix_users_phone_number
on users (phone_number);
create table identities
(
id bigint auto_increment
primary key,
user_id bigint null,
provider_id bigint null,
email varchar(200) null,
password varchar(200) null,
first_name varchar(200) null,
last_name varchar(200) null,
last_login datetime(6) null,
created_at datetime(6) default CURRENT_TIMESTAMP(6) null,
modified_at datetime(6) default CURRENT_TIMESTAMP(6) null,
is_deleted tinyint(1) default 0 null,
constraint identities_ibfk_1
foreign key (user_id) references users (id),
);
create index provider_id
on identities (provider_id);
create index user_id
on identities (user_id);
(but other user and identity creations may be happening on other nodes)
这很可能是您的问题。写入应该转到单个节点。不要 load-balance 你的文章。问题是您向 node1 发送了一个写操作,而另一个向 node2 发送了一个写操作。 tx1 将在 tx2 之前执行并在 tx2 执行之前更改数据库的“视图”,这会导致您看到的错误。