2010年12月24日星期五
2010年12月17日星期五
转载:Facebook 架构学习
在 QCon 2008 (旧金山站) 上Facebook 做的这个技术分享有不少值得借鉴的东西。所以,暂停对 QCon 北京的回顾,临时插播一贴。
设计原则
- 尽可能的使用开源软件,并且在需要优化的时候进行优化
- Unix 哲学。包括,模块化原则;整合化原则;清晰化原则等
- 任何组件具备扩展性
- 最小化故障影响
- 简化,简化,简化!
架构概览
Facebook 是 LAMP 的坚定支持者,也差不多是用 LAMP (或许用 LAM2P 更适合) 实现的最大的动态站点。
基础组件加上服务,中间用自己实现的一些工具进行粘合。其中关于运维细节的事情基本不会说出来的,这是很多公司的软实力所在。
PHP 经验
MySQL 经验
- 主要用于做 Key-Value 类型的存储操作,数据随机分布在多台逻辑实例上,访问多数基于全局 ID 。
- 逻辑实例分散在多台物理主机上(超过1800台),负载均衡在物理层进行。
- 不做读复制。
- 尽量不做逻辑数据迁移(成本太高)。
- 不做 JOIN 操作 (豆瓣在 QCon 上也阐述了这一点)。数据是随机分布的,关联操作反而带来了极大的复杂度。
- 对于数据访问,主要的操作集中在最新的数据上,针对这部分做优化,旧的数据进行归档。
- 在中心 DB 绝不存储非静态数据。
- 使用服务或者 Memcached 进行全局查询。
Memcached 经验
参见我以前的笔记:Facebook 的 Memcached 扩展经验。Facebook 对 Memcached 做了不小的改进。另外,顺便说一下,前两天 Memcached 刚在 1.2.7 发布几天之后又发布了新版本 1.2.8,修正了一些问题。
一个比较有价值的是关于个人页面数据的获取的描述。这个就完全是需要做单页面 Benchmark 的细致活儿了,可能还需要产品经理能够理解工程师的"抵抗"。
- 获取个人信息数据:通过Cache,隐性通过用户所在的 DB 获取(基于 User-ID 获知 DB)
- 获取朋友连接信息:通过Cache,否则的话通过DB(基于 User-ID 获知 DB)
- 并行抓取每个朋友的 10个照片相册 ID ,从Cache抓取,如果失效,再从 DB 抓取(基于相册 ID)
- 并行抓取最近相册中的照片数据
- 运行PHP 把整个业务逻辑跑出来
- 返回数据给用户
然后是对 Facebook 非 LAMP 体系的东西做了一番介绍,基本上也开源了。最后参考两个架构图。
Facebook NewsFeed 的架构示意图
Facebook 搜索功能的架构示意图
管中窥豹,盲人摸象而已。
--EOF--
留言评论 | Comments (5)
2010年12月16日星期四
Gentoo下安装Oracle 11g
折腾了一个下午,终于在gentoo下安装成功。安装过程都是记忆中仅存的,系统环境为去年某时装的gentoo 2007.0 amd64,由于gentoo下没有安装桌面环境,所以在一台windows的机器上装了xming,设置xming的启动参数增加-ac,否则gentoo在设置了DISPLAY后会提示connect refuse的信息。
安装前的准备工作:
1: 增加用户和组
groupadd -g 10000 dba
groupadd -g 10001 oinstall
useradd -u 10000 -g dba -G dba,oinstall -s /sbin/bash -m -d /oracle oracle
2:安装一些需要(也许需要,因为除了错误就找解决的方法,安装了以下的)软件包
emerge sun-jdk libaio logger libstdc++-v3 app-emulation/emul-linux-x86-baselibs app-emulation/emul-linux-x86-xlibs
3:设置oracle用户的.bash_profile
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/11g
export ORA_CRS_HOME=$ORACLE_BASE/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
export ORACLE_SID=orcl1
export PATH=$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:${PATH}:$HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib:$ORACLE_HOME/oracm/lib:$ORACLE_HOME/lib
export LIBPATH=$LIBPATH:$ORA_CRS_HOME/lib:$ORACLE_HOME/lib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/jlib:$ORACLE_HOME/network/jlib:$ORACLE_HOME/JRE
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export NLS_LANG=american_america.WE8ISO8859P1
export DISPLAY=10.60.4.137:0
export EDITOR=vi
4:sysctl
kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=262144 net.core.wmem_max=262144
5:安装oracle
su – oracle
cd database
./runInstaller
安装过程中碰到的问题:
Error 1: undefined reference to __pthread_unwind@GLIBC_PRIVATE 解决方法: 编辑$ORACLE_HOME/lib/sysliblist,在-ldl -lm -lpthread -lnsl -lirc -lipgo后加-lrt Error 2: cannot find -lagtsh 解决方法: 将database/stage/Components/oracle.rdbms.util/11.1.0.6.0/1/DataFiles/filegroup14.jar文件解压缩,copy 32位的libagtsh.so.1.0文件到$ORACLE_HOME/lib32目录中 Error 3: skipping incompatible /usr/lib64/libpthread_nonshared.a when searching for /usr/lib64/libpthread_nonshared.a 解决方法: 修改$ORACLE_HOME/bin/genclntsh: [ "$1" = "lib32" ] && ULIB="lib32" && LOOP="DONE" && CF=-m32 && USRLIB32=-L/usr/lib32 LD="gcc ${CF} -shared -Wl,-relax ${STUBS} ${USRLIB32} -L${OLIB}" 修改$ORACLE_HOME/bin/genagtsh: if [ $1 != "-32" ]; then LIB_NAME=$1 # Library name LIB_VER=$2 # Library version number LIB=lib NON64_LDOPT= USRLIB32= else LIB_NAME=$2 # Library name LIB_VER=$3 # Library version number LIB=lib32 LOOP="done" NON64_LDOPT="-m32" USRLIB32=-L/usr/lib32 fi LD="gcc ${NON64_LDOPT} -shared ${USRLIB32} -L${ORACLE_HOME}/${LIB} -L${ORACLE_HOME}/${LIB}/stubs" 修改$ORACLE_HOME/ctx/lib/env_ctx.mk: LDFLAGS32=$(AMD32FLAGS) -o $@ -L/usr/lib32 $(LDPATHFLAG)$(PRODLIBHOME32) $(LDPATHFLAG)$(LIBHOME32) $(LDPATHFLAG)$(LIBHOME32)stubs/ 修改$ORACLE_HOME/rdbms/lib/env_rdbms.mk: REDEFINES32=LIBDIR=lib32 LDFLAGS='-m32 -o $$@ -L/usr/lib32 $$(LDPATHFLAG)$$(PRODLIBHOME) $$(LDPATHFLAG)$$(LIBHOME) $$(LDPATHFLAG)$$(LIBHOME)stubs/' Error 4: cannot find -lclntsh 解决方法: 下载oracle client 32bit的zip包,解压缩,然后将client/stage/Components/oracle.rdbms.ic/11.1.0.6.0/1/DataFiles/filegroup4.jar文件解压缩,copy 32位的libclntsh.so.11.1文件到$ORACLE_HOME/lib32目录中 Error 5: gcc: /usr/lib64/libstdc++.so.6: No such file or directory 解决方法: cd /usr/lib64/ ; ln -s libstdc++.so.5 libstdc++.so.6
参考:
NewsFeed 的架构对SNS类型的网站有很好的借鉴意义,这里的数据传输基本可以算是三角传输的实现,aggregators的作用非常大,完成了数据的合并排序。
不知这个问题在这问合不合适。。。
我最近在做一个webim,类似facebook。。。
我想用comet技术来做。。
现在又两种方案,您能帮着分析下吗?
(1)后端用erlang --- 难点erlang比较难上手。。。
(2)后端用nginx + php --- 不知nginx能否承受像如webim的这种comet的大并发数。。
不知能否给点意见??
@kakashi
用最熟悉的东西去做。 之前做评估,而不是靠想象
@kakashi
方案2里的nginx+php里的短板应该不是nginx。
我目前的应用就是comet.(nginx+tomcat)不过不是im而是webgame
我目前的应用就是comet.(nginx+tomcat)不过不是im而是webgame