分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]
安装可以参考官方说明:
http://blog.csdn.net/simonlsy/archive/2008/01/07/2027933.aspx

顺带放个笔记:

[root@aslibra install_memcachedb]# ls
db-4.7.25.tar.gz  install.sh  libevent-1.4.8-stable.tar.gz  memcachedb-1.2.0.tar.gz

[root@aslibra install_memcachedb]# cat install.sh

echo ==== install BerkeleyDB-4.7.25 ====
sleep 2

tar xfz db-4.7.25.tar.gz
cd db-4.7.25/build_unix/
../dist/configure || exit 6
make || exit 6
make install
cd ../../

if grep /usr/local/BerkeleyDB.4.7/lib /etc/ld.so.conf
then
        echo OK
else
        echo /usr/local/BerkeleyDB.4.7/lib >> /etc/ld.so.conf
fi

echo ==== install libevent-1.4.8 ====
sleep 2

tar xfz libevent-1.4.8-stable.tar.gz
cd libevent-1.4.8-stable
./configure || exit 6
make || exit 6
make install
cd ../

if grep /usr/local/lib /etc/ld.so.conf
then
        echo OK
else
        echo /usr/local/lib >> /etc/ld.so.conf
fi

ldconfig

echo ==== install memcachedb-1.2.0 ====
sleep 2

tar xfz memcachedb-1.2.0.tar.gz
cd memcachedb-1.2.0
./configure || exit 6
make || exit 6
make install
Tags:
问题示例:
网站有千万个网页文件需要存储,占用空间大约有300-400G,导致问题:
1 小文件太多,备份困难
2 空间增长很难调整
3 前端做缓存,因为object很高,效率很低,squid和lighttpd都不合适

解决方案说明:

1 nginx+memcached接口

Nginx有一个模块是可以读取memcached的数据的,可以把网页文件内容保存到memcached里面,如果数据无效,则proxy到后端,后端服务器更新此数据

2 memcachedb接口

memcachedb是新浪的一个开源项目,用硬盘作为存储空间,用的是Berkeley DB的存储引擎,memcached的协议。
有memcached的方便性,同时有高效的读写性能,没有内存作为存储空间的限制,数据永久保留,同时使用局域网的机器就可以处理并且很容易共享,不限制为本地文件,有自动的备份机制。

3 php程序管理存储

php处理memcached很容易,和前端约定相应的key即可

4 计划任务处理更新

由于memcachedb是永久保存,前端无法判断是否过期,所以需要自己制定策略删除过期的网页,以便前端获取不到而自动更新

5 magent作为memcachedb的代理接口,解决备份问题

memcachedb有备份方法,我碰到过出现无法同步的情况,magent也可以帮助解决此问题,它是为memcached设计的,但由于memcachedb使用memcached协议,所以也同样适用

解决方案配置示例:

假设www.aslibra.com/article/xxx 地址需要使用此方案,那就可以用服务器A(2)和B(3)作为memcachedb服务,可以在A(2)上跑magent,C(4)服务器是后端服务器,负责存入memcachedb数据

前端Nginx配置判断:

upstream backend {
  server 192.168.1.4;
}
upstream memcachedb {
  server 192.168.1.2:11212;
  server 192.168.1.3:11212 backup;
}
server {
  server_name  www.aslibra.com;
  location / {
    proxy_pass http://backend;
  }
  location ~* ^/article/ {
    set $memcached_key $host$uri;
    default_type       text/html;
    memcached_pass     memcachedb;
    error_page         404 = /fallback;
  }
  location = /fallback {
    internal;
    proxy_set_header  memcached_key $memcached_key;
    proxy_pass http://backend;
  }
}


定义了memcachedb的upstream,有一个是backup标识的
/article/的请求会先查询memcachedb,找不到再发送到后端服务器
注意 proxy_set_header  memcached_key $memcached_key 这句,可以保持key值的一致性
对于中文出现在地址的情况很实用,后端使用$_SERVER['REQUEST_URI'] 会和 $uri 不一致

A和B缓存服务器:

memcachedb -p 11212 -l 0.0.0.0 -u root -d -r -N -H /data/aslibra.com/article/


如果配置主从,那可以启用magent:

magent -s 192.168.1.2:11212 -b 192.168.1.3:11212
#默认监听 0.0.0.0:11211,提供给PHP使用
#比如这里是在192.168.1.2上运行


C服务器配置rewrite(lighttpd):

$HTTP["host"] == "www.aslibra.com" {
        server.document-root = "/data/www.aslibra.com/"
        url.rewrite-once = (
                "^/article" => "/php/cache.php"
        )
}


PHP代码参考:

<?
//do sth to build html
echo $html;

