Tag: 服务



27 五 09

前言:其实使用Varnish真的有一年多的时间了,算是使用较早的了,从原来1.1.4到现在的2.0.4基本每个版本我都用过,而且也为了不同的网站架构做过很多的改动,效果一直都让我很满意。但我一直没有怎么写过文章,的确是因为觉得他还是太简单了,但还是总遇到不少人问,而且中文这方面的资料确实不多,很多都是零散和过时的,也确实是因为用这个的人好像不多。我自己刚开始的时候也是叫天不应的那种情况,没人帮忙,只好自己慢慢测试了。

今天又有一朋友问我,我兴致大发,聊了不少,还是比较懒啊,我直接把对话整理了下,这样也好更直接明了,比直述的强,我想很多人都有这些疑問。对话中如果你仔细的话还会看到一些网站中用到的方案我想都是比较实用的。最后还会附上一个VCL的样本,这段脚本是把不同的网站架构情况集中到了一个上面,而且尽量运用了varnish的一些最新的功能,并且这些都是经过了生产实践后的一个精华浓缩。希望更多的人来研究Varnish让他越来越好。

—————
首先是大Y问我一个配置方面的问题,问题前半部分削掉看主要的
——————————————————————————————————

大Y
10:44 »
我们这边全部都是走的域名~不允许直接指定IP

Ajian
11:00 »
backend xxxx {
.host = “s01.cache.xxx.com”;
.port = “80″;
} 这个位置 host最好是用IP 用域名也得做hosts 不然会慢的 域名的 这个地方的IP 跟你说的走域名不允许走IP 是不一样的 是告诉varnish 那个要访问的域名在哪台服务器上而已

后面的配置中才会有域名相关的配置
大Y
11:01 »
用域名也得做hosts 不然会慢的??

Ajian
11:02 »
你想 直接访问一个机器是IP 快还是域名快?

11:03 »
域名还需要走DNS 而你做hosts的会是本地解析 就会相对不做的快些

大Y
11:04 »
但这样会在管理上比较麻烦~
如果后端的机器IP变了~~你可能需要把所有的机器hosts或配置文件改一边~~

Ajian
11:05 »
嗯 这个会有这个麻烦 但这个更改远比你使用得少吧
你每次使用都会降低这个速度

当然你还可以自己内部做DNS
如果你要用域名没有问题 你内部做个DNS会比较好 你要知道 外部的DNS 还经常出问题呢 速度还是个很大的影响

大Y
11:08 »
恩~~我们每段vlan都会做dns服务器:)

—————

开始聊到vanrish和squid的区别了 varnish的优点和缺点

——————————————————————————————————

大Y
11:07 »
我说这个和squit的对比~:)

Ajian
11:07 »
对比做过 我肯定是喜欢vanrish才一直用它

大Y
11:08 »
你觉得这个相比较好处在那~?

Ajian
11:10 »
好处在于简单 而且速度快 当然这个只能对图片这些小文件来说 对于大文件 我觉得squid的磁盘缓存还是会好些 另外squid的缺点也让他性能不高 使用squid经常要重启 性能是越用越慢
而varnish 我用了很久也不需要去怎么维护他 如果你的网络结构不变的话
也可能我的squid使用得不好

大Y
11:11 »
恩~我现在主要是想用这做图片什么的缓存~

11:12 »
呵呵你实际测试过~大概性能能提升多少:)

Ajian
11:13 »
提升 这样打个比喻吧 缓存的效果 如果在同样的访问量在 varnish 后端的WEB 是100K 流量 而squid后端是10M的流量
当然这个还在于squid的配置水平
但从这一点说明varnish是相当简单 对吧

Ajian
11:20 »
你刚才说的性能问题 我现在用个实例说明下 你对比下你们的squid看下 有没有区别 我们现在一个cache组的总流量出口为最高80M 而后端总共流量不过2M

大Y
11:17 »
对了对于前端反应上~~squit和var区别大么?

