10月 04

python 链接 redis 测试

[2011-9-11 张子萌]
[2012-5-27 张子萌 修改]
  安装支持的模块,简单的方法是使用easy_install
# easy_install redis

  也可以下载安装包手动安装。做个简单的写入测试,使用有664039行的密码表,将密码放到redis中。代码如下:

#!/usr/bin/env python
import redis
def main():
    r = redis.Redis(host='192.168.1.200', port=6379, db=0)
    w_pass=open('big_pass.txt','r').readlines()
    next_line=0
    count_lines=len(w_pass)
    while next_line+1 < count_lines:
        r.set(str(next_line),w_pass[next_line])
        next_line=next_line+1
    print 'Game over!'
if __name__=='__main__':
    main()

测试服务器为一个Xeon(TM)双核 3.20GHz 的 cpu,内存4G。
a)写入
用两台机器做测试。两台机器均在一个千兆局域网内。实验很简单所以只记录了cpu的负载和脚本运行时间。
# time python test_redis1.py
Game over!
real 4m16.878s
user 0m55.910s
sys 0m16.879s

cpu部分
远端机缓存 load average: 1.46, 1.26, 1.34

Redis服务器 load average: 0.52, 0.30, 0.22

单台服务器本地测试:
# time python python_redis.py
Game over!
real 1m32.065s
user 1m2.643s
sys 0m17.890s

cpu部分
load average: 1.32, 0.57, 0.32

b)存环从reids中读取所有数据,测试结果如下:
两台服务器:
# time python test_redis1.py
Game over!

real 4m32.776s
user 1m3.687s
sys 0m17.675s

Redis服务器Cpu部分
load average: 0.90, 0.96, 0.69
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27525 root 15 0 117m 110m 712 S 7.3 2.8 2:55.36 redis-server

单台服务器本地测试:
# time python python_redis.py
Game over!

real 1m44.790s
user 1m9.294s
sys 0m19.031s

Cpu部分
load average: 1.36, 0.92, 0.63

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3255 root 18 0 153m 47m 2640 R 87.1 1.2 0:29.43 python
27525 root 15 0 117m 110m 712 S 33.1 2.8 2:29.26 redis-server

Redis的其它操作并未测试,但是从当前测试看,单进程每秒读写差不多再7000-8000,cpu使用维持在百分之三十多,确实效率不错。
注为了测试方便,我的redis服务没有加密码。如需加访问密码或有其它需参数,参考如下:
host='localhost'
port=6379
db=0
password=None
socket_timeout=None
connection_pool=None
charset='utf-8'
errors='strict'
unix_socket_path=None

9月 28

pyinotify监控文件和文件夹变化

【2011-9-28 张子萌】

之前写了脚本,死循环调用inotifywait监控文件夹,如果文件有变动,则启动

rsync进行同步。但是当前需求有点变化,文件要按照日期建文件夹进行存储,

且文件变化很快,如果直接监控最顶级目录系统资源将消耗很大,所以考虑还是自

写一下好,如果系统资源量变化大,且不用时时同步时可以根据文件变动对变动

对文件进行记录,可以按照优先规则进行同步。

官方网站 : http://trac.dbzteam.org/pyinotify

系统要求:Linux kernel with inotify 2.6.13

Python 2.4

直接使用easy_install安装非常简单

# sudo easy_install pyinotify

如果不能联网,则需要直接下载压缩包,进行编译安装。

首先测试下是否可用:

使用以下命令监控/tmp文件夹,

# python -m pyinotify /tmp

/tmp文件夹下新建1.txt,并随后进行删除。看到显示的记录如下:

效果不错,继续向下进行。只要有创建、删除和关闭写就打印出变化的文件或目录,代码如下:

import re

import pyinotify

wm = pyinotify.WatchManager()

mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE

class EventHandler(pyinotify.ProcessEvent):

def process_IN_CREATE(self, event):

self.rebuild(event)

def process_IN_DELETE(self, event):

self.rebuild(event)

def process_IN_CLOSE_WRITE(self, event):

self.rebuild(event)

def rebuild(self, event):

chang_name=re.compile(“.+.swp$|.+.swx$|.+.swpx$”)

if not chang_name.match(event.pathname):

print event.pathname

handler = EventHandler()

notifier = pyinotify.Notifier(wm, handler)

wdd = wm.add_watch(‘/tmp’, mask, rec=True,auto_add=True )

notifier.loop()

代码里使用正则表达式过滤因为使用vim打开文件产生的缓存文件。也可以用exclude_filter方法

在官方文档中例子如下,但是我测试多次没有成功,所以直接用正则过滤。

