工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表2013年06月的文章

mysql 开启慢查询日志

优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长),我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow Query Log记录功能,它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。记录slow queries

首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。

#打开服务
log_slow_queries = ON

当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。
启用slow query日志
#//将下列配置放到my.cnf中
[mysqld]
log-slow-queries = /var/lib/mysql/slow-queries.log

//新增加的参数
long_query_time = 3
log-queries-not-using-indexes
log-slow-admin-statements

 

上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。
log-slow-queries <slow_query_log_file>
存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。
long_query_time
如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。
log-queries-not-using-indexes
MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。
log-slow-admin-statements
一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。
日志文件

我们可以通过tail -f查看日志文件。
$tail -f /var/lib/mysql/slow-queries.log
# Time: 110107 16:22:11
# User@Host: root[root] @ localhost []
# Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1 Rows_examined: 6261774
SET timestamp=1294388531;
select count(*) from ep_friends;

第一行,SQL查询执行的时间
第二行,执行SQL查询的连接信息
第三行记录了一些我们比较有用的信息
Query_time SQL执行的时间,越长则越慢
Lock_time 在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
Rows_sent 查询返回的行数
Rows_examined 查询检查的行数
Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设 计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:
*锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间
*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优
*备份数据库,I/O变慢
*也许同时运行了其它的查询,减少了当前查询

所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。
线上记录slow query

上文的配置需要重启mysql server进程mysqld才会生效。但是很多时候,尤其是产品运营环境,不希望每次修改都需要重新启动mysql服务器,也希望能在某些特定时间记 录。MySQL5.1给我们提供了更为灵活的运行时控制,使得你不必重新启动mysql服务器,也能选择性地记录或者不记录某些slow queries。

MySQL5.1中,提供了全局变量slow_query_log、slow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间
#//停用slow query记录
#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变
mysql>set global slow_query_log=OFF

不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制,但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如
mysql>set global long_query_time = 3600;

MySQL5.0, 不关服务的情况下,希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic link)。注意:你只需要在改变后运行FLUSH LOGS以确定MYSQL释放当前的日志文件描述符,重新把日志记录到/dev/null

和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为,将日志记录到数据库表中。只要将mysql全局变量log_output设置为 TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是,我们推荐将日志记录 在日记文件中。
mysql> show variables like ‘log_output’\G
Variable_name: log_output
Value: FILE
mysql>set global log_output=’table’;
缺陷与审记

虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本,还有几大蹩足的地方。
1.MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.
2.不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。
3.如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

通过microslow-patch补丁可使用更细的时间粒度,和记录所有执行过的sql语句。不过,使用这个补订不得不自己编译MySQL,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…

MySQL自带了mysqldumpslow工具用来分析slow query日志,除此之外,还有一些好用的开源工具。比如MyProfi、mysql-log-filter,当然还有mysqlsla

rndc: ‘reload’ failed: not found解决

在执行rndc reload abc.com的时候,系统返回错误:
rndc: ‘reload’ failed: not found

发生这个错误的原因在使用单独域名reload时,rndc命令不能对新添加的域名生效,只能对已经存在的域名有效果。

也就是说当在bind里面配置对新的域名解析时,需要通过rndc reload方式去读取全部conf文件。

在这之后就可以使用rndc reload abc.com进行单独域名的更新了。

同时提示,如果使用了view方式话,需要在rndc的时候指定下
rndc reload abc.com in view_name

bind nsupdate

#设置一些必要的变量    
keyname=rndc-key    
keysecret=gAnBYq6xSv7FKTZFmzAD0Q==    
          
#用来检测本机网络是否正常    
function network_detect(){    
ping -c1 8.8.8.8 >/dev/null 2>&1 && echo connect || exit 1
}    
          
#用来删除DNS记录    
function del_record(){    
/usr/local/bind/bin/nsupdate <<EOF    
key $keyname $keysecret    
update delete $domain A $1
send    
quit    
EOF    
}    
          
#用来增加DNS记录    
function add_record(){    
/usr/local/bind/bin/nsupdate <<EOF    
key $keyname $keysecret    
update add $domain 3600 A $1
send    
quit    
EOF    
}  

linux安全加固(转)

1  BIOS 
你应该总是在系统启动的时候设置一个BIOS 密码和禁用从CD-ROM 和软盘引导,这将可以防止一些人未经允许访问你的系统和更改BIOS 设置

2 
sshd 服务 
SSH
 是一个协议,利用它可以登录到一个远程系统或远程执行系统命令,默认允许root 登录,并且sshv1 存在缺陷,我们应该在sshd_config 禁止root 访问和使用sshv2 来让ssh 更加安全
#vi /etc/ssh/sshd_config
 
Protocol 2
PermitRootLogin = no
#sshd /etc/rc.d/init.d/sshd restart

3  禁用 telnet 
早期的Linux 默认开启telnet 服务,telnet,ftp,rlogin 都是明文传输的协议是容易被嗅探到的,这就是为什么推荐使用安全的版本(sftp,scp,ssh )的原因,如果你必须要使用telnet ,那么至少应该隐藏banner 信息
#vi   /etc/xinetd.d/telnet
disable=yes

4  禁用代码编译 
你可以禁用代码编译并且只把编译的权限分配给一个用户组
#
 该组的成员可以编译代码