Ajian
11:20 »
前端反应?

大Y
11:22 »
恩~~就是用户响应这块~
我们比较关注用户响应~~这块~

Ajian
11:22 »
个人觉得vanrish快

大Y
11:22 »
比方命中率~

Ajian
11:23 »
命中率 你应该从刚才我举的例子来看

当然这个你得看varnish的并发能力 这个我没有具体去压过 因为没有好的压力测试工具 有时间你可以做个詳細的对比测试

varnish是基于内存的 是直接读取 而squid是从硬盘读取 在工作正常的情况下 你想哪个会比较快?

原理来说 是varnish快 只要varnish 工作正常 而且能够承受够大的并发压力

大Y
11:25 »
恩~我看中var也是因为它是基于内存的~

Ajian
11:26 »
这个有优点 也有一个不好的缺点
一旦你需要更新 或者重启varnish的时候会造缓存丢失

大Y
11:27 »
恩对后端压力大

Ajian
11:27 »
如果你前面的cahce 很多 而且同时重启的话会对后端压力很大

所以一定尽量不要重启他 或者重启他的时候 错开时间 不要同时

你如果真的用上的话 还有一个课题必需要攻克的就是如何清理指定缓存的问题 我现在也在为这个为难 如果是用默认的hash还是可以解决

大Y
11:30 »
我看它这个也支持PURGE来清理指定的缓存~

Ajian
11:30 »
这个只能在默认hash的情况下
hash的规则 像我们站现在的 就加了很多 就无法使用 主要是不清楚他内部的具体机制

大Y
11:33 »
默认hash我看说比较影响性能~~

Ajian
只能说默认的hash少了些东西 网站总有很多特殊的东西
他是最基本的 会少很多东西
如压缩的

—————

新Varnish的功能

——————————————————————————————————

大Y
11:36 »

我看到了2后支持RR和健康监测~~
呵呵~你做了这么?

Ajian
11:37 »
这个我就用着

不过他的健康状态监测比较的傻 我只能把他当成备份的一种策略来做

大Y
11:39 »
哦他监控检测发现失败后会剔除出去么?

Ajian
11:39 »
健康状态监测很傻 在执行失败后会按你给他的服务器列表挨个跑一遍 直到遇到好的
他有个负载机制 还行

大Y
11:40 »
失败一次后不会以后每次都是挨个走一遍?

Ajian
11:46 »
失败后 会转到你设置的服务器列表 如你配置说如果第一次出错了 就找到哪个服务器 如果再失败了再去哪个服务器 这个就看你怎么设置了 你也可以让他重试几次 ,我现在的策略是 有一台比较差的服务器做备份机 所有出错的都会转给一台机器 减少重试次数

大Y
11:49 »
哦~呵呵~~~

11:51 »
你那有vcl呵呵能发我参考看看么:)

所以我决定还是写一个VCL的样本吧,这个VCL的样本把我原来用的几种情况的VCL都归到一个脚本中了,是经过生产情况的考验的。

环境:有四台WEB,

WEB1-3为提供 www.test.com bbs.test.com 的后端服务器

WEB1-2为负载均衡根据服务器情况设置权重

WEB3为健康状态检测后的备份机 意思就是如果访问WEB1-2其中一台机器出现问题的问题那么转向WEB3服务器再访问
WEB4为theme.abc.com的后端服务器

backend web1 {
  .host = "192.168.0.1";
  .port = "80";
}
backend web2 {
  .host = "192.168.0.2";
  .port = "80";
}
backend web3 {
  .host = "192.168.0.3";
  .port = "80";
}
backend web4 {
  .host = "192.168.0.4";
  .port = "80";
}                            
 
