分页: 10/38 第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]
memcachedb使用的BerkeleyDB的数据库,但每10M生成一个log文件:

[root@aslibra db]# ll -h
total 26G
-rw-r--r-- 1 root root  25G Jun 22 00:12 data.db
-rw-r----- 1 root root  24K Jun 20 19:33 __db.001
-rw-r----- 1 root root 3.8M Jun 20 19:33 __db.002
-rw-r----- 1 root root  81M Jun 20 19:33 __db.003
-rw-r----- 1 root root  96K Jun 20 19:33 __db.004
-rw-r----- 1 root root  11M Jun 20 19:33 __db.005
-rw-r----- 1 root root  48K Jun 20 19:33 __db.006
-rw-r----- 1 root root  10M Jun 21 22:47 log.0000002271
-rw-r----- 1 root root  10M Jun 21 22:47 log.0000002272
-rw-r----- 1 root root  10M Jun 21 22:48 log.0000002273
-rw-r----- 1 root root  10M Jun 21 22:49 log.0000002274
.....


定期清理为好,否则就要有两倍数据的空间了,以前写的是定期清理某个时间修改的日志:

find /BerkeleyDB/aslibra.com/db/ -maxdepth 1 -type f -name 'log.*' -mmin +100 | xargs -i rm -f {}


清理100分钟前的文件,导致了一个文件,如果停用或者100分钟内没有更新动作,将删掉了所有日志,吃亏了,导致启动失败了,当然,可能可以修复,只是糊涂的话就没法再启用了。

稳当点,就删除所有的日志文件,保留最新的100个:

#!/bin/sh

cd /BerkeleyDB/aslibra.com/db/
ls -t log.* | awk '{ if(NR>100)print $0}'|xargs -i -t rm -f {}


简单解析一下脚本意思:

ls -t log.* 是列出所有log开头的日志文件,按时间排序,也就是最新的排前面
awk里面NR代表当前行数,NR>100则是100行后的才输出
xargs就是接收到awk输出的文件才转给rm删除

参考资料:awk手册
Tags: ,
Nginx的代理功能很强大,主要体现在可以设置返给后端服务器的http头信息,这一点可以让我们方便的实现很多需求。

比如要做一个镜像,这个当然有可能是好事。
http://a.aslibra.com/s/main.jpg
我需要访问 http://b.aslibra.com/s/main.jpg 也是一样的内容呢?

server {
  server_name  b.aslibra.com;
  root    /Data/webapps/b.aslibra.com;
  error_page           404 = @fetch;
  location @fetch {
    internal;
    proxy_store             on;
    proxy_store_access      user:rw  group:rw  all:r;
    proxy_set_header Host a.aslibra.com;
    proxy_set_header referer http://a.aslibra.com/;
    proxy_pass   http://backend;
    root  /Data/webapps/b.aslibra.com;
  }
}


利用缓存功能就可以了,以上例子还加上了简单破解防盗链的方法,就是加上正确的referer的头信息就可以了
upstream自己可以设定,修改了host的信息,使得相当于本地访问backend使用了要做镜像的域名。

同理,要多个域名是一样的内容是,那可以多个域名使用同样的server设定,简单的指定host值即可,不列举了。
Tags: ,
点击在新窗口中浏览此图片

很安详的小猫

点击在新窗口中浏览此图片

猫猫在吃东西的时候都很有自我保护意识,敌视四周

点击在新窗口中浏览此图片

准备进攻?

点击在新窗口中浏览此图片

这个小猫眼睛发炎了,很可怜

memcachedb和memcached的两个主要区别:
1 前者不管理过期,每个存储都是长期有效
2 前者使用磁盘存储,有广阔的存储空间

这两个优点使得很多缓存的地方可以使用上memcachedb。

1 本地数据缓存
这个带来的最大便利是可以实现数据共享,备份简便,这是本地文件缓存无法比拟的。
2 网页缓存
在Nginx可以使用memcache接口,很简便的实现网页cache

以上两项应用需要解决过期问题方式不同:

1 对于本地数据缓存,可以再保存一个值是当前保存的数据的时间即可。
类似读写文件一样,记录修改时的时间戳
$key=>"http://www.aslibra.com/"
$key."_time"=>time()