/usr/sbin/groupadd compiler
# 把常见的编译器所属组赋给编译用户组
chgrp compiler /usr/bin/*cc*   
chgrp compiler /usr/bin/*++*
chgrp compiler /usr/bin/ld
chgrp compiler /usr/bin/as
 

# 设置mysqlaccess 的 访问
chgrp root mysqlaccess
 
#
 设置权限
chmod 750 /usr/bin/*cc*
chmod 750 /usr/bin/*++*
chmod 750 /usr/bin/ld
chmod 750 /usr/bin/as
chmod 755 /usr/bin/mysqlaccess
#
 把用户添加到组里
vi /etc/group
 

compiler:x:520:user1,user2

5 ProFTP 
#
 修改proftpd.conf 来禁止root 登陆
vi /etc/proftpd.conf
 
Add RootLogin off
/sbin/service proftpd restart

6 
TCP wrappers 
编辑hosts.allow hosts.deny 可以限制或允许访问inet 服务
vi   /etc/hosts.allow
 
#Approved IP addresses
ALL:192.168.0.1
ALL:192.168.5.2
#CSV uploader machine
proftpd:10.0.0 .5
#pop3 from antwhere
ipop3:ALL
vi /etc/hosts.deny
ALL:ALL EXCEPT localhostENY

7 
、创建su 用户组 
因为我们在SSH 禁止了root 用户访问并且禁用了telnet ,所有我们应该分配给一些用户su 权限来获取root 特权
vi /etc/group
 ,添加一行如下
wheel:x:10:root,user1,user2
 
chgrp wheel /bin/su
chmod o-rwx /bin/su
说明:或者直接使用pam 模块来做,再则也可以编译/etc/sudoers 来做

8 
root 通知 
当一个具有root 权限的用户登录的时候发mail ,具体实施方法如下:
vi /root/.bashrc 
,当有root 权限的用户登录时发生email 通知
 
echo ‘ALERT – Root Shell Access (Server Name) on:’ `date` `who` | mail -s “Alert: Root Access from `who | cut -d”(” -f2 | cut -d”)” -f1`” your@email.com

 

9 history 安全 
这是一个避免删除.bash_history 或重定向到/dev/null 的好主意,因此他不能清除或删除他最后执行的命令
chattr +a .bash_history
chattr +i .bash_history
获取用户的人会知道他的历史命令锁定并且要同意才可以使用服务

10 
、使用欢迎信息 
你必须提供一些信息让攻击者知道该系统不对公众开放,在国外有类似案件,攻击者入侵一个系统并且系统没有这些信息,这种情况下法院不能做任何裁决,因为系统说welcome
1
 )删除/etc/redhat-release
2
 )编辑/etc/issue /etc/motd 并显示警告信息

11 
、禁用所有特殊账户 
#
 你应该从系统中删除所有默认用户和组
例如news,lp,sync,shutdown,uucp,games,halt 
userdel name
groupdel name
#
 锁定特定账户
/usr/sbin/usermod -L -s /bin/false user

12 
chmod 危险文件 
这可能是限制不具有root 权限的用户执行下面这些命令的好主意
chmod 700 /bin/ping
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /usr/bin/locate
chmod 700 /usr/bin/whereis
chmod 700 /sbin/ifconfig
chmod 700 /usr/bin/pico
chmod 700 /usr/bin/vi
chmod 700 /usr/bin/which
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm

13 
、指定允许root 登陆的TTY 设备 
因为/etc/securetty 文件允许你指定root 可以从哪个TTY 设备登录
vi /etc/securetty
 ,然后只留2 个连接
tty1
tty2

14 
、选择一个安全的密码 
/etc/login.defs 文件中定义了shadow 密码的具体配置,默认密码长度最短为5 字符,你应该至少设置为8 
vi   /etc/login.defs
PASS_MIN_LEN   8

 

15 、检测Rootkit 
chkrootkit rkhunter ,以chkrootkit 为例
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz 
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5

md5sum chkrootkit.tar.gz  # 首先检查md5 校验值
tar -zxvf chkrootkit.tar.gz
cd chkrootkit
./configure && make sense
然后运行./chkrootkit
我们可以将其添加到contrab 使其每天自动扫描:
vi /etc/cron.daily/chkrootkit.sh
#!/bin/bash
#
 输入chkrootkit 的安装目录
cd /root/chkrootkit/
# 
输入你想收到检测报告的email 
./chkrootkit | mail -s “Daily chkrootkit from Server Name” your@email.com 

16 
、安装补丁 
你要经常检查更新以修复某些缺陷或系统稳定性的改进,否则你存在漏洞的系统将会不时的遭受新的攻击
#
 列出可用更新
up2date -l
#
 安装未排除的更新
up2date -u
#
 安装包括排除的更
up2date -uf

17 
、隐藏Apache 信息 
你应该隐藏Apache banner 信息使攻击者不知道Apache 的版本,从而使他们难以利用漏洞
vi /etc/httpd/conf/httpd.conf
#
 改变服务器签名
ServerSignature Off
service httpd restart

18 
、隐藏php 信息 
你应该隐藏php banner 信息,原因同上
vi php.ini
 
expose_php=Off
 
service apache restart

19 、关闭不用的服务 
你应该把任何未使用的服务关闭,可以在/etc/xinetd.d 文件夹里找到
cd /etc/xinetd.d
grep disable * | column  -t
这将显示所有服务开启或关闭的状态,然后根据需要来开启或关闭服务

20 
、检测监听的端口 
检测是否有必要开放端口是非常重要的
 
netstat -tulp
  lsof -i -n | egrep ‘COMMAND|LISTEN|UDP’  nmap 

21 、关闭端口和服务 
重点是关闭在系统启动时打开的不需要的端口,方法如下:
#
 对于正在运行的服务,可以执行
chkconfig -list | grep on
#
 禁用服务可以执行
chkconfig servicename off
#
 然后停止正在运行的服务
/etc/init.d/service stop

22 
、删除不用的rpm  
首先应该清楚你的系统的作用,它是web,mail,file 服务器或其他,然后觉得哪些包是必要的,之后删除不需要的软件包,方法如下:
#
 首先列出安装列表
rpm -qa
#
 更详细的信息
rpm -qi rpmname
#
 还可以检测删除包可能出现的冲突
rpm -e --test rpmname

23 
、禁用危险的php 函数 
你应该禁用php 的危险函数防止在网站上执行系统命令whereis php.ini
vi /usr/local/lib/php.ini
disable_functions = “symlink,shell_exec,exec,proc_close,proc_open,popen,
system,dl,passthru,escapeshellarg, escapeshellcmd”

24 
、安装配置防火墙 
高级策略防火墙(APF )是一种IP 表(网络过滤),它是基于当今互联网部署服务器防火墙系统的基本需要和客户部署LINUX 安装的唯一需要而设计的。 它是最好的开源防火墙之一
1
 )配置APF 防火墙方法:
wget http://www.r-fx.ca/downloads/apf-current.tar.gz 

tar -zxvf apf-current.tar.gz
cd apf-0.9.7 -1
./install.sh

2 vi /etc/apf/conf.apf ,一般配置如下
启用防火墙使用DShield.org 块列表
USE_DS=”1″
然后我将列出常规的配置和CPanel 配置方式,因为CPanel 是应该最广泛的虚拟主机管理软件

1 )常规配置(DNS,Mail,Web,FTP)

Common ingress (inbound)
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,995″
# Common ingress (inbound) UDP ports IG_UDP_CPORTS=”53″
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF=”1″
# Common egress (outbound) TCP ports
EG_TCP_CPORTS=”21,25,80,443,43″
# Common egress (outbound) UDP ports
EG_UDP_CPORTS=”20,21,53″

2 CPanel 配置
Common ingress (inbound) ports
# Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,2082,2083, 2086,2087,2095, 2096,3000_3500″
# Common ingress (inbound) UDP ports
IG_UDP_CPORTS=”53″
Common egress (outbound) ports
# Egress filtering [0 = Disabled / 1 = Enabled]
EGF=”1″
# Common egress (outbound) TCP ports
EG_TCP_CPORTS=”21,25,80,443,43,2089″
# Common egress (outbound) UDP ports
EG_UDP_CPORTS=”20,21,53″
 
之后启动防火墙:/etc/apf/apf -s ,如果运行良好我在回去修改配置文件,使DEVM=”0″

3 )配置APF AntiDos
vi /etc/apf/ad/conf.antidos
 ,找到下面的内容并替换成你的资料
# Organization name to display on outgoing alert emails
CONAME=”Your Company”
# Send out user defined attack alerts [0=off,1=on]
USR_ALERT=”0″
# User for alerts to be mailed to
USR=you@yourco.com 
你应把USR_ALERT 改为1
保存后重启APF /etc/apf/apf –r

To make the firewall start with the Operating System: chkconfig –level 2345 apf on 
APF
 开机自启动:chkconfig –level 2345 apf on
禁止一个IP /etc/apf/apf -d ip 或vi /etc/apf/deny_hosts.rules
允许一个IP /etc/apf/apf -a ip 或vi /etc/apf/deny_hosts.rules

 

25 、安装配置BFD (暴力破解检测) 
BFD
 是一个用于分析应用日志和检测验证失败的模块化shell 脚本,而且安装配置和用法都是非常容易的。使用BFD 的原因很简单,其实在LINUX 领域几乎没有结合防火墙或实时设备来监控不验证和暴力攻击审计的程序。在用BFD 之前你必须安装APF 防火墙
wget http://www.r-fx.ca/downloads/bfd-current.tar.gz 
tar -zxvf bfd-current.tar.gz
cd bfd-0.9

vi /usr/local/bfd/conf.bfd
#
 把以下内容改为你的资料

# Enable/disable user alerts [0 = off; 1 = on]
ALERT_USR=”1″
# User alert email address
EMAIL_USR=”your@mail.com” 
# User alert email; subject
SUBJ_USR=”Brute Force Warning for $HOSTNAME”
vi /usr/local/bfd/ignore.hosts
 ,然后把你的IP 设置成允许主机,避免意外的锁定自己
#
 重启BFD
/usr/local/sbin/bfd -s

26 
、内核加固(sysctl.conf  
sysctl.conf
 用来加固内核,目的是避免DOS 和欺骗攻击,具体的方法如下:
#
 了解下当前配置的大概情况
sysctl -a
vi /etc/sysctl.conf
添加如下内容:

# Kernel sysctl configuration file for Red Hat Linux
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0 
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1 
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0 
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1 
#Prevent SYN attack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
 
# Disables packet forwarding
net.ipv4.ip_forward=0 
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
 
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
 
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
 
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.lo.log_martians = 1
net.ipv4.conf.eth0.log_martians = 1
 
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
 
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
 
net.ipv4.conf.default.rp_filter = 1 
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
 
# Disables the magic-sysrq key
kernel.sysrq = 0 
# Modify system limits for Ensim WEBppliance
fs.file-max = 65000 
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15 
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800 
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0 
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0 
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0 
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1 
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1 
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1 
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1 
# Set maximum amount of memory allocated to shm to 256MB
kernel.shmmax = 268435456 
# Improve file system performance
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2 
# Improve virtual memory performance
vm.buffermem = 90 10 60 
# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024 
# Increase the maximum total TCP buffer-space allocatable
net.ipv4.tcp_mem = 57344 57344 65536 
# Increase the maximum TCP write-buffer-space allocatable
net.ipv4.tcp_wmem = 32768 65536 524288
# Increase the maximum TCP read-buffer space allocatable
net.ipv4.tcp_rmem = 98304 196608 1572864 
# Increase the maximum and default receive socket buffer size
net.core.rmem_max = 524280
net.core.rmem_default = 524280
 
# Increase the maximum and default send socket buffer size
net.core.wmem_max = 524280
net.core.wmem_default = 524280
 
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000 
# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536 
# Increase the maximum memory used to reassemble IP fragments
net.ipv4.ipfrag_high_thresh = 512000
net.ipv4.ipfrag_low_thresh = 446464
 
# Increase the maximum amount of option memory buffers
net.core.optmem_max = 57344 
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 1024 
## DO NOT REMOVE THE FOLLOWING LINE!
## nsobuild:20051206
#
 重启后生效
/sbin/sysctl -p
 

sysctl -w net.ipv4.route.flush=1

27 、更改SSH 端口 
更改SSH 默认端口号在一定程度上可以提高安全性
vi /etc/ssh/sshd_config
Port 22
 改为其他端口
当然不要忘记把更改的端口加进防火墙,然后重启生效:/etc/init.d/ssh restart ,如果安装了APF 并把端口添加之后,还要重启APF:/etc/init.d/apf restart

28 /tmp,/var/tmp,/dev/shm 分区的安全 
/tmp,/var/tmp,/dev/shm
 目录是不安全的,任何用户都可以执行脚本,最好的解决办法是挂载nocexec nosuid 选项的参数( 注意:不建议在CPanel 使用)

1
 /tmp 目录
cd /dev
#
 创建 100M (“count”) 的存储文件:
dd if=/dev/zero of=tmpMnt bs=1024 count=100000
#
 设为一个扩展的文件系统
/sbin/mke2fs /dev/tmpMnt (“…is not a block special device. continue?”
 回答yes)
#
 备份现有临时文件
cp -R /tmp/ /tmp_backup
#
 noexec 挂载新文件系统: 
mount -o loop,rw,nosuid,noexec /dev/tmpMnt /tmp
chmod 0777 /tmp
#
 把备份的文件拷贝回去
cp -R /tmp_backup/* /tmp/
#
 删除备份
rm -rf /tmp_backup
#
 修改/etc/fstab 添加下面的条目使其在引导时仍然有效
/dev/tmpMnt /tmp ext2 loop,rw,nosuid,noexec 0 0

2
 /var/tmp 目录
mv /var/tmp /var/tmpbak
ln -s /tmp /var/tmp
cp /var/tmpbak/* /tmp/

3
 /dev/shm 目录
vi  /etc/fstab
"none /dev/shm tmpfs defaults,rw 0 0"  
改为  "none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0"

SSH/SCP无密码操作/rsync同步

SSH/SCP无密码操作

A,B机
A上执行
ssh-keygen -t rsa
会生成文件
/root/.ssh/id_rsa.pub

把这文件上复制到B机上的.ssh目录下
文件名为
authorized_keys
权限为700

然后A机上执行SSH/SCP到B机上,就不需要密码了

 

rsync -e "ssh -p port" -avzp sdir user@ip:ddir

rsync -e "ssh" -az --delete sidr user@ip:ddir

 

nxdomain redirect 以及在bind 9.9中的实现

今天客户有个需求,就是将不存在的解析域名请求都解析到他们的一台设备上,其实这个就是类似与电信或者联通的域名纠错系统了。

其中SSAC有一篇文章,就是讲这个的,sac-032-en

这个根据网上的资料有几个实现思路

A、F5上配合filter进行实现

B、修改dns源码

C、bind原生支持

F5的实现方式

首先说一下F5上的实现:我们的产品前面确实有F5的负载均衡设备,但是在上面跑着很重要的服务,所以也没去实验,但根据网上的说法这个是可行的:利用rules,就是拆解dns的响应包,如果状态码是NXDOMAIN,则插入A记录或者其它东西;

DNS用于响应的报文由12字节长的首部和4个长度可变的字段组成。其中从第28位开始的4位的标志字段的子字段为rcode为返回码字段,通常的值为0(没有差错)和3(名字差错),名字差错从一个授权的名字服务器上返回,表示在查询中指定的域名不存在。因此把rcode字段返回的值变更为指定的字符串,就可以完成nxdomain redirect的要求

具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
rule dns_redirect {
 when RULE_INIT {
 set ::header_without_id [binary format S5 {0x8180 0x0001 0x0001 0x0000 0x0000}]
 set ::answerpart [binary format S6c4 {0xC00C 0x0001 0x0001 0x0000 0x0D1B 0x0004} {8 8 8 8}] #后面的这四个8 代表ip,8.8.8.8
 }
 when SERVER_DATA {
 binary scan [ string range [UDP::payload] 2 3 ] S sflags
 set rcode [expr $sflags &amp; 0x000f]
 if {$rcode == 3 }{
 binary scan [string range [UDP::payload] 12 13 ] c foo
 set byte [expr $foo &amp; 0xff]
 set offset 12
 set i 0
 while {$byte &gt; 0 &amp;&amp; $i &lt; 10} {
 
# grab a part and put it in our text QNAME section
 set offset [expr $offset + $byte + 1]
 # grab the length of the next part, and make it an unsigned integer
 set byte [string range [UDP::payload] $offset [expr $offset + 1]]
 binary scan $byte c foo
 set byte [expr $foo &amp; 0xff]
 incr i
 }
 incr offset
 binary scan [string range [UDP::payload] $offset [expr $offset + 2]] S qtype
 content
 if {$qtype == 0x0001} {
 UDP::payload replace 0 0 [binary format a2a*a*a* [string range [UDP::payload] 0 1] $::header_without_id [string range
 [UDP::payload] 12 [expr $offset+3]] $::answerpart]
 }
 }
 }
 }

总之,F5还是很灵活的,并且很多isp都在使用,上面的方案就是某isp的一个方案;

修改源代码的方案

接着说下修改源代码的这个方案,当然可以实现,但是开发成本挺高,暂时不考虑

bind-9.9.2 nxdomain redirect

下面就说下使用bind-9.9.2中最新的nxdomain redirect 功能

1、下载

wget ftp://ftp.isc.org/isc/bind9/9.9.2-P1/bind-9.9.2-P1.tar.gz

2、解压

tar zxf bind-9.9.2-P1.tar.gz

3、编译安装

cd bind-9.9.2-P1

./configure --prefix=/var/named --enable-threads --without-openssl --sysconfdir=/var/named/etc --with-libtool

make install

4、几个重要的配置文件

/var/named/etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@chenqing ~]# cat /var/named/etc/named.conf
options {
directory "/var/named";
 
// dump-file "/var/named/data/cache_dump.db";
 
// statistics-file "/var/named/data/named_stats.txt";
 
// memstatistics-file "/var/named/data/named_mem_stats.txt";
 
allow-query { any; };
 
recursion yes;
//forward first ;
//forwarders {127.0.0.1;};
dnssec-enable no;
 
dnssec-validation no;
 
dnssec-lookaside no;
 
/* Path to ISC DLV key */
 