#负载轮询机制
director default random {
  {
    .backend = web1;
    .weight = 200;  }
    {
      .backend = web2;
      .weight = 300;  }
}
#允许清理缓存控制
acl purge {
  "localhost";
  "127.0.0.1";
  "192.168.0.0"/26;
}
sub vcl_recv {
  if (req.request == "PURGE") {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    elseif(req.url ~ "\.(php|cgi)($|\?)") {
      pass;
    }
    else {
      lookup;
    }
  }
#设置健康状态检测机制,这里实际是使用了一个备份功能
  if((req.http.host ~"^(www.|bbs.)?test.com")&&(req.restarts == 0))  {
    set req.backend = default;
  } elseif(req.restarts == 1) {
    set req.backend = web3;
  }
#另外一个域名的配置
  if(req.http.host ~"^(theme.|special.)?abc.com") {
    set req.backend = web4;
  }
#定义一些缓存的内容 PHP 不缓存
  if (req.request != "GET" && req.request != "HEAD")
  {
    pipe;
  }
  elseif (req.url ~ "\.(php|cgi)($|\?)")
  {
    pass;
  }
  elseif (req.http.Authenticate || req.http.Authorization) {
    pass;
  }
  lookup;
}                                                                      
 
sub vcl_hit
{
  if (req.request == "PURGE") {
    set obj.ttl = 0s;
    error 200 "Purged.";
  }                            
 
  if (!obj.cacheable)
  {
    pass;
  }                  
 
  if (obj.http.Vary)
  {
    unset obj.http.Vary;
  }
}                       
 
sub vcl_miss
{
  if (req.request == "PURGE") {
    error 404 "Not in cache.";
  }
}
#定义hash的值 这个跟清空缓存有很大的关系
#处理压缩情况的内容
sub vcl_hash {
  set req.hash += req.url;
  if (req.http.host) {
    set req.hash += req.http.host;
  } else {
    set req.hash += server.ip;
  }
  if ( req.http.Accept-Encoding ){
    if (req.url ~ "\.(jpg|jpeg|png|gif|rar|zip|gz|tgz|bz2|tbz|mp3|ogg|swf|exe|flv|avi|rmvb|rm|mpg|mpeg|pdf)$") {
    } else {
      set req.hash += req.http.Accept-Encoding;
    }
  }
  hash;
}
 
sub vcl_fetch
{
#轮询机制的一部分,定义什么时候就restart
  if ((obj.status == 500 || obj.status == 501 ||  obj.status == 502 ||  obj.status == 503) && req.restarts < 2) {
    restart;
  }
  if (!obj.cacheable)
  {
    pass;
  }
#决定哪些头不缓存
  if (obj.http.Pragma ~ "no-cache" || obj.http.Cache-Control ~ "no-cache" || obj.http.Cache-Control ~ "private") {
    pass;
  }
 
  if (obj.http.Set-Cookie)
  {
    pass;
  }
#定义不同内容的缓存时间
  if (req.request == "GET" && req.url ~ "\.(txt|js|css|html|htm)$") {
    set obj.ttl = 600s;
  }
  else {
    set obj.ttl = 10d;
  }
}






16 一 09

[前言]

随着服务器的增加和应用对时间的依赖性,在一个大的网站中时间服务器应该是必不可少的,我们应该尽力的使所有的服务器都是同一种配置,这样即有利我们配置更有利于我们维护。

[问题]

如果时间差别太大,会产生很多的问题:
1
、系统时间旧于软件创建的时间,造成软件无法安装
2
、系统时间不稳定,造成数据同步将出现问题
3
、多台计划任务不能统一准时执行
4
、对时间依赖较大的软件会出现混乱,如论坛贴子的发布等

[方案]

时间的同步这里采用NTP,NTP类似于DNS可以实现分布式的同步,避免网络延时造成的影响。服务器可以单独直接和上层公共时间服务器同步,这样的缺点时网络的延时可能造成各主机的时间并不一定统一和准确。最好是在内部自己建立一个对外同步的时间服务器,其它主机都跟内部这台时间服务器进行同步。

[部署]

环境:

1、系统:CentOS 4 CentOS 5.2 slackware 12 slackware 11 slackware 10 (我们的主机较多、 版本较多)
2
、时间服务IP192.168.0.3 192.168.0.4

安装:

不管是服务器端还是客户端都需要安装ntp的软件。建议:像这种辅助性的服务安装建议用系统自带的,没有必要弄得很复杂。
CentOS
yum -y install ntp
Slackware: slackpkg install ntp
(这个是安装有slackpkg这个包管理工具的)
当然也可以下相应的rpmtgz

主要配置:

ntp只有一个配置文件就是/etc/ntp.conf 还有些相关的有用的配置文件和命令在后面会有提及。

服务器端ntp.conf

# /etc/ntp.conf: Configuration file for ntpd.

#

server 127.127.1.0 # local clock

fudge 127.127.1.0 stratum 10

1、以上为原本内定的一个内部时间资料,不需要更动他

server 1.asia.pool.ntp.org prefer

server 0.asia.pool.ntp.org

server 2.asia.pool.ntp.org

server 3.asia.pool.ntp.org

2、上面四条为设置上层来源的四个地址,注意这个地址是各个国家和地区有不同 而且还有优劣性,

这四个地址都是亚洲地区的,可以自己在服务器上PING四个地址判断其优劣性,我的服务器 1.asia.pool.ntp.org速度快,并且给了prefer的优先级。

# Drift file. Put this in a directory which the daemon can write to.

# No symbolic links allowed, either, since the daemon updates the file

# by creating a temporary in the same directory and then rename()’ing

# it to the file.

3、调整时间差异的功能,保持默认值就可以了

driftfile /etc/ntp/drift

#multicastclient # listen on default 224.0.1.1

broadcastdelay 0.008

# Access Controls

# Keys file. If you want to diddle your server at run time, make a

# keys file (mode 600 for sure) and define the key number to be

# used for making requests.

# PLEASE DO NOT USE THE DEFAULT VALUES HERE. Pick your own, or remote

# systems might be able to reset your clock at will.

#keys /etc/ntp/keys

#trustedkey 65535

#requestkey 65535

#controlkey 65535

# Don’t serve time or stats to anyone else by default (more secure)

restrict default ignore

4、以下都是访问控制

# Trust ourselves. :-) 允许自己

restrict 127.0.0.1

# restrictions for ntp pools 限制的NTP

restrict 0.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 1.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 2.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 3.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

# permit all the internal private network servers to query the time 允许访问的网段,对客户端的

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap

restrict 其中 parameter 的参数:

  • ignore
    拒绝所有类型的 NTP 连线;
  • nomodiy
    用户端不能更改 NTP 伺服器的时间参数,这即表示用户端不能使用 ntpc ntpq 这两支程式来修改伺服器。 但用户端仍可透过这部主机来进行网路校时的;

  • noquery
    用户端不能够使用 ntpq, ntpc 等指令来查询时间伺服器,等於不提供 NTP 的网路校时罗;

  • notrap
    不提供 trap 这个远端事件登录 (remote event logging) 的功能。

  • notrust
    拒绝没有认证的用户端。

那如果没有任何参数的话,这表示『该 IP 或网段不受任何限制』的意思!

客户端ntp.conf

# /etc/ntp.conf

#

server 192.168.0.3

server 192.168.0.4

driftfile /etc/ntp/drift

restrict default ignore

restrict 127.0.0.1

restrict 192.168.0.3 mask 255.255.255.255 nomodify notrap noquery

restrict 192.168.0.4 mask 255.255.255.255 nomodify notrap noquery

客户端的ntp.conf跟服务器端一样的语法 ,只是将内部设置的时间服务器做为上层伺服务器源主机。

次要配置:

1、修改 /etc/sysconfig/ntpd

# Drop root to id ‘ntp:ntp’ by default.

OPTIONS=”-u ntp:ntp -p /var/run/ntpd.pid”

# Set to ‘yes’ to sync hw clock after successful ntpdate

