<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[抚琴煮酒之百度博客]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[新公司，新同事，新的服务器，又得好长时间熟悉环境了...]]></description>
<link>http://hi.baidu.com/yuhongchun027</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[mount挂载iso文件限制的问题]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/b5ef010301c67be608fa93f1.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>mount挂载iso文件限制的问题</strong></font></p>
<p><font size="4">在工作中遇到的问题,mount挂载超过8个iso文件报错mount :could not find any free loop device.<br>
[root@localhost pic]# cat mountiso.sh <br>
#!/bin/bash <br>
mount -o loop /data1/pic/5000windowspng.iso /data1/pic/all/5000windowspng<br>
mount -o loop /data1/pic/Wallpaper.huge.Pack_iAPULA.iso /data1/pic/all/wallpaper.huge.pack_iAPULA<br>
mount -o loop /data1/pic/all.png.iso /data1/pic/all/all.png<br>
mount -o loop /data1/pic/±&eth;&frac34;&szlig;&sup1;&acirc;&Atilde;&cent;.iso /data1/pic/all/sharing_special_light<br>
mount -o loop &quot;/data1/pic/web design master01.iso&quot; /data1/pic/all/web_design_master01<br>
mount -o loop &quot;/data1/pic/web design master02.iso&quot; /data1/pic/all/web_design_master02<br>
mount -o loop &quot;/data1/pic/web design master03(not full).iso&quot; /data1/pic/all/web_design_master03<br>
mount -o loop &quot;/data1/pic/web design master04.iso&quot; /data1/pic/all/web_design_master04<br>
mount -o loop &quot;/data1/pic/web design master plus.iso&quot; /data1/pic/all/web_design_master_plus<br>
mount -o loop &quot;/data1/pic/yq12-1.iso&quot; /data1/pic/all/yq12-1<br>
mount -o loop &quot;/data1/pic/yq12-2.iso&quot; /data1/pic/all/yq12-2<br>
mount -o loop &quot;/data1/pic/yq12-3(not full).iso&quot; /data1/pic/all/yq12-3<br>
mount -o loop &quot;/data1/pic/yq12-4.iso&quot; /data1/pic/all/yq12-4<br>
mount -o loop &quot;/data1/pic/yq12-5.iso&quot; /data1/pic/all/yq12-5<br>
mount -o loop &quot;/data1/pic/yq12-6(not full).iso&quot; /data1/pic/all/yq12-6<br>
mount -o loop &quot;/data1/pic/yq12-7.iso&quot; /data1/pic/all/yq12-7<br>
mount -o loop &quot;/data1/pic/yq12-8.iso&quot; /data1/pic/all/yq12-8<br>
mount -o loop &quot;/data1/pic/yq12-9.iso&quot; /data1/pic/all/yq12-9<br>
mount -o loop &quot;/data1/pic/yq12-10.iso&quot; /data1/pic/all/yq12-10<br>
mount -o loop &quot;/data1/pic/yq12-11.iso&quot; /data1/pic/all/yq12-11<br>
mount -o loop &quot;/data1/pic/yq12-12(not full).iso&quot; /data1/pic/all/yq12-12<br>
</font></p>
<p><font size="4">解决方法如下:在/etc/modprobe.conf文件最后追加options loop max-loop=64(或小于256的数字),重启服务器解决问题</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/b5ef010301c67be608fa93f1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/%B9%A4%D7%F7%B1%B8%CD%FC%C6%AA">工作备忘篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/b5ef010301c67be608fa93f1.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-30  16:01</pubDate>
        <category><![CDATA[工作备忘篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/b5ef010301c67be608fa93f1.html</guid>
</item>

<item>
        <title><![CDATA[sed结合正则修改文件名]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/f1a8afeeaa498ff1b2fb9514.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p align="center"><strong><font size="5">sed结合正则修改文件名</font></strong></p>
<p><font color="#000000" size="4">遇到更改文件的需求，在工作中的某文件test.txt<br>
</font><a href="http://www.5566.com/produce/2007080412/315613171.shtml"><font color="#000000" size="4">http://www.5566.com/produce/2007080412/315613171.shtml</font></a><br>
<a href="http://bz.5566.com/produce/20080808/311217.shtml"><font color="#000000" size="4">http://bz.5566.com/produce/20080808/311217.shtml</font></a><br>
<a href="http://gz.5566.com/produce/20090909/311412.shtml"><font color="#000000" size="4">http://gz.5566.com/produce/20090909/311412.shtml</font></a></p>
<p><font color="#000000" size="4">现要求将</font><a href="http://*.5566.com/"><font color="#000000" size="4">http://*.5566.com</font></a><font color="#000000" size="4">更改为/home/html/www.5566.com，用sed的方式如下：sed -i 's/http.*\.com/home\/html\/www.5566.com/g' test.txt；朋友的办法更简单，sed -i <a href="mailto: s@http://[%5E.]*.5566.com@/home/html/www.5566.com@g ">'s@http://[^.]*.5566.com@/home/html/www.5566.com@g'</a> test.txt ，[^.]表示为非.的所有字符，换成[^/]。其实如果公司是基于web的门户类网站，对正则的需求是蛮大的，我现在也或多或少的在正则上面花精力研究。</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/f1a8afeeaa498ff1b2fb9514.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/%B9%A4%D7%F7%B1%B8%CD%FC%C6%AA">工作备忘篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/f1a8afeeaa498ff1b2fb9514.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-30  09:04</pubDate>
        <category><![CDATA[工作备忘篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/f1a8afeeaa498ff1b2fb9514.html</guid>
</item>

<item>
        <title><![CDATA[Nginx目录自动加斜线详解]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/e4c5748b8bc169d9fc1f104e.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>Nginx目录自动加斜线详解</strong></font></p>
<p><font color="#000000" size="4">今天配置Nginx时，我设置了一个域名：<a href="http://www.yuhongchun027.com/">http://www.yuhongchun027.com</a>，下面有web目录为www；现在的问题就是如果我访问<a href="http://www.yuhongchun027.com/yuhongchun027/">http://www.yuhongchun027.com/www/</a>就可以显示出地址，但如果我访问<a href="http://www.yuhongchun027.com/www">http://www.yuhongchun027.com/www</a>结果却提示说找不到所需要的页面。哈哈，又开始犯老错了，nginx不会自动在请求的最后加上一个/的，原因是nginx不会自动判断请求的是一个文件还是一个目录，解决方法为:<br>
在配置文件中location里加入如下代码<br>
if (-d $request_filename) {<br>
rewrite ^/(.*)([^/])$ <a href="http://$host/$1$2/">http://$host/$1$2/</a> permanent;<br>
}<br>
这样再对http://www.yuhongchun027.com/www请求，nginx就会进行判断了，如果请求的是一个文件夹，会自动在最后加上/符号，如果请求的是一个文件，则不会改变原有url<br>
接下来对这段代码进行一个解释<br>
1，if (-d $request_filename)，如果请求的是一个文件夹，则为真，进到if语句中执行<br>
2，rewrite是执行url重写操作<br>
3，^/(.*)([^/])$表示以/符号开始并紧跟着任何字符，同时不是以/为结束的字符串，在我的url中，(.*)表示的ww，([^/])表示的w<br>
4，<a href="http://$host/$1$2/">http://$host/$1$2/</a> 表示的重写后的地址，$host是请求的域名，$1是前面第一个括号里的内容ww，在我的url里就是wordpres $2是前面第二个括号里的内容，在我的url里是w；验证的办法其实很简单，大家可以只用<a href="http://$host/$1">http://$host/$1</a>，就会发现nginx自动切换成<a href="http://www.yuhongchun027/ww/">http://www.yuhongchun027/ww/</a>了。<br>
5，permanent表示，返回永久重定向的HTTP状态301<br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/e4c5748b8bc169d9fc1f104e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/apache%2Bnginx%C6%AA">apache+nginx篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/e4c5748b8bc169d9fc1f104e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-21  19:01</pubDate>
        <category><![CDATA[apache+nginx篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/e4c5748b8bc169d9fc1f104e.html</guid>
</item>

<item>
        <title><![CDATA[Nginx缓存cache的几种方式]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/ddee94d957b7e92611df9bd4.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p align="center"><strong><font size="5">Nginx缓存cache的几种方式</font></strong></p>
<p align="left"><font size="4">1、传统缓存之一（404）<br>
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。<br>
配置：<br>
location / {<br>
root /home/html/;#主目录<br>
expires 1d;#网页的过期时间<br>
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下<br>
}<br>
location /fetch/ {#404定向到这里<br>
internal;#指明这个目录不能在外部直接访问到<br>
expires 1d;#网页的过期时间<br>
alias /home/html/;#虚拟目录文件系统地址要和locaion /一致,proxy_store会将文件保存到这目录下<br>
proxy_pass </font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">;#后端upstream地址,/fetch同时是一个代理<br>
proxy_set_header Accept-Encoding '';#让后端不要返回压缩（gzip或deflate）的内容,保存压缩后的内容会引发乱子。<br>
proxy_store on;#指定nginx将代理返回的文件保存<br>
proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内<br>
}<br>
使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。</font></p>
<p align="left"><font size="4">2、传统缓存之二（!-e）<br>
原理和404跳转基本一致,但更简洁一些：<br>
location / {<br>
root /home/html/;<br>
proxy_store on;<br>
proxy_set_header Accept-Encoding '';<br>
proxy_temp_path /home/tmp;<br>
if ( !-f $request_filename )<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_pass </font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">;<br>
}<br>
}<br>
可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。<br>
两种传统缓存都有着基本一样的优点和缺点：<br>
缺点1：不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持</font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">这种形式的首页和二级目录</font><a href="http://xok.la/download/"><font size="4">http://xok.la/download/</font></a><font size="4">,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。<br>
缺点2：nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。<br>
缺点3：只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。<br>
缺点4：nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。</font></p>
<p align="left"><font size="4">nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如：</font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">?和</font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">在squid上会被当做两个链接,所以会造成两次穿透；而nginx只会保存一次,无论链接变成</font><a href="http://xok.la/?1"><font size="4">http://xok.la/?1</font></a><font size="4">还是</font><a href="http://xok.la/?123"><font size="4">http://xok.la/?123</font></a><font size="4">,均不能透过nginx缓存,从而有效地保护了后端主机。<br>
nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。</font></p>
<p align="left"><font size="4">这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的inode数量和最大容量：</font></p>
<p align="left"><font size="4">mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm<br>
上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。</font></p>
<p align="left"><font size="4">3、基于memcached的缓存<br>
nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。<br>
location /mem/ {<br>
&nbsp;&nbsp;&nbsp;  if ( $uri ~ &quot;^/mem/([0-9A-Za-z_]*)$&quot; )<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;  set $memcached_key &quot;$1&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  memcached_pass&nbsp;&nbsp;&nbsp;&nbsp;  192.168.6.2:11211;<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  expires 70;<br>
}<br>
这个配置会将</font><a href="http://xok.la/mem/abc"><font size="4">http://xok.la/mem/abc</font></a><font size="4">指明到memcached的abc这个key去取数据。<br>
nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。</font></p>
<p align="left"><font size="4">4、基于第三方插件ncache<br>
ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考：</font><a href="http://code.google.com/p/ncache/"><font size="4">http://code.google.com/p/ncache/</font></a></p>
<p align="left"><font size="4">5、nginx新开发的proxy_cache功能<br>
从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,目前还处于开发阶段,支持相当有限,这个缓存是把链接用md5编码hash后保存,所以它可以支持任意链接,同时也支持404/301/302这样的非200状态。<br>
配置：<br>
首先配置一个cache空间：<br>
proxy_cache_path /xok/to/cache levels=1:2 keys_zone=xok1:10m inactive=5m max_size=2m clean_time=1m;<br>
proxy_temp_path参数路径也需要跟上面的proxy_cache_path在一个分区上，否则会报错。<br>
注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似/xok/to/cache/e/4a/0f1019b0db2f97d17c2238c0271a74ae；keys_zone为这个空间起个名字,10m指空间大小为10MB；inactive的5m指缓存默认时长5分钟；max_size的2m是指单个文件超过2m的就不缓存；clean_time指定一分钟清理一次缓存。<br>
location / {<br>
&nbsp;&nbsp;&nbsp;  proxy_pass </font><a href="http://xok.la/"><font size="4">http://xok.la/</font></a><font size="4">;<br>
&nbsp;&nbsp;&nbsp;  proxy_cache xok1;#使用xok1这个keys_zone<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid 200 302 1h;#200和302状态码保存1小时<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid 301 1d;#301状态码保存一天<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid any 1m;#其它的保存一分钟<br>
}<br>
综合起来可以简单优化静态文件：<br>
location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  proxy_pass </font><a href="http://backend/"><font size="4">http://backend</font></a><font size="4">;<br>
&nbsp;&nbsp;&nbsp;  expires 6h; #设置浏览器过期时间<br>
&nbsp;&nbsp;&nbsp;  proxy_cache xok1;#使用xok1这个keys_zone<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid 200 302 1h;#200和302状态码保存1小时<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid 301 1d;#301状态码保存一天<br>
&nbsp;&nbsp;&nbsp;  proxy_cache_valid any 1m;#其它的保存一分钟<br>
}<br>
注意：支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中使用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功能,也可以使用0.6.36版<br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/ddee94d957b7e92611df9bd4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/apache%2Bnginx%C6%AA">apache+nginx篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/ddee94d957b7e92611df9bd4.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-20  15:17</pubDate>
        <category><![CDATA[apache+nginx篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/ddee94d957b7e92611df9bd4.html</guid>
</item>

<item>
        <title><![CDATA[不小心删除了GRUB所在的分区怎么办]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/0315de34d73bad315bb5f588.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong><font size="5">不小心删除了GRUB所在的分区怎么办</font></strong></p>
<p><font size="4">今天闲来无事，不小心删除了grub所在的分区/dev/hdb8，因为装的是xp和Centos5.3双系统，搞得连windows也进不了，想想看这已经是第二次犯错了。因为我的工作机上没有光驱和软驱(以前本着经济的原则配置的)，上次是借别人的光驱，难道这次又要借，不行，我一定要自己想办法搞定了。花了不少时间把我的台电酷闪8G的优盘量产成了USB-CDROM+USB-HDD双启动的优盘，工作机居然不支持，晕。天寒地冻的，难道真要出门，忽然想起了，工作站支持网络引导，呵呵，那就应该有办法了。请出心爱的网刻软件MaxDOS_71PXE_G115.exe，以下为实验步骤截图:</font></p>
<p><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/yuhongchun027/pic/item/50ab52c2854cc5340ef477a6.jpg"><br>
</span><br>
</span><font size="4">搞定后原以为万事大吉了，发现一启动还是回到了gub报错状态，呵呵，看来还要想心思；不选择&quot;克隆结束后重启计算机&quot;，这样就能回到Dos界面下，选择一款MBR修复软件，diskgen或spfdisk即可；或直接fdisk/mbr；其实还有个办法也可行：在&ldquo;grub&gt;&rdquo;提示符后输入：&ldquo;rootnoverify (hd0,0)&rdquo; 回车将第一块硬盘（hd0）的第一个分区（0）设为根分区/root设备，但不加载文件系统；在&ldquo;grub&gt;&rdquo;提示符后输入：&ldquo;chainloader ＋1&rdquo; 回车，将启动引导权转交给当前分区的首扇区（Windows系统所在分区的首扇区）。</font></p>
<p><font size="4">※其实，这只是一个很简单的、常遇见的grub错误，只要有dos引导盘即可，但关键是我的工作机比较老，即无光驱、软驱，连U盘引导也不支持，如果网络引导也不支持的话，可以用第二种办法尝试(或者强大的Linux命令dd)。修复后重启，故障排除；将以上步骤记录下，方便下次犯错时能迅速排障和重温习下网络Ghost。</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/0315de34d73bad315bb5f588.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/rhce%BD%CC%D1%A7%C6%AA">rhce教学篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/0315de34d73bad315bb5f588.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-14  19:34</pubDate>
        <category><![CDATA[rhce教学篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/0315de34d73bad315bb5f588.html</guid>
</item>

<item>
        <title><![CDATA[MySQL基础命令行学习笔记]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/4c6fb9c2cd0d2e3fe5dd3bde.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>MySQL基础命令行学习笔记</strong></font></p>
<p><font size="4">我一直用MySQL数据库及习惯用phpMyAdmin对MySQL数据库进行管理，但有些机器上因为安全等因素不能使用phpMyAdmin，就只好使用命令行方式来对MySQL数据库进行管理，而且MySQL中基于授权的操作还是用命令更为方便。总的来说,Mysql命令行+phpMyadmin是配置Mysql的最佳组合，这篇文章也是为了方便直接学习和使用mysql，DBA就请自己跳过吧。<br>
</font></p>
<p><font size="4">一、从命令行登录MySQL数据库服务器<br>
1、登录使用默认3306端口的MySQL<br>
/usr/local/mysql/bin/mysql -u root -p<br>
</font></p>
<p><font size="4">2、通过TCP连接管理不同端口的多个MySQL（注意：MySQL4.1以上版本才有此项功能）<br>
/usr/local/mysql/bin/mysql -u root -p --protocol=tcp --host=localhost --port=3307</font></p>
<p><font size="4">3、通过socket套接字管理不同端口的多个MySQL<br>
/usr/local/mysql/bin/mysql -u root -p --socket=/tmp/mysql3307.sock</font></p>
<p><font size="4">4、通过端口和IP管理不同端口的多个MySQL<br>
/usr/local/mysql/bin/mysql -u root -p -P 3306 -h 127.0.0.1</font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"> </p>
<p><font size="4">二、数据库操作SQL语句<br>
1、显示服务器上当前存在什么数据库<br>
SHOW DATABASES;</font></p>
<p><font size="4">2、创建名称为rewin的数据库<br>
CREATE DATABASE rewin;</font></p>
<p><font size="4">3、删除名称为rewin的数据库<br>
DROP DATABASE rewin;</font></p>
<p><font size="4">4、选择rewin数据库<br>
USE rewin;</font></p>
<p><font size="4">三、表操作SQL语句（登录之后必须用以上的USE命令选择一个数据库,再进行表操作）<br>
1、显示当前数据库中存在什么表<br>
SHOW TABLES;</font></p>
<p><font size="4">2、创建数据库表yuhongchun：在mysql&gt;后粘贴以下SQL语句,存储引擎为MYISAM,字段id为主键、唯一</font><font size="4">索引。<br>
CREATE TABLE `yuhongchun` (<br>
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,<br>
`username` VARCHAR( 20 ) NOT NULL ,<br>
`password` CHAR( 32 ) NOT NULL ,<br>
`time` DATETIME NOT NULL ,<br>
`number` FLOAT( 10 ) NOT NULL ,<br>
`content` TEXT NOT NULL ,<br>
PRIMARY KEY ( `id` ) <br>
) ENGINE = MYISAM ;</font></p>
<p><font size="4">3、查看yuhongchun表结构<br>
DESCRIBE yuhongchun;</font></p>
<p><font size="4">4、从表中检索信息<br>
一、从yuhongchun表中检索所有记录<br>
SELECT * FROM yuhongchun;</font></p>
<p><font size="4">二、从yuhongchun表中检索特定的行：字段username等于abc,字段number等于1,按字段id降序排列<br>
SELECT * FROM yuhongchun WHERE username = 'abc' AND number='1' ORDER BY id DESC;</font></p>
<p><font size="4">三、从yuhongchun表中检索指定的字段：username和password<br>
SELECT username, password FROM yuhongchun;</font></p>
<p><font size="4">四、从yuhongchun表中检索出唯一的不重复记录：<br>
SELECT DISTINCT username FROM yuhongchun;</font></p>
<p><font size="4">5、插入信息到yuhongchun表<br>
INSERT INTO yuhongchun (id, username, password, time, number, content) VALUES ('', 'abc', </font><font size="4">'123456', '2007-08-06 14:32:12', '23.41', 'hello world');</font></p>
<p><font size="4">6、更新yuhongchun表中的指定信息<br>
UPDATE yuhongchun SET content = 'hello china' WHERE username = 'abc';</font></p>
<p><font size="4">7、删除yuhongchun表中的指定信息<br>
DELETE FROM yuhongchun WHERE id = 1;</font></p>
<p><font size="4">8、清空yuhongchun表<br>
DELETE FROM yuhongchun;</font></p>
<p><font size="4">9、删除yuhongchun表<br>
DROP TABLE yuhongchun;</font></p>
<p><font size="4">10、更改表结构,将yuhongchun表username字段的字段类型改为CHAR(25)<br>
ALTER TABLE yuhongchun CHANGE username username CHAR(25);</font></p>
<p><font size="4">11、将当前目录下的mysql.sql导入数据库<br>
SOURCE ./mysql.sql;</font></p>
<p><font size="4">四、数据库权限操作SQL语句<br>
1、创建一个具有root权限,可从任何IP登录的用户sina,密码为yuhongchun<br>
GRANT ALL PRIVILEGES ON *.* TO <a href="mailto: sina @ % ">'sina'@'%'</a>  IDENTIFIED BY 'yuhongchun';</font></p>
<p><font size="4">2、创建一个具有&ldquo;数据操作&rdquo;、&ldquo;结构操作&rdquo;权限,只能从192.168.1.***登录的用户sina,密码为</font><font size="4">yuhongchun<br>
GRANT SELECT , INSERT , UPDATE , DELETE , FILE , CREATE , DROP , INDEX , ALTER , CREATE </font><font size="4">TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON *.* </font><font size="4">TO <a href="mailto: sina @ 192.168.1.% ">'sina'@'192.168.1.%'</a>  IDENTIFIED BY 'yuhongchun';</font></p>
<p><font size="4">3、创建一个只拥有&ldquo;数据操作&rdquo;权限,只能从192.168.1.24登录,只能操作rewin数据库的yuhongchun</font><font size="4">表的用户sina,密码为yuhongchun<br>
GRANT SELECT , INSERT , UPDATE , DELETE ON rewin.yuhongchun TO <a href="mailto: sina @ 192.168.1.24 ">'sina'@'192.168.1.24'</a>  </font><font size="4">IDENTIFIED BY 'yuhongchun';</font></p>
<p><font size="4">4、创建一个拥有&ldquo;数据操作&rdquo;、&ldquo;结构操作&rdquo;权限,可从任何IP登录,只能操作rewin数据库的用户</font><font size="4">sina,密码为yuhongchun<br>
GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY </font><font size="4">TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON rewin.* TO </font><font size="4"><a href="mailto: sina @ % ">'sina'@'%'</a> IDENTIFIED BY 'yuhongchun';</font></p>
<p><font size="4">5、删除用户<br>
DROP USER <a href="mailto: sina @ % ">'sina'@'%'</a>;</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/4c6fb9c2cd0d2e3fe5dd3bde.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/mysql%CA%FD%BE%DD%BF%E2%C6%AA">mysql数据库篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/4c6fb9c2cd0d2e3fe5dd3bde.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-13  18:34</pubDate>
        <category><![CDATA[mysql数据库篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/4c6fb9c2cd0d2e3fe5dd3bde.html</guid>
</item>

<item>
        <title><![CDATA[生产环境下的Mysql数据库备份和恢复]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/8b5fc2a8617516bbcb130c91.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>生产环境下的Mysql数据库备份和恢复</strong></font></p>
<p><font size="4">为什么要用生产环境这个名词呢，这样更能引起我们重视，不是简单随便的拿上你知道的命令就干活了。它有其特殊的环境，不是平时学习实验那样的只是为了达到我们的目的。在企业中运行Mysql是一个完全生产环境，我们必须要考虑很多相关因素。最典型的特点，既然是生产环境，那么就绝对不允许你去宕机，仅仅为了你的备份活动吗（想都不要想啦）。你要清楚备份只是为了保障我们的系统更加安全的运行，减少灾难带来的损失，相对而言只是一个小角色，设想如果服务器压根就没有发生问题的可能，那么备份也就没有存在的必要了，正因为有意外，之后我们才会采取相应的措施。</font></p>
<p><font size="4">MySQL的备份主要分为逻辑备份和物理备份。在备份之初我们需要考虑哪些因素呢？<br>
·首先确定当前MySQL处在哪种表类型下工作，它们支持事务处理还是非事务的，因为我们需要根据不同的特点做一些设置。<br>
·其次要选择备份形式是全备份还是增量备份，各有其优缺点。<br>
·为了确保恢复的完整性我们开启binary log功能，同时binlog给我们恢复也带来了很大的灵活性，可以基于时间点或是位置进行恢复。考虑到数据库性能可以将binlog文件保存到其他安全的硬盘中。<br>
·正如最初所提到的，备份操作是和应用服务同时运行，这样就十分消耗系统资源，导致数据库服务性能下降，这就要求我们选择一个合适的时间在应用负担很小的时候，再来进行备份操作。<br>
·最后要提的就是，备份完不是就没事儿了，怎么就知道备份是否可用的，所以之后的恢复测试完全有必要。</font></p>
<p><font size="4">下面就来具体实践一下。<br>
1、逻辑备份和恢复<br>
MySQL的逻辑备份就是将数据库的结构连同数据用一个文本文件备份出来，我们可以对这个文件进行查看和编辑。逻辑备份对于所有的存储引擎都是适用的，而后面提到的物理备份则会根据不同数据库的特点采取不同的备份方法。MySQL逻辑备份的主要工具就是大家熟悉的MySQL自带的mysqladmin这个工具。<br>
#mysqldump -u root -p &ndash;all-database &gt; all.sql&nbsp;&nbsp;  &mdash;备份所有数据库<br>
#mysqldump -u root -p mysqlsytems &gt; mysqlsystems.sql&nbsp;&nbsp;&nbsp;  &mdash;备份指定数据库<br>
#mysqldump -u root -p mysqlsystems wp discuz &gt; wp_discuz.sql&nbsp;&nbsp;&nbsp;  &mdash;备份指定数据库中的若干表<br>
TIPs: MyISAM中为了保持数据一致性需要在备份之前对进行备份的数据库加读锁操作flush table with read lock；InnoDB则可以在mysqladmin命令中加入&ndash;single-transaction选项，可以生成一个快照以保证数据备份期间的一致性。<br>
以上介绍的是都是全备份，我们都知道全备份是必要的，在应用之初我们可以采用全备份的方式，但随着应用数据的增加，这种备份方式的效率就会变得很低，每次会花掉大量的时间和系统资源。我们有必要在全备份的同时结合增量备份。增量备份是通过备份binary log来实现的。当我们开启MySQL的二进制日志功能之后，对数据库进行的DML（select除外）、DDL操作都会纪录到其中，MySQL Replication就是通过bin-log实现的。每当MySQL重启，数据库都会重新生成一个bin-log文件。比如5月9日凌晨2点开始备份，同时我们也将bin-log进行更新重新生成一个，那么备份完成之后，我们对数据库进行的操作就会被从新纪录到生成的这个新的二进制文件中，增量备份就是要我们保存从5月9日开始，到你进行下一次备份，这期间的操作都在这个bin-log文件里面，我们只需将它备份起来就可以了。<br>
恢复比较简单。<br>
#mysql -u root -p mysqlsystems &lt; mysqlsystem.sql&nbsp;&nbsp;&nbsp;  &mdash;恢复全备份的信息<br>
#mysqlbinlog binlog-file | mysql -u root -p &mdash;恢复增量备份的部</font></p>
<p><font size="4">2、物理备份和恢复<br>
物理备份分为冷备份和热备份。物理备份其实就是物理文件的复制，从一个存放位置拷贝到另一个位置。<br>
冷备份一般很少使用，这个我们都知道原因，应用是坚决不允许停机的，即便时间很短，况且备份的时间和文件大小是成正比的，只会越来越多，不会减少的。<br>
这里主要介绍热备份，根据存储引擎不同将采用不同的备份工具。<br>
·MyISAM<br>
Option A : # mysqlhotcopy mysqlsystems /backup/db_mysqlsystems<br>
Option B : 在SQL命令行下执行flush tables for read，将数据库中所有表加读锁，以便保证数据的一致性;然后自通过cp命令将数据文件备份到指定目录下；MyISAM是Mysql的缺省表类型。它基于IASM代码，但有许多有用的扩展。<br>
·InnoDB<br>
对于InnoDB可以使用percona公司的xtrabackup，或是Innobase自己的ibbackup (收费的)</font></p>
<p><font size="4">※值得注意的是：<br>
一、确定要备份的表的存储引擎是事务型还是非事务性，两种不同的存储引擎备份方式在处理数据一致性方面是不太一样的。<br>
二、确定使用全备份还是增量备份。全备份的优点是备份保持最新备份，恢复的时候可以花费更少的时间；缺点是如果数据量大，将会花费很多的时间，并对系统造成较长时间的压力。增量备份则恰恰相反，只需要备份每天的增量日志，备份时间少，对负载压力也小；缺点就是恢复的时候需要全备份加上次备份到故障前的所有日志，恢复时间会长些。<br>
三、可以考虑采取复制的方法来做异地备份，但是记住，复制不能代替备份，它对数据库的误操作也无能为力。<br>
四、要定期做备份，备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行。<br>
五、确保MySQL打开log-bin选项，有了BINLOG，MySQL才可以在必要的时候做完整恢复，或基于时间点的恢复，或基于位置的恢复。<br>
六、要经常做备份恢复测试，确保备份是有效的，并且是可以恢复的<br>
七、这里提一下Mysql服务器硬件方面的选择，物理磁盘我推荐RAID0+1(磁盘性能是制约Mysql性能的最大因素之一)，内存最好在4G以上；同时，Mysql服务器不要在运行其它服务，CPU我推荐使用S.M.P架构的多路对称CPU。</font><font size="4"><br>
相信大家看了此篇文章后，会对mysql的备份方式有一个大致了解，也可以针对自己的生产环境下的mysql数据库进行自己的备份方式。关于mysql的备份，欢迎来信交流<a href="mailto:yuhongchun027@163.com">yuhongchun027@163.com</a>(抚琴煮酒)</font></p>
<p> </p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/8b5fc2a8617516bbcb130c91.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/mysql%CA%FD%BE%DD%BF%E2%C6%AA">mysql数据库篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/8b5fc2a8617516bbcb130c91.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-08  12:29</pubDate>
        <category><![CDATA[mysql数据库篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/8b5fc2a8617516bbcb130c91.html</guid>
</item>

<item>
        <title><![CDATA[利用shell脚本安全删除bind服务器中的指定zone]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/acf4fc461f3c2a036b63e50b.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>利用shell脚本安全删除named服务器中指定zone</strong></font></p>
<p><font size="4">笔者维护的DNS服务器主要有三个:一主一从一备，由于公司的架构采用了CDN方案，所以namd.conf针对&quot;okspace.com&quot;的出现位置就有三处:即电信、网通及其它，加上三个服务器，每次手动用vim删除okspace.com时就必须修改九处，维护起来很麻烦；更为不爽的是，有些zone经常需要删除，特别的麻烦，所以特地写了个shell以减清自己的负担，达到安全删除的目的。变量domain中的文件内容自己可以定义，签于生产环境下bind都是源码安装，这里就以named.conf文件为主。</font></p>
<p><font size="4">vim /root/delzone.sh<br>
#!/bin/bash<br>
domain='zone\ &quot;okspace.cn&quot;' <br>
if [ -e /var/named/chroot/etc/named.conf ];then<br>
sed -i &quot;/$domain/,/};/d&quot; /var/named/chroot/etc/named.conf<br>
else <br>
sed -i &quot;/$domain/,/};/d&quot; /var/named/chroot/var/named/named.rfc1912.zones<br>
fi</font></p>
<p><font size="4">用sftp将此脚本传到其它DNS服务器，很轻松的完成工作，用此语法结合grep -rl可写出更强大的删除脚本；用shell脚本已经很长时间了，越来越喜欢它。其实shell对于管理系统任务和其它的重复工作的例程来说，表现得非常好，根本不需要那些华而不实的成熟的紧凑的程序语言。</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/acf4fc461f3c2a036b63e50b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/bind%C6%AA">bind篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/acf4fc461f3c2a036b63e50b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-05  20:36</pubDate>
        <category><![CDATA[bind篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/acf4fc461f3c2a036b63e50b.html</guid>
</item>

<item>
        <title><![CDATA[分享下Nginx启动关闭重载及重启动脚本]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/1c2cbf545f23555e564e002f.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>分享下Nginx启动关闭重载及重启脚本</strong></font></p>
<p><font size="4">#/bin/bash<br>
#Nginnx Startup script for the Nginx HTTP Server<br>
# this script create it by yuhongchun027 at 2008.10.15.<br>
# it is v.1.0.0 version.<br>
# if you find any errors on this scripts,please contact yuhongchun027.<br>
# and send mail to yuhongchun027 at <a href="mailto:yuhongchun027@163.com"><font color="#000000">yuhongchun027@163.com</font></a><font color="#000000">.</font><br>
# description: Nginx is a high-performance web and proxy server.<br>
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  It has a lot of features, but it's not for everyone.<br>
# processname: nginx<br>
# pidfile: /usr/local/nginx/logs/nginx.pid<br>
# config: /usr/local/nginx/conf/nginx.conf</font></p>
<p><font size="4">nginxd=/usr/local/nginx/sbin/nginx<br>
nginx_config=/usr/local/nginx/conf/nginx.conf<br>
nginx_pid=/usr/local/nginx/logs/nginx.pid<br>
RETVAL=0<br>
prog=&quot;nginx&quot;</font></p>
<p><font size="4"># Source function library.<br>
. /etc/rc.d/init.d/functions</font></p>
<p><font size="4"># Source networking configuration.<br>
. /etc/sysconfig/network</font></p>
<p><font size="4"># Check that networking is up.<br>
[ ${NETWORKING} = &quot;no&quot; ] &amp;&amp; exit 0<br>
[ -x $nginxd ] || exit 0</font></p>
<p><font size="4"># Start nginx daemons functions.<br>
start() {<br>
if [ -e $nginx_pid ];then<br>
&nbsp;&nbsp;  echo &quot;nginx already running....&quot;<br>
&nbsp;&nbsp;  exit 1<br>
fi<br>
&nbsp;&nbsp;  echo -n $&quot;Starting $prog: &quot;<br>
&nbsp;&nbsp;  daemon $nginxd -c ${nginx_config}<br>
&nbsp;&nbsp;  RETVAL=$?<br>
&nbsp;&nbsp;  echo<br>
&nbsp;&nbsp;  [ $RETVAL = 0 ] &amp;&amp; touch /var/lock/subsys/nginx<br>
&nbsp;&nbsp;  return $RETVAL<br>
}</font></p>
<p><font size="4"># Stop nginx daemons functions.<br>
stop() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo -n $&quot;Stopping $prog: &quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  killproc $nginxd<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RETVAL=$?<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [ $RETVAL = 0 ] &amp;&amp; rm -f /var/lock/subsys/nginx /var/run/nginx.pid<br>
}</font></p>
<p><font size="4"># reload nginx service functions.<br>
reload() {<br>
&nbsp;&nbsp;&nbsp;  echo -n $&quot;Reloading $prog: &quot;<br>
&nbsp;&nbsp;&nbsp;  kill -HUP `cat ${nginx_pid}`<br>
&nbsp;&nbsp;&nbsp;&nbsp;  RETVAL=$?<br>
&nbsp;&nbsp;&nbsp;  echo<br>
}</font></p>
<p><font size="4"># See how we were called.<br>
case &quot;$1&quot; in<br>
start)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  start<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
stop)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  stop<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
reload)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  reload<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
restart)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  stop<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  start<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
status)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  status $prog<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RETVAL=$?<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
*)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo $&quot;Usage: $prog {start|stop|restart|reload|status|help}&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  exit 1<br>
esac<br>
exit $RETVAL<br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/1c2cbf545f23555e564e002f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/apache%2Bnginx%C6%AA">apache+nginx篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/1c2cbf545f23555e564e002f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-01  14:18</pubDate>
        <category><![CDATA[apache+nginx篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/1c2cbf545f23555e564e002f.html</guid>
</item>

<item>
        <title><![CDATA[Nginx负载均衡+Keepalived双机互备+tomcat集群]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/a5b4b11038ed4cf6c2ce792e.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>Nginx负载均衡+Keepalvied双机互备+tomcat集群</strong></font></p>
<p><font color="#000000" size="4">Nginx作负载均衡器的优点许多，简单概括为:①实现了可弹性化的架构，在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去;②upstream具有负载均衡能力，可以自动判断下面的机器，并且自动踢出不能正常提供服务的机器；而 Keepalived 可实现 Nginx 负载均衡器双机互备，任意一台机器发生故障，对方都能够将虚拟IP接管过去；关于session复制的问题，我考虑用ip_hash来做，因为nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端，这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session，因为手上没有太多的服务器，有了成熟的方案再与大家共享。整个拓补如下：</font></p>
<p><font color="#000000">
<table class="MsoNormalTable" style="border-right: medium none; border-top: medium none; margin: auto auto auto 5.3pt; border-left: medium none; border-bottom: medium none; border-collapse: collapse; mso-table-layout-alt: fixed; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #b3b3b3; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><font size="4"><span>名称</span></font></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #b3b3b3; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span><font face="Times New Roman" size="4">IP</font></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4"><span style="mso-spacerun: yes">Nginx主负载均衡</span></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.106</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4"><span style="mso-spacerun: yes">Nginx从负载均衡</span></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.107</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font size="4">VIP</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.108</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4"><span style="mso-spacerun: yes">Tomcat1</span></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.102</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font size="4">Tomcat2</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.103</font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-lastrow: yes">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4"><span style="mso-spacerun: yes">Tomcat3</span></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" size="4">192.168.1.105</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</font></p>
<p><font color="#000000" size="4">布置整个环境用到的软件为:<br>
apache-tomcat-6.0.20.tar.gz<br>
jdk-6u17-linux-i586.bin<br>
nginx-0.7.17.tar.gz<br>
prce-7.7.tar.gz</font></p>
<p><font color="#000000" size="4">①首先分别在3台tomcat主机上布置java环境，安装tomcat，具体步骤为：<br>
apache-tomcat-6.0.tar.gz，下载地址为</font><a href="http://apache.freelamp.com/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz"><font color="#000000" size="4">http://apache.freelamp.com/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz</font></a><font color="#000000" size="4">；jdk-6u16-linux-i586.bin我是用文件挖掘者</font><font color="#000000" size="4">直接搜索下载的</font><a href="ftp://202.204.60.11/pub/Java_VM/JDK/jdk-6u17-linux-i586.bin"><font color="#000000" size="4">ftp://202.204.60.11/pub/Java_VM/JDK/jdk-6u17-linux-i586.bin</font></a><br>
<font color="#000000" size="4">第一步，安装java环境。<br>
JDK的安装<br>
#chmod +x jdk-6u17-linux-i586.bin<br>
#./jdk-6u17-linux-i586.bin<br>
到此JDK已经安装完成<br>
建立符号链接<br>
# ln -s /usr/local/jdk-1.6.0-17/bin/java /usr/bin/java<br>
# ln -s /usr/local/jdk-1.6.0-17/bin/javac /usr/bin/javac<br>
ln -s /usr/local/jdk-1.6.0-17 /usr/local/jdk<br>
ln -s /usr/local/jdk-1.6.0-17/jre /usr/local/jre<br>
TOMCAT的安装<br>
#tar zxvf apache-tomcat-6.0.20.tar.gz<br>
#mv apache-tomcat-6.0.20 /usr/local/tomcat</font></p>
<p><font color="#000000" size="4">设置环境变量: vim /etc/rc.d/rc.local，以追加的形式添加如下内容<br>
JAVA_HOME=/usr/local/jdk<br>
export JAVA_HOME<br>
JRE_HOME=/usr/local/jre<br>
export JRE_HOME<br>
CLASSPATH=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib<br>
export CLASSPATH<br>
PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin<br>
export PATH<br>
TOMCAT_HOME=/usr/local/tomcat<br>
export TOMCAT_HOME <br>
重启服务器，启动tomcat以检查是否存在错误：<br>
#cd /usr/local/tomcat/bin<br>
#./startup.sh<br>
</font><a href="http://ip/"><font color="#000000" size="4">http://IP</font></a><font color="#000000" size="4">地址:8080 可以看到猫头。</font></p>
<p><font color="#000000" size="4">②分别在二台nginx负载均衡器上安装nginx及配置<br>
下载及安装nginx:<br>
wget </font><a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz"><font color="#000000" size="4">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz</font></a><br>
<font color="#000000" size="4">tar zxvf pcre-7.7.tar.gz<br>
cd pcre-7.7/<br>
./configure<br>
make &amp;&amp; make install<br>
wget </font><a href="http://sysoev.ru/nginx/nginx-0.7.17.tar.gz"><font color="#000000" size="4">http://sysoev.ru/nginx/nginx-0.7.17.tar.gz</font></a><br>
<font color="#000000" size="4">tar zxvf nginx-0.7.17.tar.gz<br>
cd nginx-0.7.17/<br>
./configure --prefix=/usr/local/nginx --with-http_stub_status_module <br>
make &amp;&amp; make install</font></p>
<p><font color="#000000" size="4">这里贴上nginx.conf配置文件，不加任何说明，方便用X-shell直接粘贴，很人性化的噢。二个nginx负载均衡器的文件一样，配置完成后启动nginx服务。<br>
user nobody nobody;<br>
worker_processes 1;<br>
pid /usr/local/nginx/logs/nginx.pid;<br>
worker_rlimit_nofile 51200;<br>
events<br>
{<br>
use epoll;<br>
worker_connections 51200;<br>
}<br>
http{<br>
include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mime.types;<br>
default_type application/octet-stream;<br>
server_names_hash_bucket_size 128;<br>
client_header_buffer_size 32k;<br>
large_client_header_buffers 4 32k;<br>
client_max_body_size 8m;<br>
sendfile on;<br>
tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp;  on;<br>
keepalive_timeout 60;<br>
tcp_nodelay on;<br>
fastcgi_connect_timeout 300;<br>
fastcgi_send_timeout 300;<br>
fastcgi_read_timeout 300;<br>
fastcgi_buffer_size 64k;<br>
fastcgi_buffers 4 64k;<br>
fastcgi_busy_buffers_size 128k;<br>
fastcgi_temp_file_write_size 128k;<br>
gzip on;<br>
gzip_min_length 1k;<br>
gzip_buffers&nbsp;&nbsp;&nbsp;&nbsp;  4 16k;<br>
gzip_http_version 1.0;<br>
gzip_comp_level 2;<br>
gzip_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  text/plain application/x-javascript text/css application/xml;<br>
gzip_vary on;<br>
upstream backend<br>
{<br>
server 192.168.1.102:8080;<br>
server 192.168.1.103:8080;<br>
server 192.168.1.105:8080;<br>
}<br>
server {<br>
listen 80;<br>
server_name <a href="http://www.yuhongchun027.com/">www.yuhongchun027.com</a>;<br>
location / {<br>
root /var/www ;<br>
index index.jsp index.htm index.html;<br>
proxy_redirect off;<br>
proxy_set_header Host $host;<br>
proxy_set_header X-Real-IP $remote_addr;<br>
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>
proxy_pass <a href="http://backend/">http://backend</a>;<br>
}</font></p>
<p><font color="#000000" size="4">#location /nginx {<br>
#access_log on;<br>
#auth_basic &quot;NginxStatus&quot;;<br>
#auth_basic_user_file /usr/local/nginx/htpasswd;<br>
#}<br>
log_format access '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '<br>
'$status $body_bytes_sent &quot;$http_referer&quot; '<br>
'&quot;$http_user_agent&quot; $http_x_forwarded_for';<br>
access_log /var/log/access.log access;<br>
}<br>
}</font></p>
<p><font color="#000000" size="4">③在二台Nginx机上安装及配置keepalived，做双机互备。<br>
#wget <a href="http://www.keepalived.org/software/keepalived-1.1.15.tar.gz">http://www.keepalived.org/software/keepalived-1.1.15.tar.gz</a><br>
#tar zxvf keepalived-1.1.15.tar.gz<br>
#cd keepalived-1.1.15<br>
#./configure<br>
#make<br>
#make install<br>
将keepalived做成启动脚务，方便管理:<br>
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/<br>
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/<br>
#mkdir /etc/keepalived<br>
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/<br>
#cp /usr/local/sbin/keepalived /usr/sbin/<br>
#service keepalived start|stop <br>
在二台Nginx上，我分别贴出keepalived.conf配置文件，配置完成后分别用service keepalived start启动，检验keepalived是否成功可用命令<strong>ip a</strong><br>
vrrp_instance VI_INET1 {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  state MASTER<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  interface eth0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  virtual_router_id 53<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <strong>priority 100</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  advert_int 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  authentication {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  auth_type pass<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  auth_pass yourpass<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  virtual_ipaddress {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <strong>192.168.1.108</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
}</font></p>
<p><font color="#000000" size="4">vrrp_instance VI_INET1 {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  state BACKUP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  interface eth0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  virtual_router_id 53<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;  priority 99</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  advert_int 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  authentication {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  auth_type pass<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  auth_pass yourpass<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  virtual_ipaddress {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp;  192.168.1.108</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
}<br>
以上三步完成后，就是检测和压力测试了。大家可任意停掉其中一台的任何服务，在正常结果中大家应该发现，其中任意一台服务器宕机后，不影响整个系统的运作；其实生产环境下的nginx双机互备方案蛮多的，Keepalived只是其中一种，如对以上实验过程有任何疑问，欢迎来信交流<a href="mailto:yuhongchun027@163.com">yuhongchun027@163.com</a>(抚琴煮酒)</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/a5b4b11038ed4cf6c2ce792e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/%B8%BA%D4%D8%BE%F9%BA%E2%BA%CD%B8%DF%BF%C9%D3%C3ha%C6%AA">负载均衡和高可用ha篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/a5b4b11038ed4cf6c2ce792e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-31  14:50</pubDate>
        <category><![CDATA[负载均衡和高可用ha篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/a5b4b11038ed4cf6c2ce792e.html</guid>
</item>

<item>
        <title><![CDATA[LVS+Keepalived架构基于Web的负载均衡]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/ba1db94ade423f2908f7ef56.html]]></link>
        <description><![CDATA[
		
		<div>
<p> </p>
<p> </p>
<p> </p>
<p><font size="4"><span><span><span><span><span><span><span><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/yuhongchun027/pic/item/5127c07a9f894cc22e73b3c9.jpg"><br>
</span></span></span></span></span></span></span></span></span></font><font size="4">服务器故障：(服务器故障包括：服务器宕机、web服务终止、网线松动等等)<br>
①当lvs-master故障时，无法再接受用户请求并将请求转发给真实的web服务器(即便真实web服务器正常)从而导致整个web服务的瘫痪，也就是lvs控制器存在单点故障问题。<br>
②当lvs-master正常时，真实地web服务器如web1-realserver故障。此时lvs-master并不知道真实服务器是否在正常提供web服务，所以仍然在向故障的web1-realserver转发用户请求。这样的结果是用户请求无法被故障web服务器相应，某些用户可以访问网站有些则无法访问。<br>
基于以上的问题，我们需要想办法实现对lvs控制器和web服务器的健康监测,一旦服务出现问题能保证服务不中断的情况下排除故障。即增加lvs控制器实现主备模式避免单点故障约白远 境 收蟱eb服务结点并当它恢复后再自动添加到群集中这样的功能，这就是LVS+keepalived能实现的功能。整个线上环境由Linuxtone的站长netseek提供，这里表示感谢，整个系统的拓补如下：</font></p>
</div>
<div> </div>
<div align="left"> </div>
<p> </p>
<p>
<table class="MsoNormalTable" style="border-right: medium none; border-top: medium none; margin: auto auto auto 5.3pt; border-left: medium none; border-bottom: medium none; border-collapse: collapse; mso-table-layout-alt: fixed; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #b3b3b3; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><font color="#000000" size="4"><span>名称</span></font></strong></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; background: #b3b3b3; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span><font face="Times New Roman" color="#000000" size="4">IP</font></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font color="#000000" size="4">LVS-DR-Master</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" color="#000000" size="4">61.164.122.6</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font color="#000000" size="4">LVS-DR-BACKUP</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" color="#000000" size="4">61.164.122.7</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font color="#000000" size="4">LVS-DR-VIP</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" color="#000000" size="4">61.164.122.8</font></span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font color="#000000" size="4">WEB1-Realserver</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" color="#000000" size="4">61.164.122.9</font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-lastrow: yes">
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 207.75pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="277">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><font color="#000000" size="4">WEB2-Realserver</font></font></span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 192.8pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="257">
            <p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman" color="#000000" size="4">61.164.122.10</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="4">实施步骤：<br>
①在realserver主机上实行脚本realserver,为lo:0绑定VIP地址61.164.122.8，这步分别在二个web主机上61.164.122.9、61.164.122.10实施</font><font size="4">。这步提前做，是因为以后的过程中这一步是不会发生更改的。 #vim /usr/local/sbin/realserver</font></p>
<p><code style="border-right: rgb(204,204,204) 1px solid; padding-right: 0.5em; border-top: rgb(204,204,204) 1px solid; display: block; padding-left: 0.5em; font-weight: normal; font-size: 12px; padding-bottom: 0.5em; margin: 0pt 1em 1em; border-left: rgb(204,204,204) 1px solid; line-height: 1.8em; padding-top: 0.5em; border-bottom: rgb(204,204,204) 1px solid; font-style: normal; font-variant: normal; font-size-adjust: none; font-stretch: normal"><font face="Arial" size="4">#!/bin/bash<br>
SNS_VIP=61.164.122.8<br>
. /etc/rc.d/init.d/functions<br>
case &quot;$1&quot; in<br>
start)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  /sbin/route add -host $SNS_VIP dev lo:0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;1&quot; &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;2&quot; &gt;/proc/sys/net/ipv4/conf/lo/arp_announce<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;1&quot; &gt;/proc/sys/net/ipv4/conf/all/arp_ignore<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;2&quot; &gt;/proc/sys/net/ipv4/conf/all/arp_announce<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sysctl -p &gt;/dev/null 2&gt;&amp;1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;RealServer Start OK&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
stop)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ifconfig lo:0 down<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  route del $SNS_VIP &gt;/dev/null 2&gt;&amp;1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;0&quot; &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;0&quot; &gt;/proc/sys/net/ipv4/conf/lo/arp_announce<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;0&quot; &gt;/proc/sys/net/ipv4/conf/all/arp_ignore<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;0&quot; &gt;/proc/sys/net/ipv4/conf/all/arp_announce<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;RealServer Stoped&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ;;<br>
*)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;Usage: $0 {start|stop}&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  exit 1<br>
esac<br>
exit 0<br>
</font></code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><font size="4">②为二台lvs主机安装lvs脚本，这步并非必要。做完这步时可以检测到用软件实现了LVS/DR的双机互备机制，但并不能实现的智能自动增加删除故障的web站点，所以这个靠keepalived来实现。过程如下：<br>
#mkdir /usr/local/src/lvs<br>
#cd /usr/local/src/lvs<br>
#wget <a href="http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz"><font color="#000000">http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz</font></a><br>
<font color="#000000"><font color="#ff0000"><strong>#ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/ /usr/src/linux</strong></font><br>
#tar zxvf ipvsadm-1.24.tar.gz<br>
#cd ipvsadm-1.24<br>
#make <br>
#make install</font></font></p>
<p><code style="border-right: rgb(204,204,204) 1px solid; padding-right: 0.5em; border-top: rgb(204,204,204) 1px solid; display: block; padding-left: 0.5em; font-weight: normal; font-size: 12px; padding-bottom: 0.5em; margin: 0pt 1em 1em; border-left: rgb(204,204,204) 1px solid; line-height: 1.8em; padding-top: 0.5em; border-bottom: rgb(204,204,204) 1px solid; font-style: normal; font-variant: normal; font-size-adjust: none; font-stretch: normal"><font face="Arial" size="4">#vi /usr/local/sbin/lvs.sh<br>
#!/bin/bash<br>
#website director vip.<br>
SNS_VIP=61.164.122.8<br>
SNS_RIP1=61.164.122.9<br>
SNS_RIP2=61.164.122.10<br>
. /etc/rc.d/init.d/functions<br>
logger $0 called with $1<br>
case &quot;$1&quot; in<br>
start)<br>
# set squid vip<br>
/sbin/ipvsadm --set 30 5 60<br>
/sbin/ifconfig eth0:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up<br>
/sbin/route add -host $SNS_VIP dev eth0:0<br>
/sbin/ipvsadm -A -t $SNS_VIP:80 -s wrr -p 3<br>
/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1<br>
/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1<br>
touch /var/lock/subsys/ipvsadm &gt;/dev/null 2&gt;&amp;1<br>
;;<br>
stop)<br>
/sbin/ipvsadm -C<br>
/sbin/ipvsadm -Z<br>
ifconfig eth0:0 down<br>
route del $SNS_VIP<br>
rm -rf /var/lock/subsys/ipvsadm &gt;/dev/null 2&gt;&amp;1<br>
echo &quot;ipvsadm stoped&quot;<br>
;;<br>
status)<br>
if [ ! -e /var/lock/subsys/ipvsadm ];then<br>
echo &quot;ipvsadm stoped&quot;<br>
exit 1<br>
else<br>
echo &quot;ipvsadm OK&quot;<br>
fi<br>
;;<br>
*)<br>
echo &quot;Usage: $0 {start|stop|status}&quot;<br>
exit 1<br>
esac<br>
exit 0</font></code></p>
<p><font size="4">③关闭lvs脚本./lvs stop，编辑keepalived.conf文件，用keepalived实现负载均衡及高可用性。<br>
a)Keepalved的安装<br>
#wget <a href="http://www.keepalived.org/software/keepalived-1.1.15.tar.gz">http://www.keepalived.org/software/keepalived-1.1.15.tar.gz</a><br>
#tar zxvf keepalived-1.1.15.tar.gz<br>
#cd keepalived-1.1.15<br>
#./configure<br>
#make<br>
#make install<br>
将keepalived做成启动脚务，方便管理:<br>
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/<br>
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/<br>
#mkdir /etc/keepalived<br>
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/<br>
#cp /usr/local/sbin/keepalived /usr/sbin/<br>
#service keepalived start|stop </font></p>
<p><font size="4">b)Keealived的配置<br>
1、配置在主负载均衡服务器上配置keepalived.conf</font><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<code style="border-right: rgb(204,204,204) 1px solid; padding-right: 0.5em; border-top: rgb(204,204,204) 1px solid; display: block; padding-left: 0.5em; font-weight: normal; font-size: 12px; padding-bottom: 0.5em; margin: 0pt 1em 1em; border-left: rgb(204,204,204) 1px solid; line-height: 1.8em; padding-top: 0.5em; border-bottom: rgb(204,204,204) 1px solid; font-style: normal; font-variant: normal; font-size-adjust: none; font-stretch: normal"><font face="Arial" color="#000000" size="4">! Configuration File for keepalived<br>
global_defs {<br>
notification_email {<br>
</font><a href="mailto:yuhongchun027@163.com"><font face="Arial" color="#000000" size="4">yuhongchun027@163.com</font></a><br>
<font face="Arial" color="#000000" size="4">}<br>
notification_email_from </font><a href="mailto:sns-lvs@gmail.com"><font face="Arial" color="#000000" size="4">sns-lvs@gmail.com</font></a><br>
<font face="Arial" color="#000000" size="4">smtp_server 127.0.0.1<br>
# smtp_connect_timeout 30<br>
router_id LVS_DEVEL<br>
} #VIP1<br>
vrrp_instance VI_1 {<br>
<font color="#ff0000"><strong>state MASTER#备份服务器上将MASTER改为BACKUP</strong></font>&nbsp;&nbsp;  <br>
interface eth0<br>
virtual_router_id 51<br>
<strong><font color="#ff0000">priority 100#备份服务上将100改为99</font></strong><br>
advert_int 1<br>
authentication {<br>
auth_type PASS<br>
auth_pass 1111<br>
}<br>
virtual_ipaddress {<br>
61.164.122.8&nbsp;&nbsp;  <br>
}<br>
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  virtual_server 61.164.122.8 80 {<br>
delay_loop 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
lb_algo wrr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
lb_kind DR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
persistence_timeout 60&nbsp;&nbsp;&nbsp;&nbsp;  <br>
protocol TCP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  real_server 61.164.122.9 80 {<br>
weight 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
TCP_CHECK {<br>
connect_timeout 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
nb_get_retry 3<br>
delay_before_retry 3<br>
connect_port 80<br>
}<br>
}<br>
real_server 61.164.122.10 80 {<br>
weight 3<br>
TCP_CHECK {<br>
connect_timeout 10<br>
nb_get_retry 3<br>
delay_before_retry 3<br>
connect_port 80<br>
}<br>
}<br>
}</font></code>
<p><font size="4">2、BACKUP服务器同上配置，先安装lvs再按装keepalived,仍后配置/etc/keepalived/keepalived.conf，只需将红色标示的部分改一下即可。<br>
3、停掉lvs脚本，分别在二台lvs机上启动servcie keepalived start就可实现负载均衡及高可用集群。</font></p>
<p><font size="4">※值得注意的是：<br>
1、你必须向你的服务器所在机房IDC多申请一个IP供VIP使用。<br>
2、服务器的iptables、SElinux均关闭；在生产环境中，我就遇到了iptables的NAT转发问题，导致了lvs失败。<br>
<font color="#000000">3、修改keepalved.conf文件请直接修改/etc/keealived/keepalived.conf，因为keepalived启动时会以这个为默认。<br>
4、系统排障时多用ipvsadm -ln和tail -f /var/log/messages。以上架构我在生产环境、局域网、虚拟机下均实现，有兴趣的同志可以对照实验，有问题的话欢迎来信交流</font><a href="mailto:yuhongchun027@163.com"><font color="#000000">yuhongchun027@163.com</font></a><font color="#000000">(抚琴煮酒)</font><br>
</font><br>
<font size="4"><br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/ba1db94ade423f2908f7ef56.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/%B8%BA%D4%D8%BE%F9%BA%E2%BA%CD%B8%DF%BF%C9%D3%C3ha%C6%AA">负载均衡和高可用ha篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/ba1db94ade423f2908f7ef56.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-27  16:25</pubDate>
        <category><![CDATA[负载均衡和高可用ha篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/ba1db94ade423f2908f7ef56.html</guid>
</item>

<item>
        <title><![CDATA[VMWARE6.0+CentOS5.3+Squid2.6构建反向代理环境]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/61c2a4667c70672eab184cd5.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>VMWARE6.0+Centos5.3+Squid2.6构建反向代理环境</strong></font></p>
<p><font size="4">2009-10-23日重新更新<font color="#ff0000" size="3"><font color="#000000" size="4">(反向加速原理请参照另一篇squid2.6文章)</font><br>
</font>系统环境:XP_SP2+Centos5.3+Vmware6.0+Squid2.6.STABLE21-3.el5+X-manager3.0，为了方便我直接用yum安装squid2.6。<br>
网络拓补为:<br>
Squid服务器:CentOS5.3,IP:192.168.1.103,主机名为squid2.test.com<br>
WebServer1:nginx作web服务器，IP:192.168.1.104,主机名为webserver1.test.com<br>
WebServer2:nginx作web服务器，IP:192.168.1.105,主机名为webserver2.test.com<br>
WebServer3:apache作web服务器 IP:192.168.1.101,主机名为webserver3.test.com<br>
XP作web客户机: IP为192.168.1.188<br>
所有主机均通过路由器连接(即虚拟的Linux服务器采用bridged连接)</font></p>
<p><font size="4">因为XP准备作客户机，在XP主机下编辑文件 edit c:\windows\system32\drivers\etc\hosts,省略掉DNS解析过程<br>
192.168.1.103 webserver1.test.com<br>
192.168.1.103 webserver2.test.com<br>
192.168.1.103 werserver3.test.com</font></p>
<p><font size="4">Squid主要配置文件如下: <br>
#可视化主机名，必填<br>
visible_hostname squid2.test.com<br>
#监听服务器的80端口，支持域名和IP的虚拟主机<br>
http_port 192.168.1.103:80 vhost </font></p>
<p><font size="4">#重点，反向代理的配置,以下内容在原有squid内容文件上添加，其语法如下:<br>
被代理的web的IP父子关系 端口 icp或HTCP端口(0代表禁止)自命名<br>
cache_peer 192.168.1.104 parent 80 0 no-query originserver name=webserver1<br>
cache_peer 192.168.1.105 parent 80 0 no-query originserver name=webserver2<br>
cache_peer 192.168.1.101 parent 80 0 no-query originserver name=webserver3</font></p>
<p><font size="4">#所代理的域名<br>
cache_peer_domain webserver1 webserver1.test.com<br>
cache_peer_domain webserver2 webserver2.test.com<br>
cache_peer_domain webserver3 webserver3.test.com</font></p>
<p><font size="4">#访问权限的控制<br>
acl all src 0.0.0.0/0.0.0.0<br>
http_access allow all<br>
cache_peer_access webserver1 allow all<br>
cache_peer_access webserver2 allow all<br>
cache_peer_access webserver3 allow all</font></p>
<p><font size="4">用xp验证实验结果是可直接在IE中输入<a href="http://webserver1.test.com/"><font color="#000000">http://webserver1.test.com</font></a>等进行验证,为了方便大家实验，特地贴出我的squid.conf配置文件，省去了大家sed的麻烦，如下：</font></p>
<p><font size="4">visible_hostname squid2.test.com</font></p>
<p><font size="4">cache_peer 192.168.1.104 parent 80 0 no-query originserver name=webserver1<br>
cache_peer 192.168.1.105 parent 80 0 no-query originserver name=webserver2<br>
cache_peer 192.168.1.101 parent 80 0 no-query originserver name=webserver3</font></p>
<p><font size="4">cache_peer_domain webserver1 webserver1.test.com<br>
cache_peer_domain webserver2 webserver2.test.com<br>
cache_peer_domain webserver3 webserver3.test.com</font></p>
<p><font size="4">acl all src 0.0.0.0/0.0.0.0<br>
acl manager proto cache_object<br>
acl localhost src 127.0.0.1/255.255.255.255<br>
acl to_localhost dst 127.0.0.0/8<br>
acl SSL_ports port 443<br>
acl Safe_ports port 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # http<br>
acl Safe_ports port 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # ftp<br>
acl Safe_ports port 443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # https<br>
acl Safe_ports port 70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # gopher<br>
acl Safe_ports port 210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # wais<br>
acl Safe_ports port 1025-65535 # unregistered ports<br>
acl Safe_ports port 280&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # http-mgmt<br>
acl Safe_ports port 488&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # gss-http<br>
acl Safe_ports port 591&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # filemaker<br>
acl Safe_ports port 777&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # multiling http<br>
acl CONNECT method CONNECT<br>
http_access allow manager localhost<br>
http_access deny manager<br>
http_access deny !Safe_ports<br>
http_access deny CONNECT !SSL_ports<br>
http_access allow localhost<br>
http_access allow all<br>
icp_access allow all<br>
cache_peer_access webserver1 allow all<br>
cache_peer_access webserver2 allow all<br>
cache_peer_access webserver3 allow all<br>
http_port 192.168.1.103:80 vhost<br>
hierarchy_stoplist cgi-bin ?<br>
access_log /var/log/squid/access.log squid<br>
acl QUERY urlpath_regex cgi-bin \?<br>
cache deny QUERY<br>
refresh_pattern ^ftp:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1440&nbsp;&nbsp;&nbsp;  20%&nbsp;&nbsp;&nbsp;&nbsp;  10080<br>
refresh_pattern ^gopher:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1440&nbsp;&nbsp;&nbsp;  0%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1440<br>
refresh_pattern .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  20%&nbsp;&nbsp;&nbsp;&nbsp;  4320<br>
acl apache rep_header Server ^Apache<br>
broken_vary_encoding allow apache<br>
coredump_dir /var/spool/squid</font></p>
<p><font color="#000000" size="4">※以上实验环境尽量用单网卡模拟真实的生产环境(如CDN系统)，因为大家都只有一个公网IP的缘故。由于智能DNS的原因，用户最终解析到的主机就是离自己最近的squid服务器，笔者遇到过因为机房故障导致部分地区用户不能访问公司的web网站的故障，所以对squid服务的监控是非常重要的(这也是一个CDNS点必须有squid冗余的原因之一)；欢迎大家就squid实际运维工作中出现的问题进行技术交流</font><a href="mailto:yuhongchun027@163.com"><font color="#000000" size="4">yuhongchun027@163.com</font></a><font size="4"><font color="#000000">(抚琴煮酒)</font><br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/61c2a4667c70672eab184cd5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/squid%C6%AA">squid篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/61c2a4667c70672eab184cd5.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-23  13:42</pubDate>
        <category><![CDATA[squid篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/61c2a4667c70672eab184cd5.html</guid>
</item>

<item>
        <title><![CDATA[RHCE实验室NTP时间服务器配置(第二版)]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/f79bb0231f89f3589822edad.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>RHCE实验室NTP时间服务器配置(第二版)</strong></font></p>
<p><font size="4">以RHCE实验室为准,一个简单的NTP时间服务器标准配置如下:</font></p>
<p><font size="4">服务器端: <font size="2"><strong>昨天的梦里,小熊坐在狮子身上哭泣,他们告诉我,那只蓝色的海豚也在梦里想念你</strong></font><br>
首先修正下系统时间,并将系统时间写进硬件时间里 date MMDDhhmmYYYY.ss;hwclock -w<br>
vim /etc/ntp.conf<br>
restrict default nomodify notrap noquery <br>
restrict 127.0.0.1<br>
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap<br>
server 127.127.1.0<br>
fudge 127.127.1.0 stratum 0</font></p>
<p><font size="4">客户机端:<br>
vim /etc/ntp.conf<br>
server 192.168.1.2<br>
vim /etc/ntp/step-ticker<br>
192.168.1.2</font></p>
<p><font size="4">客户端重启ntpd服务即可看到效果 service ntpd restart</font></p>
<p><font size="4">※在授课过程发现，虚拟的linux的时间比真实机越走越慢，具体原因如下:<br>
Linux 2.6核心里把系统计时器的频率加高到1000 Hz ，VMware没办法真的每隔1ms就报一次讯号给guestOS，所以guestOS里的Linux 2.6无法确实接到计时器的讯号。本来这也不应该造成问题，不过2.6核心处理这个&quot;tick loss&quot;的程式有问题，以致于guestOS里的Linux 2.6系统时间走一秒会慢一秒；外面过了两秒里面只过了一秒。具体解决方案也有:可以修改内核及安装vmware-tools软件包，均麻烦。<br>
下面是我家里的vmware5.5虚拟机(如果不能上外网的话，可以选择内部ntp时间服务器)<br>
①直接用脚本解决不能对时的问题，脚本如下: /root/ntptime.sh<br>
#!/bin/bash<br>
while :<br>
do<br>
/usr/sbin/ntpdate ntp.api.bz &gt;/dev/null 2&gt;&amp;1<br>
sleep 30<br>
done<br>
放入后台执行 sh ntptime.sh &amp;&nbsp;&nbsp;  </font></p>
<p><font size="4">②当然还是crontab老大出马了，在这里注意下脚本与crontab的区别，脚本可以控制到秒，而crontab只能到分 vim /etc/crontab<br>
*/1 * * * * root /usr/sbin/ntpdate ntp.api.bz &gt;/dev/null 2&gt;&amp;1<br>
</font></p>
<p><font size="4">效果很明显，每隔一分钟，系统自动对时，呵呵。<br>
[root@ltos mail]# tcpdump -v host 192.168.0.154 and 221.130.196.230<br>
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes<br>
13:16:02.359384 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 76) yuhongchun027.com.ntp &gt; 221.130.196.230.ntp: NTPv4, length 48<br>
Client, Leap indicator: clock unsynchronized (192), Stratum 0, poll 4s, precision -6<br>
Root Delay: 1.000000, Root dispersion: 1.000000, Reference-ID: (unspec)<br>
&nbsp;&nbsp;  Reference Timestamp: 0.000000000<br>
&nbsp;&nbsp;  Originator Timestamp: 0.000000000<br>
&nbsp;&nbsp;  Receive Timestamp:&nbsp;&nbsp;&nbsp;  0.000000000<br>
&nbsp;&nbsp;  Transmit Timestamp:&nbsp;&nbsp;  3464918162.358386999 (2009/10/19 13:16:02)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Receive Timestamp: 0.000000000<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Transmit Timestamp: 3464918162.358386999 (2009/10/19 13:16:02)<br>
13:16:02.511502 IP (tos 0x0, ttl 49, id 5224, offset 0, flags [none], proto: UDP (17), length: 76) 221.130.196.230.ntp &gt; yuhongchun027.com.ntp: NTPv4, length 48<br>
Server, Leap indicator: (0), Stratum 2, poll 4s, precision -18<br>
Root Delay: 0.158142, Root dispersion: 0.027862, Reference-ID: clock.fmt.he.net<br>
&nbsp;&nbsp;  Reference Timestamp: 3464917189.288964740 (2009/10/19 12:59:49)<br>
&nbsp;&nbsp;  Originator Timestamp: 3464918162.358386999 (2009/10/19 13:16:02)<br>
&nbsp;&nbsp;  Receive Timestamp:&nbsp;&nbsp;&nbsp;  3464918182.209876791 (2009/10/19 13:16:22)<br>
&nbsp;&nbsp;  Transmit Timestamp:&nbsp;&nbsp;  3464918182.209906405 (2009/10/19 13:16:22)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Receive Timestamp: +19.851489782<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Transmit Timestamp: +19.851519405<br>
13:16:02.512579 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 76) yuhongchun027.com.ntp &gt; 221.130.196.230.ntp: NTPv4, length 48<br>
Client, Leap indicator: clock unsynchronized (192), Stratum 0, poll 4s, precision -6<br>
Root Delay: 1.000000, Root dispersion: 1.000000, Reference-ID: (unspec)<br>
&nbsp;&nbsp;  Reference Timestamp: 0.000000000<br>
&nbsp;&nbsp;  Originator Timestamp: 0.000000000<br>
&nbsp;&nbsp;  Receive Timestamp:&nbsp;&nbsp;&nbsp;  0.000000000<br>
&nbsp;&nbsp;  Transmit Timestamp:&nbsp;&nbsp;  3464918162.512529999 (2009/10/19 13:16:02)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Receive Timestamp: 0.000000000<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Originator - Transmit Timestamp: 3464918162.512529999 (2009/10/19 13:16:02)<br>
13:16:02.688528 IP (tos 0x0, ttl 49, id 5242, offset 0, flags [none], proto: UDP (17), length: 76) 221.130.196.230.ntp &gt; yuhongchun027.com.ntp: NTPv4, length 48<br>
Server, Leap indicator: (0), Stratum 2, poll 4s, precision -18<br>
Root Delay: 0.158142, Root dispersion: 0.027862, Reference-ID: clock.fmt.he.net<br>
</font></p>
<p><font size="4">※另外值得注意的是，尽管时间是一件很麻烦的事(还有UTC与GMT、系统时间与硬件时间的区别)但其实在生产环境中，这件事很简单--服务器投入运行之前必须用crontab对时；如果时间不同步的话是件很麻烦的事，我维护的dovecot服务器经常因为时间问题自己杀了自己(KiLL myself)，关于ntp时间服务器有任何疑问的话，欢迎来信交流<a href="mailto:yuhongchun027@163.com"><font color="#000000">yuhongchun027@163.com</font></a>(抚琴煮酒)<br>
<br>
<br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/f79bb0231f89f3589822edad.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/rhce%BD%CC%D1%A7%C6%AA">rhce教学篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/f79bb0231f89f3589822edad.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-19  12:17</pubDate>
        <category><![CDATA[rhce教学篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/f79bb0231f89f3589822edad.html</guid>
</item>

<item>
        <title><![CDATA[iptables简单防攻击脚本(自动过滤白名单)]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/7fec0b1fd1a7f600304e15ba.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p> </p>
<p align="center"><font size="5"><strong>iptables简单防攻击脚本(自动过滤白名单)</strong></font></p>
<p><font color="#000000"><font size="4">这里自动分析黑名单及白名单的iptables 脚本（此脚本直接从生产服务器上下载）即/root/deny_100.sh,<font color="#ff0000"><font color="#000000">脚本内容如下(</font></font><font color="#000000">white.txt为企业外网合法IP)</font></font></font></p>
<p><font color="#000000" size="4">[root@mail ~]# cat /root/deny_100.sh <br>
#/bin/bash<br>
netstat -an| grep :80 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1}' | uniq -c | awk '$1 &gt;100' &gt; /root/black.txt<br>
for i in `awk '{print $2}' /root/black.txt`<br>
do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  COUNT=`grep $i /root/black.txt | awk '{print \$1}'`<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DEFINE=&quot;100&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZERO=&quot;0&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if [ $COUNT -gt $DEFINE ];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  grep $i /root/white.txt &gt; /dev/null<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if [ $? -gt $ZERO ];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  echo &quot;$COUNT $i&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  iptables -I INPUT -p tcp -s $i -j DROP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fi<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fi<br>
done</font></p>
<p><font color="#000000" size="4">2009年3月30日下午14:25分，用下列命令监控时:<br>
<font color="#ff0000"><strong>netstat -an| grep :25 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1}' | uniq -c | awk '$1 &gt;100'</strong></font><br>
<strong>1122</strong> 219.136.163.207<br>
17 61.144.157.236</font></p>
<p><font color="#000000" size="4">用</font><a href="http://www.ip138.com/"><font color="#000000" size="4">http://www.ip138.com</font></a><font color="#000000" size="4">一查，发现<br>
ip138.com IP查询(搜索IP地址的地理位置)<br>
您查询的IP:219.136.163.207<br>
本站主数据：广东省广州市 电信(荔湾区) <br>
参考数据一：广东省广州市 电信(荔湾区) <br>
参考数据二：广东省广州市荔湾区 电信ADSL </font></p>
<p><font color="#000000" size="4">调用deny_100.sh后将此IP Drop掉，再运行./root/count.sh后无显示，显示成功，可用iptables &ndash;nL验证，所以将此安全脚本写进crontab里<br>
<strong><font color="#ff0000">*/1 * * * * root /bin/sh /root/deny_100.sh</font></strong></font></p>
<p><font color="#000000" size="4">※在这里衷心感谢3158的技术总监，谢谢您的帮助；监视端口视服务器性质而定，web是80，mail25，其它以此类推；局域网下要测试此iptables的脚本的同志可用webbench模拟并发环境，然后启动此脚本检测其有效性。好了，关于iptables的技巧及其它使用问题，欢迎来信交流:yuhongchun027@163.com(抚琴煮酒)</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/7fec0b1fd1a7f600304e15ba.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/linux%B7%C0%BB%F0%C7%BD%BC%B0%B0%B2%C8%AB%CF%E0%B9%D8%C6%AA">linux防火墙及安全相关篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/7fec0b1fd1a7f600304e15ba.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-18  19:17</pubDate>
        <category><![CDATA[linux防火墙及安全相关篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/7fec0b1fd1a7f600304e15ba.html</guid>
</item>

<item>
        <title><![CDATA[mysql性能和检查和调优方法]]></title>
        <link><![CDATA[http://hi.baidu.com/yuhongchun027/blog/item/3cc7ec4c6dd997f3d62afc45.html]]></link>
        <description><![CDATA[
		
		<p align="center"><font size="5"><strong>mysql性能和检查和调优方法</strong></font></p>
<p align="left"><font size="4">我一直是使用mysql这个数据库软件，它工作比较稳定，效率也很高。在遇到严重性能问题时，一般都有这么几种可能：<br>
一、索引没有建好；<br>
二、sql写法过于复杂；<br>
三、配置错误；<br>
四、机器实在负荷不了；</font></p>
<p align="left"><font size="4">下面就这些些情况一一罗列：<br>
一、索引没有建好<br>
如果看到mysql消耗的cpu很大，可以用mysql的client工具来检查。<br>
在linux下执行<br>
/usr/local/mysql/bin/mysql -hlocalhost -uroot -p <br>
输入密码，如果没有密码，则不用-p参数就可以进到客户端界面中。<br>
看看当前的运行情况<br>
show full processlist<br>
可以多运行几次<br>
这个命令可以看到当前正在执行的sql语句，它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息<br>
在我的cache后端，这里面大部分时间是看不到显示任何sql语句的，我认为这样才算比较正常。如果看到有很多sql语句，那么这台mysql就一定会有性能问题<br>
如果出现了性能问题，则可以进行分析：</font></p>
<p align="left"><font size="4">1、是不是有sql语句卡住了？<br>
这是出现比较多的情况，如果数据库是采用myisam，那么有可能有一个写入的线程会把数据表给锁定了，如果这条语句不结束，则其它语句也无法运行。<br>
查看processlist里的time这一项，看看有没有执行时间很长的语句，要留意这些语句。<br>
2、大量相同的sql语句正在执行<br>
如果出现这种情况，则有可能是该sql语句执行的效率低下，同样要留意这些语句。<br>
然后把你所怀疑的语句统统集合一下，用desc（explain）来检查这些语句。<br>
首先看看一个正常的desc输出：<br>
mysql&gt; desc select * from imgs where imgid=1651768337;<br>
+----+-------------+-------+-------+---------------+---------+---------+-------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;&nbsp;  | key_len | ref&nbsp;&nbsp;  | rows | Extra |<br>
+----+-------------+-------+-------+---------------+---------+---------+-------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | const | PRIMARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | PRIMARY | 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | const |&nbsp;&nbsp;&nbsp;  1 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+-------+---------------+---------+---------+-------+<br>
1 row in set (0.00 sec)<br>
注意key、rows和Extra这三项，这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询，结果集数量为1条，Extra没有显示，证明没有用到排序或其他操作。由此结果可以推断，mysql会从索引中查询imgid=1651768337这条记录，然后再到真实表中取出所有字段，是很简单的操作。<br>
key是指明当前sql会使用的索引，mysql执行一条简单语句时只能使用到一条索引，注意这个限制；rows是返回的结果集大小，结果集就是使用该索引进行一次搜索的所有匹配结果；Extra一般会显示查询和排序的方式，。<br>
如果没有使用到key，或者rows很大而用到了filesort排序，一般都会影响到效率，例如：<br>
mysql&gt; desc select * from imgs where userid=&quot;7mini&quot; order by clicks desc limit 10;<br>
+----+-------------+-------+------+---------------+------+---------+------+-------+<br>
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+------+---------------+------+---------+------+-------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | ALL | NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | NULL | NULL&nbsp;&nbsp;&nbsp;  | NULL | 12506 | Using where; Using filesort |<br>
+----+-------------+-------+------+---------------+------+---------+------+-------+<br>
1 row in set (0.00 sec)<br>
这条sql结果集会有12506条，用到了filesort，所以执行起来会非常消耗效率的。这时mysql执行时会把整个表扫描一遍，一条一条去找到匹配userid=&quot;7mini&quot;的记录，然后还要对这些记录的clicks进行一次排序，效率可想而知。真实执行时如果发现还比较快的话，那是因为服务器内存还足够将12506条比较短小的记录全部读入内存，所以还比较快，但是并发多起来或者表大起来的话，效率问题就严重了。<br>
这时我把userid加入索引：<br>
create index userid on imgs (userid);<br>
然后再检查：<br>
mysql&gt; desc select * from imgs where userid=&quot;7mini&quot; order by clicks desc limit 10;<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;  | key_len | ref&nbsp;&nbsp;  | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | ref | userid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | userid | 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | const |&nbsp;&nbsp;&nbsp;  8 | Using where; Using filesort |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
1 row in set (0.00 sec)<br>
嗯，这时可以看到mysql使用了userid这个索引搜索了，用userid索引一次搜索后，结果集有8条。然后虽然使用了filesort一条一条排序，但是因为结果集只有区区8条，效率问题得以缓解。<br>
但是，如果我用别的userid查询，结果又会有所不同：<br>
mysql&gt; desc select * from imgs where userid=&quot;admin&quot; order by clicks desc limit 10;<br>
+----+-------------+-------+------+---------------+--------+---------+-------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;  | key_len | ref&nbsp;&nbsp;  | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | ref | userid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | userid | 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | const | 2944 | Using where; Using filesort |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+<br>
1 row in set (0.00 sec)<br>
这个结果和userid=&quot;7mini&quot;的结果基本相同，但是mysql用userid索引一次搜索后结果集的大小达到2944条，这2944条记录都会加入内存进行filesort，效率比起7mini那次来说就差很多了。这时可以有两种办法可以解决，第一种办法是再加一个索引和判断条件，因为我只需要根据点击量取最大的10条数据，所以有很多数据我根本不需要加进来排序，比如点击量小于10的，这些数据可能占了很大部分。<br>
我对clicks加一个索引，然后加入一个where条件再查询：<br>
create index clicks on imgs(clicks);<br>
mysql&gt; desc select * from imgs where userid=&quot;admin&quot; order by clicks desc limit 10;<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;  | key_len | ref&nbsp;&nbsp;  | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | ref | userid,clicks | userid | 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | const | 2944 | Using where; Using filesort |<br>
+----+-------------+-------+------+---------------+--------+---------+-------+------+<br>
1 row in set (0.00 sec)<br>
这时可以看到possible_keys变成了userid,clicks，possible_keys是可以匹配的所有索引，mysql会从possible_keys中自己判断并取用其中一个索引来执行语句，值得注意的是，mysql取用的这个索引未必是最优化的。这次查询mysql还是使用userid这个索引来查询的，并没有按照我的意愿，所以结果还是没有什么变化。改一下sql加上use index强制mysql使用clicks索引：<br>
mysql&gt; desc select * from imgs use index (clicks) where userid='admin' and clicks&gt;10 order by clicks desc limit 10<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;  | key_len | ref | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | range | clicks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | clicks | 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | NULL | 5455 | Using where |<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
1 row in set (0.00 sec)<br>
这时mysql用到了clicks索引进行查询，但是结果集比userid还要大！看来还要再进行限制：<br>
mysql&gt; desc select * from imgs use index (clicks) where userid='admin' and clicks&gt;1000 order by clicks desc limit 10<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;&nbsp;  | key_len | ref | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | range | clicks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | clicks | 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | NULL | 312 | Using where |<br>
+----+-------------+-------+-------+---------------+--------+---------+------+------+<br>
1 row in set (0.00 sec)<br>
加到1000的时候结果集变成了312条，排序效率应该是可以接受。<br>
不过，采用换索引这种优化方式需要取一个采样点，比如这个例子中的1000这个数字，这样，对userid的每个数值，都要去找一个采样点，这样对程序来说是很难办的。如果按1000取样的话，那么userid='7mini'这个例子中，取到的结果将不会是8条，而是2条，给用户造成了困惑。<br>
当然还有另一种办法，加入双索引：<br>
create index userid_clicks on imgs (userid, clicks)<br>
mysql&gt; desc select * from imgs where userid=&quot;admin&quot; order by clicks desc limit 10;<br>
+----+-------------+-------+------+----------------------+---------------+---------+-------<br>
| id | select_type | table | type | possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | key_len | ref&nbsp;&nbsp;  | rows | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  |<br>
+----+-------------+-------+------+----------------------+---------------+---------+-------<br>
| 1 | SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | imgs | ref | userid,userid_clicks | userid_clicks | 51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | const | 2944 | Using where |<br>
+----+-------------+-------+------+----------------------+---------------+---------+-------<br>
1 row in set (0.00 sec)<br>
这时可以看到，结果集还是2944条，但是Extra中的filesort不见了。这时mysql使用userid_clicks这个索引去查询，这不但能快速查询到userid=&quot;admin&quot;的所有记录，并且结果是根据clicks排好序的！所以不用再把这个结果集读入内存一条一条排序了，效率上会高很多。<br>
但是用多字段索引这种方式有个问题，如果查询的sql种类很多的话，就得好好规划一下了，否则索引会建得非常多，不但会影响到数据insert和update的效率，而且数据表也容易损坏。<br>
以上是对索引优化的办法，因为原因可能会比较复杂，所以写得比较的长，一般好好优化了索引之后，mysql的效率会提升n个档次，从而也不需要考虑增加机器来解决问题了。<br>
但是，mysql甚至所有数据库，可能都不好解决limit的问题。在mysql中，limit 0,10只要索引合适，是没有问题的，但是limit 100000,10就会很慢了，因为mysql会扫描排好序的结果，然后找到100000这个点，取出10条返回。要找到100000这个点，就要扫描100000条记录，这个循环是比较耗时的。不知道会不会有什么好的算法可以优化这个扫描引擎，我冥思苦想也想不出有什么好办法。对于limit，目前直至比较久远的将来，我想只能通过业务、程序和数据表的规划来优化，我想到的这些优化办法也都还没有一个是万全之策，往后再讨论。</font></p>
<p align="left"><font size="4">二、sql写法过于复杂<br>
sql写法假如用到一些特殊的功能，比如groupby、或者多表联合查询的话，mysql用到什么方式来查询也可以用desc来分析，我这边用复杂sql的情况还不算多，所以不常分析，暂时就没有好的建议。</font></p>
<p align="left"><font size="4">三、配置错误<br>
配置里主要参数是key_buffer、sort_buffer_size/myisam_sort_buffer_size，这两个参数意思是：<br>
key_buffer=128M：全部表的索引都会尽可能放在这块内存区域内，索引比较大的话就开稍大点都可以，我一般设为128M，有个好的建议是把很少用到并且比较大的表想办法移到别的地方去，这样可以显著减少mysql的内存占用。<br>
sort_buffer_size=1M：单个线程使用的用于排序的内存，查询结果集都会放进这内存里，如果比较小，mysql会多放几次，所以稍微开大一点就可以了，重要是优化好索引和查询语句，让他们不要生成太大的结果集。<br>
另外一些配置：<br>
thread_concurrency=8：这个配置标配=cpu数量x2<br>
interactive_timeout=30<br>
wait_timeout=30：这两个配置使用10-30秒就可以了，这样会尽快地释放内存资源，注意：一直在使用的连接是不会断掉的，这个配置只是断掉了长时间不动的连接。<br>
query_cache：这个功能不要使用，现在很多人看到cache这几个字母就像看到了宝贝，这是不唯物主义的。mysql的query_cache在每次表数据有变化的时候都会重新清理连至该表的所有缓存，如果更新比较频繁，query_cache不但帮不上忙，而且还会对效率影响很大。这个参数只适合只读型的数据库，如果非要用，也只能用query_cache_type=2自行用SQL_CACHE指定一些sql进行缓存。<br>
max_connections：默认为100，一般情况下是足够用的，但是一般要开大一点，开到400-600就可以了，能超过600的话一般就有效率问题，得另找对策，光靠增加这个数字不是办法。<br>
其它配置可以按默认就可以了，个人觉得问题还不是那么的大，提醒一下：1、配置虽然很重要，但是在绝大部分情况下都不是效率问题的罪魁祸首。2、mysql是一个数据库，对于数据库最重要考究的不应是效率，而是稳定性和数据准确性。</font></p>
<p align="left"><font size="4">四、机器实在负荷不了<br>
如果做了以上调整，服务器还是不能承受，那就只能通过架构级调整来优化了。<br>
1、mysql同步。<br>
通过mysql同步功能将数据同步到数台从数据库，由主数据库写入，从数据库提供读取。<br>
我个人不是那么乐意使用mysql同步，因为这个办法会增加程序的复杂性，并常常会引起数据方面的错误。在高负荷的服务中，死机了还可以快速重启，但数据错误的话要恢复就比较麻烦。<br>
2、加入缓存<br>
加入缓存之后，就可以解决并发的问题，效果很明显。如果是实时系统，可以考虑用刷新缓存方式使缓存保持最新。<br>
在前端加入squid的架构比较提倡使用，在命中率比较高的应用中，基本上可以解决问题。<br>
如果是在程序逻辑层里面进行缓存，会增加很多复杂性，问题会比较多而且难解决，不建议在这一层面进行调整。<br>
3、程序架构调整，支持同时连接多个数据库<br>
如果web加入缓存后问题还是比较严重，只能通过程序架构调整，把应用拆散，用多台的机器同时提供服务。<br>
如果拆散的话，对业务是有少许影响，如果业务当中有部分功能必须使用所有的数据，可以用一个完整库+n个分散库这样的架构，每次修改都在完整库和分散库各操作一次，或定期整理完整库。<br>
当然，还有一种最笨的，把数据库整个完完整整的做拷贝，然后程序每次都把完整的sql在这些库执行一遍，访问时轮询访问，我认为这样要比mysql同步的方式安全。<br>
4、使用 mysql proxy 代理<br>
mysql proxy 可以通过代理把数据库中的各个表分散到数台服务器，但是它的问题是没有能解决热门表的问题，如果热门内容散在多个表中，用这个办法是比较轻松就能解决问题<font color="#000000"><strong>(Ayou)</strong></font><br>
</font></p> <a href="http://hi.baidu.com/yuhongchun027/blog/item/3cc7ec4c6dd997f3d62afc45.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yuhongchun027/blog/category/mysql%CA%FD%BE%DD%BF%E2%C6%AA">mysql数据库篇</a>&nbsp;<a href="http://hi.baidu.com/yuhongchun027/blog/item/3cc7ec4c6dd997f3d62afc45.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-11  18:48</pubDate>
        <category><![CDATA[mysql数据库篇]]></category>
        <author><![CDATA[yuhongchun027]]></author>
		<guid>http://hi.baidu.com/yuhongchun027/blog/item/3cc7ec4c6dd997f3d62afc45.html</guid>
</item>


</channel>
</rss>