bindkeys-file "/etc/named/bind.key";
};
 
logging {
 
channel default_debug {
 
file "data/named.run";
 
severity dynamic;
};
 
};
 
zone "." IN {
 
type hint;
 
file "named.ca";
 
};
zone "." {
 
type redirect;
 
file "redirect.db";
 
};

/var/named/named.ca

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.              IN  NS
 
;; ANSWER SECTION:
.           518400  IN  NS  M.ROOT-SERVERS.NET.
.           518400  IN  NS  A.ROOT-SERVERS.NET.
.           518400  IN  NS  B.ROOT-SERVERS.NET.
.           518400  IN  NS  C.ROOT-SERVERS.NET.
.           518400  IN  NS  D.ROOT-SERVERS.NET.
.           518400  IN  NS  E.ROOT-SERVERS.NET.
.           518400  IN  NS  F.ROOT-SERVERS.NET.
.           518400  IN  NS  G.ROOT-SERVERS.NET.
.           518400  IN  NS  H.ROOT-SERVERS.NET.
.           518400  IN  NS  I.ROOT-SERVERS.NET.
.           518400  IN  NS  J.ROOT-SERVERS.NET.
.           518400  IN  NS  K.ROOT-SERVERS.NET.
.           518400  IN  NS  L.ROOT-SERVERS.NET.
 
