免root权限实现多服务器负载均衡

2011年5月10日 分类: 网来往事

前几天洛奇亚的服务器所在机房发生了长达2小时的断电,博客也down了很久,回家打不开ping不通很是郁闷,所以切换到mirror服务器后着手研究下集群。

用VPS或者独服做博客的人应该相对少一点,但是用虚拟主机的人肯定不在少数,这里灵曦摸索出一套适合虚拟主机+DNS轮询实现负载均衡的方法。(也支持VPS和独服,但是相对于这两种,有更优处理方案,在此不做讨论。)

实现本方案的前提条件:

服务器linux系统

服务器在国外

有SSH权限(不必root)

本方案优点:

成本低,管理简单

能较为有效的均衡流量

本方案缺点:

DNS轮询不比反向代理,不能实现线性均衡,在访问量小的时候,效果非常不明显

各服务器主机间同步的大小受dropbox限制(以dropbox作为中间设备的,免费最高8G)

一服宕机,会导致三分之一流量损失,但是可以在DNS端实现宕机监控并自动切换线路解析

Dropbox稳定性较差,对性能差或者负载神高的机器,容易引发Resource temporarily unavailable错误

如果服务器质量良莠不齐,反而容易降低在线率。

参考教程:让进程在后台可靠运行的几种方法–IBM

 

好了,废话一大堆,下面是核心内容:

备份服务器数据!如果没有备份,你很可能会在操作中因为同步而丢失全站数据!!!

连上SSH,进入第一台服务器,
打入命令:

wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
tar -zxof dropbox.tar.gz
mv .dropbox-dist ~

解释下几条命令,从dropbox官网下载dropbox客户端,解压并移动到当前用户的家目录

第一次运行:

~/.dropbox-dist/dropboxd &

随后会出现一条很长的url,复制出来,翻墙打开,连入你的dropbox账户,绑定完成。

如果没问题,在你的家目录下会出现一个叫做Dropbox的文件夹。

然后

killall dropbox

rm -rf ~/Dropbox

ln -s 你的web目录绝对路径 ~/Dropbox

杀了这个进程

删除dropbox文件夹并将你的网站目录软链接到Dropbox文件夹

随后,将dropbox切入后台,并保证让你断开SSH后能继续同步:

(~/.dropbox-dist/dropboxd &)

很重要的命令,小括号不可省略!小括号是把SID转为1,不受本账号hup信号而终止。

然后

ps -ef| grep dropbox

检查是否挂载了Dropbox进程,正常应该如图:

image

 

有红框内内容红框内则表示正常运行,注意20022后面的1,这个非常重要,只有这样才不会在挂断SSH的时候终止,考虑到虚拟主机多没有screen权限的命令,以此代替。VPS等亦可用screen代替。

服务器1算是配置完成了,一切无误的话,你会在dropbox中看见你网站根目录的内容。

接下来切换到第二台服务器的SSH:

 

wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
tar -zxof dropbox.tar.gz
mv .dropbox-dist ~

~/.dropbox-dist/dropboxd &

同服务器1,完成对机器的绑定,之后,删除原有网站的www目录,请注意备份数据!

killall dropbox

rm -rf 你的网站目录

或者:

mv 你的网站目录 你的网站目录_old

作为备份(建议)

 

然后,创建一个软链接到你的网站目录:

ln -s ~/Dropbox/ 你的网站目录

把DNS记录解析到服务器2,访问测试看看有没有问题,如果有问题,比如权限问题等,输入

chmod 755 -R 你的网站目录

甚至可以开放777权限,排除权限问题后,再恢复755或者644进行测试。

如果一切正常,可以按照配置服务器2的方法配置服务器3,服务器4,等等。

第一台服务器和其他服务器的区别就是软链接的对象区别,如果这一步错误,将会损失数据。

同步设置完成后,建议在一台服务器的网站根目录输入:

echo test>test

然后在其他服务器的根目录ls下看看,有没有test这个文件,如果有,则成功,没有,则应该检查错误。

 

服务器配置完成后,应该逐服切换,逐服检查,确保每个服务器都正常访问,读写,同步后:

