本文共 16697 字,大约阅读时间需要 55 分钟。
从上图可以看到当client端执行dml操作时,将操作发给server,server的native进程处理请求,client端执行commit,server将复制写数据集发给group(cluster),cluster中每个动作对应一个GTID,其它server接收到并通过验证(合并数据)后,执行appyl_cb动作和commit_cb动作,若验证没通过,则会退出处理;当前server节点验证通过后,执行commit_cb,并返回,若没通过,执行rollback_cb。只要当前节点执行了commit_cb和其它节点验证通过后就可返回。(节点接收sql 请求后,对于dml 操作,在commit之前,由wsrep API 调用galera 库进行集群内广播,所有其他节点验证成功后事务在集群所有节点进行提交,反之roll back。在一个事务提交的过程,Node1提交一个事物,必须要所有的节点通过了这个事务的请求,并且返回成功(ok)或者失败(conflict)信号之后,才真正的commit之后返回结果给用户,但是这里注意,最后在其它节点apply过程,并不会影响到给用户返回结果的过程。)
任何命令执行出现unkown command ,表示出现脑裂,集群两节点间4567端口连不通,无法提供对外服务。执行SET GLOBAL wsrep_provider_options="pc.ignore_sb=true"; 恢复业务
1,目前的复制仅仅支持InnoDB存储引擎。任何写入其他引擎的表,包括mysql.*表将不会复制。但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的。2,pxc结构里面必须有主键,如果没有主建,有可能会造成集中每个节点的Data page里的数据不一样3,在多主环境下LOCK/UNLOCK TABLES不支持。以及锁函数GET_LOCK(), RELEASE_LOCK()…,4,查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。5,允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。,6,由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).7,XA事务不支持,由于在提交上可能回滚。8,整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。9,集群节点建议最少3个。10,不要使用binlog-do-db和binlog-ignore-db, 这些选项仅支持DML语句, 不支持DDL语句, 使用这些选项可能会引起数据的错乱。3306:数据库对外服务的端口号
4444:请求SST(全量同步),在新节点加入时起作用4567:组成员之间沟通的端口4568:传输IST(增量同步 ),节点下线,重启加入时起作用pxc cluster相互通讯的端口:2)Port for group communication, default 4567. It can be changed by the option: wsrep_provider_options ="gmcast.listen_addr=tcp://0.0.0.0:4010; "用于SST传送的端口:3)Port for State Transfer, default 4444. It can be changed by the option: wsrep_sst_receive_address=10.11.12.205:5555用于IST传送的端口:4)Port for Incremental State Transfer, default port for group communication + 1 (4568). It can be changed by the option: wsrep_provider_options = "ist.recv_addr=10.11.12.206:7777; "1)OPEN: 节点启动成功,尝试连接到集群,如果失败则根据配置退出或创建新的集群
2)PRIMARY: 节点处于集群PC(primary component)中,尝试从集群中选取donor进行数据同步3)JOINER: 节点处于等待接收/接收数据文件状态,数据传输完成后在本地加载数据4)JOINED: 节点完成数据同步工作,尝试保持和集群进度一致5)SYNCED:节点正常提供服务:数据的读写,集群数据的同步,新加入节点的sst请求6)DONOR(贡献数据者):节点处于为新节点准备或传输集群全量数据状态,对客户端不可用centos 6.5+ percona xtradb cluster 5.6
192.168.2.128 slave1192.168.2.129 slave2192.168.2.130 slave3在slave1,slave2,slave3上分别执行:
[root@slave1 ~]#rpm -ivh [root@slave1 ~]#rpm -ivh [root@slave1 ~]#yum -y install Percona-XtraDB-Cluster-56在slave1上执行:
[root@slave1 ~]# mv /var/lib/mysql /data #如果数据库不放在默认/var/lib下,要先移动之前的安装文件然后才能重新启动。不然启动会报错:[root@slave1 ~]# vi /etc/my.cnf[mysqld]datadir=/var/lib/mysqluser=mysqlwsrep_provider=/usr/lib64/libgalera_smm.so# Cluster connection URL contains the IPs of node#1, node#2 and node#3wsrep_cluster_address=gcomm://192.168.2.128,192.168.2.129,192.168.2.130binlog_format=ROWdefault_storage_engine=InnoDB# This changes how InnoDB autoincrement locks are managed and is a requirement for Galerainnodb_autoinc_lock_mode=2# Node #1 addresswsrep_node_address=192.168.2.128# SST methodwsrep_sst_method=xtrabackup-v2# Cluster namewsrep_cluster_name=my_cluster# Authentication for SST methodwsrep_sst_auth="sstuser:s3cret"wsrep_provider_options="gcache.size=2000M"wsrep_slave_threads=16##########mysq#########innodb_flush_log_at_trx_commit=2[root@slave1 ~]#/etc/init.d/mysql bootstrap-pxc //初始化节点1 mysql> show status like 'wsrep%'; //查看状态,保证以下几项没有问题。+----------------------------+--------------------------------------+| Variable_name | Value |+----------------------------+--------------------------------------+| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |...| wsrep_local_state | 4 || wsrep_local_state_comment | Synced |...| wsrep_cluster_size | 1 || wsrep_cluster_status | Primary || wsrep_connected | ON |...| wsrep_ready | ON |+----------------------------+--------------------------------------+mysql@slave1> UPDATE mysql.user SET password=PASSWORD("123456") where user='root';mysql@slave1> FLUSH PRIVILEGES;mysql@slave1> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cret';mysql@slave1> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';mysql@slave1> FLUSH PRIVILEGES;配置节点2,在slave2上操作:[root@slave2 ~]# vi /etc/my.cnf[mysqld]datadir=/var/lib/mysqluser=mysqlwsrep_provider=/usr/lib64/libgalera_smm.sowsrep_cluster_address=gcomm://192.168.2.128,192.168.2.129,192.168.2.130binlog_format=ROWdefault_storage_engine=InnoDB# This changes how InnoDB autoincrement locks are managed and is a requirement for Galerainnodb_autoinc_lock_mode=2# Node #2 addresswsrep_node_address=192.168.2.129wsrep_cluster_name=my_cluster# SST methodwsrep_sst_method=xtrabackup-v2#Authentication for SST methodwsrep_sst_auth="sstuser:s3cret"wsrep_provider_options="gcache.size=2000M"wsrep_slave_threads=16innodb_flush_log_at_trx_commit=2[root@slave2 ~]# /etc/init.d/mysql startmysql> show status like 'wsrep%';配置节点3,在slave3上操作[root@slave3 ~]# vi /etc/my.cnf[mysqld]datadir=/var/lib/mysqluser=mysqlwsrep_provider=/usr/lib64/libgalera_smm.sowsrep_cluster_address=gcomm://192.168.2.128,192.168.2.129,192.168.2.130binlog_format=ROWdefault_storage_engine=InnoDB# This changes how InnoDB autoincrement locks are managed and is a requirement for Galerainnodb_autoinc_lock_mode=2# Node #2 addresswsrep_node_address=192.168.2.130wsrep_cluster_name=my_cluster# SST methodwsrep_sst_method=xtrabackup-v2#Authentication for SST methodwsrep_sst_auth="sstuser:s3cret"wsrep_provider_options="gcache.size=2000M"wsrep_slave_threads=16innodb_flush_log_at_trx_commit=2[root@slave2 ~]# /etc/init.d/mysql startmysql> show status like 'wsrep%';
验证:在其中任意节点新建表插入数据,在其他库上查看是否已经同步。
当galera cluster集群单个节点或所有节点停机情况分析
单个节点停机节点停机重启,重新加入集群,通过IST增量同步数据,来保持集群数据的一致性。IST的实现由wsrep_provider_options="gcache.size=1G"参数决定,一般设置为1G。参数大小由什么决定,根据停机时间,若停机一小时,需要确认一小时产生多大的binlog来算出参数大小。如果停机时间过长,部分数据gcache没有,此时该节点SST全量同步数据。3.2 利用主从的概念,把一个从节点转化为PXC/Galera集群中的节点
增加节点:
1,如果是之前旧节点恢复了只需要启动就可以了,会自动加入集群。2,如果是新搭建的机器,还是按照之前安装集群的方法装好这台机器,然后修改其他节点的/etc/my.cnf中的wsrep_cluster_address=gcomm://,修改其他节点的my.cnf文件后不需要重启。删除节点:
直接停掉该节点的mysql,修改my.cnf中wsrep_cluster_address=gcomm://,然后修改其他节点/etc/my.cnf把停掉的节点ip在wsrep_cluster_address=gcomm://中删除掉,修改完my.cnf后不需要重启。gvwstate.dat : This file is used for Primary Component recovery featuregrastate.dat :This file contains the Galera state information.
情景1:三个节点挂了2个(正常关闭):
node1,node2挂了,node3存活在node1,node2上执行:#service mysql start --wsrep_sst_donor=node3
注意:当某个node被宣威donor时,使用rsync或者dump时,该节点无法提供服务。即使使用xtrabackup这个节点性能也会收到影响,建议手动选择donar,避免高负载的机器被用来做donar,不指定则随机选择。
情景2:三个节点全部挂了(正常关闭):
在node1上执行:#/etc/init.d/mysql bootstrap-pxc
在node2,node3上执行:
#/etc/init.d/mysql start
情景3:node1,node2不见了(非正常关闭),node3无法单独形成仲裁,同时它会变成non-primary状态并且不会处理任何请求。
在node3上执行命令:mysql> select * from test.t1;ERROR 1047 (08S01): Unknown command查看节点日志:140814 0:42:13 [Note] WSREP: commit failed for reason: 3140814 0:42:13 [Note] WSREP: conflict state: 0140814 0:42:13 [Note] WSREP: cluster conflict due to certification failure for threads:140814 0:42:13 [Note] WSREP: Victim thread:THD: 7, mode: local, state: executing, conflict: cert failure, seqno: -1SQL: insert into t values (1)
解决办法:
在node3上执行(告诉node3你可以自己组成一个新集群):SET GLOBAL wsrep_provider_options='pc.bootstrap=true';
注意:在执行命令之前一定要确认node1,node2确实挂了,否则会造成数据不一致。
情景4,所有节点突然掉电
#cat /var/lib/mysql/grastate.dat# GALERA saved stateversion: 2.1uuid: 220dcdcb-1629-11e4-add3-aec059ad3734seqno: -1cert_index:因为突然掉电,不确定哪个节点的数据是最新的,查看gvwstate.dat文件找出最新的seqno#cat /var/lib/mysql/gvwstate.dat my_uuid: 76de8ad9-2aac-11e4-8089-d27fd06893b9#vwbegview_id: 3 6c821ecc-2aac-11e4-85a5-56fe513c651f 3bootstrap: 0member: 6c821ecc-2aac-11e4-85a5-56fe513c651f 0member: 6d80ec1b-2aac-11e4-8d1e-b2b2f6caf018 0member: 76de8ad9-2aac-11e4-8089-d27fd06893b9 0#vwend
实际上在 PXC5.6.19以后的系统会根据这个文件自动找到seqno最大的节点,从而自动启动数据恢复过程,不需要人工干预。如果实在不行就在该文件中找到最新的节点,手动在该节点上执行SET GLOBAL wsrep_provider_options='pc.bootstrap=true'(同情景2处理方法一样);
两节点集群排错:
解决方法:在其中一个节点上初始化所有集群,并且将该节点设为新的Primary Componentmysql> SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';如果你想该节点可以同时处理请求,执行如下命令:mysql> SET GLOBAL wsrep_provider_options='pc.ignore_sb=TRUE';
注意:在多主节点中执行这个很危险,会有脑裂的风险。所以该命令尽量只在主从环境中执行。
perconaXtraDB cluster中有两种参数可用于在通信断开时防止节点降级为non-primary状态。分别为pc.ignore_quorum和pc.ignore_sb。
pc.ignore_quorum参数设置为true的时候,节点忽略quorum算法,节点正常运行。pc.ignore_sb是当节点通讯关闭,发生脑裂时,忽略为防止脑裂时数据不一致而无法执行语句的机制,可以在各个节点正常运行命令。例1:
在各节点my.cnf中加入wsrep_provider_options = "pc.ignore_quorum =true" 参数,断开节点间网络。可以看到两个节点都没有降级到non-primary状态,不会降级并且可以各自处理请求。但是当网络恢复之后,点不会自动恢复到同步状态,不会发生数据同步,双节点各自形成一个cluter。如果要恢复集群模式,只能通过SST方式将数据同步,但是会造成一个节点的数据丢失!例2:
在各节点my.cnf中加入wsrep_provider_options = "pc.ignore_sb = true" 参数,断开节点间网络。可以看到两个节点都没有降级到non-primary状态,向两个节点插入不同的数据后恢复网络,集群不会恢复到原来的状态,重启备节点,由于备节点多插入了数据,seqno比主节点的高,所以重启失败。节点间无法构成集群,只能删除数据重新进行SST。IST的实现是由wsrep_provider_options="gcache.size=1G"参数决定,参数大小是由什么决定的,根据停机时间,若停机一小时binlog为1G,则gcache.size设置为1G,gcache是需要实际内存分配的,也不能设置太大,否则会出现oom-kill
wsrep_flow_control_paused_ns :表示当前节点落后集群的程度,0.0---1.0。0.0表示为没有落后。1.0表示为flow control已经停止 。如果落后太厉害要适当增加wsrep_slave_threads数。wsrep_cert_deps_distance: 表示当前节点平均时间内并行执行的事务数。这个可以作为wsrep_slave_threads的参考,同时并发量大的时候这个值也会大。wsrep_flow_control_sent:表示flow_control发出FC_PAUSE事件的次数,暂停的次数越多,表示接受到的请求频繁堵满slave队列。这种情况下不是队列长度不足就是机器性能太差,如果集群中多个机器出现这种情况,则考虑调整slave队列长度相关参数,如gcs.fc_limit等wsrep_local_recv_queue_avg:本地节点平均的接收队列长度,如果这个参数不为0.0,表示接收来的 数据不能被及时应用(立即应用了则不会进入队列)wsrep_local_send_q_avg:表示本地节点发送数据的队列长度,如果这个参数不为0.0,表示向外发送数据的速度比较慢,有堆积。wsrep_slave_threads:建议每core启动4个复制线程wsrep_local_cert_failures :同步过程中节点认证失败计数,冲突来自本地提交的事务和同步队列中事务存在锁冲突,则本地验证失败(保证全局数据一致性)wsrep_local_bf_aborts :强制放弃,本地事务和同步队列中正在执行的事务存在锁冲突时,将强制保证先提交的事务成功,后者回滚后报错wsrep_last_committed : 已经提交事务数目,所有节点之间相差不大,可以用来计算延迟wsrep_provider_options
该参数是一个字符串,包含了group communication system中很多参数设置,配置时使用分号隔开:wsrep_provider_options="key_a=value_a;key_b=value_b;key_c=value_c",evs.send_window:节点一次可以发送的消息数目,默认4
evs.user_send_window:其与evs.send_window之间的差别类似于max_connections与max_user_connection,默认2gcs.fc_factor:flow control参数,默认0.5gcs.fc_limit:flow control参数,流量控制大小限制,默认16FC问题处理:注意:这两个参数的意义是,当从节点堆积的事务数量超过gcs.fc_limit的值时,从节点就发起一个Flow Control,而当从节点堆积的事务数小于gcs.fc_limit * gcs.fc_factor时,发起Flow Control的从节点再发起一个解除的消息,让整个集群再恢复。发送FC消息的节点,硬件有可能出现问题了,比如IO写不进去,很慢,CPU异常高等发送FC消息的节点,本身数据库压力太高,比如当前节点承载太多的读,导致机器Load高,IO压力大等等。发送FC消息的节点,硬件压力都没有太大问题,但做得比较慢,一般原因是主库并发高,但从节点的并发跟不上主库,那么此时可能需要观察这两个节点的并发度大小,可以参考状态参数wsrep_cert_deps_distance的值,来调整从节点的wsrep_slave_threads,此时应该是可以解决或者缓解的。假设集群每个节点的硬件资源都是相当的,那么主库可以执行完,从库为什么做不过来?那么一般思路就是像处理主从复制的延迟问题一样。检查存不存在没有主键的表,因为Galera的复制是行模式的,所以如果存在这样的表时,主节点是通过语句来修改的,比如一个更新语句,更新了全表,而从节点收到之后,就会针对每一行的Binlog做一次全表扫描,这样导致这个事务在从节点执行,比在主节点执行慢十倍,或者百倍,从而导致从节点堆积进而产生FC。可以看出,其实这些方法,都是用来解决主从复制延迟的方法,没什么两样,在了解Flow Control的情况下,解决它并不是难事儿。gcs.fc_master_slave:flow control参数,默认NOgcs.recv_q_hard_limit:接收队列的占用的最大内存,默认LLONG_MAXgcs.recv_q_soft_limit:当接收队列占用内存超过(gcs.recv_q_hard_limit*gcs.recv_q_soft_limit),复制被延迟,默认0.25gmcast.listen_addr:节点用于接收其它节点消息的地址,默认tcp://0.0.0.0:4567pc.checksum:是否对发送的消息做checksum,默认truepc.ignore_sb:是否忽略split brain,默认false注意:Galera flow control
galera是同步复制(虚拟同步)方案,事务在本地节点(客户端提交事务的节点)上提交成功时,其它节点保证执行该事务。在提交事务时,本地节点把事务复制到所有节点后,之后各个节点独立异步地进行certification test、事务插入待执行队列、执行事务。然而由于不同节点之间执行事务的速度不一样,长时间运行后,慢节点的待执行队列可能会越积越长,最终可能导致事务丢失。galera内部实现了flow control,作用就是协调各个节点,保证所有节点执行事务的速度大于队列增长速度,从而避免丢失事务。实现原理和简单:整个galera cluster中,同时只有一个节点可以广播消息(数据),每个节点都会获得广播消息的机会(获得机会后也可以不广播),当慢节点的待执行队列超过一定长度后,它会广播一个FC_PAUSE消息,所以节点收到消息后都会暂缓广播消息,直到该慢节点的待执行队列长度减小到一定长度后,galera cluster数据同步又开始恢复flow control相关参数:gcs.fc_limit:待执行队列长度超过该值时,flow control被触发,对于Master-Slave模式(只在一个节点写)的galera cluster,可以配置一个较大的值,对启动多写的galera cluster,较小的值比较合适,因为较大待执行队列长度意味着更大的冲突,默认值16gcs.fc_factor:当待执行队列长度开始小于(gcs.fc_factor*gcs.fc_limit)时,数据同步恢复,默认0.5gcs.fc_master_slave:galera cluster是否为Master-Slave模式,默认NO其余参数:
wsrep_auto_increment_control:控制auto_increment_increment=#nodes和auto_increment_offset=#node_id,默认ONwsrep_causal_reads:默认是在本地节点读,读到的可能不是最新数据,开启后将读到最新数据,但会增加响应时间,默认OFFwsrep_certify_nonPK:为没有显示申明主键的表生成一个用于certification test的主键,默认ONwsrep_cluster_address: 启动节点时需要指定galera cluster的地址,作为cluster中第一个启动的节点wsrep_cluster_address=gcomm://,对于后续启动的节点,wsrep_cluster_address=gcomm://node1,node2,node3wsrep_cluster_name: 所有node必须一样, 默认my_test_clusterwsrep_convert_LOCK_to_trx:将LOCK/UNLOCK TABLES转换成BEGIN/COMMIT,默认OFFwsrep_data_home_dir:galera会生成一些文件,默认使用mysql_data_dirwsrep_node_name:节点名称wsrep_on:session/global,设置为OFF时,事务将不会复制到其他节点,默认ONwsrep_OSU_method:Online Schema Update设置,TOI/RSU(MySQL >= 5.5.17),默认TOIwsrep_provider:libgalera_smm.so的路径,若没有配置,galera复制不会启动wsrep_retry_autocommit:事务在冲突时重新尝试的次数,默认1wsrep_slave_threads:并行复制的slave线程数,默认4wsrep_sst_method:Snapshot State Transter方法:mysqldump/rsync/xt,默认xtrabackup-v2wsrep_local_state_uuid:应该与wsrep_cluster_state_uuid一致,如363acc29-9160-11e2-0800-4316271a76e4
wsrep_last_committed:已经提交事务数目,所有节点之间相差不大,可以用来计算延迟wsrep_replicated:从本地节点复制出去的write set数目wsrep_replicated_bytes:从本地节点复制出去的write set的总共字节数wsrep_received:本地节点接收来自其他节点的write set数目wsrep_received_bytes:本地节点接收来自其他节点的write set的总共字节数wsrep_local_commits:从本地节点发出的write set被提交的数目,不超过wsrep_replicatedwsrep_local_cert_failures:certification test失败的数目wsrep_local_bf_aborts:certification test通过的write set执行过程中回滚的与其冲突的本地事务wsrep_local_replays:事务被回滚(bf abort)重做的数目wsrep_local_send_queue:发送队列的长度wsrep_local_send_queue_avg:从上次查询状态到目前发送队列的平均长度,>0.0意味着复制过程被节流了wsrep_local_recv_queue:接收队列的长度wsrep_local_recv_queue_avg:从上次查询状态到目前接收队列的平均长度,>0.0意味着执行速度小于接收速度wsrep_flow_control_paused:从上次查询状态到目前处于flow control的时间占比,如0.388129wsrep_flow_control_sent:从上次查询状态到目前节点发送出的FC_PAUSE消息数目,如1wsrep_cert_deps_distance:可以并行执行的write set的最大seqno与最小seqno之间的平均差值,如1851.825751wsrep_apply_oooe:队列中事务并发执行占比,值越高意味着效率越高wsrep_commit_window:平均并发提交窗口大小wsrep_local_state:节点的状态,取值1-6wsrep_local_state_comment:节点的状态描述,比如Syncedwsrep_incoming_addresses:集群中其它节点的地址,多个地址之间用逗号分隔wsrep_cluster_conf_id:集群节点关系改变的次数(每次增加/删除都会+1)wsrep_cluster_size:集群节点个数wsrep_cluster_state_uuid:集群uuid,所有节点应该一样,如:363acc29-9160-11e2-0800-4316271a76e4wsrep_cluster_status:集群的目前状态,取值:PRIMARY(正常)/NON_PRIMARY(不一致)wsrep_connected:节点是否连接到集群,取值:ON/OFFwsrep_local_index:节点idwsrep_provider_name:默认Galerawsrep_provider_vendor:默认Codership Oywsrep_provider_version:wsrep版本,如:2.2(rXXXX)wsrep_ready:节点是否可以接受查询了,取值:ON/OFF如何检查节点是否加入到集群
判断复制过程是否出现问题
wsrep_flow_control_paused,正常情况下,其取值应该接近于0.0,大于0.0意味着有'慢节点'影响了集群的速度,可以尝试通过增大wsrep_slave_threads来解决找出最慢的节点wsrep_flow_control_sent,wsrep_local_recv_queue_avg两个值最大的节点参考:galera status,galera monitoringDDL执行卡死:在Galera Cluster中执行一个大的改表操作,会导致整个集群在一段时间内卡死在那里,导致线上完全不可服务了。原因还是并发控制,因为提交操作设置为串行的,DDL执行是一个提交的过程,那么串行执行改表,当然执行多久,就卡多久,直到改表执行完,其它事务也就可以继续操作了,这个问题现在没办法解决,但我们长期使用下来发现,小表可以这样直接操作,大一点或者更大的,都是通过osc(pt-online-schema-change)来做,这样就很好的避免了这个问题。
挡我者死:由于Galera Cluster在执行DDL时,是Total Ordered Isolation(wsrep_OSU_method=TOI)的,所以必须要保证每个节点都是同时执行的,当然对于不是DDL的,也是Total Order的,因为每一个事务都具有同一个GTID值,DDL也不例外,而DDL涉及到的是表锁,MDL锁(Meta Data Lock),只要在执行过程中,遇到了MDL锁的冲突,所有情况下,都是DDL优先,将所有的使用到这个对象的事务,统统杀死,不管是读事务,还是写事务,被杀的事务都会报出死锁的异常,并且目前无法解决。
不死之身:继上面的"挡我者死",如果集群真的被一个DDL卡死了,导致整个集群都动不了了,所有的写请求都Hang住了,直接在每个节点上面输入kill connection_id会出现报错:You are not owner of thread connection_id。这种情况下,要不就等DDL执行完成(所有这个数据库上面的业务都处于不可服务状态),要不就将数据库直接Kill掉,快速重启,赶紧恢复一个节点提交线上服务,然后再考虑集群其它节点的数据增量的同步等。
转载地址:http://gvaao.baihongyu.com/