;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET. 3600000 IN  A   198.41.0.4
A.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:ba3e::2:30
B.ROOT-SERVERS.NET. 3600000 IN  A   192.228.79.201
C.ROOT-SERVERS.NET. 3600000 IN  A   192.33.4.12
D.ROOT-SERVERS.NET. 3600000 IN  A   128.8.10.90
E.ROOT-SERVERS.NET. 3600000 IN  A   192.203.230.10
F.ROOT-SERVERS.NET. 3600000 IN  A   192.5.5.241
F.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:2f::f
G.ROOT-SERVERS.NET. 3600000 IN  A   192.112.36.4
H.ROOT-SERVERS.NET. 3600000 IN  A   128.63.2.53
H.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:1::803f:235
I.ROOT-SERVERS.NET. 3600000 IN  A   192.36.148.17
J.ROOT-SERVERS.NET. 3600000 IN  A   192.58.128.30
J.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:c27::2:30
K.ROOT-SERVERS.NET. 3600000 IN  A   193.0.14.129
K.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:7fd::1
L.ROOT-SERVERS.NET. 3600000 IN  A   199.7.83.42
M.ROOT-SERVERS.NET. 3600000 IN  A   202.12.27.33
M.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:dc3::35
 
;; Query time: 147 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon Feb 18 13:29:18 2008
;; MSG SIZE  rcvd: 615

