Percona XtraDB Cluster 5.7 event是否重复执行?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

最近的某个业务系统即将由单点转入PXC集群,碰到的问题是mysql单实例上运行的那些event,再转入集群之后,该如何执行呢?带着这个问题,做了个实验,并给出相关结论。如果看官有类似的疑惑不妨往下读。

一、环境描述

# more /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

mysql> show variables like 'version';  
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| version      | 5.7.20-18-57-log |
+---------------+------------------+

mysql> show status like '%wsrep_cluster_size%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3    |
+--------------------+-------+

二、PXC环境测试event

测试说明
  该测试在一个节点上创建event,然后观察其他节点上event是否被执行。那如何判断event是在哪个节点上执行的呢?在这里写一个存储过程来调度使用当前实例的ip地址进行往表写入操作。因此如果任意一节点写入,必定包含自身ip。因此,我们调用了美每个实例上的wsrep_node_address这个变量。

1、在其中的一个节点创建event
mysql> show variables like '%wsrep_node_address%';
+--------------------+---------------+
| Variable_name      | Value        |
+--------------------+---------------+
| wsrep_node_address | 192.168.1.248 |
+--------------------+---------------+

--当前节点为1.248,变量event_scheduler处于开启
mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

--建一个测试库
mysql> create database tempdb;

--创建过程
mysql> delimiter //

mysql> CREATE 
PROCEDURE `inst_rows` ()
BEGIN
  DECLARE v1  INT DEFAULT 500;
  WHILE v1 > 0
  DO
      SET @ipaddr =
            (SELECT VARIABLE_VALUE
              FROM `performance_schema`.session_variables
              WHERE variable_name = 'wsrep_node_address');
      INSERT INTO tempdb.tb_test(ip_addr, ins_time)
      VALUES (@ipaddr, now());
      SET v1 = v1 - 1;
      SELECT sleep(1);
  END WHILE;
END
//

mysql> delimiter ;

--创建测试表
mysql> CREATE TABLE tb_test (
  id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  ip_addr varchar(30) DEFAULT NULL,
  ins_time timestamp 
);

mysql> select now();
+---------------------+
| now()              |
+---------------------+
| 2018-04-27 17:46:27 |
+---------------------+

--添加event
mysql> CREATE EVENT test_event
ON SCHEDULE AT '2018-04-27 18:05:00' 
ON COMPLETION PRESERVE
DO CALL inst_rows ;

mysql> select name,status from mysql.`event` where db='tempdb';
+------------+---------+
| name      | status  |
+------------+---------+
| test_event | ENABLED |
+------------+---------+

#####2、其他节点观察event
mysql> show variables like '%wsrep_node_address%';
+--------------------+---------------+
| Variable_name      | Value        |
+--------------------+---------------+
| wsrep_node_address | 192.168.1.249 |
+--------------------+---------------+

mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

--在节点1.248上,event状态为SLAVESIDE_DISABLED,即不会被执行
mysql> select name,status from mysql.`event` where db='tempdb';
+------------+--------------------+
| name      | status            |
+------------+--------------------+
| test_event | SLAVESIDE_DISABLED |
+------------+--------------------+

mysql> select "Leshami" Author, "https://blog.csdn.net/leshami",645746311 "WeiXin/QQ";
+---------+-------------------------------+-----------+
| Author  | https://blog.csdn.net/leshami | WeiXin/QQ |
+---------+-------------------------------+-----------+
| Leshami | https://blog.csdn.net/leshami | 645746311 |
+---------+-------------------------------+-----------+

mysql> select now();
+---------------------+
| now()              |
+---------------------+
| 2018-04-27 18:07:25 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from tb_test where ip_addr='192.168.1.249';
Empty set (0.00 sec)

mysql> select count(*) from tb_test where ip_addr='192.168.1.248';
+----------+
| count(*) |
+----------+
|      500 |
+----------+

三、主从架构测试event

在mysql当中,系统变量event_scheduler,来自官方的说明,缺省值为OFF。
  This variable indicates the status of the Event Scheduler; possible values are ON, OFF, and DISABLED, with the default being OFF.

如下主从架构
mysql> show slave status \G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.248
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqlbin.000011
          Read_Master_Log_Pos: 382972
              Relay_Log_File: zcd05-relay-bin.000010
                Relay_Log_Pos: 383183
        Relay_Master_Log_File: mysqlbin.000011
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

mysql> show variables like '%report_host%';
+---------------+---------------+
| Variable_name | Value        |
+---------------+---------------+
| report_host  | 192.168.1.244 |
+---------------+---------------+
1 row in set (0.01 sec)

mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| event_scheduler | OFF  |
+-----------------+-------+
1 row in set (0.01 sec)

--从库节点上的event状态也为SLAVESIDE_DISABLED
mysql> select name,status from mysql.`event` where db='tempdb';
+------------+--------------------+
| name      | status            |
+------------+--------------------+
| test_event | SLAVESIDE_DISABLED |
+------------+--------------------+
1 row in set (0.00 sec)

四、结论

1、The status of the event is set to SLAVESIDE_DISABLED on the slave regardless of the state specified (this does not apply to DROP EVENT).
2、SLAVESIDE_DISABLED indicates that the creation of the event occurred on another MySQL server acting as a replication master and replicated to the current MySQL server which is acting as a slave,but the event is not presently being executed on the slave.
3、在PXC集群中,在任意一个节点上创建的event,在其余节点上event状态将处于SLAVESIDE_DISABLED。也就是在哪个节点上创建将被所在节点调度。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32708 79
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17763 20
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36690 20
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24770 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36673 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29843 52

热门文章

最新文章

下一篇
开通oss服务