2 对于nginx无法判断是否过期的情况,可以实现自动清理,阿权设计方案的是按秒存储数据,定期清理
清理的方法决定了保存的其它数据的方式,你也可以写入文件日志的方式,然后按日志清理
这里用自身的存储,记录相应的数据信息
$key=>"http://www.aslibra.com/"
$key2=>"http://www.aslibra.com/blog/"
$expire_time=>Num
$expire_time.'_'.Num=>$key
$expire_time.'_'.Num2=>$key2


这个主要在解决$expire_time的自增的问题,细节可以处理此问题
需要用到increment和add,他们都有键值是否存在的问题,根据此功效解决冲突。
先尝试increment,如果成功,说明已经有了,否则可能没有。在没有的情况下,尝试添加此键值,成功说明此时没有同时的进程,否则有同时请求的进程已经在此短暂的不行的时间里添加了,那就再次调用increment即可。

下面是封装了的PHP代码:

<?

/****************************************
*** memcachedb_manage version 0.1 @ 2009-6-12
*** code by hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/memcachedb-manage/
*** http://code.google.com/p/memcachedb/
*** let the memcachedb acts like memcached!
****************************************/

class memcachedb extends Memcache{

  //是否有调试信息
  var $debug = false;
  //兼容使用memcache,这样就不用set时再保存额外数据
  var $is_memcachedb = true;
  //清理时间开始为0时,默认最小的清理时间差
  var $mini_clear_time = 86400;
  //临时数据前缀
  var $prefix = 'db_';
  //临时数据,清理的最后时间戳
  var $last_timeid_key = 'last_timeid';
  
  //本地处理缓存有效性
  var $cache_expire = 900;
  var $cache_prefix = 'WWW_FILE_';
  var $cache_time_prefix = 'WWW_TIME_';

  function memcachedb(){
  }
  
  //改写函数
  //此功能适合前端无法判断数据是否有效的情况,需要自行清理过期数据
  function set($key, $value, $flag=0, $expire=0){

    if($expire>0 && $this->is_memcachedb){
      $mykey = $this->prefix.(time() + $expire);
      //尝试取得自增值
      $i = parent::increment($mykey);
      if($i == FALSE){
        //尝试增加key,防止用set产生的冲突
        $i = parent::add($mykey,1) ? 1 : parent::increment($mykey);
      }
      parent::set($this->mykey($mykey, $i), $key);
    }

    return parent::set($key, $value, $flag, $expire);
  }

  //管理自增的键值组合方式
  function mykey($mykey, $i){
    return $mykey.'_'.$i;
  }

  //保存上次清理的时间戳的键值
  function last_timeid_key(){
    return $this->prefix.$this->last_timeid_key;
  }
  
  //清理
  function clear($start=0, $end=0){

    //取得上次清理的最后时间戳,可以不需要从time_start开始
    $last_timeid = parent::get($this->last_timeid_key());
    if($last_timeid == false) $last_timeid = 0;
    $start = $last_timeid>$start ? $last_timeid : $start;
    $start = $start>0 ? $start : ( time() - $this->mini_clear_time );
    $end = $end>0 ? $end : time();
    if($this->debug)echo " clear $start to $end <br>";

    for($mytime = $start; $mytime<=$end; $mytime++){
      $mykey = $this->prefix.$mytime;
      $auto_id = parent::get($mykey);
      if($auto_id){
        if($this->debug)echo "<hr>clear time: $mytime<br>";
        for($i = 1;$i<=$auto_id;$i++){
          $key = parent::get($this->mykey($mykey, $i));
          if($this->debug)echo " delete ".$k."<br>";
          parent::delete($key);
          if($this->debug)echo " delete ".$this->mykey($mykey, $i)."<br>";
          parent::delete($this->mykey($mykey, $i));
        }
        if($this->debug)echo " delete $mykey<br>";
        parent::delete($mykey);
      }
    }

    //记下当前处理过的时间戳
    $this->set($this->last_timeid_key(), $end);
  }