/var/named/redirect.db

1
2
3
4
5
6
7
8
9
10
11
$TTL 300
 
@ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0
 
@ IN NS ns.example.net
 
; NS records do not need address records in this zone as it is not in the
 
; normal namespace.
 
*. IN A 8.8.8.8

5、启动 named

/var/named/sbin/named -c /var/named/etc/named.conf -u named

6、验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@chenqing ~]# dig  xxxxxx.chenqing.org
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.6 <<>> xxxxxx.chenqing.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37117
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;xxxxxx.chenqing.org.       IN  A
 
;; ANSWER SECTION:
xxxxxx.chenqing.org.    300 IN  A   8.8.8.8
 
;; Query time: 1301 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Mar 20 22:02:43 2013
;; MSG SIZE  rcvd: 53

[squid]看上去很美——国内CDN现状与美国对比

CDN的理想与现实
多年以前,当《Kingdom of Heaven》这部史诗电影发行的时候,中国的影迷使用电驴和BT来寻找种子,而那个时候,高清也才刚刚进入电影领域,我的同事不惜用自家的电脑花费一个星期的时间去下载高清的版本。而现在,中国的影迷在使用迅雷去下载《越狱》,而每一集越狱播出以后,在20小时之内,迅雷上面就可以下载到有中文字幕的完整版本,而影迷只要半个小时就可以下载完成,他们使用的是以“CDN”为基础的所谓P2SP服务。我们在这里不需要讨论盗版的问题,我们在这里想谈论的只是互联网和CDN的改变……
我们要谈论CDN么?
互联网的改变让CDN变得不那么神秘与高深
CDN是个古老的东西,在互联网发展之初就已经出现了。一群MIT的精英份子发现如果要让任何地方的人都可以很快的打开自己的网站的话,就需要象在世界各地盖教堂一样,把自己的网页发布到离信众最近的地方去。所以,他们用一种简单的缓存镜像的办法实现了这种发布。最早的入主这个教堂网络的是Yahoo!那是在1998年。就像天做良缘,Yahoo!使用了当时世界上最大的CDN网络,当然现在他还是最大的。啊,忘了解释:CDN是内容投递网络(Content Delivery Network)的简称。我们可以在Wiki上面轻易找到这个单词的解释,但并不是所有人都能轻易理解CDN和它的意义,因为它是一个架接在互联网与传统电信运营商之间的看不见的桥梁。
让我们继续回顾互联网与CDN在那耀眼的一瞬之后的日子,互联网经历了泡沫的破裂,新模式的创新,但CDN却好像渐渐的被人遗忘了。我们熟悉的portal,垂直portal,鼠标加水泥,B2B,C2C,B2C,P2P,Web2.0,搜索,竞价排名,Page Ranking, RSS,Wiki,Meshup,pod_casting,网络游戏,Social Network……那么多我们耳熟能详的名词,或者其实并不明白其中的真正意思,但在炫耀自己的互联网阅历的时候随口说出的几个里面,唯独没有CDN……直到短视频的出现。
YouTube出现在世人面前的时候,人们为互联网的又一次革命而叫好,而与此同时,人们看到了在YouTube后面的一个强大的CDN支持,是这个CDN网络把YouTube的无数视频展现在人们面前,在这个时候,人们发现CDN是不可或缺的,CDN在经历了那么长时间的默默无闻以后,突然一夜间闻达于诸侯,就象君士坦丁大帝把天主教定为国教一样,大家突然认识到了一个不为人熟知的领域。但我们看到的是什么呢?君士坦丁介绍给罗马的天主教是耶稣创立时的教义么?我们所看到的CDN是MIT创立时的CDN么?
人们开始搜索CDN,研究CDN,发现CDN是那么的简单,可以用一页PPT就把原理讲的清清楚楚,而网络硬件的厂商也会这样和互联网的客户说,我们可以提供完整的CDN解决方案,你不需要做什么,买我们的硬件,它已经能够解决你所有的CDN问题。
从此,CDN变成了一个流行词汇,尤其是在高盛领投LimeLight(全球第二大CDN公司) 1.2亿美金之后,突然之间,世界各地都出现了大大小小的CDN公司,无数的投资蜂拥而至,就像那时的罗马,人人都开始信仰天主教,也许是真的信仰,也许是为了圣餐,也许是为了研究,总之,“我们都爱CDN”。
也许有人问:我们谈论的是同一个CDN么,或者我们谈论的不是CDN?
当我们在说CDN的时候,所有的公司都是谈到两个偶像,就像谈耶稣和圣母一样,一个是Akamai(世界第一大CDN公司),一个就是LimeLight。所以,阵营就分开来了,要么介绍自己是师从Akamai,要不就说自己是LimeLight的真传弟子,尽管大部分这么说的人几乎没有见过Akamai和LimeLight的网络和服务,但并不影响大家对自己的夸耀和标榜。而CDN是什么却越来越没有人关注,哪怕是LimeLight和Akamai的区别也被人忽略了。我们每一个谈论CDN的人谈论的是同一个概念么?
CDN是有专利的,这一点与天主教的圣经不同,CDN的解释是可以通过查询这些文件发现的。CDN在利用DNS的转授权来引导最终访问者找到最理想的缓存或者镜像站点,它是基于域名的一种服务。在不同的实现方式下,最终的定位到哪个缓存和镜像站点的策略有很大的不同。Akamai使用的是传统的基于地理位置的定位策略,在世界各地的ISP里面,都会有自己的节点,而通过智能DNS的判断,可以为用户找到离自己地理位置“最近”的节点。而LimeLight则用的是完全不同的策略,LimeLight有自己的骨干网,给访问者的节点并不是地理位置“最近”的节点,而是路由层面“最近”的节点,这一点有点像我们访问网站不通过域名而直接通过IP访问一样,它会寻找对于访问者的ISP最近的路由是哪里,用那里的节点服务于这个访问。LimeLight的策略已经在很大程度上改变了CDN的工作方式,所以,当LimeLight准备上市的时候,谁都会认为他们已经绕过了Akamai的专利壁垒,但不幸的是,之后他们还是遇到了诉讼的麻烦,或许因为DNS转授权是无法改变的……
在这样的壁垒下面,任何做CDN的公司都好像要面对宗教法庭一样,要么被烧死,要么就皈依。所以,有好事者想我们如果使用其他的方式做CDN该有多好?我们既然可以把驴弄进贵州,为什么不能把P2P融进CDN?我记得一位Akamai的高管对我说过,那不是CDN,CDN是透明的……,所以,让我们忘了P2PCDN吧……。也许还没有人搞清楚P2P和CDN的关系,那么Cloud呢?也许是个好主意。但实际上客户已经在自己发展他们认为的CDN了,其中也包括所谓的P2P CDN。
那么CDN真的象我们想象的那么美好么?就像天国王朝里面的圣地?
当年的《天国王朝》,无数的十字军涌向耶路撒冷,那里是天国,是一个可以让灵魂升华与遍地黄金的地方,但生活在圣城的人们却发现事实与理想相去甚远……,现在人们涌向CDN,是因为它是一个看起来很美的行业,但实际上如何呢?
自从CDN成为一个业内的大众词汇,CDN服务就像卖白菜一样了,几乎没有人关心你的CDN和别人的CDN有什么差别,只是问多少钱1M,多少钱1G,好用么?回答的也是那么的合乎情理:你可以试试,不好不要钱。
另一方面,CDN客户的流失率从来没有下过10%,高的公司可以达到20%-30%,测试客户更是今天测,明天走。正是因为这样,客户基本上找不到满足要求的CDN公司,从而让很多人开始质疑CDN本身有问题,甚至突然觉得CDN应该是一个夕阳产业。
好在中国但凡叫得出名字的CDN公司,这几年的收入都是翻翻的,虽然利润少的可怜,而且那些利润也不是从CDN业务中获得的……
但我们同时发现在美国的Akamai却有着不同的表现,2007年6亿美金的销售额,1亿美金的纯利润,毛利更是超过40%,2008年至少有30%的成长。难道美国是CDN的天国,而中国就是被异教践踏的土地?还是我们并没有看到CDN真正的一面?就像柏拉图所描绘的山洞,我们看到只是火光照耀的影子?
事实上,互联网出现以来,只有CDN是没有海外公司进入中国市场的互联网业务,而正是这样的安排或者壁垒,让中国的CDN与海外的CDN有着巨大的差别。
差别?差距,还是用差别吧。
(美国的CDN与中国CDN的对比)
在美国,CDN领域里面会有这样一些分类:静态内容的加速,动态内容的加速,大文件下载加速;对不同的客户类型,还会有不同的系统与之对应,比如SSL加速,Long Tail加速,Streaming加速;而对不同行业客户也会有不同的加速系统,比如媒体类客户加速,电子商务类客户加速,软件与IT行业客户的加速等等。甚至于对不同的客户规模也会有不同的系统与之对应:大流量客户的加速,中小客户的加速,甚至个人客户的加速;CDN的系统是一个庞杂而专业性非常强的领域。在这些领域与系统中,所有的功能甚至网络都是不一样的,配置的系统也是不一样的。
但在中国,这些系统的差别大部分是在售前的嘴里和不知所云的白皮书里面。而网络都是一个,功能都是一个,实现方式也是一个,所以就会出现如果一家CDN公司做不了一个功能,几乎所有的CDN公司都做不到,因为大家都是用最“通用的方式构建自己的通用CDN”,从而使中国CDN成为一个从电信转卖带宽的代理商。
我们发现了几个有趣的小例子:
中国的网站很注意防盗链(虽然并不注意防盗版),但是居然没有哪家CDN公司可以提供一个让客户满意的防盗链的系统,虽然各家都在说自己提供防盗链。就象我的一个做远程教育的朋友和我说的一样,“测试了能够叫得出名字的所有的CDN公司,但却没有一家CDN公司可以做好防盗链。”但在Akamai,这是一个很久就标准化的服务了。
中国是一个游戏和软件下载的大国,互联网上的主要流量是下载,而直到最近,国内的CDN公司才开始可以提供基于HTTP下载成功数的统计功能,而且还不是全自动的,是需要客户配合设置才可以使用。同样,在Akamai,这也是基本服务项目。
再有一个例子与视频有关了,短视频网站使用的Flash视频,在用户端是和文件下载没有区别的,用户会尽可能快的去下载完视频文件,而通常播放一个视频只需要300K码流就可以流畅播放,这样会有两种情况导致资源的浪费,第一、用户看视频并没有看完,但下载已经下载完了;第二、用户如果是宽带接入的话,虽然只需要300K带宽,可实际上却使用了1M。对于最终用户来说,这两点几乎不会有什么实际影响,但对视频网站来说,这意味着浪费了宝贵的带宽资源,在同等条件下支付了更多的成本。这与上面谈到的HTTP下载成功数计费是一个道理。而在美国,CDN公司是可以控制每个HTTP链接的速度,比如在开始播放的前30秒,1分钟不进行限速,而超过这个时间,就可以把速度控制在需要的范围内,以节省带宽资源。
至于SLA(服务等级协议),就更加的有趣,通常在中国的SLA是不会作为依据的,而评估好坏的标准是“你自己上网看看就知道了么”,这是中国现在一家发展很快的CDN公司的老总的看法。奇怪的是,使用CDN之后,没有哪家客户有能力在去进行所有地区的测试,看一下自己的网站是否比原来快。在这样的情况下,有些做论坛的客户就会发动自己在各地的版主进行测试,收集意见,然后再告诉CDN公司,你们哪里哪里不好,能否调一下?我们的CDN服务商然后说,“噢,你先给我们解释你是怎么测试的?给我一个你们测试的IP,我看看是不是不是中国的IP啊,千万不要给我你自己机器的IP,要给我Local DNS的IP……,不知道Local DNS?怎么连这个都不知道呢?……那是……”(其实我个人觉得还应该问问版主是不是中国人,也许这样更容易发现问题),我只能说,这是多好的客户啊……,在美国的CDN服务商会感动的掉泪的。
在美国,用户会每天得到一份SLA报告,会标出在什么时间段SLA没有达到标准,如果用户需要,还会给用户具体哪个区域没有达到SLA标准,而所有的这些,都只需要用户登录到BOSS的portal上面。
类似的例子还有很多,比如流的点播加速,长尾市场,小图片的加速等等。这些服务功能的差别也许还不是最主要的,而成本的控制与自动化的运营却是CDN公司能否盈利的关键,Akamai部署一个客户只需要10分钟,而国内部署需要客户在填写复杂的表格后,耐心的等待1天时间;Akamai管理上万台服务器只需要4个人,任何时间10%的服务器宕机都无需处理,因为系统会自动保证服务的可靠运行并自主恢复,而国内最小的CDN公司运维人员也有几十个,并且疲于应付各种“突发”事件。
现在,也许我们应该提一个建议,开放中国的CDN市场,让大部分中国的网站都可以看到真正的CDN服务是什么样子。
到这里,其实我们忽略了一个重要的问题,需求!中国的客户使用CDN很多时候是希望以此解决南北互通的问题,而美国客户没有这个问题,他们使用CDN首要考虑的是off load和降低成本。在有人发现有其他更加经济实惠的方案之后,CDN在米国的日子好像也不好过了。
CDN被逐出了圣地?
BT的出现对媒体行业来说是打开了一个盒子(也许是潘多拉,也许是宝盒),盗版的发行比以往任何时候都要快,成本也更低;而同时,视频直播也达到了前所未有的低成本,我们也许还记得在P2P客户端上看欧洲杯,看NBA,看奥运,如果是换成CDN,任何公司都会无法负担。
在看看客户情况,伟大的Google是一个什么事情都要in source的公司,它从来不使用CDN,但它的服务遍及全球,Amazon的EC2,SaleForce的CRM系统,Second Life的虚拟世界,他们都没有在CDN上,但他们同样出色,而且看起来更有效率,成本更低。
现在,已经没有人会考虑使用CDN做大规模的直播服务了,充其量是作为一个备份手段;而自从YouTube离开LimeLight以后,CDN的光环也开始慢慢退去,VC和投机者开始又一股脑的质疑这个奇怪的生意,CDN有价值么?为什么盈利这么困难呢?就像勇猛的萨拉丁赶走了十字军一样,难道CDN会被P2P和不断升级的光纤所取代?还是象经过改革的宗教一样,即使历经文艺复兴与科技的反复冲击,而今依然影响着无数的人们。
CDN的宗教革命?
我们之所以把CDN比作宗教,是因为CDN到现在也有很多“流派”,LimeLight的大节点,大带宽的做法被许多IDC与运营商背景的公司所推崇,而传统的Akamai模式则是独立于运营商之外的CDN公司所首选的道路;而各种新奇理念的出现更是让CDN行业象是一个万花筒,从而也使其拥有更多的互联网气息。Amazon的Cloud Front,EC2;Level 3的ITM;Prime的CDN Aggregation,CDTM;Simple CDN的S3+等等,如此众多的演变,任何一种都是对传统CDN,甚至是对LimeLight模式的革命。感谢LimeLight与Akamai的成功,让很多优秀的工程师与天才的梦想家投入到CDN这个被Akamai一家统治多年的领域,并不断给我们与CDN客户以惊喜。但当我们把目光从美国看回中国的时候(上述所有的公司都是美国企业),我们要面对的是什么样的现实?
中国的CDN是CDN的佛教还是道教?还是象柏阳说得被中国这个大染缸去其精华留其糟粕的垃圾?
说道中国的CDN,我们可能要问:什么时候CDN开始没人关注SLA?什么时候CDN开始不提供标准的95/5计费?什么时候,全网配置的服务被悄悄替换成了“部分”节点配置?什么时候,CDN变成了一个黑匣子,客户无从了解自己的服务与问题,也无法控制自己的内容的发布与刷新(美国的CDN客户是可以直接自己设置3段TTL时间的)。这些我们无从而知,因为可能从我们开始认识中国CDN的时候就已经是这个样子了。
所以这些后来的中国的CDN厂商第一件要做的事情就是鼓吹自己的节点数量,而不管是否这些节点都为所有客户提供服务(客户甚至不知道有几个节点在为自己服务。PS:一般情况下,中国CDN公司为每个客户配置的节点不会超过20个)
所以,当海外的CDN公司在网站上介绍其服务的时候,中国客户通常很难找到他们全球有多少节点的信息,而中国CDN公司则乐此不疲的修改自己的节点地图,也不管地图画得就像一张地雷分布图。而销售人员更是信口开河的讲自己的公司有几百个节点,可笑的是,几乎所有的CDN公司都有“几百”个节点,全中国的IDC恐怕都不够这些CDN公司瓜分的了。
中国CDN已经把CDN本土化了,经常挂在嘴边的是外国公司不了解中国的网络,也许是吧,但到现在为止,没有一家本土CDN公司可以解决教育网的服务质量问题。而大部分的客户到CDN节点机房看到的情况是:“哦,怎么你们在使用和我们自己一样的系统?!”这是为什么呢?因为中国的CDN公司认为CDN是运营业务,就像中国移动,中国电信一样,最主要的是运营;
而象Akamai这样的美国CDN公司首先认为自己是技术公司,然后才是运营公司,Akamai的系统从底层到应用是自己开发的,所有的服务是自己开发的,所有的控制与监管是自己开发的,甚至在早期,连硬件都要自己开发。我记得一位VC界的著名人物这样评价在中国很出名的CDN企业:“他们没有技术”。这就是中国CDN与美国CDN公司的最大差距。那我们要问,难道十几年中国CDN的发展就白费了么?当然不是的,中国的CDN在花费了大量的时间在处理用户的客户化需求,可惜这些需求主要表现在计费领域,有的CDN公司居然有上百种计费方式。
而对于CDN的黑盒子问题(即用户看不到及时全面的数据),就像佛教的禅宗一样,一句“不可说”,客户也没有任何办法。而对于道教的无为则通常会用在对付客户的投诉上面。当然,这是不能责怪CDN的运营人员的,即使在CDN如火如荼的年代,能够说清楚CDN的具体情况与细节的人也还是少之又少。记得上面提到的发展很快的那家CDN公司的老总说到视频:“我们觉得视频是一个很简单的服务,根本没有难度”,但当客户测试他们视频服务,却选择了其他运营商之后,已经很少听到这种气壮山河的言论了。
中国的CDN虽然经历了很长的时间,但却没有真正的积累下来,而本土化,或者异化的CDN使本来就难于理解的CDN服务被断章取义的成为一个Cache和带宽的替代词汇。
而事实上,真正的CDN服务或者CDN的本来面目我们也许就从没有见到,就像中国的网站编程,在IE下看的好好的,但是换了浏览器就全乱了,这才发现原来没有按照W3C标准编写,而问题是很多的编程人员根本就没看过这些标准,所以也就不知道原来IE并不是严格遵照W3C解析与渲染的。
To be, or not to be: that is the question!
当莎士比亚的这句名言作为出现在这里的时候,我们应该考虑的是CDN的未来,还是中国CDN的未来?
让我们在更高的层面来看待如今的年代,越来越多的闪光点出现在这个领域,就像在Google出现之前,没有人关注搜索一样,CDN有可能成为第二个孕育奇迹的行业。CDN伴随着互联网的成长起起落落,现在的服务已经不仅仅局限在内容的分发,越来越多的CDN公司开始提供以复杂分布式存储为核心的存储网络服务,Amazon的S3是一个典型的代表,而Prime的FileGrid则是另一个值得关注的方向。Amazon在这个领域已经耕耘多年,虽然不是一个CDN公司,但实际上的服务内容已经涵盖了CDN服务,而其基于运计算的EC2服务更是现在可以使用的唯一的“云”了。有人说云计算就是CDN的未来,这也许还很远,Bill Gate的话也许更有道理:“云存储离我们更近一些”。无论是云计算还是云存储,对于CDN公司来说,都要比其他任何行业的公司都要靠近云端,而CDN的路线图也一定会是这样的发展,从内容网络到存储网络再到计算网络,而未来的CDN也会象使用电灯一样容易。
对于CDN的未来憧憬,另外的方向就是CDN云,尽管只是一个概念,但确实是一个很宏伟的想法,虽然现在可以看到的服务只有Prime的CDTM,或许这是CDN云的初级阶段──一个利用众多的CDN网络构建一个更高效成本控制更好与更智能的网络,但谁能够忽视这令人兴奋的进步与想象力?
在中国,各家CDN公司都开始大力开发自己的产品,也从没有象现在这样重视研发。而Akamai,CDNetwork已经开始进入中国;Prime也开始在中国展开一些试探。中国的客户已经开始体验到不同的服务,有的CDN公司提出的SLA至少看起来已经是一份有价值或者是可以度量的标准文件了。虽然路还是有些漫长,但相信中国的客户将会很快体验到世界水准的CDN服务,以及天才工程师们所创造的更多令人兴奋的网络产品。
中国乃至世界CDN领域的大变革正发生在我们身边,也许明天你就会看到一个不同的CDN来到你的眼前。