SYNC_HWCLOCK=yes

将上面的no 改为yes 这个是系统时间跟BIOD时间同步的一个设置

注意:这个文件在slackware是没有的,我也单独添加了这个文件不知道是否是正常生效了。

# Additional options for ntpdate

NTPDATE_OPTIONS=”"

2、添加启动项

如果是用系统的包安装的:
CentOS: 1)
setup 选择 system service 2) chkconfig ntpd on
Slackware:
第一步chmod +x /etc/rc.d/rc.ntpd 第二步添加到启动中
/etc/rc.d/rc.M

# Start the Network Time Protocol daemon:

if [ -x /etc/rc.d/rc.ntpd ]; then

sh /etc/rc.d/rc.ntpd start

fi

3、查看和修改时区

查看时区
cat /etc/sysconfig/clock
slackware没有)显示的是地区
date -R
显示的是时区号

修改时区
# tzselect
# timeconfig (
仅限于RedHat Linux CentOS)

3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$
主时区/$次时区 /etc/localtime

在中国可以使用:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

启动服务

CentOS: 1)service ntpd restart 2) /etc/init.d/ntpd restart
Slackware:1)/etc/rc.d/rc.ntpd restart

查看结果

注意:一般服务启动15分钟内才会同步时间,这个时间不是很固定所以要注意,不过还是有判断的标准的。

1、(只适用于centos redhat这种) ntpstat

synchronised to NTP server (192.168.0.4) at stratum 4 <==同步的服务器

time correct to within 174 ms <==服务器与客户端的时间差

polling server every 1024 s <==下次同步的时间

这个可以很清楚的看到同步的情况,可惜slackware下没有看到这个命令

2ntpq -p

remote refid st t when poll reach delay offset jitter

=============================================================

+192.168.0.3 61.129.66.79 3 u 328 1024 377 1.142 -62.973 0.257

*192.168.0.4 61.129.66.79 3 u 763 1024 377 1.188 22.298 3.615

这个 ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,上头的几个栏位的意义为:

  • remote:亦即是 NTP 主机的 IP 或主机名称~注意最左边的符号, 如果有『+』代表目前正在作用当中的上层 NTP ,如果是『*』代表也有连上线,不过是作为次要连线的 NTP 主机。

  • refid:参考的上一层 NTP 主机的位址

  • st:就是 stratum 阶层!

  • when:几秒钟前曾经做过时间同步化更新的动作;

  • poll:下一次更新在几秒钟之后;

  • reach:已经向上层 NTP 伺服器要求更新的次数

  • delay:网路传输过程当中延迟的时间,单位为 10^(-6)

  • offset:时间补偿的结果,单位与 10^(-6)

  • jitterLinux 系统时间与 BIOS 硬体时间的差异时间, 单位为 10^(-6) 秒。

3ntptrace -n 127.0.0.1

ntptrace -n 127.0.0.1

127.0.0.1: stratum 4, offset -0.019501, synch distance 0.298589

192.168.0.4: stratum 3, offset 0.005055, synch distance 0.200525

61.129.66.79: stratum 2, offset 0.006232, synch distance 0.123439

209.81.9.7: stratum 1, offset -0.000008, synch distance 0.000465, refid ‘GPS’

其它:

时间设置:

如果时间差别太大、或者在没有时间同步服务器的情况下可以用手动设置的方法

时间

1、查看时间和日期

date

2、设置时间和日期

date -s “dd/mm/yyyy hh:mm:ss”

将系统日期设定成1996610日的命令

date -s 1996-06-10

将系统时间设定成下午1520秒的命令

date -s 13:52:00

3. 将当前时间和日期写入BIOS,避免重启后失效

hwclock -w

简单的客户端同步法:

如果主机不算太多的话 加一条到计划任务就可以了。

#crontab -e
10 5 * * * root /usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock -w

参考文章 :

鳥哥的 Linux 私房菜http://linux.vbird.org/linux_server/0440ntp.php