  //缓存读写
  //此功能适合PHP使用的数据,自行判断数据是否有效的情况
  function get_cache($key, $expire=0){
    $expire = $expire>0 ? $expire : 0;
    if($expire == 0)
      return parent::get($this->cache_prefix.$key);
    $cache_time = parent::get($this->cache_time_prefix.$key);
    $cache_time = $cache_time == FALSE ? 0 : $cache_time;
    if(time() - $cache_time <= $expire)
      return parent::get($this->cache_prefix.$key);
    return FALSE;
  }

  function set_cache($key, $value, $flag=0, $expire=0){
    $expire = $expire>=0 ? $expire : $this->cache_expire;
    parent::set($this->cache_time_prefix.$key, time());
    return parent::set($this->cache_prefix.$key, $value, $flag, $expire);
  }
}
?>


一些示例:

<?
require_once('memcachedb.class.php');

$m = new memcachedb;
$m->connect('192.168.1.5', 11311);

//保存一个300秒有效期的数据
$m->set('test','www.aslibra.com', 0, 300);
//清理到1000秒前到100秒前过期的数据
$m->clear(time()-1000, time()-100);

//获取一个键值,不理会是否过期,相当于get
echo $m->get_cache("test", 0);
//获取一个键值,300秒内保存的才有效
$m->get_cache("test", 300);
//保存一个数据,300秒内有效
$m->set_cache("test", "www.aslibra.com", 0, 300);
//保存一个数据,长期有效,相当于set
$m->set_cache("test", "www.aslibra.com");

//清理到目前已经过期是数据
$m->clear();
?>


相关资料:

1 memcachedb-manage
2 memcachedb
3 代码下载

代码更新:

# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://memcachedb-manage.googlecode.com/svn/trunk/ memcachedb-manage-read-only
故意出错,你可以知道一些错误发生的原因,检查方法:

tail -n 20 /var/log/messages | grep named


下面是碰到的部分错误:

1 logging channel 'query_log' file '/logs/query.log': file not found

开了logging,但没有创建日志文件会提示出错

2 logging channel 'query_log' file '/logs/query.log': permission denied

可能伴有这样的错误:
kernel: audit(1240046511.743:4): avc:  denied  { write } for  pid=5649 comm="named" name="logs" dev=dm-0 ino=778352 scontext=root:system_r:named_t:s0 tcontext=root:object_r:named_conf_t:s0 tclass=dir

有权限的问题,可能你得查一下用户权限,如果是使用SELINUX,输入getenforce 看看现在的安全级别
可以关闭SELinux如果你不需要,编辑 /etc/sysconfig/selinux 文件

3 couldn't open pid file '/var/named.pid': Permission denied

还是目录权限的问题,如果没有该目录,创建并且给named权限

4 /etc/named.conf:14: when using 'view' statements, all zones must be in views

如果使用了view,那就不能在主文件单独定义了啦,可怜的,必须在每个view里面都定义每个zone
但是,如果你不需要根据每个view处理不一样的,你可以在每个view都引用同一个解析文件

5 transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied

检查一下是否master加了此主机为允许的ip了
Master在reload和restart时会发生notify

... zone myzcom.com/IN/any: loaded serial 2008061100
... running
... zone aslibra.com/IN/any: sending notifies (serial 2008061100)


也就是加载后会发送当前的serial标识的给notify列表的机器
slave机器要注意对配置文件的可写权限

引用
..  received notify for zone 'aslibra.com'
..  dumping master file: config/tmp-XXXXeybkW9: open: permission denied
..  transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied
..  transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer


正常的情况:

引用
..  received notify for zone 'aslibra.com'
..  zone aslibra.com/IN: transferred serial 2008061100
..  transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer


两个机器的配置文件会不一样的,传输并非文件传输,而是数据传输:

Master的配置文件:

[root@aslibra etc]# cat config/domain-aslibra.com.any
$TTL 300
@       IN      SOA     ns.aslibra.com. hqlulu.gmail.com. (
                                2008061100 ; serial
                                3600       ; refresh
                                60         ; retry
                                604800     ; expire
                                3600       ; minimum
                                )

                                NS      ns2.aslibra.com.
                                NS      ns.aslibra.com.


www                             A       222.76.215.25
ns                              A       192.168.1.41
ns2                             A       192.168.1.42


Slave的配置文件:

[root@localhost etc]# cat config/domain-aslibra.com.any
$ORIGIN .
$TTL 300        ; 5 minutes
aslibra.com             IN SOA  ns.aslibra.com. hqlulu.gmail.com. (
                                2008061100 ; serial
                                3600       ; refresh (1 hour)
                                60         ; retry (1 minute)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
                        NS      ns.aslibra.com.
                        NS      ns2.aslibra.com.
$ORIGIN aslibra.com.
ns                      A       192.168.1.41
ns2                     A       192.168.1.42
www                     A       222.76.215.25


6 如何检查配置文件

[root@aslibra etc]# named-checkconf -t /var/named/chroot/
/etc/config/view-any.conf:13: option 'masters' is not allowed in 'master' zone 'aslibra.com'
[root@aslibra etc]# named-checkconf -t /var/named/chroot/
[root@aslibra etc]#


如果有错误,会提示你信息,没有错则没有提示了

7 如何检查zone文件

[root@fetion etc]# named-checkzone -t /var/named/chroot/ aslibra.com /etc/config/domain-aslibra.com.any
zone aslibra.com/IN: loaded serial 2008061100
OK
[root@fetion etc]# named-checkzone aslibra.com /var/named/chroot/etc/config/domain-aslibra.com.any
zone aslibra.com/IN: loaded serial 2008061100
OK


8 重载配置文件

service named reload
Tags: ,
升级一下Nginx,笔记一下:

wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz
tar xfz nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure  --prefix=/Data/apps/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
&& make && make install

#平滑升级可执行程序,使用新的 nginx 可执行程序替换旧的
kill -USR2 `cat /Data/apps/nginx/logs/nginx.pid`
#你可以让旧进程停止工作
kill -QUIT `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
#如果不需要完全停止旧进程,还希望恢复的,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
kill -WINCH `cat /Data/apps/nginx/logs/nginx.pid.oldbin`


升级后的信息:

[root@localhost nginx]# curl -I http://localhost
HTTP/1.1 403 Forbidden
Server: nginx/0.7.59
Date: Wed, 10 Jun 2009 15:04:14 GMT
Content-Type: text/html
Content-Length: 169


参考资料:
Nginx中文文档 > 运行和控制 Nginx - 命令行参数和信号
Tags:
一般而言,随便找个合适的dns服务器作为自己的dns解析服务器即可,但如果选择不当,可能就会导致网络选择并不是最优的。
这个情况一般发生在电信网通优化的域名上。

检查方法(域名有所替换):

[root@aslibra ~]# dig cdl.cdn.aslibra.com
...(省略)
;; ANSWER SECTION:
cdl.cdn.aslibra.com.     683     IN      A       218.25.68.145
cdl.cdn.aslibra.com.     683     IN      A       218.25.68.192
cdl.cdn.aslibra.com.     683     IN      A       218.25.11.105

;; Query time: 6 msec
;; SERVER: 202.106.0.20#53(202.106.0.20)
;; WHEN: Wed Jun 10 16:40:07 2009
;; MSG SIZE  rcvd: 84

[root@aslibra ~]# dig cdl.cdn.aslibra.com +trace
...(省略)
cdl.cdn.aslibra.com.     900     IN      A       60.191.185.162
cdl.cdn.aslibra.com.     900     IN      A       60.191.187.8
...(省略)
;; Received 282 bytes from 61.160.207.67#53(ns1.dnspod.net) in 0 ms


第一个是目前自己的网络,dig +trace是用自己本身取获取解析
我们看到,第一次和第二次是不一样的,原因比较简单,这个是网通和电信的不同路线
第一个是从202.106.0.20(自己设定的dns服务器)返回的,以它访问目标域名服务器所取得的数据为准,也就是如果它是网通IP,则返回的就是网通的解析方案,而trace则直接咨询目标域名服务器,目标服务器根据你的IP来返回解析方案。

如果你是电信线路,而设定的是网通线路的dns服务器,这个时候就容易取得网通解析方案了。

也给我们引发一些注意的地方:
1 自己架设本地dns缓存服务器是最合适的解析方案
2 找到自己线路的dns服务器才有最优的访问效果
Tags: ,
分页: 10/38 第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