百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 网站模板(百分百源码网)>电脑软件>服务器> 了解web服务器和数据库的负载平衡以及反向代理
分享本文到:

了解web服务器和数据库的负载平衡以及反向代理

发布时间:05/16 来源:未知 浏览: 关键词:

但是若该网站均匀每秒的请求是200屡次,那么题目就来了:这已经是最佳的web服务器了,我该怎么办?一样的情形也适用于数据库。要解决这种题目,就需要理解“负载平衡”的道理了。

web服务器怎样做负载平衡

为web服务器做负载平衡适用的的较多的方式是DNS重定向和反向代理,其他的方式道理也是很相似。

我们屡次ping一下百度,会发明回复的IP会有所不一样,例如第一次的效果为:

复制代码 代码如下:

正在 Ping baidu.com [220.181.111.86] 拥有 32 字节的数据:
来自 220.181.111.86 的回复: 字节=32 工夫=27ms TTL=51
来自 220.181.111.86 的回复: 字节=32 工夫=27ms TTL=51
来自 220.181.111.86 的回复: 字节=32 工夫=27ms TTL=51

过一会再Ping一次,效果可能就变了:
复制代码 代码如下:

正在 Ping baidu.com [220.181.111.85] 拥有 32 字节的数据:
来自 220.181.111.85 的回复: 字节=32 工夫=27ms TTL=51
来自 220.181.111.85 的回复: 字节=32 工夫=27ms TTL=51
来自 220.181.111.85 的回复: 字节=32 工夫=29ms TTL=51

运用nslookup下令可以看到多个ip与baidu.com对应。在这里用到的就是DNS重定向技术,道理很简略:DNS服务器保留某域名对应的多个IP,客户端发出DNS请求时DNS服务器依据算法将IP发回给客户端;发送回的个别是一个IP地址汇合,但是每次的排序不一样,第一次的第一个IP为201.11.11.1,第二次的第一个可能是201.11.11.2,客户端运用的是第一个IP——简略地说,就是客户端每次获取的域名的IP可能不一样。不一样的IP对应不一样的web服务器,但是这些web服务器的内容应当是同样的。

我们从下图了解反向代理:



客户端向反向代剃头送HTTP请求报文(若该网站有域名,域名的IP是反向代理服务器的外网IP),反向代理将请求报文随机发送给一个web服务器,web服务器将HTTP相应报文发送给反向代理,反向代理再将这报文返回给客户端。既然这样简略,我们就可以着手实现一个简略的反向代理。

在linux mint 15 下安装apache和nginx服务器,在apache的80端口的文档根目录下新建文件index.html,内容如下:

复制代码 代码如下:

<html>
<head>
<title>index</title>
</head>
<body>
<h1>hello, i am apache</h1>
</body>
</html>

在nginx的8080端口的文档根目录下新建文件index.html,内容如下:
复制代码 代码如下:

<html>
<head>
<title>index</title>
</head>
<body>
<h1>hello, i am nginx</h1>
</body>
</html>

新建源文件simple_reverse_proxy.py,内容如下:
复制代码 代码如下:

#!/usr/bin/python
#-*-encoding:utf8-*-
'''
这是一个简略的反向代理服务器
'''
import BaseHTTPServer
import urllib2
HOST_NAME = '127.0.0.1'
PORT_NUMBER = 8081  #端口
SERVER_URL=('http://127.0.0.1:80','http://127.0.0.1:8080')
server_choice = 0
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(s):
        """response to a GET request"""
        global server_choice
        url = SERVER_URL[server_choice]
        print url
        server_choice = (server_choice + 1) % 2
        headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
        try:
            req = urllib2.Request(url, None, headers)
            response = urllib2.urlopen(req)
            html = response.read()
            #print html
            s.send_response(200);
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write(html)
        except:
            s.send_response(404);
            s.send_header("Content-type", "text/html")
            s.end_headers()
            s.wfile.write('<h2>404</h2>')
if __name__ == '__main__':
    server_class = BaseHTTPServer.HTTPServer
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()

启动apache、nginx,并运转simple_reverse_proxy.py。我们在阅读器中打开http://127.0.0.1:8081,我们可以看到:


刷新一下可以看到:



而simple_reverse_proxy.py会有下列信息输出:
复制代码 代码如下:

bash >> ./simple_reverse_proxy.py
http://127.0.0.1:80
127.0.0.1 - - [05/Sep/2013 19:25:02] "GET / HTTP/1.1" 200 -
http://127.0.0.1:8080
127.0.0.1 - - [05/Sep/2013 19:25:43] "GET / HTTP/1.1" 200 -

当然,开源天下里已经有许多优良的反向代理服务器了,例如Nginx。

只有了解了反向代理的道理,更复杂的架构也容易去实现。

数据库的负载平衡

关于大型网站,一个数据库系统确定会碰到没法承担大量的读请求、写请求的状况。那么我们怎么来通过负载平衡来实现高并发的读写请求呢?

这其中一个非常不错的要领就是读写别离:将原本针对一个数据库服务器的读写请求分成读请求和写请求,向一个(或者多个)数据库服务器发送写请求,向另外一个(或多个)服务器发送读请求,这可以显明的提高相应工夫。不过其中有一个难点,就是必须维持多个数据库服务器中的数据是一致的,不用担忧,许多数据库系统已经实现了这个功能。下面是一个架构示例:

上图中其实有一个写写冲突的题目,想象下列场景:

该系统用于寄存某网站的会员注册信息,该网站不允许会员名雷同,且以会员名为独一主键,所以在单数据库架构中必须波及到事务的处置。此刻在这个负载平衡的数据库架构中,会员A要注册会员名为xiaoming,这个写请求分配给了db server 1;与此同时会员B一样注册会员名xiaoming,要是写请求分配给了db server1,就不会有题目产生,可是要是分配给db server 2呢?两个db server离别寄存了不一样会员的会员名雷同的会员信息!解决的要领很简略,写请求的分配不能用随机算法,应当运用哈希映射,例如注册的会员名首字母为x时,写请求分配各 db server2,其他写请求一概分配给db server 1。

另外一个题目,这种架构为开发利用供给了很大的灵活性,就是这种架构不适用于某些ORM框架,解决要领就是在这个架构上再加上一层——“数据库代理”。例如关于MySQL,就有MySQL Proxy这样的解决方案。

热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板
责任编辑:n0bPD
打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有153人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助



订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板