开发者社区> leshami> 正文

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

简介:
+关注继续查看

最近的某个业务系统即将由单点转入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。也就是在哪个节点上创建将被所在节点调度。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19282 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28550 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22284 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20402 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15957 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14885 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23551 0
+关注
leshami
传播知识,分享快乐!十年以上数据库,系统运维与管理,性能优化经验。全部文章,欢迎扩散,转载请注明出处!
639
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载