2010年11月

搭建gitweb环境

gitweb是git提供的一个基于web的版本查看工具

在新版的git源码中,它已经打包进去了

我们可以使用cgi方式,让gitweb运行在apache中

安装配置如下:

#进入git的src目录中
cd /opt/ysz/src/git-1.7.0
make clean
#编译gitweb,GITWEB_PROJECTROOT为要查看的git仓库目录,bindir为git目录
make GITWEB_PROJECTROOT="/opt/gitroot/repositories/" bindir=/usr/local/bin gitweb
mkdir /opt/gitroot/repositories/gitweb
#将cgi文件和静态文件拷贝到某个地方
cp gitweb/gitweb.cgi /opt/gitroot/repositories/gitweb
cp gitweb/*.js gitweb/*.css gitweb/*.png /opt/gitroot/repositories/gitweb

配置Apache2:

<VirtualHost *:80>
    DocumentRoot /opt/gitroot/repositories/gitweb
    ServerName 10.10.71.10
    ScriptAlias /gitweb /opt/gitroot/repositories/gitweb/gitweb.cgi
   
    <Location />
        AuthName "Access auth"
        AuthType Basic
        AuthUserFile /usr/local/apache2/conf/passwd
        Require valid-user
    </Location>
   
    <Directory /opt/gitroot/repositories/gitweb>
        Options Indexes FollowSymLinks MultiViews
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog "/opt/log/apache2log/gitweb_error.log"
    CustomLog "/opt/log/apache2log/gitweb_access.log" common
</VirtualHost>

这样配置后,就可以通过以下url访问gitweb了

http://10.10.71.10/gitweb

由于是基于web访问git仓库,所以加上基本的权限认证

Hbase Shell的常用命令

总结的一些Hbase shell的命令

都很简单,可以help来查看帮助

create 'user_test','info'
describe 'user_test'
disable 'user_testinfo'
drop 'user_testinfo'
put 'user_test','test-1','info:username','test1'
put 'user_test','test-1','info','1'
put 'user_test','test-2','info:creattime','20101116'
list
scan 'user_test'
#可以指定startrow,stoprow来scan多个row
scan 'user_test',{COLUMNS =>'info:username',LIMIT =>10, STARTROW => 'test',STOPROW=>'test2'}
get 'user_test','test-1'
get 'user_test','test-1',{COLUMN => 'info:username'}
#删除某行的某一列,比如username那列的值
delete 'user_test','test-1','info:username'
#删除某行所有的列
deleteall 'user_test','test-2'     
count 'user_test'
status 'detailed'

基于Hadoop的Hbase环境搭建

基于现有的Hadoop集群,来搭建Hbase的环境

整个过程还是比较简单的

1. 下载Hbase源码,并解压

cp hbase-0.20.6.tar.gz /opt/hadoop/
cd /opt/hadoop/
tar zxvf hbase-0.20.6.tar.gz
ln -s hbase-0.20.6 hbase

2.修改hbase-env.sh,加入java环境,并修改log位置

export JAVA_HOME=/opt/java/jdk
export HBASE_LOG_DIR=/opt/log/hbase
export HBASE_MANAGES_ZK=true

3. 修改hbase-site.xml,配置hbase

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://zw-hadoop-master:9000/hbase</value>
    <description>The directory shared by region servers.</description>
</property>
<property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
            <description>The mode the cluster will be in. Possible values are
              false: standalone and pseudo-distributed setups with managed Zookeeper
              true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
            </description>
    </property>
<property> 
    <name>hbase.master</name> 
    <value>hdfs://zw-hadoop-master:60000</value> 
</property>
<property>
    <name>hbase.zookeeper.quorum</name>       
    <value>zw-hadoop-slave225,zw-hadoop-slave226,zw-hadoop-slave227</value>
    <description>Comma separated list of servers in the ZooKeeper Quorum.      For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".      By default this is set to localhost for local and pseudo-distributed modes      of operation. For a fully-distributed setup, this should be set to a full      list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh      this is the list of servers which we will start/stop ZooKeeper on.     
    </description>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/opt/log/zookeeper</value>
    <description>Property from ZooKeeper's config zoo.cfg.
        The directory where the snapshot is stored.
    </description>
</property>

几个配置的说明:

  • hbase.rootdir设置hbase在hdfs上的目录,主机名为hdfs的namenode节点所在的主机
  • hbase.cluster.distributed设置为true,表明是完全分布式的hbase集群
  • hbase.master设置hbase的master主机名和端口
  • hbase.zookeeper.quorum设置zookeeper的主机,官方推荐设置为3,5,7比较好

4. 编辑regionservers文件,设置regionservers的服务器,和hadoop的slaves一样即可

5. 启动Hbase

/opt/sohuhadoop/hbase/bin/start-hbase.sh
/opt/sohuhadoop/hbase/bin/stop-hbase.sh

Hbase默认只有一个Master,我们可以也启动多个Master:

/opt/sohuhadoop/hbase/bin/hbase-daemon.sh start master

不过,其它的Master并不会工作,只有当主Master down掉后

其它的Master才会选择接管Master的工作

Hbase也有一个简单的web界面,来查看其状态

http://10.10.71.1:60010/master.jsp
http://10.10.71.1:60030/regionserver.jsp
http://10.10.71.1:60010/zk.jsp

Hadoop集群的NameNode的备份

Hadoop集群中,NameNode节点存储着HDFS上所有文件和目录的元数据信息

如果NameNode挂了,也就意味着整个Hadoop集群也就完了

所以,NameNode节点的备份很重要,可以从以下2个方面来备份NameNode节点

1. 在hdfs-site.xml中,配置多个name的dir到不同的磁盘分区上:

<property>
    <name>dfs.name.dir</name>
    <value>/pvdata/hadoopdata/name/,/opt/hadoopdata/name/</value>
</property>

2. 在另外的一台服务器上配置Secondary NameNode:它是NameNode的一个备份

Secondary NameNode会定期合并fsimage和edits日志,将edits日志文件大小控制在一个限度下

合并的时机是由2个配置参数决定的:

fs.checkpoint.period,指定连续两次检查点的最大时间间隔, 默认值是1小时。
fs.checkpoint.size定义了edits日志文件的最大值,一旦超过这个值会导致强制执行检查点(即使没到检查点的最大时间间隔)。默认值是64MB。

Secondary NameNode的配置过程如下:

  • conf/masters中指定第二名称节点的主机名
  • 在core-site.xml中指定checkpoint的目录

<property>
  <name>fs.checkpoint.dir</name>
  <value>/opt/hadoopdata/secondname,/pvdata/hadoopdata/secondname</value>
  <description>Determines where on the local filesystem the DFS secondary
      name node should store the temporary images to merge.
      If this is a comma-delimited list of directories then the image is
      replicated in all of the directories for redundancy.
  </description>
</property>

如果NameNode节点挂了,可以按照如下步骤来从Secondary NameNode来恢复:

  • dfs.name.dir指定的位置建立一个空文件夹
  • Secondary NameNode上把secondname的目录给scp到新的NameNode机器的fs.checkpoint.dir下
  • 使用hadoop/bin/hadoop namenode -importCheckpoint来启动NameNode,主要不要执行format命令
  • 使用hadoop fsck /user命令检查文件Block的完整性

详细的Secondary NameNode细节可参考Hadoop官方文档:

http://hadoop.apache.org/common/docs/r0.20.2/hdfs_user_guide.html#Secondary+NameNode

惊天大悲剧-Hadoop的rmr和trash

这两天在操作Hadoop集群时,由于一个误操作,制作了一个天大的悲剧

不小心把Hadoop集群上的所有文件全部删除了,具体情况是这样的:

我用hadoop的超级帐户要建立一个目录,结果发现位置错了

也是,想使用rmr删掉那个目录,可是不小心把命令写成了

hadoop fs -rmr /user

于是,悲剧出现了,所有user目录下的所有目录和文件全都没有了

当时我就慌神了,赶紧从web查看50070的服务

眼看着DFS Used空间从100多G不停的减少

后来才反应过来,赶紧停掉namenode节点,然后上网google办法

后来,从secondname节点重新恢复了一个checkpoint

但绝大部分数据都已经丢失了,只恢复了一小部分数据,已经没啥用了

幸好,原始log我们在其它服务器上还保留的有,只能重新分析再入Hadoop了

总结了一下几点教训:

  1. 首先一定要控制好hadoop上各用户的权限,使各user只能操作自己的目录
  2. 尽量少用hadoop的超级用户进行操作,可以减少误操作
  3. hadoop的rm和rmr命令,设计的太BT了,连一个确认提示都没有,直接就删除了。看到有人给官方提了这个建议,但人家回复说:已经有了trash机制了,所以不需要提示,真是无语....
  4. hadoop的trash功能:很遗憾,之前没有配置trash,所以就直接给删除了,经过这次误操作,赶紧配置上trash,并设置保留时间为7天。

在core-site.xml中增加如下配置,表明rm后会在trash中保留多少分钟:

<property>
  <name>fs.trash.interval</name>
  <value>10080</value>
  <description>
      Number of minutes between trash checkpoints. If zero, the trash feature is disabled
  </description>
</property>

很遗憾的是,hadoop的这个默认值是0,就是直接删除了,为什么要这么设计呢?郁闷....

经过简单的测试,这个trash功能还是不错的,当rm后,它会move到当前文件夹下的.Trash目录下

如果你删除一个文件或目录多次,则hadoop会自动在name后加上数字序列号

这样,如果你误删除后,就可以有选择的恢复文件了

hadoop fs -mkdir /user/oplog/test
hadoop fs -put *.txt /user/oplog/test
hadoop fs -rmr /user/oplog/test
hadoop fs -ls /user/oplog/.Trash/Current/user/oplog
    drwxr-xr-x   - oplog oplog          0 2010-11-16 10:44 /user/oplog/.Trash/Current/user/oplog/test
hadoop fs -mv /user/oplog/.Trash/Current/user/oplog/test /user/oplog/
hadoop fs -ls /user/oplog/.Trash/Current/user/oplog
    drwxr-xr-x   - oplog oplog          0 2010-11-16 10:44 /user/oplog/.Trash/Current/user/oplog/test
    drwxr-xr-x   - oplog oplog          0 2010-11-16 10:47 /user/oplog/.Trash/Current/user/oplog/test.1

AS的几点心得

今天,Sohu邮箱上线了Flash进度条显示和Flash上传附件功能

通过和前端工程师协作,项目进展虽然磕磕碰碰的,但最终总算还是上线了

关于Flash AS相关东西,有以下几点心得(可能不完全对....):

  1. URLLoader类,在AS中使用它来load相应的js文件。请求虽然是在Flash中,但貌似Flash还是借用浏览器来发送相应的Http请求,UA什么的都和浏览器完全一样,Cookie也能相应的带到后端去,这样的请求在HttpWach中是可以监听到
  2. FileReference类,在AS中使用它来完成附件上传。刚开始以为它Post到后台的是二进制流,后来发现,它post过去的数据和普通文件上传是一致的,是multipart/form-data。上传过程是Flash来实现的,在HttpWatch中是监听不到的,但Fiddler是可以看到的,UA是shockwave flash。
  3. 上传时的身份验证:据说FileReference是有Bug的,在IE浏览器中,它能把所有的Cookie带到Server端。但在FireFox,Opera,Safari之类的浏览器,它不能携带相应的cookie,而是带着IE浏览器的持久Cookie(不是Session有效的Cookie)到Server端,这个实现的确很变态,也令人很无语。原本想用js读取Cookie,然后传递给Flash到后台验证,但Passport的Cookie有一个是HttpOnly的,所以很杯具,只好实现一个新的认证机制了.....
  4. 用AS去下载js,实现loading进度,当初做这个是为了能让进度条更平滑,更逼真一些。现在的方案是AS中去下载js,然后回调js函数,利用浏览器的缓存,再动态生成一个javascript标签。这样问题就出现了,如果浏览器禁用了缓存,那么就会重复load相应的js文件2遍,至今还没找到什么好的解决方案....
  5. Flash8.5以上的版本才支持AS3,所以需要严格判断Flash的版本

昕昕趣事-关于上学

一天,奶奶接昕昕下幼儿园

昕昕问奶奶:

奶奶,我什么时候才能上大学呢?

奶奶对他说:

还早呢,你上完幼儿园,然后上小学

接着初中,高中,然后才能上大学

昕昕听后,说了一句很雷的话:

那我岂不是要累死啊~

在Apache和Nginx中实现StickySession功能

当我们使用负载均衡,后端对应多台Server,而且使用了单机Session的

如果不进行配置,可能会发生丢Session的问题,因为前端Nginx可能会随机分发Request请求

Aapache已经提供了stickysession的功能,前端Apache2的配置如下:

ProxyPassMatch ^/(.*)$ balancer://vip stickysession=STICKY_HOST
ProxyPassReverse / balancer://vip
<Proxy balancer://vip>
        BalancerMember http://192.168.x.x smax=5 max=20 ttl=120 retry=30 route=159
        BalancerMember http://192.168.x.x smax=5 max=20 ttl=120 retry=30 route=160
</Proxy>

它是依赖Cookie来实现route的,需要在后端的Apache2上设置相应的Cookie值:

RewriteEngine On
RewriteRule .* - [CO=STICKY_HOST:host.159:.xxx.test.com]

Nginx上也可以实现这样的机制,配置如下:

set $serverid $cookie_STICKY_HOST;
if ($serverid ~ ^host.159$)
{
    proxy_pass http://192.168.x.x;
}
if ($serverid ~ ^host.160$)
{
    proxy_pass http://192.168.x.x;
}

Nginx还提供了一个ip_hash的指令,可以根据ip来分发请求

也可以实现StickySession的功能,使用很简单:

upstream mail_pop
{
    ip_hash;
    server  10.x.x.x:83;
    server  10.x.x.x:83;
}
 

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它