首页 文章 精选 留言 我的

精选列表

搜索[重复报告],共10010篇文章
优秀的个人博客,低调大师

python 查找目录中的重复文件脚本

!/usr/bin/python coding=utf-8 from hashlib from sys from os from fnmatch CHUNK_SIZE=8192 def find_specific_files(root,patterns=['*'],exclude_dirs=[]): pass def get_chunk(filename): with open(filename) as f: while True: chunk=f.read(CHUNK_SIZE) if not chunk: break else: yield chunk def get_file_checksum(filename): h=hashlib.md5() for chunk in get_chunk(filename): h.update(chunk) return h.hexdigest() def main(): sys.argv.append("") directory=sys.argv[1] if not os.path.isdir(directory) raise SystemExit("{0} is not a directory".format(directory)) record={} for item in find_specific_files(directory): checksum=get_file_checksum(item) if checksum in record: print('find {0} vs {1}'.format(record[checksum],item)) else: record[checksum]=item if name=='main': main()

优秀的个人博客,低调大师

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。也就是在哪个节点上创建将被所在节点调度。

优秀的个人博客,低调大师

disruptor调研报告

票池暂定使用disruptor来做消息队列,把最近对disruptor的调研结果整理一下。大部分文字都是把disruptor和其它网站上看到的资料翻译一下。 原文:http://www.oraclejavamagazine-digital.com/javamagazine/20120304/?pg=56&pm=1&u1=friend#pg56 Disruptor是什么? Disruptor是一个线程间通信的框架,即在多线程间共享数据。它是由LMAX公司开发的可信消息传递架构的一部分,以便用非常快速的方法来在多组件之间传递数据。它的一个核心思想是理解并适应硬件工作方式来达到最优的效果。 在很多(并行)架构里,普遍使用队列来共享数据(例如传递消息)。图1就是使用队列来传递消息的一个示意图(里面蓝色的小圈圈表示一个线程)。这种架构允许生产线程(图1里的stage1)在消费线程(图1里的stage2)处理不过来的情况下,还可以继续后面的工作,队列在其中用来做为消息的缓冲区。 图1 在最简单的情况下,disruptor可以用来替代图1架构里的队列,也就是线程间通过disruptor来传递数据。在disruptor里保存消息的数据结构是环状缓冲区(RingBuffer - 后面都用RingBuffer这个术语)。生产线程stage1将消息放到RingBuffer里,然后消费线程stage2从RingBuffer里读取消息,如图2。 图2 从图2里可以看到,RingBuffer里的每一个元素都有一个序列号(sequence number)来索引,RingBuffer维护当前最新放置的元素的序列号,这个序列号一直递增,(通过求余来得到元素在RingBuffer下面的数组下标)。 Disruptor的关键特性是无锁编程,这个是通过单一写线程的方式实现的 - 即一块数据永远只有一个线程写入。通过遵循这个编程原则来避免使用昂贵的同步锁或CAS操作,这就是为什么Disruptor这么快的原因。 因为RingBuffer规避了锁,而且每个EventProcessor维护自己的序列号。 向Disruptor发布消息 往RingBuffer里写入消息使用两步提交的方式。首先,生产线程Stage1需要确定RingBuffer里下一个空闲槽,如图3。 图3 RingBuffer维护了最后一次写入的序列号(图3里的18号),因此就可以推知下一个空闲的槽号。RingBuffer通过检查所有从RingBuffer读取消息的EventProcessor的序列号,以判别下一个槽号是否空闲。 图4演示了索取下一个空闲槽序列号的过程。 图4 当生产线程拿到了下一个序利号之后,它从RingBuffer里拿到槽里保存的对象并执行任何操作。这个过程中,因为RingBuffer的最新序列号依然是18,因此其它线程无法读取19号槽里面的事件 - 生产线程还在处理它。 图5 图5演示了RingBuffer在提交变更后的情况。当生产线程处理完第19号槽的数据后,它告诉RingBuffer将其公布出来。这个时候,RingBuffer才会更新它维护的序列号,任何等待读取第19号槽里的数据的线程才能读取它。 从RingBuffer里读取信息 Disruptor框架里提供了一个叫做BatchEventProcessor来从RingBuffer里读取数据。当生产线程向RingBuffer要求下一个可写入的空闲槽的序列号时,同时一个EventProcessor(类似消费者,但其并消费RingBuffer里的元素 - 即不从RingBuffer里移除任何元素)也会维护其最后所处理的数据的序列号,并要求下一个可处理的数据的序列号。 图6演示了EventProcessor等待处理下一个可读取数据序利号的过程。 图6 EventProcessor不是直接从RingBuffer里获取下一个可读取数据的序列号,而是通过一个SequenceBarrier对象来做的,稍后我们谈这个细节。 图6里,EventProcessor(即消费者线程Stage2)最后看到的是第16号槽的数据,它希望处理下一个(第17号)槽的数据,因此它执行SequenceBarrier的waitFor(17)函数调用。线程Stage2可以一直等待下一个可读序列号,因为如果尚没有数据生产出来的话,它什么也不需要做。但跟图6所示的一样,RingBuffer里最新可用数据已经到18号槽了,因此waitFor返回18,即告诉EventProcessor可以一直读到第18号的所有数据。如图7。 图7 这种模式提供了很好的批处理行为,可以使用这种批处理代码来实现EventHandler,在Disruptor里性能测试FizzBuzzEventHandler就是一个很好的例子。 处理系统组件之间的依赖关系 Disruptor处理系统内部多组件的依赖关系,而不引入任何线程竞争的做法很有意思。Disruptor遵循的是单线程写入,多线程读取的做法。Disruptor的原始设计是支持几步具有特定顺序的串行流水线操作 - 这种操作在企业级的系统里很常见。图8演了一个标准的三步流水线操作: 图8 首先,所有事件都会写入硬盘(日志“Journaling”操作),以便容灾恢复。第二所有事件会备份(Replication操作)到第二台服务器上,只有这些步骤都完成之后系统才能处理实际的业务操作(Business Logic)。 串行做这三步操作是一个合理的做法,但不是最有效率的。日志和备份操作可以并行,因为它们相互独立。但业务操作不行,因为它依赖前两者,图9演示了这个依赖关系。 图9 如果使用Disruptor,前两步(日志和备份)可以直接读RingBuffer。跟图7示意的,它们都使用一个屏障(Sequence Barrier)来得到RingBuffer下一个可读取的序列号。它们各自维护自己的序列号,这样方便它们自己知道已经读到哪了,并使用BatchEventProcessor来处理事件(日志和备份)。 业务线程也会从同一个RingBuffer里读取事件,不过只能处理前两个线程处理完的事件。这个限制通过第二个SequenceBarrier来实现,它被配置来读取日志线程和备份线程的序列号,返回它们的最小值,以告诉业务线程安全读取的范围。 只有每一个EventProcessor都使用序列号屏障(Sequence Barrier)来确定可以安全处理的事件范围,才能从RingBuffer里读取数据。如图10。 图10 虽然有很多线程读取不同的序利号,但由于都是简单递增自己内部的序利号,所以线程间没有竞争。 多个生产线程 Disruptor也支持,但是本文没有说如何支持,放在后面写。 结论 虽然disruptor的原理已经比较熟悉了,但是其API还不是很了解,我写了一个实验性的代码,来完善我的理解 - 不过随着理解的深入,代码会不断更新: https://github.com/shiyimin/12306ngpm/blob/8be9178d318618f905aaed45fa6025df09371c31/trunk/tpms/src/test/java/org/ng12306/tpms/DisruptorConceptProofTest.java 本文转自 donjuan 博客园博客,原文链接: http://www.cnblogs.com/killmyday/archive/2012/12/02/2798218.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册