Mysql 慢查询和慢查询日志分析

众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的。下面总结一些使用过或者研究过的经验,从配置以及调节索引的方面入手,对mysql进行一些优化。
第一步应该做的就是排查问题,找出瓶颈,所以,先从日志入手
开启慢查询日志
mysql>show variables like “%slow%”; 查看慢查询配置,没有则在my.cnf中添加,如下

log-slow-queries = /data/mysqldata/slowquery.log    #日志目录 long_query_time = 1                          #记录下查询时间查过1秒 log-queries-not-using-indexes     #表示记录下没有使用索引的查询

分析日志 – mysqldumpslow
分析日志,可用mysql提供的mysqldumpslow,使用很简单,参数可–help查看

# -s:排序方式。c , t , l , r 表示记录次数、时间、查询时间的多少、返回的记录数排序; #                             ac , at , al , ar 表示相应的倒叙; # -t:返回前面多少条的数据; # -g:包含什么,大小写不敏感的; mysqldumpslow -s r -t 10  /slowquery.log     #slow记录最多的10个语句 mysqldumpslow -s t -t 10 -g "left join"  /slowquery.log     #按照时间排序前10中含有"left join"的

推荐用分析日志工具 – mysqlsla

wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz tar zvxf mysqlsla-2.03.tar.gz cd mysqlsla-2.03 perl Makefile.PL make make install mysqlsla /data/mysqldata/slow.log # mysqlsla会自动判断日志类型,为了方便可以建立一个配置文件“~/.mysqlsla” # 在文件里写上:top=100,这样会打印出前100条结果。
【说明】 queries total: 总查询次数 unique:去重后的sql数量 sorted by : 输出报表的内容排序 最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数. Count, sql的执行次数及占总的slow log数量的百分比. Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比. 95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间. Lock Time, 等待锁的时间. 95% of Lock , 95%的慢sql等待锁时间. Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量. Rows examined, 扫描的行数量. Database, 属于哪个数据库 Users, 哪个用户,IP, 占到所有用户执行的sql百分比 Query abstract, 抽象后的sql语句 Query sample, sql语句
Records:912