从零搭建MongoDB Cluster分片集群

由于单台MongoDB服务器目前存在非常大的读写压力,并且在查询过程中消耗大量时间。使用8核32GB的云服务器完全不能满足现阶段数据吞吐量的要求(一天100万条数据写入,超过100万条数据读出)。当查询热数据时还能应付,但是查询冷数据时可能出现MongoDB查询非常缓慢的问题。因此我们将尝试搭建MongoDB Cluster分片集群。

Read more

Redis主从同步数据死循环

根据业务需求搭建了Redis Cluster集群,使用了4台服务器配置是8核32G内存。Redis集群的配置是2主2从。经过艰难困苦的各种操作,终于把2个主节点组建完毕。具体步骤和困难可以参考《从零搭建Redis Cluster分片集群》和《Redis Cluster分片数据迁移过程中的挑战》两篇文章。本篇文章将讨论另外一个问题,就是主从之前数据初始化过程中从服务器不断出现请求全量同步数据问题。以下是问题的具体细节和相关方案。
Read more

从零搭建Redis Cluster分片集群

由于整个爬虫系统的爬取队列和去重队列都由Redis负责维护。每隔一个小时,会做一次磁盘持久化的操作。然而由于业务量的逐渐增加,服务器的内存消耗越来越大,并且一次磁盘持久化操作所需要的时间越来越长。目前Redis服务器的配置为8核32G内存,在正常情况下,Redis服务要消耗95%的内存,做一次磁盘持久化操作大约需要8到10分钟。在做磁盘持久化操作,爬虫系统连接Redis的组件可能会报错:

redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

这里出现磁盘持久化错误的原因是由于内存不足,主机暂时没有响应,等持久化结束以后会回复。但是比较明显的是,目前单台高配Redis服务器已经无法满足现在的业务需求。扩展Redis服务器已经是势在必行的任务。
Read more

关于Google云建站的一些坑

由于之前的香港服务器到期了,但是有一些没什么流量但是扔掉又可惜的域名空着也难受。就找了免费的Google云服务器建一个Web服务器。谷歌提供了很多免费使用的服务,其中包括一台低配版本的云服务器。虽然云服务器目前是终身免费的,但有很多限制条件

  • 选择的区域必须是regon、Iowa、或者South Carolina
  • 必须选择f1-micro实例(1G600M)
  • 30GB的标准硬盘
  • 1GB的网络流量,并且不能是中国或者土澳的,否则要按需收费

所以条件非常苛刻。当然由于免费,这些条件也就忍了。本来计划是半天内建好并把所有的域名都重新配置好。但是没有想到由于Google云服务器有那么多坑,导致花了两天时间完成任务。因为这个知识点非常冷门,所以就再花点时间把这些坑记下来以备后用。
Read more

使用Frida实现内存注入主动调用函数

上篇文章中,我演示如何使用OllyDbg逆向一个简单的C语言程序,找到HOOK的内存地址和参数汇编指令。最后使用Frida框架编写了一个HOO脚本实现内存注入(远程线程插入)。当C语言函数被调用时,HOOK脚本会监听对应的函数,读取ESP寄存器中的函数参数,并打印在屏幕上。

本文将更深一步的研究如何使用Frida通过内存注入的方式,主动调用应用程序在内存中的函数。大致原理就是在内存中申请一个新的区域,在这个新内存片段中写入自己定义的汇编指令。最后注入到已经运行的应用中,从而实现在内存中调用应用内部方法。本文根据《使用OllyDbg逆向查找HOOK地址和寄存器使用》中逆向获取的内存地址和寄存器操作,使用Frida模拟调用应用中的方法。因此在继续本文内容之前,建议先阅读一下这篇文章,否则阅读源代码过程中可能会有困难。
Read more

使用Frida编写HOOK实现内存注入

上文中我们使用C语言编写了一个简单的程序,并且使用OllyDbg逆向查看每一个函数的入口地址。并且使用调用堆栈查看调用每一个函数前的汇编指令。通过观察在调用每一个函数前汇编语言是如何操作和准备输入参数的,我们就可以编写HOOK程序,截取函数调用过程中的数据。本文将以《使用OllyDbg逆向查找HOOK地址和寄存器使用》中的C语言作为样例,编写一个HOOK程序实现内存注入,截取函数h()的两个参数,并打印在屏幕上。
Read more