Kafka消息监控 – Kafka Eagle

1.概述

在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper 客户端工具,可以很方便的完成我们的工作。随着业务的复杂化,Group 和 Topic 的增加,此时我们使用 Kafka 提供的命令工具,已预感到力不从心,这时候

阅读全文

Kafka设计与原理详解

一、Kafka简介

本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料。

转载请注明出处 : 本文链接(http://blog.csdn.net/suifeng3051/article/details/48053965)

1.1 背景历史

当今社会各种应用系统诸如商业、社交、搜索、浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战:

  1. 如何收集这些巨大的信息
  2. 如何分析它
  3. 如何及时做到如上两点

阅读全文

为RaspberryPi3板子初始化Raspbian系统 (Mac环境)

新入手了pi3 model b板子,按下述操作即可安装并启动成功,mark一下,以免其它人再走弯路。

准备硬件:

1.pi3 model B板子一块

2.电源线(整个android手机的充电线就可以)

3.hdmi转vga视频线(用来连接pi和普通电脑显示器)

4.micro sd tf卡(建议大点,免得过些天空间不足)

阅读全文

让python调用mongo读写速度加速10倍的方法

1.把mongo读写封装成api

2.在api初始化时保持数据库长链接;并且用线程每2分钟遍历一次所有的表并count一次

import sys import time import pymongo import json import log import traceback import threading //库名test,表名test_table server_list = ['test-mongos.all.serv:6365' for i in range(8)] conn_str = "mongodb://test:123456@" + ",".join(server_list) + "/test" print conn_str conn = pymongo.MongoClient(conn_str) test = conn.test def load_cache(){

阅读全文

小猪学arduino—使用GP2Y1010AU0F检测pm2.5空气质量

今天老婆不在家,申请的dueros和买的机器人零件都没到,儿子自己玩坦克玩的正hi,我也找点事干吧,从箱子里扒拉出一个GP2Y1010AU0F灰尘传感器,做个pm2.5检测吧。

GP2Y1010AU0F模块的检测原理:

传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量,跟激光的比成本较低。

硬件连线

传感器 -> Arduino
1白线Vled –> 5V (150ohm resistor)2
2蓝线 LED-GND –> GND3
3 绿线LED –> Digital pin 24
4 黄线S-GND –> GND5
5 黑线Vo –> Analog pin 06
6 红线Vcc –> 5V
示例没有接电容电阻,其中1、6红白线可以连一起后接5v;2、4蓝黄线连一起后接GND;3绿线接D2数字端口;5黑线接A0模拟端口。

检测结果:

今天下大雨空气太好,人工制造了点灰尘,这是灰尘被检测到散开的检测数据:

临时加了个警报灯,超过阈值就会亮起来,等esp板子到了就统一都传到server端显示。

程序代码

int measurePin = 0; // 引脚定义里的第5脚,黑色线接到A0 int pm25Pin = 2; // 引脚定义里的第3脚,白色线接到D2 int ledPin = 13; // led报警灯接到D13 int samplingTime = 280;//等待LED开启的时间是280μs int deltaTime = 40;//整个脉冲持续时间为320μs。因此,我们还需再等待40μs int sleepTime = 9680; float

阅读全文

小猪学arduino—欠儿子的坦克终于兑现了

最近公司事情比较多,有段时间没玩arduino了,这周末又拾起来了,打算把之前答应给儿子做的履带坦克兑现了。

在某宝上花几十大洋淘了个履带底盘,捣鼓了半天,先是用L298N控制2个DC3-6V电机时总是只有一个能转,后来用了1块9v方块电池做外接电源,终于两个都转了;然后把电机换成坦克的t130电机,又趴窝了,换成4块1.5v南孚,坦克在不坨东西的情况下能同时转,但是把数据线一拔,又趴窝了,确定是电压或电流不够的问题,试了1.5v南孚串联、9v方块电池、充电宝、手机锂电池,最后发现使用两节18650电池不但电压和电流够用,而且充满电能用好久,以后搞arduino用这种电池就行了,所以看到此文的人就不要在外接电池的问题上耽误时间了。

试验过程和连线图

写在另一篇l298n的文章里了:

小猪学arduino—使用L298N控制两个直流电机

效果图

下图是换了个底盘,儿子用一次性筷子和吸管做的炮管

坦克v1.0代码

#tank.ino #include <IRremote.h>//包含红外库 int infraredPin = 3;//红外线接收器端口 long INFRARED_PLAY = 0x00FFA857;//红外遥控器上的PLAY键指令 long INFRARED_LEFT = 0x00FFE01F;//红外遥控器上的左键指令 long INFRARED_RIGHT = 0x00FF906F;//红外遥控器上的右键指令 long INFRARED_UP = 0x00FF02FD;//红外遥控器上的上键指令 long

阅读全文

小猪学arduino—使用L298N控制两个直流电机

简介

L298N驱动模块,可以驱动2个直流电机,可分别实现正转,反转功能.

准备材料

Arduino Uno       * 1
L298N驱动模块   * 1
直流电机               * 2
18650电池            * 2
跳线                      若干

连线方法

注意:L298N必须外接6-12v电压及一定电流的外接电池,在这里被坑了好久,用普通的6v+电池外接时,不是只转一个轮子就是在拔掉电脑数据线后完全不转了,最后把外接电源换成两节18650电池后解决

程序代码

选用IO口为5,6,9,10,这四个均支持PWM,可以通过占空比代码实现控制转动速度的快慢

//LingShun Lab int input1 = 5; // 定义uno的pin 5 向 input1 输出 int input2 = 6; // 定义uno的pin 6 向 input2 输出 int input3 = 9; // 定义uno的pin 9 向 input3 输出 int input4 = 10; // 定义uno的pin 10 向 input4 输出 void setup() { // Serial.begin (9600); //初始化各IO,模式为OUTPUT 输出模式

阅读全文

用shell脚本监控进程是否存在,不存在则启动的实例

用shell脚本监控进程是否存在,不存在则启动的实例:

vim socks-forward.sh
#!/bin/sh
ps -fe|grep 'process name' |grep -v grep
if [ $? -ne 0 ]
then
echo "start....."
#do same thing
echo "done....."
else
echo "runing....."
fi

设置定时任务:

*/10 * * * * sh /disk/server/socks-forward.sh

从PHP客户端看MongoDB通信协议

MongoDB 的 PHP 客户端有一个 MongoCursor 类,它是用于获取一次查询结果集的句柄(或者叫游标),这个简单的取数据操作,内部实现其实不是那么简单。本文就通过对 MongoCursor 类一些操作进行分析,向大家揭开 MongoDB 客户端服务器通信的一些内部细节。

getNext与网络请求

通常来说,每一次find操作都会返回一个MongoCursor对象,在这个对象上调用getNext方法,就能够获得一条结果数据。循环调用getNext方法就能获取多条数据。下面我们就来看看其内部取数据的具体逻辑。

首先我们用最简单的方法来生成一个MongoCursor对象:

$m = new Mongo();
$collection = $m->demoDb->demoCollection;
$cursor = $collection->find();

当我们调用 find 方法的时候,会生成一个 MongoCursor 对象,而这时候只是生成一个内存中的对象而已,并不会把我们的 find 查询发送到服务端,因为在生成 MongoCursor 对象后,我们还可能对它做一些其它操作,比如 sort,limit 等等。这就对查询条件进行了改变。

那什么时候 PHP 会对 MongoDB 发起 find 的网络请求呢,是在 MongoCursor 调用 getNext 方法的时候。比如我们在上面代码的基础上,再执行 sort 和 getNext 两个方法:

$cursor->sort( array( 'name' => 1 ) );
$result = $cursor->getNext();

这时候第二行代码就会触发 find 的网络请求,具体请求的内容如下图,下图是对这次请求的二进制协议进行解析后的数据结构展示:

从上面图中我们可以看到,Number to Return 字段是0,MongoDB 协议里0表示不做限制,获取全部数据。所以这一次的 find 操作会把所有这个 collection 中的所有数据都拿到。而我们调用一次 getNext 实际上只拿到一条数据。那是不是说我们每调一次 getNext,PHP 就会进行一次网络请求获取一条数据呢?结果当然是否定的,这样效率未免也太低了。那好,那是不是 PHP 在第一次调用 getNext 就把所有数据拿回来,存在内存中,然后后续的 getNext 调用都在本地内存里取就行了呢?结果还是否定的,这样数据量大点 PHP 就容易被暴菊了吧。

所以事实上是怎么做的呢?我们来看下面一张图:

图上的 Number Returned 的值是101,也就是说 MongoDB 给我们返回了101条数据,这个101实际上就是服务器默认的 batchSize 大小。也就是说在没有指定返回多少条的情况下,会默认返回101条数据。这101条数据会存在 PHP 的内存中,这样后续的100次 getNext 调用,都不会再进行网络请求,而是直接从内存中返回数据。

如果我们在上面的 getNext 后再进行下面的调用。

// skip the other 100 docs
for ($i = 0; $i < 100; $i++) { $cursor->getNext(); }
// request document 102:
$result = $cursor->getNext();

上面先循环调用了100次 getNext,内存中的101项数据就都已经被取光了,然后当我们再次调用 getNext 去获取第102条数据的时候,PHP 内存中已经没有数据可以提供了,这时候又会再发起一次向 MongoDB 服务器的请求,去获取更多的数据。客户端这次会发起如下请求:

这次我们看到,请求的码变成了 Get More。也就是在上次的基础上获取更多数据。这时候实际 MongoDB 不会再按一个特定的条数返回数据,而是按一个特定的大小,目前是4M,也就是说,这一次,MongoDB 会返回最多4M的数据。对上面的请求,MongoDB 的返回如下:

这次返回结果中,标识了是从第101条开始,共返回了34673条数据。大小是4194378,正好是4M。

设置batchSize

上面我们说了,MongoDB 默认的 batchSize 是101条,这个条数实际上我们可以通过客户端来设定的。在 PHP 中,通过 batchSize 函数来进行设置。比如我们用下面命令设定 batchSize 为25:

$cursor = $collection->find()->sort

阅读全文

Python 的 WSGI 服务器 Gunicorn

Gunicorn 绿色独角兽 是一个Python WSGI UNIX的HTTP服务器。这是一个pre-fork worker的模型,从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器大致与各种Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。

结构图:

uWSGI 的性能比较:

特点:

  • 本身支持WSGI、Django、Paster
  • 自动辅助进程管理
  • 简单的 Python配置
  • 允许配置多个工作环境
  • 各种服务器的可扩展钩子
  • 与 Python 2.x > = 2.5,3.x >= 3.2 兼容

安装:

$ pip install gunicorn $ cat myapp.py # -*- coding: utf-8 - from wsgiref.validate import validator from gunicorn import __version__ @validator   def app(environ, start_response):       if environ['REQUEST_METHOD'].upper() != 'POST': data = b'Hello, World!\n' else: data = environ['wsgi.input'].read()       start_response("200 OK", [           ("Content-Type", "text/plain"),           ("Content-Length", str(len(data)))       ])

阅读全文

hhvm3.0的坑

最近新架构升级了hhvm版本,从2.2升级到了3.0,运行环境增加了一个虚拟化用的容器,结果遇到一个诡异的现象,在基本相同代码、相同压力下,cpu消耗远大于升级前。

经过仔细排查,虚拟化容器里有不少文件是软链(这是一个兄弟部门的自研容器,有大范围的实际应用),而问题就在hhvm一个叫CheckSymLink的软链配置上,该配置项说明如下:“如果php文件或其上级目录为符号链接,则__FILE__会返回实际目录地址。但开启会影响性能,所以如果目录中没有符号链接,建议关闭CheckSymLink

阅读全文

python如何搭建http web服务器

使用python做了些很有趣的代码封装,希望能在php+nginx里调用,因为使用了第三方库的原因很难移植,除了用php执行python命令调用外,有什么更好的办法吗?

试了下,可以用python启一下webserver来实现http server的封装。下边实现一个用http接口访问python,执行简单的时间戳转日期,用来做示范。

#!/usr/bin/env python # -*- coding: utf-8 -*- """ File: python_server.py Desc: python服务测试 """ from BaseHTTPServer import BaseHTTPRequestHandler from BaseHTTPServer import HTTPServer import os import re import time import urllib #自定义处理程序,用于处理HTTP请求 class TestHTTPHandler(BaseHTTPRequestHandler): def

阅读全文

小猪学arduino—使用DS3231芯片测量温度

上一篇,我们尝试了 DS3231高精度时钟模块的使用 ,今天我们试一下这个芯片集成的数字温度传感器(传感器每64秒采集一次,精度为±3℃)。

看了下uRTCLib库没有温度相关的函数,但实际芯片上是有温度测量模块的,跟时钟一样通过串口通信,为了省事就直接在uRTCLib库上进行改造,以使它支持温度的获取。通过arduino官方开发工具库添加的库默认位置在

/Users/yanjingang/Documents/Arduino/libraries/目录下。

一、uRTCLib添加温度获取功能

vim uRTCLib/src/uRTCLib.h  #添加温度变量和函数声明

class uRTCLib {
	private:
		uint8_t _temperature = 0;
	public:
		uint8_t temperature();
}

vim uRTCLib/src/uRTCLib.cpp  #实际温度获取

void uRTCLib::refresh() { //给串口发送指令,获取温度信息 byte temp; Wire.beginTransmission(URTCLIB_ADDRESS); Wire.write(uint8_t(0x11)); Wire.endTransmission(); Wire.requestFrom(URTCLIB_ADDRESS, 2); temp = Wire.read(); // Here's the MSB _temperature

阅读全文

小猪学arduino—DS3231高精度时钟模块的使用

ds3231

arduino是个功能很弱的单片机,自身没有获得当前时间的功能。仅有的mills()记录系统运行时长函数在49天左右后也会溢出而重置,无法用于时钟,故只能外加一个时钟芯片。

网上搜到的常用芯片一般是ds1307,比小指甲盖还小,成本只有几毛钱,很划算。因为后续我还有存储信息的需求,所以最终选择了集成DS3231 AT24C32 高精度时钟模块 IIC模块 存储模块功能的芯片,大概2/3大拇指那么大,某宝上一堆。

ds3231时钟模块参数如下:

DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。包含扭扣电池,断开主电源时仍可保持精确的计时

RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。
精密的、经过温度补偿的电压基准和比较器电路用来监视VCC状态,检测电源故障,提供复位输出,并在必要时自动切换到备份电源。另外,/RST监视引脚可以作为产生μP复位的手动输入。
除计时精度高之外,DS3231还具有一些其它功能,这些功能扩展了系统主机的附加功能和选择范围。该器件内部集成了一个非常精确的数字温度传感器,可通过I2C*接口对其进行访问(如同时间一样)。这个温度传感器的精度为±3°C。片上控制电路可实现自动电源检测,并管理主电源和备用电源(即低压电池) 之间的电源切换。如果主电源掉电,该器件仍可继续提供精确的计时和温度,性能不受影响。当主电源重新加电或电压值返回到容许范围内时,片上复位功能可用来重新启动系统微处理器。

模块参数:
1.尺寸:38mm(长)*22mm(宽)*14mm(高)
2.重量:8g
3.工作电压:3.3–5.5V
4.时钟芯片:高精度时钟芯片DS3231
5.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟
6.带2个日历闹钟
7.可编程方波输出
8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿
9.芯片内部自带温度传感器,精度为±3℃
10.存储芯片:AT24C32(存储容量32K)
11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)
12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x57
13.带电池CR2032,保证系统断电后,时钟任然正常走动
14.包装方式:单个防静电包装
一、接线说明(以Arduino uno r3为例):
SCL→A5
SDA→A4
VCC→5V
GND→GND

二、安装uRTCLib库(找来找去,还是这个库好用,似乎是针对这快集成芯片封装的)

三、使用uRTCLib库测试初始化和读取ds3231的时间

#include <uRTCLib.h> #include "Arduino.h" #include "Wire.h" #include "uRTCLib.h" uRTCLib rtc; unsigned int pos; void setup() { delay (2000); Serial.begin(9600); Serial.println("Serial OK"); // Max position: 32767 for (pos = 0; pos < 1000; pos++) { rtc.eeprom_write(pos, (unsigned char) pos % 256); } //芯片初次使用时初始化一次当前时间,成功后注掉这行 //rtc.set(0

阅读全文

Git常用命令与Svn命令对比

场景 Svn Git
下载代码 svn checkout git clone
加入版本控制 svn add git add
本地提交 git commit
提交到服务器 svn commit git push
获取其他人的更新 svn update git fetch/pull[fetch不会自动merge,pull自动merge]
查看状态 svn status / log / diff git status / log / diff
新建本地分支 git branch
切换分支/版本 svn switch git checkout
合并分支 svn merge git merge/rebase

CentOS6安装GitLab

GitLab 是将issues, code review, CI and CD 整合到独立的网站UI,版本控制使用GIT。

1.安装配置依赖项

sudo yum install curl openssh-server openssh-clients postfix cronie
sudo service postfix start  
(注:如果postfix启动失败,直接运行/usr/sbin/postfix start查看报错信息并解决即可。通常是因为ipv6的原因,把/etc/postfix/main.cf的inet_protocols值all改成ipv4即可)
sudo chkconfig postfix on
sudo lokkit -s http -s ssh

2.添加GitLab仓库,并安装到服务器上

wget

阅读全文

小猪学arduino—1602LCD液晶显示屏

%e6%9c%aa%e5%91%bd%e5%90%8d

本次实验使用arduino直接驱动1602液晶显示字母。
1602液晶在应用中非常广泛,最初的1602液晶使用的是HD44780控制器,现在各个厂家的1602模块基本上都是采用了与之兼容的IC,所以特性上基本都是一致的。

1602LCD主要技术参数
显示容量为16×2个字符;
芯片工作电压为4.5~5.5V;
工作电流为2.0mA(5.0V);
模块最佳工作电压为5.0V;
字符尺寸为2.95×4.35(W×H)mm。

1602采用标准的16脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光电源正极
第16脚:背光电源负极

1602直接与arduino通信,根据产品手册描述,分8位连接法与4位连接法,本实验使用8位连接法。硬件连接方式如下图好电路后,就可以开始编写程序了。
8位连接法:

4位连接法:

8位与4位连接法除初始化时不同,其它是一样的。

在Arduino的安装目录下\libraries\LiquidCrystal可以查看到函数的原型
LiquidCrystal()——定义你的LCD的接口:各个引脚连接的I/O口编号,格式为LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
begin()——定义LCD的长宽(n列×n行),格式lcd.begin(cols, rows)
clear()——清空LCD,格式lcd.clear()
home()——把光标移回左上角,即从头开始输出,格式lcd.home()
setCursor()——移动光标到特定位置,格式lcd.setCursor(col, row)
write()——在屏幕上显示内容(必须是一个变量,如”Serial.read()”),格式lcd.write(data)
print()——在屏幕上显示内容(字母、字符串,等等),格式lcd.print(data)
lcd.print(data, BASE)
cursor()——显示光标(一条下划线),格式lcd.cursor()
noCursor()——隐藏光标,格式lcd.noCursor()
blink()——闪烁光标,格式lcd.blink()
noBlink()——光标停止闪烁,格式lcd.noBlink()
display()——(在使用noDisplay()函数关闭显示后)打开显示(并恢复原来内容),格式lcd.display()
noDisplay()——关闭显示,但不会丢失原来显示的内容,格式为lcd.noDisplay()
scrollDisplayLeft()——把显示的内容向左滚动一格,格式lcd.scrollDisplayLeft()
scrollDisplayRight()——把显示的内容向右滚动一格,格式为lcd.scrollDisplayRight()
autoscroll()——打开自动滚动,这使每个新的字符出现后,原有的字符都移动一格:如果字符一开始从左到右(默认),那么就往左移动一格,否则就向右移动,格式lcd.autoscroll()
noAutoscroll()——关闭自动滚动,格式lcd.noAutoscroll()
leftToRight()——从左往右显示,也就是说显示的字符会从左往右排列(默认),但屏幕上已经有的字符不受影响,格式lcd.leftToRight()
rightToLeft()——从右往左显示,格式lcd.rightToLeft()
createChar()——自造字符,最多5×8像素,编号0-7,字符的每个像素显示与否由数组里的数(0-不显示,1-显示)决定,格式lcd.createChar(num, data)
参考源程序如下:

#include <LiquidCrystal.h> //申明1602液晶的函数库 //申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一 LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2); //8数据口模式连线声明 //LiquidCrystal lcd(12,11,10,5,4,3,2); //4数据口模式连线声明 int i; void setup(){ lcd.begin(16,2)

阅读全文

python发送post请求

python发送post请求代码示例:

import sys import httplib, urllib import traceback def post(params): '发送post请求' result = {'status':500, 'reason':'', 'response':'', 'headers':''} httpClient = None try: data = urllib.urlencode(params['data']) httpClient = httplib.HTTPConnection(params['hostname'], params['port'], timeout=30) if params.has_key('header'): httpClient.request("POST"

阅读全文