54chen Twitter Memo 2011-10-23

    小米科技2012校园招聘行程更新[确定部分场地]
http://t.co/gIzt1qOT # 有人在使用maven nexus的时候遇到过snapshot目录文件数dailybuild后过多,后面再计算最新文件时超时的问题吗? # http://t.co/Ya6Loj44 riak的nagios监控plugin # CAP的正确解法应该是:努力提升P能力,CA二选一,CA不可兼顾。并没有固定P能力之说,以前都谬了。 # MIT:Mobile Internet Talk/Miliao Infrastructure Talk/其实是米聊内部技术系列讲座 # 小米科技2012校园招聘行程 http://t.co/5IxFut2n # riak源码阅读手记 操作列表及supervisorTree一览 http://t.co/WAWN6RY2 # 54chen Twitter memo 2011-10-16 http://t.co/1uHkEdXm #

小米科技2012校园招聘行程更新[确定部分场地]

东北 大连理工 西部校区 10/24-25 18:00-22:00 西部校区综合教学2号楼B401
吉林大学 南区 10/26-27 18:00-21:30 李四光楼109教室
哈工大 本部 10/28-29 18:30-22:00 正心楼21室
合肥 中国科学技术大学 西校区 10/31-01 18:30-20:30 西区学生活动中心学术报告厅
广州 华南理工 南校区 11/01--02 19:00-21:30 南校区 A4204室
中山大学 东校区 11/02--03 18:00-21:30 公共教学楼
上海 复旦大学 张江校区 11/02--03 18:30-21:00 张江行政楼106报告厅
同济大学 嘉定校区 11/04--05 18:00-20:00 行政楼224
上海交通大学 闵行校区 11/11-12 19:00-21:00 光彪楼一楼多功能厅
南京 南京大学 鼓楼校区 11/08--09 18:30-21:00 南园21舍203报告厅
南京理工大学 本部 11/09-10 19:00-21:30 艺文馆多功能厅
东南大学 九龙湖校区 11/10-11 18:30-21:30 阶梯教室教三305室
南京邮电大学 三牌楼校区 11/11-12 18:00-21:30 科学会场一楼演讲厅
南京航空航天大学 明故宫校区 11/14-15 18:30-22:00 明宫校区13号楼103
杭州 浙江大学 玉泉校区 11/17-18 18:00-21:30 玉泉永谦活动中心第二报告厅
西安 西安电子科技大学 北校区 11/18-19 19:00-21:00 阶梯教室110室
西北大学 南校区 11/21-22 19:00-21:00 长安校区2j201教室
西北工业大学 友谊校区 11/22-23 19:00-21:00 航空楼报告厅D座
西安交通大学 本部 11/23-24 19:00-21:00 学生就业中心一楼报告厅
成都 电子科技大学 清水河校区 11/21-22 19:00-22:00 学生活动中心二楼圆厅
四川大学 江安校区 11/22-23 14:00-18:00 四川大学江安校区第二基础实验楼B座报告厅
天津 南开大学 本部 11/17-18 18:00-23:00 伯苓楼一楼报告厅
天津大学 本部 11/25-26 18:30-21:30 大学生活动中心一层
武汉 武汉大学 人文学部 12/07-08 18:00-21:30 人文馆主厅
华中科技大学 本部 12/08-09 19:00-21:30 大学生活动中心305
北京 北京邮电大学 10月27日 18:30-20:30 教三楼535室
北京理工大学 11月3日 18:30-20:30 中心教学楼407
北京航空航天大学 11月15日 18:30-21:00 1号楼316室
清华大学 11月16日 18:30-20:30 第二教学楼403报告厅
北京大学
济南 山东大学
沈阳 东北大学
长沙 中南大学
湖南大学
 小米,校园招聘

受场地影响,小米2012校园招聘的行程会不断更新,有最新消息我会尽快更新。欢迎应届的朋友们加入我们的队伍。