如果是wordpress博客,需要对mysql服务器开放主机为“%”的权限,即,允许所有外网访问该服务器,或者指定一个主机文本域,在指定IP内服务器允许访问数据库,然后修改wp-config.php文件,把服务器原来的localhost(一般是这样)修改为mysql服务器的IP,并定期备份数据。

完成后,设置DNS轮询,即在根域和www域下,解析上N个A记录指向IP,实现后本机刷新DNS缓存(win:ipconfig /flushdns),应该能看到这样的变化:

image

两次查询,分别是轮询前和轮询后的变化,IP指向三个不同的IP,从而实现负载均衡。

但是,这种均衡并不是真正的均衡,效果也不如反向代理或CDN,只能作为一种分担流量的手段。

 

常见错误:

This is usually because of a permissions error. Errors can also be caused by your home folder being stored on a network share.

权限问题,用chmod赋予~/.dropbox-dist下文件夹777权限,如果仍然不能解决,应该耐心等待,因为这个奇怪的错误通常在部署完服务器的12小时内会出现,具体原因未知。

资源临时不可用,通常是dropbox在同步数据时过载的错误,在VPS不会出现,在虚拟主机有可能是超过了用户的线程数,应该等几个小时,如果仍然这样,应该写一个php文件:

<?php

exec("killall dropbox");

echo ok;

?>

用FTP上传到服务器上,在网站中打开,当回显ok时,应该可以正常连上SSH了。

 

如果在配置过程中有其他问题,同样欢迎留言~~

标签: , ,

