• MongoDB 地理位置索引的实现原理

    地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B+Tree的形式,下文将为你描述。

    首先假设我们将需要索引的整个地图分成16×16的方格,如下图(左下角为坐标0,0 右上角为坐标16,16):

    map1

    单纯的[x,y]的数据是无法建立索引的,所以MongoDB在建立索引的时候,会根据相应字段的坐标计算一个可以用来做索引的hash值,这个值叫做geohash,下面我们以地图上坐标为[4,6]的点(图中红叉位置)为例。

    我们第一步将整个地图分成等大小的四块,如下图:

    map2

    划分成四块后我们可以定义这四块的值,如下(左下为00,左上为01,右下为10,右上为11):

    01 11
    00 10

    这样[4,6]点的geohash值目前为 00

    然后再将四个小块每一块进行切割,如下:

    map3

    这时[4,6]点位于右上区域,右上的值为11,这样[4,6]点的geohash值变为:0011

    继续往下做两次切分:

    map4

    map5

    最终得到[4,6]点的geohash值为:00110100

    这样我们用这个值来做索引,则地图上点相近的点就可以转化成有相同前缀的geohash值了。

    我们可以看到,这个geohash值的精确度是与划分地图的次数成正比的,上例对地图划分了四次。而MongoDB默认是进行26次划分,这个值在建立索引时是可控的。具体建立二维地理位置索引的命令如下:

    db.map.ensureIndex({point : "2d"}, {min : 0, max : 16, bits : 4})

    其中的bits参数就是划分几次,默认为26次。

  • mongoDB主从同步笔记

    同步之前做个笔记

    centos下yum方式安装最新版本的mongodb

    vi /etc/yum.repos.d/10gen.repo,输入下面的语句:

    [10gen]
    
    name=10gen Repository
    
    baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
    
    gpgcheck=0

    查看最新版本信息:

    yum info mongo-10gen-server

    安装:

    yum install mongo-10gen-server

    升级:

    yum update mongo-10gen mongo-10gen-server

    启动:service mongod start


    主从服务器各自安装好带连接认证的mongodb

    use admin
    
    db.addUser('sa','sa')

    1.首先我们备份好数据库

    备份数据库foo

    mongodump -uroot -p -d foo -o /data/backup/database/

    附带一个还原命令:

    (mongorestore  -uroot -p -d foo –drop /data/backup/database/)

    2.主从加同步认证账号:

    主服务器和从服务器必须开启安全认证:–auth, 主服务器和从服务器的admin数据库中必须有全局用户, 然后主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。

    use local
    db.addUser('repl','repl')

    主服务器:
    vi /etc/mongo.conf

    master = true
    source = 172.16.1.22,172.16.1.23(从库ip)

    从服务器:

    vi /etc/mongo.conf<
    slave = true
    source =172.16.1.11:27017

    各自重启服务器:

    3.查看数据是否全部同步过来了

    附上:mongodb的备份脚本

    #!/bin/sh
    
    today=$(date +"%Y%m%d")
    
    old7day=$(date -d "7 days ago" +"%Y%m%d")
    
    cd /data/backup/database/
    
    /usr/local/mongodb/bin/mongodump -uroot -ppassword -o /data/backup/database/
    
    zip -rP 888888 /data/backup/database/xz_ad_db_${today}.zip foo
    
    zip -rP 888888 /data/backup/database/admin_db_${today}.zip admin
    
    rm -rf /data/backup/database/foo
    
    rm -rf /data/backup/database/admin
  • 利用Bucardo 将PostgresSQL数据同步到MongoDB

    Bucardo 是一个用 Perl 语言编写的 PostgreSQL的多Master节点复制系统
    它支持任意方式的同步,以下是同步到mongodb的说明
    参考:http://blog.endpoint.com/2011/06/mongodb-replication-from-postgres-using.html

  • mysql 自动检测主从同步状态的一个小脚本

    Slave机器的IO和SQL状态都必须为YES,才是同步状态;

    #!/bin/bash 
    #Check MySQL Slave's Runnning Status
    #Crontab time 00:10
    
    MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`
    MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'`
    STATUS=$(/usr/bin/mysql -uroot -p123qwe -S /var/lib/mysql/mysql.sock -e "show slave status\G" | grep -i "running")
    IO_env=`echo $STATUS | grep IO | awk  ' {print $2}'`
    SQL_env=`echo $STATUS | grep SQL | awk  '{print $2}'`
    DATA=`date +"%y-%m-%d %H:%M:%S"`
    
    function checkMysqlStatus(){
    	if [ "$MYSQLPORT" == "3306" ]
    	then
    		/usr/bin/mysql -uroot -p123qwe --connect_timeout=5 -e "show databases;" &>/dev/null 2>&1
    		if [ $? -ne 0 ]
    		then
    			echo "Server: $MYSQLIP mysql is down, please try to restart mysql by manual!" > /var/log/mysqlerr
                mail -s "WARN! server: $MYSQLIP  mysql is down." xxxx@126.com < /var/log/mysqlerr
    		else
    			echo "mysql is running..."
    		fi
    	else
    		mail -s "WARN!Server: $MYSQLIP mysql is down." mailcity@126.com
    	fi
    }
     
    checkMysqlStatus
    
    if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]
    then
      echo "MySQL Slave is running!"
    else
      echo "####### $DATA #########">> /var/log/mysql/mysql_slave_status.log
      echo "MySQL Slave is not running!" >>    /var/log/mysql/mysql_slave_status.log
      echo "MySQL Slave is not running!" | mail -s "WARN! $MYSQLIP MySQL Slave is not running." xxxx@126.com
    fi
    
  • 压测工具 siege

    siege下载地址:http://www.joedog.org/pub/siege/siege-3.0.3.tar.gz

    centos 下编译安装

    ./configure

    make

    make install

    创建.siegec.config配置文件到当前用户的家目录下  /roor/.siegerc
    /usr/local/bin/siege.config

    使用

    50个用户(每次并发量,注意不是每秒并发量) 重复100次 共产生 50 * 100 = 5000个请求
    /usr/local/siege/bin/siege -c 50 -r 100  https://www.abc.com/a.php

    50个用户 重复100次 发送GET参数
    /usr/local/siege/bin/siege -c 50 -r 100  https://www.abc.com/a.php?name=zhangsan

    50个用户 重复100次 发送POST参数 (注意引号)
    /usr/local/siege/bin/siege -c 50 -r 100  “https://www.abc.com/a.php POST name=zhangsan”

    50个用户 重复100次 发送POST参数(从文件中读取)
    /usr/local/siege/bin/siege -c 50 -r 100  “https://www.abc.com/a.php POST < /root/ab_test/post.xml”

    另外还有发送时间参数等
    详情请man 或 siege -h
    参考链接:http://www.joedog.org/siege-home/

  • 张开你的大嘴

    昨晚帮一个美女装无线路由,折腾完都12点了,
    走的时候她竟然跟我说晚上骑车不好,不安全,要不留下住一晚吧。
    真是可笑,哥的车技如同行云流水,怎么会不安全!?
    20分钟就到家啦!

    今天在十字路口碰到俩打架得,周围很多人看热闹,
    警察也来了,一打听才得知,
    原来这俩人是到十字路口烧纸的,
    其中一个烧纸的时候说:爸,你生前没花到多少钱,现在给你多烧点,弄个飞机开。
    另一个烧纸的听到后,边烧纸边嘟囔:操、真JB能吹,爸,我也给你多烧点,买个大炮,专门轰飞机。
    然后就打起来了!

    某村搞计划生育,成年男子一律结扎。一个老光棍坐不住了,到计生办要求结扎。
    工作人员火了:你凑什么热闹,人家结扎的都是有老婆的,你一个人扎啥子?
    老光棍也火了,愤愤地说:全村的男人都结扎了,那以后村里哪个女人怀孕了,
    不都要赖在我头上吗?老子没那么傻!

    牙疼到医院拔牙,前面有一个四五岁小男孩不愿意治疗,哭闹,怎么哄都不行。
    男孩儿妈妈就说:“不疼的,乖,要不让后面的叔叔先来,你看看叔叔疼不疼”
    男孩儿点头答应。于是我坐在治疗椅上治疗,医生很麻利地打麻药,拿钳子拔牙。
    尼玛拔断了有没有,然后各种拽拉,终于拔掉了,弄的老子满嘴是血。
    疼的我啊啊大叫,眼泪都出来了。然后之前的那男孩吓傻了,哭着跑了……
    我只想说:姐,我真不是装的,是真他妈疼啊!你原谅我吧!

  • 思考

    有两种方式构建软件设计:一种是把软件做得很简单以至于明显找不到缺陷;另一种是把它做得很复杂以至于找不到明显的缺陷。

    一个人,一定要想清楚自己五年后要做什么,不要只看着眼前。

  • 运气就是机会碰巧撞到了你的努力

    行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。

    活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。

    宁愿做过了后悔,也不要错过了后悔。

    学的到东西的事情是锻炼,学不到的是磨练。

    过错是暂时的遗憾,而错过则是永远的遗憾!

    勇气是控制恐惧心理,而不是心里毫无恐惧。

    人一生下就会哭,笑是后来才学会的。所以忧伤是一种低级的本能,而快乐是一种更高级的能力。

    放弃该放弃的是无奈,放弃不该放弃的是无能,不放弃该放弃的是无知,不放弃不该放弃的是执著!

    一杯清水因滴入一滴污水而变污浊,一杯污水却不会因一滴清水的存在而变清澈。

    运气就是机会碰巧撞到了你的努力。

    只有你学会把自己已有的成绩都归零,才能腾出空间去接纳更多的新东西,如此才能使自己不断的超越自己。

  • linux抓包 tcpdump命令详解

    tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    实用命令实例

    默认启动

    tcpdump

    普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。

    监视指定网络接口的数据包

    tcpdump -i eth1

    如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。

    监视指定主机的数据包

    打印所有进入或离开sundown的数据包.

    tcpdump host sundown

    也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包

    tcpdump host 210.27.48.1

    打印helios 与 hot 或者与 ace 之间通信的数据包

    tcpdump host helios and \( hot or ace \)

    截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

    tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.

    tcpdump ip host ace and not helios

    如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

    tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    截获主机hostname发送的所有数据

    tcpdump -i eth0 src host hostname

    监视所有送到主机hostname的数据包

    tcpdump -i eth0 dst host hostname

    监视指定主机和端口的数据包

    如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令

    tcpdump tcp port 23 host 210.27.48.1

    对本机的udp 123 端口进行监视 123 为ntp的服务端口

    tcpdump udp port 123

    监视指定网络的数据包

    打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为’Berkeley网络’的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)

    tcpdump net ucb-ether

    打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)

    tcpdump 'gateway snup and (port ftp or ftp-data)'

    打印所有源地址或目标地址是本地主机的IP数据包

    (如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络.(nt: 此句翻译曲折,需补充).localnet 实际使用时要真正替换成本地网络的名字)

    tcpdump ip and not net localnet

    监视指定协议的数据包

    打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))

    tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

    打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)

    tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

    (nt: 可理解为, ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算

    成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2,
    即 ((tcp[12]&0xf0)>>2). ((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去
    tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的’Payload Length’ 与 ‘tcp头的长度’的差值, 并且其中表达方式’ip[]’需换成’ip6[]’.)

    打印长度超过576字节, 并且网关地址是snup的IP数据包

    tcpdump 'gateway snup and ip[2:2] > 576'

    打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报

    tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

    打印除’echo request’或者’echo reply’类型以外的ICMP数据包( 比如,需要打印所有非ping 程序产生的数据包时可用到此表达式 .
    (nt: ‘echo reuqest’ 与 ‘echo reply’ 这两种类型的ICMP数据包通常由ping程序产生))

    tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

    tcpdump 与wireshark

    Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。
    还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。

    tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

    (1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
    (2)-i eth1 : 只抓经过接口eth1的包
    (3)-t : 不显示时间戳
    (4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
    (5)-c 100 : 只抓取100个数据包
    (6)dst port ! 22 : 不抓取目标端口是22的数据包
    (7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
    (8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

    使用tcpdump抓取HTTP包

    tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

    0x4745 为”GET”前两个字母”GE”,0x4854 为”HTTP”前两个字母”HT”。

    tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

  • 商业计划

    少听身边人的话,多听有结果人的话。

    预测大趋势,就能找到大商机;预测小趋势,只能找到小商机。商机有方法,创业有思路。

    商学院百万学费收获的最有用东西

    战略方向:
    一、SWOT分析法:

    Strengths:优势;
    Weaknesses:劣势;
    Opportunities:机会;
    Threats:威胁

    意义:帮您清晰地把握全局,分析自己在资源方面的优势与劣势,把握环境提供的机会,防范可能存在的风险与威胁,对我们的成功有非常重要的意义。

    战术层面:

    二、PDCA循环规则

    Plan:制定目标与计划;
    Do:任务展开,组织实施;
    Check:对过程中的关键点和最终结果进行检查;
    Action:纠正偏差,对成果进行标准化,并确定新的目标,制定下一轮计划。

    意义:每一项工作,都是一个pdca循环,都需要计划、实施、检查结果,并进一步进行改进,同时进入下一个循环,只有在日积月累的渐进改善中,才可能会有质的飞跃,才可能取得完善每一项工作,完善自己的人生

    三、5W2H法

    What:工作的内容和达成的目标
    Why:做这项工作的原因
    Who:参加这项工作的具体人员,以及负责人
    When:在什么时间、什么时间段进行工作;
    Where:工作发生的地点
    How:用什么方法进行
    How much:需要多少成本

    意义:做任何工作都应该从5W2H来思考,这有助于我们的思路的条理化,杜绝盲目性。我们的汇报也应该用5W2H,能节约写报告及看报告的时间。

    四、SMART原则  目标管理

    Specific 具体的;
    Measurable 可测量的;
    Attainable 可达到的;
    Relevant 相关的;
    Time based 时间的;

    意义:人们在制定工作目标或者任务目标时,考虑一下目标与计划是不是SMART化的。只有具备SMART化的计划才是具有良好可实施性的,也才能指导保证计划得以实现。

    特别注明:有的又如此解释此原则
    —S代表具体(Specific),指绩效考核要切中特定的工作指标,不能笼统;
    —M代表可度量(Measurable),指绩效指标是数量化或者行为化的,验证这些绩效指标的数据或者信息是可以获得的;
    —A代表可实现(Attainable),指绩效指标在付出努力的情况下可以实现,避免设立过高或过低的目标;
    —R代表现实性(realistic),指绩效指标是实实在在的,可以证明和观察;
    —T代表有时限(time bound),注重完成绩效指标的特定期限。

    五、时间管理-重要与紧急

    急迫
    不急迫
    重要
    紧急状况
    迫切的问题
    限期完成的工作
    你不做其他人也不能做
    准备工作
    预防措施
    价值观的澄清
    计划
    人际关系的建立
    真正的再创造
    增进自己的能力
    不重要
    造成干扰的事、电话、
    信件、报告
    会议
    许多迫在眉捷的急事
    符合别人期望的事
    忙碌琐碎的事
    广告函件
    电话
    逃避性活动
    等待时间

    优先顺序=重要性*紧迫性
    在进行时间安排时,应权衡各种事情的优先顺序,要学会“弹钢琴”。
    对工作要有前瞻能力,防患于未然,如果总是在忙于救火,那将使我们的工作永远处理被动之中。

    六、任务分解法[WBS]

    即Work Breakdown  Structure,如何进行WBS分解:目标→任务→工作→活动

    WBS分解的原则:
    将主体目标逐步细化分解,最底层的任务活动可直接分派到个人去完成;每个任务原则上要求分解到不能再细分为止。

    WBS分解的方法:
    至上而下与至下而上的充分沟通;
    一对一个别交流;
    小组讨论

    WBS分解的标准:
    分解后的活动结构清晰;
    逻辑上形成一个大的活动;
    集成了所有的关键因素包含临时的里程碑和监控点;
    所有活动全部定义清楚

    意义:学会分解任务,只有将任务分解得足够细,您才能心里有数,您才能有条不紊地工作,您才能统筹  安排您的时间表

    价值创造

    七、二八原则

    巴列特定律:“总结果的80%是由总消耗时间中的20%所形成的。”   按事情的“重要程度”编排事务优先次序的准则是建立在“重要的少数与琐碎的多数”的原理的基础上。举例说明:
    80%的销售额是源自20%的顾客;
    80%的电话是来自20%的朋友;
    80%的总产量来自20%的产品;
    80%的财富集中在20%的人手中。