技术运营
Git – the fast version control system
Git 一个轻量,易用的版本管理工具。
http://git-scm.com/
如何安装?(CentOS 5)
1.安装相关的包。
yum install zlib-devel
yum install openssl-devel
yum install perl
yum install cpio
yum install expat-devel
yum install gettext-devel
2.安装Git.
./configure
make
make install
如何使用?
http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
如何在CAKEPHP应用中嵌套另一个CAKEPHP应用 – TAPD3新版本的部署方案
我们的tapd3新版本(一个CAKEPHP应用)要发布了,但是由于某原因不能代替现有的老版本(另一个CAKEPHP应用)。两个版本必须并存。但域名只有一个(tapd3.oa.com),并且已经被老版本占用着。
那么我们的tapd3新版本只能挂tapd3.oa.com的一个目录下了,目录就暂定为tapd3.oa.com/beta/吧。这样,访问http://tapd3.oa.com/beta时就是访问新版本,访问http://tapd.oa.com的话还是以前的老版本。
方案定下来了,动手进行配置。
注:下文出现的TAPD3_ROOT表示tapd3老版本(一个CAKEPHP应用)的根目录。
1.了解现有的设置:
服务器: apache
配置有虚拟主机:tapd3.oa.com;其DocumentRoot为TAPD3_ROOT/app/webroot;此目录已经打开AllowOverRide
2.设置虚拟主机的DocumentRoot.
把虚拟主机:tapd3.oa.com的DocumentRoot设为TAPD3_ROOT,这个并没有任何影响,效果跟值为TAPD3_ROOT/app/webroot时一样的。因为默认下CAKEPHP的根目录有这样的一个.htaccess文件。
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
这个文件的作用是把当前目录下的所有请求重定向到app/webroot/下面。
3.放入代码。
先把tapd3新版本的代码checkout一份到TAPD3_ROOT目录下(跟config/ controller/ model/ view/ 目录同一级),并以bata命名。
4.修改TAPD3_ROOT目录下的.htaccess文件。
如果Apache没有作其它配置的话,访问http://tapd3.oa.com/beta/时,请求数据应该就会到beta这个目录下面去找。但是CAKEPHP根目录,也就是我们的TAPD3_ROOT目录下面存在着第2步所说的这个.htaccess文件。把http://tapd3.oa.com/beta/这个请求的服务器数据路径被重定向到app/webroot下面去了,以致不能达到我们想要的效果。
这里要改动一下这个.htaccess文件,使访问http://tapd3.oa.com/beta/时,服务器还是去beta目录去查找数据。改变后的.htaccess文件如下:
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteCond ${REQUEST_URI} !beta //这句表示请求uri不等于beta时,下面的重写命令才生效。
RewriteRule (.*) app/webroot/$1 [L]
大功做成!
访问http://tapd3.oa.com还是原来的CAKEPHP应用;
访问http://tapd3.oa.com/bata/就是新的CAKEPHP应用啦。
如何利用Ruby来解析XML
前段时候做个小工具,把每天的svn日志抽出来取,再把必要的信息通过邮件方式知会大家。
最后采用的技术是ruby on rails 的rake。实现过程中必须要用ruby解析xml文件。上网查了一些相关的资料,方法有很多,在这里做一个汇总:
1. 使用REXML
doc = REXML::Document.new(File.open(file_path))
doc.elements.each(’log/logentry’) do |ele|
author_ele = ele.get_elements(’author’)
msg_ele = ele.get_elements(’msg’)
end
2. 使用XmlSimple
xml_file = File.open(file_path)
data = XmlSimple.xml_in(xml_file)
data['logentry'].each do |item|
item['msg']
item['author']
end
3. 使用Hpricot
Hpricot是一个HTML解释的库,支持XML。Hpricot允许开发者通过CSS-selectors和X-Path访问html元素,因此你很轻松就可以明确目标标记,还有它是用C语言写的,因此相当快。
安装方法:gem install hpricot
# load the RedHanded home page
doc = Hpricot(open(”http://redhanded.hobix.com/index.html”))
# change the CSS class on links
(doc/”span.entryPermalink”).set(”class”, “newLinks”)
# remove the sidebar (doc/”#sidebar”).remove
# print the altered HTML
puts doc
实战!如何恢复丢失的数据
今天2009年2月11号,我们TAPD3系统出了一个运营事故,数据库需求表的部份数据丢失了!
针对这类问题,我们一般是分两条线去处理。
1. 迅速作数据恢复。
2. 追查问题根源。
今天我先谈一下,我们的TAPD系统是如何作数据恢复的。
首先,必须要了解我们服务器数据备份的策略。我们服务器是采用公司统一的分布式的备份机制,直接备份指定的整个目录或文件。周六全备份,其他天每天凌晨增量备份。简单来说我们会将服务器上的重要文件每天放到另外一个服务器中去。公司是使用一些相关的软件来管理备份的。如果是简单的备份,我们用scp结合crontab也可以做到。
了解数据的备份策略后,那要作数据恢复那很简单了。说白了就是要备份的数据从备份服务器copy回来。公司备份机制是有专人在管理的,只要联系一下接口人就可以取回自已想要的数据备份。
如果只是文件的丢失,经过上述处理就可以了。
如果是Mysql数据库中数据丢失的话,像这次我们碰到的运营事故一样,就要多做一些额外的数据库处理了。总结了一下,大致步骤如下:
1. 取回想要的完好的Mysql数据备份。
我们的Mysql服务器数据存储目录为/data/db/。而每个库会以一个个目录的形式存在于Mysql数据存储目录:如tapd库的数据就存储在这样的目录下:/data/db/tapd/。 在库目录下面是一些的表文件,每个表都会有三个表文件(*.frm、*.MYD和*.MYI文件),如tickets表就会有这样的三个文件:tickets.frm、tickets.MYD和tickets.MYI。
这次运营事故中,是tapd库的数据丢失了,丢失时间是2009年02月11号,所以我们只要从取回tapd库在2009年02月10号凌晨的备份文件就可以了。tapd库备份文件是放在这个目录下:/data/db/tapd。
2. 通过备份文件恢复数据库。只要将mysql库备份目录copy到本地的Mysql数据存储目录就可以了。(这一过程强烈建议在开发机上处理)
要恢复的2009年02月10号tapd库,我们把备份的库文件(/data/db/tapd) copy到nvwa的mysql数据存储目录(/data/db/)目录下。为了避免重复,copy的同时要将文件目录改为tapd20090210。这样后,nvwa的mysql中就多了一个名字为tapd20090210的库,这个库就是2009年02月10号凌晨的数据。
3.将从备份文件恢复过来的数据库中的相关数据dump到正式服务器中。这一步可以使用mysqldump这个工具来实现,当然使用一些数据库管理软件也没有问题。
恢复10号的需求表的数据,我这里就简单用navicat把需求表的数据直接导入正式库中就完事了。到这里我们只是恢复10号凌晨以前的数据,而10号到事故发生的时间段内的数据还是丢了。要找回这些数据就要利用mysql的log了,一般是使用mysqlbinlog这个工具来实现的。这个Topic franky研究细致后再跟大家分享。^^
这是一次真实的数据恢复的过程,谈到的知识不是很全面。更多mysql数据备份恢复的知识,建议大家看mysql的用户手册,里面有数据备份与恢复的一章。
