从etcd学习raft 在etcd的项目下有一个使用raft的示例,在之前读etcd代码的时候会比较难理解raft相关的代码。因此通过这个示例会更容易的了解raft相关的实现细节。我将这部分代码推送到了我的git仓库:https://github.com/yugu2day/raftexample在示例中,主要是构建了一个基于map的k-v存储服务, 支持PUT和GET对键值内容的存取,通过POST和DELETE来添加/删除raft集群中的节点。
etcd 的Put请求处理 在介绍etcdctl的内容中,我们知道了etcdctl实际上是向etcd服务端执行了grpc请求获取对应的结果,这一篇主要介绍当向etcd服务端执行Get/Put指令的时候究竟做了哪些工作。
etcd启动和测试 趁着失业看点没看过的东西,先在本机上启动etcd的环境再跟着文档看看一些具体的实现。首先可以再docker上pull一个最新的镜像并启动,用docker启动一个容器会比较方便的得到一个干净隔离的环境,需要删除的时候也更彻底一些。官方文档: https://etcd.io/docs/v3.5/tutorials/
CLUSTERDOWN The cluster is down 的解决办法 在本机上单机创建redis cluster执行命令报错 (error) CLUSTERDOWN The cluster is downredis-cli --cluster check 127.0.0.1:6379给出问题原因 not all 16384 slots are covered by nodes因此是部分slot分配的节点已经挂掉了输入命令 redis-cli --cluster fix 127.0.0.1:6379问题解决...
【golang】go 使用sarama写入kafka数据时间戳问题 查看消息时间戳的命令:kafka-console-consumer --bootstrap-server localhost:9092 --property print.timestamp=true --topic test --from-beginning发现sarama生产者推送到kafka的CreateTime均为-1。而命令行推送到kafka的时间戳正常。原因:sarama默认支持的是0.8.2的kafka版本,而timestamp的支持是从0.10版本开始的。因此需要初始化生产者配置时指
Scrapy logging日志重复输出的解决方法 如果是完全在scrapy流程中的日志,一般有三种输出方式。from scrapy.log import loggerlogger.info("info")# 会抛出warning,警告scrapy.log已经被废弃,此时的logger为 scrapy.log# ScrapyDeprecationWarning: Module `scrapy.log` has been depreca...
【爬虫】Python http.client能拿到数据而requests状态码异常 遇到一个case,抓包之后丢进postman无法正常拿到数据,使用curl和requests时也无法正常取到数据。而java,go,python的http.client库可以正常取到数据。当url和headers相同时,不同库的请求拿到结果不同。对requests和http.client请求抓包进行对比。headers一个个看过去发现requests多了一个accept请求头,那accept请求...
python sorted函数自定义排序 一般使用sorted函数的时候,直接会将key设置为一个lambda表达式的匿名函数。这样一般可以直接对字典的key或者value进行排序。但是今天刷leetcode的时候,需要对字典value的数组进行逐一排序,当value一致时,按key的字母顺序排序。这时候就需要自定义比较方法了。通过functools中的com_to_key将一个函数转变为参数key的值。https://leetco...
scrapy请求头首字母大写的解决方法 背景:同样的url, headers, payload进行post请求,requests可以正确的拿到数据,而scrapy则无法通过验证。通过抓包发现,scrapy所发出的请求头首字母均为大写,在postman中将请求头的各个key改为小写后能正确拿到请求数据。原因:scrapy的Request对象通过传入的headers字典初始化了一个scrapy.http.Headers对象,Head...
uiautomatorviewer报错:java.lang.reflect.InvocationTargetException 在使用uiautomatorviewer对设备进行截屏时,出现异常Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException解决方法:通过android studio对sdk tool进行了更新,从25.x 升级到了26.1.1升级后sdk manager没有界面了,ui...
在linux服务器上搭建mitmproxy pip install mitmproxymitmdump --listen-host 0.0.0.0 -p 5555如果服务器与手机不在同一局域网,确定手机能连通服务器的情况下,启动mitmproxy时增加–set block_global=false...
Python过滤字符串中的unicode乱码 最近获取到的字符串里除了正常的汉字字符外,有一些unicode的乱码在里面显示异常。 我是憨憨因此想要过滤掉这些显示异常的字符。str = eval(str.__repr__())可以通过repr获取raw string,进行正则匹配替换。这样就将字符串中的乱码unicode过滤掉啦!~...
brew cask install java8 失败 用网上看到的命令,结果brew cask 找不到指定版本brew tap caskroom/versionsbrew cask install java8Error: Cask ‘java8’ is unavailable: No Cask with this name exists.搜到一条命令brew cask install adoptopenjdk8下载结束后java -ve...
(六)Scrapy的抓取流程——Downloader 当通过Scheduler取出一条request之后,engine就会调用_download方法进行对这条request的下载。图中downloader的fetch方法就是下载器对request的操作方法。通过DownloaderMiddlewareManager在download方法中定义了process_request, process_response, process_excepti...
【Pyppeteer】ConnectionError:Connection is closed解决办法 想着用Pyppeteer写一个渲染web页面的接口,测试的时候发现过不了多久。常驻的browser在newPage()创建的时候就会报错。一直提示Connection is closed。这种情况应该也适于其他连接异常的情况。出现这种情况的原因是建立连接是通过websocket库,而websocket连接默认过期时间是20s,所以经过20s后连接断开也就无法控制浏览器了。解决方法:在...
inode使用率过高的解决方法 周末因为一个鸟程序的日志每条都疯狂输出到一个文件,直接把inode塞满了。记一下排查方法和删除大量文件所做的一些措施。问题排查for i in /*; do echo $i; find $i | wc -l; done首先使用上面的这条命令一步步缩小范围,确定在哪个目录下inode的节点数过多异常。最后我锁定到了日志目录,可是里面只有几个日志文件,在目录下直接运行这条命令也只能看到可...
(五)Scrapy的抓取流程——Scheduler 在Engine中,是通过Engine实例化的slot对象进行对scheduler对象的初始化,和任务状态的记录。# engine.py中ExecutionEngine的crawl方法def crawl(self, request, spider): assert spider in self.open_spiders, \ "Spider %r not opened w...