# Exclude patterns from list

excl_lst = [‘^/etc/apache[2]?/’,

‘^/etc/rc.*’,

‘^/etc/hostname’,

&nb
sp;
‘^/etc/hosts’,

‘^/etc/(fs|m)tab’,

‘^/etc/cron..*’]

excl = pyinotify.ExcludeFilter(excl_lst)

# Add watches

res = wm.add_watch([‘/etc/hostname’, ‘/etc/cups’, ‘/etc/rc0.d’],

pyinotify.ALL_EVENTS, rec=True, exclude_filter=excl)

如果监控文件太多,需要对系统做一下修改sysctl -n -w fs.inotify.max_user_watches=16384

7月 07

mongodb双机主从同步初步学习

mongodb主从同步
【2011-07-06 张子萌】

mongodb的主从同步非常简单。主机启动声明自己是主机,从机启动时只需要声明自己是从机,
并填写主机的IP和端口启动即可。

数据同步实现了读写分离,在压力比较大的时候可以设置多太从机,分离读的压力。主从模式有
数据复制和Replica pairs模式模式服务器
断电或者损坏的情况下的从机会自动接管,并升级为主服务器。主机在修复后变为从机,当从机宕机
后系统会自动切换为之前的主机。在主从认证的同时也会有认证机制,用户可以创建用户信息。

a)在mongod中主从的参数如下
–master 主机模式
–slave 从机模式
–source arg 在从机上指定主机的信息
–only arg 在从机上可以指定一个数据库用于复制
–slavedelay arg 同步的延时时间,单位是秒
–autoresync 自动重新同步主服务器上的所有document。

测试环境
主从服务器存储的路径均是/data/db
主服务器IP地址为:192.168.1.51
从服务器IP地址为:192.168.1.52

b) 开始实验

需要注意两台服务器的时间要调为一致,最好设定定时同步时间。
1.分别启动主从服务器
启动主服务器使用默认端口27017
./mongod -dbpath /data/db –master
启动从服务器10002 端口
./mongod -dbpath /data/db –source 192.168.1.51:27017 –slave –port 27017 –autoresync –slavedelay 1
启动后如果从主服务器连接成功,就可以看到复制内容的信息。
当发现从服务器的数据不是最新时,就用到了autoresync和slavedelay两个参数。
启动同步系统会打出大量信息,可以使用“> /dev/null &”屏蔽日志信息。

2.测试主从同步
在主服务器新建数据库
./mongo
> use mytest
> db.mytest.save({“context”:”I am here!”})
> db.mytest.save({“context”:”hello world”})
> db.mytest.find()
可以查看到两条数据。

在从服务器上查看同步数据
./mongo
MongoDB shell version: 1.8.1
connecting to: test
> show dbs
admin
local
test
> use mytest
switched to db testdb
> db.mytest.find()
通过查询两条数据已经同步过来。

删掉“hello world”的记录。删除只能在主机上操作。
> db.mytest.remove({“context”:”hello world”})
再次到主从台机器检查,记录已经被删掉。同步数据操作完成。

3.测试从库宕机数据丢失
从库宕机数据丢失,需要将数据从备机机同步到主机上。

首先停止主机删掉数据。(直接到数据目录下rm -rf 即可)
将备机改为主机运行,之后修好主机将主机启动为备机运行即可。

在从机上操作,停止从机进程(mongod)。删除Slave数据目录中的local.*。以主机模式启
动。待之前的主机修好后以从机模式启动即可。

3月 01

shell 打印拷贝进度

写了一个脚本做大量数据拷贝,但是拷贝的时间比较常,不知道当前进度如何,是否死机,于是写了一段关于拷贝百分比的输出,详细参见以下脚本。

#!/bin/bash
# ——————————————————————————-
# Filename: copy_percent.sh
# Revision: 1.0
# Date: 2011-03-01
# Author: simon-zzm
# Email: simon-zzm@163.com
# ——————————————————————————-

SOURCE=$1
TARGET=$2

/bin/cp -r “$SOURCE” “$TARGET” &

compute_percent() #
{
SOURCE_SIZE=`/usr/bin/du -s ${1}|awk ‘ ”{print $1}’`
TARGET_SIZE=`/usr/bin/du -s ${2}|awk ‘ ”{print $1}’`
let “i=(${TARGET_SIZE}*100)/${SOURCE_SIZE}”
return $i
}

compute_percent ${SOURCE} ${TARGET}
while [ ${i} -lt ‘100’ ]
do
compute_percent ${SOURCE} ${TARGET}
echo $i’%’
sleep 1
done
echo “ok”