如何搭建大型网站系统?
程序员们都希望能通过自己的努力学习,技术提升,拿到更好的收入,技术提升和高收入虽然不是轻易就能实现的,但总是有章可循。
一个成熟的大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线。所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就;不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索、下单、支付,例如腾讯,要解决数亿的用户实时消息传输,百度它要处理海量的搜索请求,他们都有各自的业务特性,系统架构也有所不同。尽管如此我们也可以从这些不同的网站背景下,找出其中共用的技术,这些技术和手段可以广泛运行在大型网站系统的架构中,下面就通过介绍大型网站系统的演化过程,来认识这些技术和手段。
一、最开始的网站架构
最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:
二、应用、数据、文件分离
随着业务的扩展,一台服务器已经不能满足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。
三、利用缓存改善网站性能
在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问路径,提高用户体验。
缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,OSCache就是常用的本地缓存组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。
四、使用集群改善应用服务器性能
应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。
常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx是七层负载均衡和HAProxy支持四层、七层负载均衡,可以根据报文内容选择内部服务器,因此LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如可以用来做动静分离(根据请求报文特征,选择静态资源服务器还是应用服务器)。
五、数据库读写分离和分库分表
随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切换则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务不同来切换,如用户业务、商品业务相关的表放在不同的数据库中。
六、使用CDN和反向代理提高网站性能
假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。
而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有没有缓存数据才会继续走应用服务器获取,也减少了获取数据的成本。反向代理有Squid,Nginx。
七、使用分布式文件系统
用户一天天增加,业务量越来越大,产生的文件越来越多,单台的文件服务器已经不能满足需求。需要分布式的文件系统支撑。常用的分布式文件系统有NFS。
八、使用NoSql和搜索引擎
对于海量数据的查询,我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis,搜索引擎有lucene。
九、将应用服务器进行业务拆分
随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者同享数据库来实现。
十、搭建分布式服务
这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。淘宝的Dubbo是一个不错的选择。
大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段。
如果你还有这些疑问,成熟的网站架构师需要学什么核心技能?Java程序员如何晋升为互联网架构师?Java语言在架构搭建中扮演什么角色?怎样成为年收入几十万的架构师?欢迎来电来访昌平北大青鸟java培训。
1什么是Docker
借用下网上传统虚拟机与Docker的对比。
传统虚拟化应用程序中,不仅包含应用程序和必要的二进制文件库,还包含一个完整的操作系统。
而Docker容器仅包含应用程序和相关依赖项,在主机的操作系统用户空间中作为一个独立进程运行,与其他容器共享内核,从而实现了虚拟机的资源隔离和分配,具有更高的可移植性和效率提高。
2为什么使用Docker
1更快速的交付和部署
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接 使用这个容器来部署代码。
2高效部署和扩容
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。
3更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
4更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
3Docker的工作原理和概念
自己制作镜像然后上传仓库或使用仓库已有的镜像文件拉取到容器中部署。
为了方便Docker的说明,本次例子使用虚拟机安装CentOS 7来演示。CentOS 7的安装请等查看下篇文章或自行百度。
1安装之前的准备工作
按照顺序,执行如下操作
1、安装必要的一些系统工具
2、添加软件源信息
3、更新并安装Docker-CE
安装准备工作
2开启Docker服务
运行docker version 如果出现以下情况,说明当前用户没有 root相关操作权限
无root权限
解决思路
先查看有多少镜像
运行docker run hello-world 测试命令,如果出现下方红框内消息,证明安装成功
3查看docker基本信息和版本
1构建Nginx基础镜像
查询nginx镜像
镜像拉取
查看对外的访问路径
怎么才能访问刚才启用的nginx
nginx页面内容
我们可以进入容器,看下这个容器是什么样子
查看nginx在哪个位置
我们发现尽管启动了nginx,但是在外部还是不能访问,这是因为docker具有隔离机制,要不然怎么叫做容器化部署呢
Docker内nginx端口
对Nginx进行外网端口映射;
2构建Tomcat基础镜像
打开容器后,默认安装目录在 /usr/local/
3创建自己的专属镜像
用Dockerfile来制作镜像
创建一个新的镜像,并起名字为nywlw
查看新的镜像
运行自己创建的容器
4删除容器实例
5删除镜像
每天发布更多新鲜有含量的技术文章、总有一款适合你。
目录
FastDFS部署 1
一、 环境准备 2
(一) 使用的系统软件 2
(二) 编译环境 2
(三) 磁盘目录 3
(四) 安装libfatscommon 3
(五) 安装FastDFS 3
(六) 安装fastdfs-nginx-module 4
(七) 安装nginx 4
二、 单机部署 4
(一) tracker配置 4
(二) storage配置 4
(三) client测试 5
(四) 配置nginx访问 5
三、 分布式部署 6
(一) tracker配置 6
(二) storage配置 6
(三) client测试 6
(四) 配置nginx访问 7
四、 启动 8
(一) 防火墙 8
(二) tracker 8
(三) storage 8
(四) nginx 8
(五) 检测集群 8
五、 说明 9
(一) 配置文件 9
六、 双IP设置说明 9
(一) Tracker server服务器双IP设置 9
(二) Storage server服务器双IP设置 9
七、 涉及的配置文件 9
(一) tracker配置文件说明 10
(二) storageconf配置说明 13
http://192168521:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVggtargz
tracker_server #有几台服务器写几个
group_name #地址的名称的命名
bind_addr #服务器ip绑定
store_path_count #store_path(数字)有几个写几个
store_path(数字) #设置几个储存地址写几个 从0开始
添加多个
tracker_server=192168521:22122
tracker_server=192168522:22122
storage server要使用双IP的话,需要启动storage server id特性,在trackerconf中将use_storage_id设置为true,需要将storage server双IP配置到storage_idsconf中
企业站流量不大,没有必要做分布式吧,总共就那点内容,如果需要做优化,建议还是把放到自己域名下面。
提主速度,把质量优化,页面优化就Ok了。一个企业网站没有必要这样处理。
网络直播平台的实现技术,归纳起来主要有如下这些:
一、视音频的采集和编码技术,当前主流的主要是H264、H265这种视频编码技术和AAC、MP3这种音频编码技术。
二、视音频的流媒体传输技术。
三、CDN内容分发技术。
四、终端解码技术。
架构方面,如果要做运营级的服务平台,需要采用分布式的架构方式,不仅包括各个功能模块的分布式部署,还包括各种应用服务器的分布式部署。
流媒体传输技术通常使用的方式主要包括:
1、通过HTTP协议传输,需要通过技术开发来实现高性能的HTTP流媒体服务器;
2、通过RTMP协议传输,需要通过技术开发来实现高性能的RTMP流媒体服务器;
3、通过UDP协议传输,这种方式通常用于大规模的可控网络中,比如IPTV电视直播应用,通过交换机即可支持这种传输方式;
4、通过P2P方式传输,P2P方式所用的传输协议可以由用户自主定义,并且可以基于UDP或TCP来实现,这种方式通常也是用于超大规模组网环境中。
session的复制与共享
在web应用中,为了应对大规模访问,必须实现应用的集群部署要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数主流web服务器都采用了session复制以及实现session的共享 但问题还是很明显的:
在节点持续增多的情况下,session复制带来的性能损失会快速增加特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著这种特性使得web应用的水平扩展受到了限制
session共享的另一种思路就是把session集中起来管理,首先想到的是采用数据库来集中存储session,但数据库是文件存储相对内存慢了一个数量级,同时这势必加大数据库系统的负担所以需要一种既速度快又能远程集中存储的服务:memcached
使用memcached来存储session有两种方案:
(1)直接通过tomcat6的扩展机制实现
(2)通过自己编写filter实现
考虑到系统的扩展,我们采用这种方案这样可以使session共享机制和中间件脱钩
主要思路:
1)继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现
2)使用filter拦截cookie中的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用
3)SessionService连接memcached服务,以sessionId作为key,存取的对象是一个mapmap的内容即为session的内容
使用过程注意几个问题和改进思路:
1、memcache的内存应该足够大,这样不会出现用户session从Cache中被清除的问题(可以关闭memcached的对象退出机制)。
2、如果session的读取比写入要多很多,可以在memcache前再加一个Oscache等本地缓存,减少对memcache的读操作,从而减小网络开销,提高性能。
3、如果用户非常多,可以使用memcached组,通过set方法中带hashCode,插入到某个memcached服务器
0条评论