小米科技2012校园招聘行程

小米,校园招聘 一年一度的校园招聘又开始了,在这里发一发,对我们有兴趣的应届生,欢迎提前联系,主动改动人生。mail to chenzhen at xiaomi.com

区域 学校 校区 预定时间
日期
东北 大连理工 西部校区 10/24-25
吉林大学 南区 10/26-27
哈工大 本部 10/28-29
合肥 中国科学技术大学 西校区 10/31-01
广州 华南理工 南校区 11/01--02
中山大学 东校区 11/02--03
上海 复旦大学 张江校区 11/02--03
同济大学 嘉定校区 11/04--05
上海交通大学 闵行校区 11/11-12
南京 南京大学 鼓楼校区 11/08--09
南京理工大学 本部 11/09-10
东南大学 九龙湖校区 11/10-11
南京邮电大学 三排楼校区 11/11-12
南京航天航空 明宫校区 11/14-15
杭州 浙江大学 玉泉校区 11/17-18
西安 西安电子科技大学 北校区 11/18-19
西北大学 南校区 11/21-22
西北工业大学 友谊校区 11/22-23
西安交通大学 本部 11/23-24
成都 电子科技大学 清水河校区 11/21-22
四川大学 江安校区 11/22-23
天津 南开大学 本部 11/17-18
天津大学 本部 11/25-26
武汉 武汉大学 人文学部 12/07-08
华中科技大学 本部 12/08-09
北京 清华大学 11.16
北京大学
北京航空航天大学
北京理工大学 11月3日
北京邮电大学 10.27

Riak源码阅读手记 操作列表及supervisorTree一览

基于0.14.2的记录,1.0的变化会在后续记录。 riak riak源码阅读手记一 初出茅庐 项目入口 http://www.54chen.com/_linux_/riak-source.html riak源码阅读手记二 左右开弓 启动 http://www.54chen.com/_linux_/riak-cource-code.html riak源码阅读手记 运行安装 http://www.54chen.com/_linux_/riak-source-install-run.html 一些常用的指令: http://wiki.basho.com/Command-Line-Tools.html#riak-admin riak源码阅读手记 压力测试 http://www.54chen.com/_linux_/riak-benchmark.html riak源码阅读手记 操作列表及supervisorTree一览 http://www.54chen.com/_linux_/riak-source-notes-operation-supvisor-detail.html [山寨收集操作列表]

看系统状况,有各种内存cpu硬盘的情况
bin/riak-admin status

节点更换新的ip地址:
如果是所有的节点都换,那在停下来集群,在每个节点都依次运行:
./riak-admin reip riak@192.168.103.9 riak@10.235.2.226
./riak-admin reip riak@192.168.97.48 riak@10.235.2.183
./riak-admin reip riak@192.168.100.52 riak@10.235.2.138

依次去对应的节点,修改etc:

  1. sed -i 's/192.168.103.9/10.235.2.226/g' app.config  
  2. sed -i 's/192.168.103.9/10.235.2.226/g' vm.args  
  3.   
  4. sed -i 's/192.168.97.48/10.235.2.183/g' app.config  
  5. sed -i 's/192.168.97.48/10.235.2.183/g' vm.args  
  6.   
  7. sed -i 's/192.168.100.52/10.235.2.138/g' app.config  
  8. sed -i 's/192.168.100.52/10.235.2.138/g' vm.args   

进入运行着的集群:
./riak attach
ctrl+d退出

看ring的分布情况:
>{ok,Ring} = riak_core_ring_manager:get_my_ring().

[看一点代码] riak_kv_app -> riak_core->riak_core_sup[supervisor]-> riak_core_sup
|-riak_core_handoff_manager handoff管理 gen_server
|-riak_core_handoff_listener handoff接收 gen_nb_server
|-riak_core_ring_events 处理ring变化 gen_event
|-riak_core_ring_manager ring管理 gen_server2
|-riak_core_node_watcher_events 节点侦察 gen_event
|-riak_core_node_watcher 节点 gen_server
|-riak_core_gossip gossip协议 gen_server