//如果有传递memcached_key值就把结果存入memcachedb
//不需要设置缓存时间,因为没有用 :)
//有需要更新,那就记录一下日志
if($_SERVER['HTTP_MEMCACHED_KEY']){
  $m = new Memcache;
  if($m->connect('192.168.1.2', 11211) ){
    $key = $_SERVER['HTTP_MEMCACHED_KEY'];
    $m->set($key, $html);
    //有必要就记日志
    //log to file...
  }
}
?>


删除文件:

如果有记录日志(可以是web服务器日志或者php记录的日志),可以根据保存的日志处理
需要删除的 $m->delete($key) 即可

备份请参考memcachedb的操作指南。
此解决方案适合memcached的存储方式,况且不用处理过期的问题,php可以解决过期时间
文章更新请关注本文更新:
http://www.aslibra.com/blog/post/memcachedb_cache_solution.php

参考资料:
1 Berkeley DB
2 memcachedb
3 magent
4 NginxModules
5 嵌入式数据库系统Berkeley DB
6 memcached和magent的安装
7 memcachedb的安装
1 IP高可用性
可以靠keepalived来维持。

2 web高可用性
可以用proxy服务器的负载均衡分配,一般自带后端检查,可以是nginx,比较流行这个。

3 php运行
可以是fastcgi,也是可以实现负载均衡,能者多劳。

4 mysql
可以使用amoeba或者mysql-proxy,实现读写分离和负载均衡,重要的事情是主从配置和维护。
amoeba-mysql的安装使用和读写分离
Amoeba for Mysql 试用小结

5 数据缓存层
可以用memcached,速度要求低一点的可以用memcachedb,使用magent可以做代理,保持高可用性。
Nginx和memcached/memcachedb配合可以加速可缓存的访问。
memcached和magent的安装
memcachedb的缓存解决方案

6 nginx的proxy性能
可以使用自带的memcache加速,起文件缓存作用。
也许还可以使用同步文件到本地的方式,不经过cache服务器。

7 cache服务器
比如lighttpd+modcache,或者squid、varnish等。新出的modcache可以利用内存缓存,性能估计能高一些,只是用内存缓存居然不支持本地压缩了,需要改为后端处理gzip工作。
lighttpd的mod_cache缓存不了的问题

总体而言
要高可用性,必须有代理层,有了代理层才会解决单点故障。。。
memcached似乎都成了现在网站的必备工具了,数据缓存的利剑。
magent是解决memcached的单点故障的解决方案。

安装memcached需要libevent的支持,需要先安装。

参考的libevent安装过程

libevent官网:http://www.monkey.org/~provos/libevent/

参考过程(最后一个很重要,如果启动失败,那应该ln做一个连接):
tar xvfz libevent-1.4.5-stable.tar.gz
cd libevent-1.4.5-stable
./configure && make && make install
ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2


memcached安装:

memcached官方下载地址:http://www.danga.com/memcached/
tar xvfz memcached-1.2.5.tar.gz
cd memcached-1.2.5
./configure && make && make install


运行一下就可以知道是否可以正常启动,正常出现帮助信息即可,如果没有上面的ln操作,可能会启动失败的:
[root@aslibra memcached-1.2.8]# memcached -h
memcached 1.2.8
-p <num>      TCP port number to listen on (default: 11211)
-U <num>      UDP port number to listen on (default: 11211, 0 is off)
-s <file>     unix socket path to listen on (disables network support)
-a <mask>     access mask for unix socket, in octal (default 0700)
....


如果有必要配置magent,那也很简单:

magent官网下载地址:http://code.google.com/p/memagent/downloads/list

安装过程参考:

[root@aslibra magent]# ls
magent-0.5.tar.gz
[root@aslibra magent]# tar xfz magent-0.5.tar.gz
[root@aslibra magent]# ls
ketama.c  ketama.h  magent-0.5.tar.gz  magent.c  Makefile
[root@aslibra magent]# make
gcc -Wall -O2 -g  -c -o magent.o magent.c
gcc -Wall -O2 -g  -c -o ketama.o ketama.c
gcc -Wall -O2 -g -o magent magent.o ketama.o -levent
[root@aslibra magent]# which memcached
/usr/local/bin/memcached
[root@aslibra magent]# cp magent /usr/local/bin/
[root@aslibra magent]# magent -h
memcached agent v0.4 Build-Date: May 17 2009 14:33:14
Usage:
  -h this message
  -u uid
  -g gid
  -p port, default is 11211. (0 to disable tcp support)
.....


部署简单的环境:

10,11,12三台机器,10和11运行memcached:

memcached -u root -d -m 1000 -l 192.168.1.10
memcached -u root -d -m 1000 -l 192.168.1.11


