Mongodb 学习整理之介绍

tinyfisher 发表于 2013-07-09

What is Mongodb?

MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSQL数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。那什么是NoSQL呢?

What is NoSQL?

NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库。这类数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。

Why NoSQL?

随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:

对数据库高并发读写的需求

web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系型数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO 就已经无法承受了,其实对于普通的BBS网站,往往也存在对高并发写请求的需求。

对海量数据的高效率存储和访问的需求

对于大型的SNS网站,每天用户产生海量的用户动态信息,以国外的Friend feed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。

对数据库的高可扩展性和高可用性的需求

在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,可是停机维护随之带来的就是公司收入的减少

基于以上三点,NoSQL在现在越来越流行。

Why Mongodb?

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的bjson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。

ok,既然MongoDB如此神奇,那么我们该怎么安装和使用他呢?下篇blog继续介绍。

利用Hostapd搭建无线wifi

tinyfisher 发表于 2013-06-23

网上这类文章一大堆,但都有一些问题,应该是环境不一样,所以在搭建之前,先说下我的环境:

1.Linux系统:ubuntu 10.04

2.无线网卡:TP-LINK WN822N(需要网卡支持Master模式,其他网卡请自行搜索)

ok, 下面介绍如何搭建:

step1:安装网卡驱动,网卡都不识别的话就gg了,请参见我的博文《TL-WN822N TL-WN722N linux安装驱动》,识别之后

ifconfig wlan1 10.0.0.1  

为网卡设置ip地址。

step2:下载hostapd,在解压安装之前,先安装libnl和libssl,否则hostapd无法编译通过,命令如下:

sudo apt-get install libnl-dev
sudo apt-get install libssl-dev  

step3:安装hostapd,解压压缩包,终端进入到hostapd文件夹,configuremakemake install 常见的三个步骤

step4:修改配置文件,在hostapd文件夹里的etc目录下,找到hostapd.conf文件,编辑如下

interface=wlan1 // 根据你的无线网卡名修改
driver=nl80211  //重要
ssid=tinyfisher  //这是AP名称
channel=6
hw_mode=g
ignore_broadcast_ssid=0
auth_algs=1
wpa=3
wpa_passphrase=xxxxxxxx   //这是你的密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP  

启动hostapd,命令:

./hostapd -B hostapd.conf  

之后就可以搜索到 tinyfisher的wifi了。

但是此时设备还不能通过wifi上网,还需要搭建dhcp服务器:

sudo apt-get install dnsmasq  

修改/etc/dnsmasq.conf

interface=wlan1 #根据你的网卡名称修改
dhcp-range=10.0.0.10,10.0.0.110,6h     #设置dhcp地址范围,即租借时间6小时
dhcp-option=3,10.0.0.1 #配置网关
dhcp-option=6,202.114.128.2  #配置dns,请自己修改为外网的dns地址  

重启

dnsmasq:/etc/init.d/dnsmasq restart  

ok,此时连接到wifi上的设备都能被随机分配到从10.0.0.10~10.0.0.110 的地址

现在就能上网了吗?不行,我们还需要一个外网出口,并且将内网的流量通过这个外网接口连出去,其实就是做一个SNAT,所以我们还需要设置iptables,命令如下:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE    //其中eth0就是外网接口,请根据你的实际情况修改  

最后一步,开启网卡转发功能:

echo 1 >/proc/sys/net/ipv4/ip_forward  

搞定收工!

2013微软暑期实习笔试错题、疑题整理

tinyfisher 发表于 2013-05-23

参加了微软“智在未来”暑期实习笔试,跪了,将错题、疑题整理如下,方便后面复习整理。

**What’s the output of the following code?(3 Points) ** B

class A  
{  
public:  
    virtual void f()  
    {  
        cout<<"A::f()"<<endl;  
    }  
    void f() const  
    {  
        cout<<"A::f() const"<<endl;  
    }  
};  
  
class B: public A  
{  
public:  
    void f()  
    {  
        cout<<"B::f()"<<endl;  
    }  
    void f() const  
    {  
        cout<<"B::f() const"<<endl;  
    }  
};  
  
void g(const A* a)  
{  
    a->f();  
}  
  
int main()  
{  
    A* a = new B();  
    a->f();  
    g(a);  
    delete a ;  
}  

A. B::f()B::f()const    
B. B::f()A::f()const  
C. A::f()B::f()const    
D. A::f()A::f()const  

解析:类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。

在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:**有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员; **

没有 const 修饰的成员函数,对数据成员则是可读可写的。除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。

What is the difference between a linked list and an array?(3 Points) (全选)

A. Search complexity when both are sorted  

B. Dynamically add/remove  

C. Random access efficiency  

D. Data storage type  

【此题D选项存在疑问】

About the Thread and Process in Windows, which description(s) is(are) correct:(3 Points) C

A. One application in OS must have one Process, but not a necessary to have one Thread  

B. The Process could have its own Stack but the thread only could share the Stack of its parent Process  

C. Thread must belongs to a Process  

D. Thread could change its belonging Process  

解析:A选项,一个程序至少有一个进程,一个进程至少包含一个线程(主线程)

B选项,线程共享父进程的数据空间,也可以拥有自己的栈空间

C对,线程不能独立存在,必须属于一个进程

D明显错误

Please choose the right statement about const usage:(3 Points) ABC

A. const int a; //const integer  