28 条评论 于 “免root权限实现多服务器负载均衡”

  1. 2011年5月10日21:19
    1
    Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

    沙发先坐了,在慢慢啃,虽然估计看不懂。。。 /lenghan

  2. 2011年5月10日21:33
    2
    Google Chrome 11.0.696.57 Google Chrome 11.0.696.57 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.57 Safari/534.24

    /lenghan /lenghan 。。没用过VPS,只是看过相关资料。。只有一点点
    本来以为来早了。。。却还是被楼上的混沌抢了沙发

  3. 2011年5月11日00:02
    3
    Safari 5.0.5 Safari 5.0.5 Mac OS X  10.6.7 Mac OS X 10.6.7
    Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

    有VPS有root但是一直不会优化><

    • 灵曦
      2011年5月11日12:48
      4
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      很容易优化的,网上一大堆教程,不过我这个思路比较偏,可能没人提过

  4. 2011年5月11日01:03
    5
    Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Mac OS X  10.6.7 Mac OS X 10.6.7
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

    怎么也想不到竟然是利用Dropbox在Linux的客户端。

    • 灵曦
      2011年5月11日12:48
      6
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      有两个原因,一个是我不会让两只服务器做异步备份,一个是用dropbox不需要root权限。

  5. 2011年5月11日17:45
    7
    Google Chrome 12.0.742.30 Google Chrome 12.0.742.30 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.30 Safari/534.30

    『解析上N个A记录指向IP』,那么我访问的时候会随机解析到一个IP么?

    • 灵曦
      2011年5月11日18:15
      8
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      会,而且TTL越低,几率越大。我的TTL是1,也就是DNS缓存实时更新。

  6. root9000
    2011年5月11日19:15
    9
    Chromium 11.0.696.57 Chromium 11.0.696.57 Ubuntu 11.04 Ubuntu 11.04
    Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/11.04 Chromium/11.0.696.57 Chrome/11.0.696.57 Safari/534.24

    教程不错,学习了。。。。。

  7. 2011年5月11日19:48
    10
    Firefox 3.6.13 Firefox 3.6.13 Windows XP Windows XP
    Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 QQDownload/1.7

    说实在话,没看明白。用dropbox也太另类了……

    萌娘百科最初是在HK和USA各放一个服务器,HK的连到USA的数据库,但是实测效果非常糟糕,mediawiki作为一个全动态站非常依赖数据库反映速度。

    又尝试在HK主机开squid,但是因为需要完全权限……价格承受不起,不了了之。

    现在用的是cloudflare(免费),效果还OK。就是不像squid一样能在页面更改后刷新缓存

    现在HK服务器完全是当作FTP在使用……这个方法虽然可行但是无法同步数据库对于萌娘百科来说用不上啊……

    • 灵曦
      2011年5月11日21:39
      11
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      well,看不懂完全可以理解呢,简单的说,就是利用dropbox实现服务器中文件的高速同步
      dropbox对mysql完全无能为力,我最初是试过多数据库同步的,后来失败告终(mysql确实摸不透啊魂淡..
      如果对数据库要求很高的话,建议去IBM developer work看看,可能有相当不错的解决方案(也相当麻烦
      cloudflare没记错的话是CDN吧,免费的东西还是保留态度

      • 2011年5月24日14:55
        12
        Google Chrome 11.0.696.68 Google Chrome 11.0.696.68 Windows XP Windows XP
        Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24

        今天忽然算是看明白你在写什么了,你在服务器端安装了Dropbox以后通过Dropbox同步两个网站。不过个人始终认为作为wordpress这种不太要求速度的网站,一个高性能大流量的服务器会比这样的同步要好,毕竟不是所以网站都会流量大到必须要用服务器群。不管从实用性上还是方便性上都差一些。

        说到免费服务的话……最高8G的Dropbox不一样是免费的吗……?

        我这边始终没有条件架设squid,不过前几天在HK找到了一个开了数据库同步的空间(虽然空间很小,但是是免费的cpanel),设为每5min和主数据库合并新增数据一次,如果有人提交编辑则强制触发同步。图片外链主站,基本没有速度问题。现在唯一不能解决的就是让大陆流量到HK服务器,其他地区流量到USA的主服务器了……

        • 灵曦
          2011年5月24日21:00
          13
          Google Chrome 11.0.696.68 Google Chrome 11.0.696.68 Windows 7 Windows 7
          Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24

          啊,真高兴有人看懂了呢。。
          其实这个方案最大的有点不在于负载均衡,主要是防止某个IDC数据突然损坏没备份,或者备份不够实时之类的,负载均衡另外有反向代理方案更好一点。
          dropbox免费最高是到8G的,还要N多邀请,很麻烦的,不过,用上面这个方法,绑定shell后过验证倒是很容易~
          弱弱的问一下,你是怎么设置5分钟同步数据库和强制同步的呢?很想知道呢!
          关于流量分流的问题,建议采用智能DNS方案,比如用DNSPOD国际版之类的就可以了。

          • 2011年5月25日10:06
            14
            Google Chrome 11.0.696.68 Google Chrome 11.0.696.68 Windows XP Windows XP
            Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24

            嘛……不管是负载还是可用率考虑……我都觉得反向代理为佳。

            定时同步在phpmyadmin里就有(如果开了同步的话)(设置主从数据库然后定时,如果不行,corn定时运行应该也可以)

            最麻烦的是编辑提交,我搞了半天也没弄明白,只好让提供空间的同学帮忙了。好像是怎么把数据交到主数据库,然后再强制触发同步什么的 /ku

            话说HK现在这个同步还是经常会出错误(把主站数据也搞乱了),而且日500IP都会宕掉…所以没正式启用…不过毕竟是免费的嘛……人家愿意给已经很够意思了

            • 灵曦
              2011年5月25日12:40
              15
              Google Chrome 11.0.696.68 Google Chrome 11.0.696.68 Windows 7 Windows 7
              Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24

              phpmyadmin里面的同步很早前就知道了,一直不知道套接字(socket)应该怎么填,也查不到相关资料~!!求解释!!
              主站数据一般还是少动的好,测试同步先用虚拟机或者用两台后端服务器做测试,无误后再同步主站就会把损失减到最小~!

  8. 2011年5月11日22:34
    16
    Sogou Explorer Sogou Explorer Windows 7 Windows 7
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0; SE 2.X MetaSr 1.0)

    我的方法:不用dropbox,建立三个wordpress,配上同样的主题(不同也行)其他两个博客通过rss抓取主博客的内容.

    对于访问较多的网站,多个镜像能发挥出它的作用,但是访问较多的网站往往会关注seo.一个域名解析到多个ip的话,会不会造成搜索引擎蜘蛛每次爬的ip不同,而影响搜索引擎对网站的评价?

    • 灵曦
      2011年5月11日22:37
      17
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      用rss不是什么好办法呢,会导致很多错误的,比如图片啦,附件啦。还有rss的样式和全文输出什么的,麻烦不比dropbox少。。
      域名做DNS轮询是很普遍的事情,不存在对SEO产生负面影响吧,不信你nslookup下一些大型网站,基本都是绑定了数个IP的。
      大型网站一般采用反向代理减少负载和CDN方案。

  9. 2011年5月11日23:27
    18
    Firefox 4.0.1 Firefox 4.0.1 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1

    以下只针对普通博客.
    除了rss以外还有不少采集方法,图片声音等媒体都是能抓到的,另建图床则不需担心此问题
    对于普通博客来说,没有运行同步程序或建立cdn的条件,如果要考虑预防当机,建一个镜像站(比如你建过的gae),甚至是输出到其他bsp的博客(比如新浪/网易博客)就行了.
    虽然是备份站点,但在博客不能访问时,跳转到镜像,并向读者解释跳转的原因也不失为一种方法.
    不过对于怎样在主博客当机时,转到备份站点,我只想到自定义503页面的办法.如果整个站点都下线时就不行了.你有没有什么办法,比如设定dns的之类的来实现主站下线时转到备份站点呢

    • 灵曦
      2011年5月12日17:28
      19
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      利用DSP做映像很可能会对SEO产生负面影响,比如DSP比主站还先收录等等。
      同步RSS的话附件应该同步不了吧?比如RAR
      如果非要映像的话,我觉得GAE依旧是很好的方案。
      映像我觉得应该作为主站down后临时的接入,最理想状态是客户端完全没发觉,所以樱保持站点数据的同步,用BSP的话就显得有点不够意思了。。
      至于主站down后的切换,dnspod提供了宕机检测和宕机切换,具体效果不做评价,总之感觉没有监控宝那么灵敏,检测周期还蛮长的,不做推荐。
      其他方案,我觉得可以用一台服务器做反向代理,在服务器判断接入是否有效,再选择有效的节点进行PHP解析处理,不过如果反向代理服务器本身down了,也就没办法了。。

  10. 2011年5月12日09:02
    20
    Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

    看不懂你写神马的人你伤不起啊

  11. 2011年5月13日19:04
    21
    Internet Explorer 9.0 Internet Explorer 9.0 Windows 7 Windows 7
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

    仅仅反监听的路过~

  12. 2011年5月14日03:55
    22
    Google Chrome 10.0.648.127 Google Chrome 10.0.648.127 Windows 7 Windows 7
    Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 dianso

    看起来好复杂,主题透明的,我喜欢

    • 灵曦
      2011年5月14日18:26
      23
      Google Chrome 11.0.696.65 Google Chrome 11.0.696.65 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24

      思路是蛮复杂的。

  13. 2011年5月14日21:14
    24
    Google Chrome 12.0.742.53 Google Chrome 12.0.742.53 Windows 7 Windows 7
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30

    Dropbox还能这样用?

    不过这种方法对我这些小小小小博客来说,傻折腾~~

  14. 2011年5月18日09:18
    25
    Google Chrome 11.0.696.68 Google Chrome 11.0.696.68 Windows 7 x64 Edition Windows 7 x64 Edition
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24

    还有两枚小loli哦~~

  15. 2011年5月29日14:29
    26
    Safari 5.0.5 Safari 5.0.5 Mac OS X  10.6.7 Mac OS X 10.6.7
    Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; zh-cn) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

    唔…乃的博客真的有好多实用的技术文啊…
    偶虽然买了VPS,但是相当不会折腾…

    • 灵曦
      2011年5月29日14:32
      27
      Google Chrome 11.0.696.71 Google Chrome 11.0.696.71 Windows 7 Windows 7
      Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.71 Safari/534.24

      其实这篇很不实用的啦~更实用的还不如用VPS搭个VPN神马的~

  16. 2011年6月26日22:32
    28
    Google Chrome 12.0.742.100 Google Chrome 12.0.742.100 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30

    我这个主机不能用ssh,悲催啊。。

灵曦:请留下点什么嗯~

/qy /sy /hx /hp /cj /hz /yang more »