自从上回参加培训以后,负载均衡的想法一直在脑子里面挂着。以前的公司和天涯网络社区有业务合作,曾经和他们的技术总监进行过交流,他介绍过天涯的架构,记忆中最深的一句话是,“设计之初就要自问:随着数据规模增加和流量增长能否通过增加新服务器(DB/WEB)解决性能问题”。近期和德哥都在进行一些尝试,形成了下面这样可实现并且低成本的架构图。给各位老大看看缺陷和可提升的地方在哪里,因为我接触这块的信息不多,可使用的方案也就缺乏,让各位老大提一些意见来完善它。
WEB层面:
1, 采用Nginx 做WEB服务器的负载均衡控制,为了避免 Nginx 代理服务器的崩溃造成的WEB服务器无法访问,并提高它的可靠性。需要再增加另一台 Nginx 服务器,它们之间用NLB来做群集。这样子我在添加新的WEB服务器时,只需要在Nginx代理服务器中添加它的IP地址即可。(已经验证)
2, WEB 服务器之间采用 cwRsync 软件进行文件同步。(未验证)
3, WEB 服务器采用 MemCached 来进行 SESSION 共享。(已经验证)
4, WEB 服务器共用一台文件服务器做为图片和附件的保存,用户先通过WEB服务器上传,再通过FTP传输到文件服务器,文件服务器通过HTTP发布出来(访问时校验)。(已经验证)
SQL SERVER的DB层面:
1, Write数据库服务器提供发布功能,多个Read数据库服务器进行订阅,达到数据共享的目的。(已经验证)
2, Write数据库需要主从备份,然后提供出发布。(没实现,因为复制服务器需要提供出机器名,这样子提供出的机器名是哪台?能自动切换?)
3, 如果Write数据库经过长时间的积累,数据量庞大。那么我增加一个Read服务器时,需要重新订阅,这样子的效率会很慢。怎么办?这是很大的问题,不解决就达不到添加服务器就能增加性能的目的。
1, 通过一个配置文件来加载数据库服务器,格式如下:
<DbSnapInfoList>
<DbSnapInfo>
<!-- 数据库源编号 -->
<SouceID>1</SouceID>
<!-- 是否启用 -->
<Enable>true</Enable>
<!-- 数据库连接 -->
<DbconnectString>Data Source=LIJINGFAN;User ID=sa;Password=123456;Initial Catalog=NetFrameWork2;Pooling=true</DbconnectString>
<!-- 负载权重 -->
<Weight>4</Weight>
<!-- 是否写服务器 -->
<IsWrite>true</IsWrite>
</DbSnapInfo>
<DbSnapInfo>
<SouceID>2</SouceID>
<Enable>true</Enable>
<DbconnectString>Data Source=HPWANGMEIDE1;User ID=sa;Password=123456;Initial Catalog=NetFrameWork2;Pooling=true</DbconnectString>
<Weight>3</Weight>
<IsWrite>false</IsWrite>
</DbSnapInfo>
</DbSnapInfoList>
2, 根据SQL语句获取数据源,如果是SELECT语句就根据权重值获取Read的数据源,其它的就使用Write的数据源。这里面需要更详细的考虑,包括存储过程和视图查询或者变更等等。
3, 采用 权重算法 来推荐数据源。这儿可能服务器的性能和负载不一样,可能通过调整权重来分配查询的压力。
4, 还有没有??