B. int const a; //const integer  

C. int const *a; //a pointer which point to const integer  

D. const int *a; //a const pointer which point to integer  

E. int const *a; // a const pointer which point to integer  

解析:这里注意一下A、B的写法均可,两者意思一样

1 of 1000 bottles of water is poisoned which will kill a rat in 1 week if the rat drunk any amout of the water. Given the bottles of water have no visual difference, how many rats are needed at least to find the poisoned one in 1 week?(5 Points) B

A. 9  

B. 10  

C. 32  

D. None of the above  

解析:2的10次方=1024,大于1000,用二进制的思维思考问题

**Which of the following statement(s) equal(s) value 1 in C programming language?(5 Points) ** BCD

A. the return value of main function if program ends normally

B. return (7&1)  

C. char *str="microsoft"; return str=="microsoft"  

D. return "microsoft"=="microsoft"  

E. None of the above  

解析:A选项,C程序正常退出,return 0;

B选项,计算即可得

C选项,因为C语言中是没有bool类型的(1个字节,只有0,1),所以返回1

D选项,同C

How many rectangles you can find from 3X4 grid?(5 Points) D

A. 18  

B. 20  

C. 40  

D. 60 

E. None of above is correct  

解析:智力题 整不了

Which of the following sorting algorithm(s) is(are) stable sorting?(5 Points) A

A. bubble sort  

B. quick sort  

C. heap sort  

D. merge sort  

E. Selection sort  

解析:不稳定排序:“快选希堆”,原地排序:“快选希堆冒”

Model-View-Controller(MVC) is an architectural pattern that frequently used in web applications. Which of the following statement(s) is(are) correct:(5 Points) AB

A. Models often represent data and the business logics needed to manipulate the data in the application  

B. A view is a (visual) representation of its model. It renders the model into a form suitable for interaction, typically a user interface element  

C. A controller is the link between a user and the system. It accepts input from the user and instructs the model and a view to perform actions based on that input  

D. The common practice of MVC in web applications is, the model receives GET or POST input from user and decides what to do with it, handing over to controller and which hand control to views(HTML-generating components)  

E. None of the above  

解析:不是很清楚,关于MVC,请看这篇blog,写得挺直白的http://www.ruanyifeng.com/blog/2007/11/mvc.html

Given a set of N balls and one of which is defective (weighs less than others), you are allowed to weigh with a balance 3 times to find the defective. Which of the following are possible N?(13 Points) ABCD

A. 12  

B. 16  

C. 20  

D. 24  

E. 28  

解析:A选项:第一次:4,4,4 第二次:2,2,第三次:1,1, B选项:第一次:5,5,6,第二次:若在某一个5中,2,2,1;若在6中,2,2,2,;第三次1,1, C选项:第一次:7,7,6,;第二次:若在某一个7中,2,2,3;若在6中,2,2,2;第三次,1,1 D选项:第一次:8,8,8;第二次:2,3,3;第三次1,1

fluentd插件开发

tinyfisher 发表于 2013-05-01

fluentd默认支持了一些插件,如apache,但是最近做项目对squid日志进行分析时,发现fluentd没有这个默认插件,需要自己开发,方法如下 自己编写一个ruby脚本,比如:in_mytail.rb,将他放到/etc/td-agent/plugin 即可

修改/etc/td-agent/td-agent.conf

<source>
	type mytail
	path /path/to/myformat_file
	tag myapp.mytail
<source>  

标签里面是日志来源,type表示input插件类型,这里是自己编写的类型,path是源日志文件,tag是标签,用于区分其他插件.

<match **>
	type stdout
</match>  

用于输出,这里输出到stdout,可以是file,mongodb等,看自己需要. 调试模式:

td-agent -vv  

ruby脚本如下

class MyTailInput < Fluent::TailInput  
  Fluent::Plugin.register_input('mytail', self)  
  
  # Override 'configure_parser(conf)' method.  
  # You can get config parameters in this method.  
  def configure_parser(conf)  
    @time_format = conf['time_format'] || '%Y-%M-%d %H:%M:%S'  
  end  
    
  # Override 'parse_line(line)' method that returns time and record.  
  # This example method assumes following log format:  
  #   %Y-%m-%d %H:%M:%S\tkey1\tvalue1\tkey2\tvalue2...  
  #   %Y-%m-%d %H:%M:%S\tkey1\tvalue1\tkey2\tvalue2...  
  #   ...  
  def parse_line(line)  
    elements = line.split("\t")  
    time="2012-11-11 11:11:11"  #why unknow  
    t_time = Time.strptime(time, @time_format).to_i  
    record = {}  
    record['logtime']=elements[0]  
    record['logcontent']=elements[1]  
    return t_time, record  
  end  
end  

Mongodb的备份与恢复

tinyfisher 发表于 2013-04-23

坑爹的保密检查需要擦除硬盘,所有环境都需要重新安装,Mongodb数据库需要进行备份,还好Mongodb为我们提供了mongodumpmongorestore两种方法,非常方便。

进到mongodb的bin目录下:

备份:

mongodump -d Injection   //Injection 就是你要备份的数据库

执行之后会生成dump文件夹,里面子目录Injection就是备份的数据

恢复:

mongorestore -d Injection dump/Injection

这样就完成的备份与恢复,是不是十分方便呢~随后送上其他环境配置日志,坑爹的保密检查。