资源描述
,单击此处编辑母版标题样式,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,高性能网站架构,总体架构,数据中心(数据库切分、搜索引擎、文件存储),业务层(内部通信、缓存),前端负载均衡,页面优化,大纲,高可用性(,H,igh,A,vailability),可伸缩性(Scalability),高性能(High Performance),网站架构的目标,C,onsistency,一致性,A,vailability,可用性,P,artition Tolerance,分区耐受性,在任意时刻,只有两项能同时成立,不要浪费精力可能突破上面限制,CAP原则,可用性,一致性,分区耐受性,CA,:传统关系数据库,AP,:,key-value,数据库,网站的系统分层架构,5,网站的物理架构,网络拓扑结构,RAC(Real Application Clusters):高可用(HA)的负载均衡集群(LB)的技术,双机热备:通过数据库服务器冗余来提供的解决方案,数据库集群,8,数据库读写分离,Master,w,Slave,r,Slave,r,MySQL Proxy(数据库读写分离),load balancing,failover,query analysis,R/W Splitting,水平切分:,2*N(如定单,购买者与网店各一份),N/n(按日期或ID范围分区),hash(N)%n(按hash分),查找,表,垂直分区,按功能,分,(,用户,,,新闻,),数据,Sharding,针对系统业务数据的特点,没有一致通用的解决方案,结合,M-S,结构解决库表扩充,思考:,满足,1,亿条记录量的论坛应用数据层设计方案,面向系统层解决方案:独立的DAL Proxy服务器,MySQL:Amoeba、Mysql_proxy,PostgreSQL:PL/Proxy(Skype),面向应用层解决方案:DAL API,Java:Hibernate Shard,Ibatis Shard,HiveDB,Python:Pyshards,透明的软件层中间件,12,什么是全文索引?,为了快速搜索大量的文本文件,为一本书建立关键词的索引“书签”,什么是全文搜索?,在索引中查找关键字的过程,找到关键字在哪些,地方,出现,全文搜索引擎,高性能、可扩展的信息检索工具库,为应用程序添加索引/搜索功能,一个典型的应用:,开源搜索引擎,Lucene,Lucene,索引过程的核心类,IndexWriter,:提供对索引的写入操作,Directory:,描述了索引存放的位置,Analyzer:,对文本进行分析,提取词汇(token),剔除无用的信息,Document:,虚拟的文档,Field:,每个Document包含一个或多个不同命名的Field,每个Field对应一段数据,这些数据在搜索过程中可能会被查询或在索引中被检索,Lucene,索引代码示例,Directory dir=FSDirectory.getDirectory(indexDir);,Analyzer anlyzer=new SimpleAnalyzer();,IndexWriter writer=new IndexWriter(dir,analyzer,true);,Document doc=new Document();,doc.add(Field.Keyword(“id”,“1000”);,doc.add(Field.UnIndexed(“name”,“Yao Ming”);,doc.add(Field.UnStored(“intro”,“Yao Ming is a player of Houseton Rockets.”);,writer.addDocument(doc);,writer.close();,Lucene,搜索过程的核心类,IndexSearcher:,用于搜索IndexWriter创建的索引,Term:,用于搜索的一个基本单元包括了一对字符串元素,与Field相对应,Query,:抽象的查询类,TermQuery:,最基本的查询类型,用来匹配特定Field中包含特定值的文档,Hits:,存放有序搜索结果指针的简单容器,Lucene,搜索代码示例,IndexSearcher searcher=new IndexSearcher(directory);,Term t=new Term(“intro”,“Yao”);,Query query=new TermQuery(t);,Hits hits=searcher.search(query);,assertEquals(“JUnit test”,1,hits.length();,Lucene的线程安全性,不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改,IndexWriter和IndexReader是线程安全的,可以被多线程共享,paoding,:“庖丁解牛”Paoding Analysis,imdict,:imdict智能词典所采用的智能中文分词程序,mmseg4j,:用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器,ik,:采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式,Lucene,开源中文分词器,Solr,Lucene,仅仅是一个全文检索包,不是一个独立的搜索服务,Solr,来源于,CNET.com,的内部数据库检索项目,Solr,的含义是:,Searching On Lucene w/Replication,Solr,当前主要主要代码维护者,Yonik,斯坦福大学硕士毕业,企业级搜索引擎服务器,是Web Server中的Servlet,积极的缓存(自动加载搜索热词等),Web管理界面,XML/HTTP,JSON 接口,Faceting(分类统计搜索结果),通过Schema配置文件定义types 和 fields,为了并发访问,实现主从式的索引复制,Solr,搜索服务器的特点,Java客户端-SolrJ,通过Java 二进制格式快速返回结果,.Net客户端-SolrSharp,PHP客户端-“solr-php-client”,使用,Solr,搜索服务器,优秀的文件系统,GFS,:,Google,开发的大型、分布式、满足大数据量访问的,文件系统,HDFS,:,Apache Hadoop,项目中的文件系统实现,是居于,GFS,论文思想,GridFs,:,MongoDB,数据库内置的文件系统,有,Nginx,集成访问模块,文件存储,使用Linux内核的Inotify监控文件系统事件,利用开源的lsync监听某一目录如果目录内文件发生增、删、改,则利用Rsync协议自动同步到多台服务器,多服务器同步,可以避免每一个图片的请求都有可能导致一个 HTTPD 进程的调用。,可以对不同使用性质的图片设置不同的过期时间,前端访问快速且省带宽,独立图片服务器,面向服务的,应用,架构,使用内部通信器分离业务层,使用分布式缓存系统,业务层,Socket,通信器:,ICE,、,MINA,、,Netty,JMS,Web Service,通信器,memcached由,LiveJournal,运营人员开发,memcached是,高性能,的,分布式,内存缓存服务器,,开源,协议简单,基于libevent时间处理:epoll/kqueue,内置内存存储方式:slab/LRU,Memcache,缓存,Memcache,应用,Linux,操作系统优化,Tomcat,服务器,优化,Apache,服务器,优化,Nginx,服务器的优化,生产环境软件优化,增大,连接数及,TCP/IP,的,超时,设置,在,/etc/sysctl.conf,配置文件中增加如下内核参数:,net.ipv4.tcp_syncookies=1,net.ipv4.tcp_tw_reuse=1,net.ipv4.tcp_tw_recycle=1,net.ipv4.tcp_fin_timeout=5,Linux,操作系统优化,基于DNS的负载均衡一个域名绑定多个IP,通过硬件四层交换实现负载均衡,通过软件四层交换实现负载均衡,通过反向代理服务器实现负载均衡,Apache+Tomcat集群实现负载均衡,前端负载均衡,通过DNS服务中的随机名字解析来实现的,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中的一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,它们也就访问不同地址上的Web 服务器,从而达到负载均衡的目的。,落后淘汰的技术,基于,DNS,的负载均衡,知名产品有:Alteon、F5,成本较高,硬件四层交换实现负载均衡,LVS(Linux Virtual Server),典型的应用策略:在软件或者硬件四层交换的基础上搭建squid集群,软件四层交换实现负载均衡,又称WEB 加速服务器,充当WEB服务的内容缓存器,典型代表产品:Nginx、Squid,反向代理服务器实现负载均衡,worker_processes:该参数的值最好跟cpu核数相等,能够发挥最大性能,如果nginx所在服务器为2颗双核cpu,则建议设定为4。,Nginx,服务器的优化,Apache+Tomcat,集群实现负载均衡,加大并发数量和关闭不需要的模块。因为apache非常消耗内存,尽量轻量化。,Apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率,同时配置apache和tomcat的组合使之能作到动静分离,apache处理静态页面,tomcat处理动态页面。,在处理静态页面或者图片、js等访问方面,可以考虑使用lighttpd代替Apache,它提供了更轻量级和更高效的处理能力,Apache,服务器优化,1,、,JDK,内存优化:,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的,80%,。,Tomcat,默认可以使用的内存为,128MB,,在较大型的应用项目中,这点内存是不够的,需要调大,.,Tomcat,默认可以使用的内存为,128MB,Windows,下,在文件,/bin/catalina.bat,,,Unix,下,在文件,/bin/catalina.sh,的前面,增加如下设置:,JAVA_OPTS=-Xms【,初始化内存大小,】-Xmx【,可以使用的最大内存,】,需要把这个两个参数值调大。例如:,JAVA_OPTS,=-,Xms2g Xmx4g,表示初始化内存,为,2g,,,可以使用的最大,内存,为,4g,。,Tomcat,服务器优化,2,、连接器优化,:,在,tomcat,配置文件,server.xml,中的配置中,和连接数相关的参数有:,maxThreads,:,Tomcat,使用线程来处理接收的每个请求。这个值表示,Tomcat,可创建的最大的线程数。默认值,150,。,acceptCount,:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值,10,。,minSpareThreads,:,Tomcat,初始化时创建的线程数。默认值,25,。,maxSpareThreads,:一旦创建的线程超过这个值,,Tomcat,就会关闭不再需要的,socket,线程。默认值,75,。,enableLookups,:是否反查域名,默认值为,true,。为了提高处理能力,应设置为,false,connnectionTimeout,:网络连接超时,默认值,60000,,单位:毫秒。设置为,0,表示永不超时,这样设置有隐患的。通常可设置为,30000,毫秒。,maxKeepAliveRequests,:保持请求数量,默认值,100,。,bufferSize,:输入流缓冲大小,默认
展开阅读全文