[riak里的自定义behaviour] -gen_nb_server from gen_server
-gen_server2 gen_server的一个拷贝 增加了pxxx的办法及增加了许多参数
-riak_core_vnode from gen_fsm
riak_kv:
-riak_kv_backend Riak backend behaviour

54chen Twitter Memo 2011-10-09

    十一回来,小米米聊team吸各路php好手,一到两年经验的大侠们,团队主要方向:php java erlang,如果你有计划在php以外的领域有所建树,请速来:chenzhen at xiaomi.com。
# 54chen Twitter memo 2011-10-02 http://t.co/cCI9keqP #

54chen Twitter Memo 2011-10-02

    riak java client针对riak1.0.0的rc1昨天才发出来,想尝鲜还需要时日,官方的宣传以http为主,实际使用时pb才是王道。
# 北京时间1号凌晨4点,riak 1.0 正式发布。此版本经2年时间15次RC,话说我也贡献了一个bug。这次改动实际上弱化了bitcask,巧妙利用了leveldb完成了Secondary Indexes。http://t.co/TI4z1Ymh (左右键翻页) # @rednaxelafx @turingbook OceanBase不能算作一类,tair beansdb nuclear或多或少都有dynamo的影子,而oceanbase已经很不一样了。 # “API design is like sex: Make one mistake and support it for the rest of your life.” – @joshbloch # thrift最佳实践:版本与兼容 http://t.co/419R7gYk # riak坏处:不好debug,节点关系变化是危险的,默认使用的bitcask所有的key都维护在内存里,List-keys操作可能会搞死一个集群。 # 54chen Twitter memo 2011-09-25 http://t.co/jIjRPKtr #

Thrift最佳实践:版本与兼容

facebook,thrift

十分苦逼的api提供过程。一次提供,终身负责制。

"API design is like sex: Make one mistake and support it for the rest of your life." - @joshbloch

Structs: 在许多系统里面,被称做message.

协议随着岁月而演变,如果一个已经存在的消息类型不再满足需求,但是你仍然想使用原来使用thrift文件生成的代码,比如你想在现在的消息类型上增加一个额外的字段。

不用担心人,不搞坏原来的任何代码而更新消息类型,是非常简单的,只需要时刻记录以下的规则

1.不要修改现存的任何已经存在字段的数字标签

2.任何新增的字段应该是optional的,这就意味着,所有新定义产生的代码都能解析新老的格式,因为一定会有任何一个标上required的元素。你应该设置可能的默认值给这个元素,让新代码与老数据也能正常协作。与此类似,新数据也能被老代码解析,老的实现解析时会忽略新的字段。尽管如此,未知的字段不能被丢弃,并且如果消息被延迟序列化,未知的字段也会被一起序列化,因此当消息到达新代码的时候,新字段依旧可用。

3.当你更新的消息类型里不再包括相关的标签数字时,非required字段可以删除。(把这个废字段改名,比如说加个前缀OBSOLETE_ ,可以防止未来维护.thrift文件人误用原来的数字,这做法可能更好。)

4.修改默认值基本上是OK的,但是你记得这个默认值永远不会“串线”。比如,如果程序收到一个在某个字段没有值的消息,程序会看那个版本里定义的默认值。这可能会导致得不到正确的默认值。

cassandra的thrift定义:http://svn.apache.org/viewvc/cassandra/trunk/interface/cassandra.thrift?view=co
fb303的定义:http://svn.apache.org/repos/asf/thrift/trunk/contrib/fb303/if/fb303.thrift
scribe的定义:https://github.com/facebook/scribe/blob/master/if/scribe.thrift

from:ThriftThe Missing Guide

54chen Twitter Memo 2011-09-25

    riak的开发很细致,test很全,我提的bug确认就修改了,还不忘邮件告诉我已经merge了代码:http://t.co/s1HZVaoG
