大规模网站架构

以下并非所有都经过本人实践,部分为根据资料的假想所得,切勿贯彻本本主义。 网站架构目标 高可用性(High Availability) 可伸缩性(Scalability) 高性能(High Performance) 原则 尽量避免分布式,此为分布式第一原则 避免分布式事务 系统异构 架构与语言无关 系统可以多个平台并存(分层,模块化) 数据库 数据库读写分离 直接在程序中实现,或封装为ORM MySQL Proxy 数据库纵横切分 水平切分 根据自定义策略,如hash(N)%n(按hash分),查找表 在水平分库时,应优先考虑从属关系,以降低查询的复杂度。如用户A和用户A所发表的文章应分在同一数据库中。 如有用到user_id,则应该在公共库中创建一个路由表,表字段主要有:user_id,user_name,DB_Name。如没有用到user_id,而是根据user_name判断及查询用户的关系,则可省略路由表,根据某种算法进行DB定位,此时应考虑以后增加节点时,DB定位是否会发生变化的情况。 为避免分表时自增id发生重复的情况,可选择以下的几个方法: 1.在公共库创建一个空表,专门用于id分发。 2.利用递增值,如DB1的递增值为2,DB2的递增值为3,DB3的递增值为5… 3.利用初始值,id长度一般为11位,每个DB取9位(最多100个DB),如DB1的起始值为100000000,DB2的起始值为200000000,DB3的起始值为300000000… – 在系统设计时就考虑数据库切分的话,应先在一台服务器创建多个数据库节点,当负载达到一定程度时,再将节点迁移至其他服务器上,这样可以减少数据迁移的工作量。每次增加数据库节点,原则上应为已有节点的倍数,而不是一台台的增加。 垂直切分 按功能分(论坛,博客) 表分区 非关系数据库(NoSQL) 高性能 Redis Memcached 海量存储 MongoDB 负载均衡 DNS负载均衡 反向代理负载均衡 负载均衡软件 nginx HAProxy apache httpd LVS(网络第四层工作) F5(硬件,四层/七层) 高可用性 使用双机热备 故障时切换至备份机 工具(Linux-HA) heartbeat 缓存 按功能分 数据缓存 页面缓存 页面片段缓存 静态化 浏览器缓存 按存储介质分 本地缓存 分布式缓存 memcached 反向代理缓存 squid 巨无霸 Varnish 静态资源分离 img,js,css使用单独的服务器处理请求 图片服务器的域名不同 多台机器保存相同的图片(img3,img2子域名) 同一页面不同图片随机生成不同的子域名进行负载均衡 FAQ A.一些大网站,图片服务器为什么都用另外一个域名? 比如yahoo.com 图片服务器用了yimg.com 的域名? ...

December 16, 2009 · 1 min · 107 words · jabin

mac下安装pyside2

环境:mac已经安装了python3.5,pip3.5 IDE:PyCharm 安装pyside2 pip3.5 install --index-url=http://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io 简单实例 #!/usr/bin/python # -*- coding: utf-8 -*- # 1st.py import sys from PySide2 import QtGui from PySide2 import QtWidgets app = QtWidgets.QApplication(sys.argv) wid = QtWidgets.QWidget() wid.resize(250, 150) wid.setWindowTitle('Simple') wid.show() sys.exit(app.exec_()) 面向对象写法 #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PySide2 import QtGui from PySide2 import QtWidgets class Example(QtWidgets.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Icon') self.setWindowIcon(QtGui.QIcon('icon.png')) self.show() def main(): app = QtWidgets.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()

April 18, 2009 · 1 min · 86 words · jabin

NVelocity直接使用字符串模板

using System; using System.IO; using System.Collections; using System.Collections.Generic; using NVelocity; using NVelocity.App; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string templates = "Hi $name $surname, The date is $date."; Dictionary oo = new Dictionary(); oo.Add("name", "Joe"); oo.Add("surname", "Smith"); oo.Add("date", DateTime.Now.ToString("D")); Console.WriteLine(Fill(templates,oo)); Console.ReadLine(); } static public string Fill(string template, IDictionary values) { var engine = new VelocityEngine(); engine.Init(); var context = new VelocityContext(); if (values != null) foreach (string k in values.Keys) { context.Put(k, values[k]); } using (var writer = new StringWriter()) { engine.Evaluate(context, writer, "", template); return writer.GetStringBuilder().ToString(); } } } }

April 18, 2009 · 1 min · 96 words · jabin

一段广告加载代码

var arr = { "default" : "http://dpvc.39.net/adpolestar/door/;ap=5E30CD32_CA9F _8CC4_BD09_09CE939700E0;ct=if;pu=san9;/?" } var Html = { load: function() { var s=document.getElementById("show_drug"); if(typeof(s)=="undefined"||s==null) return arr["default"]; var code = s.src.replace(/^.+\?/,''); code=decodeURI(code); if(typeof(arr[code])!="undefined") return arr[code]; var index; while((index=code.lastIndexOf('_'))!=-1){ code=code.substring(0,index); if(typeof(arr[code])!="undefined") { return arr[code]; } } return arr["default"]; } } document.getElementById("drug_tl").innerHTML = "<iframe SRC='"+Html.load()+"' NAME='adFrame' WIDTH='970' HEIGHT='90' FRAMEBORDER='no' BORDER='0' MARGINWIDTH='0' MARGINHEIGHT='0' SCROLLING='no'></iframe>"; 注:show_drug为js id,如 <script id="show_drug" type="text/javascript" language="javascript" src="http://img.39.net/js/db/show_drug.js?%e4%ba%a7%e5%93%81_%e8% 8d%af%e5%93%81_%e4%b8%ad%e6%88%90_%e7%97%94%e7%96%ae"></script>

October 15, 2008 · 1 min · 63 words · jabin