12可以启用magent:

magent -s 192.168.1.10:11211 -b 192.168.1.11:11211

Tags: ,
发现netstat -nlp 看到的tomcat和amoeba都是java程序运行的,所以ps看了一下系统的java进程:

[root@aslibra ~]# ps aux | grep java
root     15827  0.0  3.7 257360 78160 ?      Sl   Apr27   0:03 /usr/java/jdk/bin/java -Djava.endorsed.dirs=/Data/apps/tomcat/common/endorsed -classpath /usr/java/jdk/lib/tools.jar:/Data/apps/tomcat/bin/bootstrap.jar -Dcatalina.base=/Data/apps/tomcat -Dcatalina.home=/Data/apps/tomcat -Djava.io.tmpdir=/Data/apps/tomcat/temp org.apache.catalina.startup.Bootstrap start
root     13875  1.8  1.5 325000 31304 pts/2  Sl   22:12   0:00 /usr/java/jdk/bin/java -server -Xms128m -Xmx128m -Xss128k -Damoeba.home=/Data/apps/amoeba-mysql -Dclassworlds.conf=/Data/apps/amoeba-mysql/bin/amoeba.classworlds -classpath /Data/apps/amoeba-mysql/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher
root     13993  0.0  0.0  4480  680 pts/0    S+   22:13   0:00 grep java


这些应用都是java程序运行起来的,只是加了参数,运行了自己的程序,有意思。
-D是赋值变量 -classpath是设定jar包

另外,bin/amoeba是一个shell脚本,就是生成的以上的运行参数。
打开查看就知道还支持cygwin。

Tags: ,
防盗链,是一个比较好玩的话题,看大家防的是否严格。

为什么要防盗链?

不用说了,防止别人直接引用下载文件。对于图片,一般都检查来源来防盗链,因为图片包含在网页里就有来源,除非你使用firefox的无来源模式,但一般还得开放无来源的权限。
对于重要的文件下载,那也可以这么做,但并不太稳妥,况且参考信息并不合适。那可以试试lighttpd的mod_secure_download,和Nginx的 Access Key Module 。

两者都有不同的功效:

lighttpd是使用时间戳来提供验证,保证时间戳在一定的范围内有效即可,这个可以用作有效时间的开放下载,但注意如果处理地址的服务器和提供下载的服务器的时间要一致或者相差不大才好。
Nginx是使用客户信息作为一个依据,比如IP,那可以提供IP限制,或者可以的话实现网段限制,但此地址就没有时间限制了

选择哪个好?

lighttpd适合有时间限制的下载,比如你有一个软件限制今天能下载,那就再好不过了,可以把地址放心公布了,当然了,限制为60秒那就可以当作是对当前用户私有了。
Nginx适合用客户信息做依据,那你可以用IP地址作为依据,也可以用cookie值做限制哦,很不错的吧?我还可以想象到可以用网址信息。你可以对现有的服务器文件进行防盗链而不用改变文件架构。
Tags: , , , ,
近日上一RHEL5的机器,一直安装lighttpd的缓存模块就是没法缓存上文件,郁闷了几天,让我真有点恼火了。

系统无法写入?模块没有编译?

检查过系统可写性都是正常的,我就纳闷了,可连图片文件都无法缓存。
也检查过模块编译问题,就算复制了原先的正常的程序过来测试也是徒劳。

今天想起了lighttpd可以debug:
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModCache

引用
cache.debug
writes mod_cache debugging messages to error.log or not

Default: disable.


遂得到如下提示:

引用
2009-04-07 23:37:34: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /
2009-04-07 23:37:34: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /css/v4_common.css
2009-04-07 23:37:34: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /css/v4_all.css


似乎是时间的问题,现在是下午,服务器时间居然是23点,看来上新机器还是忽略了系统时间。
同步了一下系统时间:

ntpdate pool.ntp.org


问题解决,可以关闭debug了:

引用
2009-04-07 23:37:36: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /images/v4_images/title_02.gif
2009-04-07 23:37:37: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /google/160x600.htm
2009-04-07 23:37:38: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /images/pic_mian.gif
2009-04-07 23:37:38: (mod_cache.c.1339) ignore response uri that Expires is sometime before now:  /images/headfoot/help_icon.gif
2009-04-07 15:14:15: (mod_cache.c.2175) cache file saved successfully: /cache/web/www.aslibra.com/index_mod_cache.html
2009-04-07 15:14:15: (mod_cache.c.2175) cache file saved successfully: /cache/web/www.aslibra.com/css/v4_common.css
2009-04-07 15:14:15: (mod_cache.c.2175) cache file saved successfully: /cache/web/www.aslibra.com/css/v4_all.css
Tags: , ,
分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