# 小数一下,我们已经使用了十多项开源系统或者技术了,包括的范围有网络框架、存储系统、项目管理、分布式计算、持续构建、代码质量、包管理、监控、服务管理... # @arthur369 @virushuo 汗死了。。。 # http://t.co/Z9t3ESH5 riak1.0.0 rc1放出来了,亮点:Secondary Indexes;LevelDB;Search。修复了许多bug。 # 用supervisord管理杂乱的服务 http://t.co/3TY9Ubwj # 54chen Twitter memo 2011-09-18 http://t.co/tbb4VqGM # 54chen Twitter memo 2011-09-18 http://t.co/IXhzMo9s #

用supervisord管理杂乱的服务

supervisord

Supervisord是用Python实现的一款非常实用的进程管理工具,在批量服务化管理时特别有效。

环境

centos
python2.4

安装

wget http://pypi.python.org/packages/source/s/supervisor/supervisor-3.0a10.tar.gz#md5=99c6fbd45bade87301296b7a597fb68e

tar zxvf supervisor-3.0a10.tar.gz
cd supervisor-3.0a10
python setup.py install
如果上述遇到问题,请按如下操作。

依赖setuptools安装

wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg#md5=bd639f9b0eac4c42497034dec2ec0c2b
sh setuptools-0.6c11-py2.4.egg

产生基础配置文件

echo_supervisord_conf > /etc/supervisord.conf

配置

[inet_http_server]前面的分号去掉;
定义port=192.168.1.1:8888

启动

supervisord -c /etc/supervisord.conf

查看

浏览器打开 http://192.168.1.1:8888 深入配置

[program:service]
command=sh /opt/soft/service/run.sh ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/soft/service/ ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)

以上配置了一个shell脚本的启动和stop过程。
一般java程序都喜欢在一个shell脚本内初始化classpath,再执行java main。
直接在shell中run java会出现stop失败的情况,在启动前添加 exec即可。

#!/bin/sh
export CLASSPATH=.
for jarpath in `ls library/*.jar`
do
CLASSPATH=$CLASSPATH:$jarpath
done
export CLASSPATH=$CLASSPATH
exec java com.chen.main;

帮助

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。
supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
supervisorctl start programxxx,启动某个进程
supervisorctl restart programxxx,重启某个进程
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,并按新的配置启动、管理所有进程。
supervisorctl reread,当一个服务由自动启动修改为手动启动时执行一下就ok

如何添加进程不启动所有的服务进程

1)修改/etc/supervisord.conf
2)supervisorctl reread
3)supervisorctl add xxservice

如何删除进程不启动所有的服务进程

1)修改/etc/supervisord.conf
2)supervisorctl reread
3)supervisorctl update
http://smarden.org/runit/runscripts.html 一些可参考的启动配置

supervisord开机自启动 chkconfig --add supervisord #加为服务
运行ntsysv,选中supervisord启动系统时跟着启动。
[/etc/rc.d/init.d/supervisord]

#!/bin/sh
# # /etc/rc.d/init.d/supervisord
# # Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
# # chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord

# Source init functions
. /etc/rc.d/init.d/functions

prog="supervisord"

prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid"

start()
{ echo -n $"Starting $prog: "
daemon $prog_bin --pidfile $PIDFILE
[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
echo
}

stop()
{ echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
}

case "$1" in

start)
start
;;

stop)
stop
;;

status)
status $prog
;;

restart)
stop
start
;;

*)
echo "Usage: $0 {start|stop|restart|status}"
;;

esac

注意 不带参数运行supervisord是以daemon方式运行。
把supervisord加入到开机启动项里就可以完成监控进程的功能了。
当supervisord以非daemon方式运行时,杀掉supervisord后,被监控的进程也退出了。
而以daemon方式运行,杀掉supervisord对被监控进程无影响。