分布式

大型高性能ASP.NET系统架构设计

和自甴很熟 提交于 2020-03-01 06:37:18
大型 动态应用系统 平台主要是针对于大流量、高并发网站建立的底层系统架构。大型网站的运行需要一个可靠、安全、可扩展、易维护的应用系统平台做为支撑,以保证网站应用的平稳运行。 大型动态应用系统又可分为几个子系统: Web前端系统、负载均衡系统、数据库集群系统、缓存系统、分布式存储系统、分布式服务器管理系统、代码分发系统 1、Web前端系统 为了达到不同应用的服务器共享、避免单点故障、集中管理、统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过增加服务器节点达到整个服务器集群的性能提高,同时使他应用也会受益。 该Web前端系统基于IIS/ASP.NET等的虚拟主机平台,提供PHP程序运行环境。服务器对开发人员是透明的,不需要开发人员介入服务器管理。 2、负载均衡系统 负载均衡系统分为硬件和软件两种。硬件负载均衡效率高,但是价格贵,比如F5等。软件负载均衡系统价格较低或者免费,效率较硬件负载均衡系统低,不过对于流量一般或稍大些网站来讲也足够使用,比如lvs,nginx。大多数网站都是硬件、软件负载均衡系统并用。 3、数据库集群系统 由于Web前端采用了负载均衡集群结构提高了服务的有效性和扩展性,因此数据库必须也是高可靠的才能保证整个服务体系的高可靠性,如何构建一个高可靠的、可以提供大规模并发处理的数据库体系?

学习分布式架构感悟

自作多情 提交于 2019-12-23 23:54:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 随着公司业务规模的扩大,网站访问量日益剧增,最初的系统架构可能已经没办法满足业务发展的需求了。这时候就要考虑将系统架构改造成扩展性更强,能够承受更大访问量的分布式架构。 本文从大致三个方面谈谈分布式架构的概念、原理和相关的解决方案。为什么要做分布式?举个栗子,就好比原来城市的道路是双车道,同一时间只能容纳很小一部分车流量,但是改成多车道后,道路的容量就提升了几倍,网站也是相同的道理,用户的访问请求就是汽车,分布式架构就是在构建一个多车道的网站系统。接下来我们具体聊一聊各个层面的分布式技术解决方案。首先讲业务层的分布式,最简单的就是部署几台业务服务器,部署Apache或者Nginx,配置相同(vhost、域名解析、代码目录等),然后使用负载均衡技术将这几台服务器组成集群,达到对用户分流的效果。需要注意的是SESSION会话需要保存到数据库或者缓存系统中,保证SESSION的一致性,至于数据库,有统一的数据层,不需要担心数据不一致的问题。负载均衡有很多种解决方案,比较常见的是LVS(阿里巴巴章文嵩博士开发)、Nginx(阿里巴巴优化的Tengine)、HAProxy等。LVS是负责在4层网络实现负载均衡,有DR、隧道等方式,可以根据自身需求选择合适的方式。Nginx和HAProxy是负责7层网络的负载均衡

一致性哈希算法及其在分布式系统中的应用

醉酒当歌 提交于 2019-12-18 10:16:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> #摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。 #分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制。现在我们一共有三台机器可以作为Memcached服务器,如下图所示。 很显然,最简单的策略是将每一次Memcached请求随机发送到一台Memcached服务器,但是这种策略可能会带来两个问题:一是同一份数据可能被存在不同的机器上而造成数据冗余,二是有可能某数据已经被缓存但是访问却没有命中,因为无法保证对相同key的所有访问都被发送到相同的服务器。因此,随机策略无论是时间效率还是空间效率都非常不好。 要解决上述问题只需做到如下一点:保证对相同key的访问会被发送到相同的服务器。很多方法可以实现这一点,最常用的方法是计算哈希。例如对于每次访问,可以按如下算法计算其哈希值: h = Hash(key) % 3

分布式ID生成方法

牧云@^-^@ 提交于 2019-12-17 09:15:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、需求缘起 几乎所有的业务系统,都有 生成一个记录标识的需求 ,例如: ( 1 )消息标识: message-id ( 2 )订单标识: order-id ( 3 )帖子标识: tiezi-id 这个记录标识往往就是数据库中的 唯一主键 ,数据库上会建立聚集索引( cluster index ),即在物理存储上以这个字段排序。 这个记录标识上的查询,往往又有 分页或者排序的业务需求 ,例如: ( 1 )拉取最新的一页消息: selectmessage-id/ order by time/ limit 100 ( 2 )拉取最新的一页订单: selectorder-id/ order by time/ limit 100 ( 3 )拉取最新的一页帖子: selecttiezi-id/ order by time/ limit 100 所以往往要有一个 time 字段,并且在 time 字段上建立普通索引( non-cluster index )。 我们都知道普通索引存储的是实际记录的指针,其访问效率会比聚集索引慢,如果记录标识在生成时能够基本按照时间有序,则可以省去这个 time 字段的索引查询: select message-id/ (order by message-id)/limit 100 再次强调

聊聊分布式ID生成方法

两盒软妹~` 提交于 2019-12-17 09:14:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 目标: ( 1 )全局唯一 ( 2 )趋势有序 如何高效生成趋势有序的全局唯一 ID呢? 一、需求缘起 几乎所有的业务系统,都有 生成一个记录标识的需求 ,例如: ( 1 )消息标识: message-id ( 2 )订单标识: order-id ( 3 )帖子标识: tiezi-id 这个记录标识往往就是数据库中的 唯一主键 ,数据库上会建立聚集索引( cluster index ),即在物理存储上以这个字段排序。 这个记录标识上的查询,往往又有 分页或者排序的业务需求 ,例如: ( 1 )拉取最新的一页消息: select message-id order by time limit 100 ( 2 )拉取最新的一页订单: select order-id order by time limit 100 ( 3 )拉取最新的一页帖子: select tiezi-id order by time limit 100 所以往往要有一个 time 字段,并且在 time 字段上建立普通索引( non-cluster index )。 我们都知道普通索引存储的是实际记录的指针,其访问效率会比聚集索引慢,如果记录标识在生成时能够基本按照时间有序,则可以省去这个 time 字段的索引查询: select message

php根据二分查找法从普通csv文件中获取ip的地理位置(效率比使用mysql提高近800倍)

丶灬走出姿态 提交于 2019-12-11 22:16:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近要做一个全球的ip地理位置查询,并且要精确到城市一级,还要求是英文版的. 首先是要找ip库, 纯真ip 库只有中文的,而且国内的ip缺少国家这一级的分类,放弃 apnic 的倒是不错,英文而且更新也快,但是只有国家一级. 终于电驴上找到了相关的资源 IP地理位置数据库 世界城镇扩展版 130812 数据来源于 MaxMind , 也算比较新的. 这个比较符合要求. 数据源是csv格式的. 格式如下: 16777472 16778239 CN CHN China 16785408 16793599 CN CHN Guangzhou, Guangdong, China 前两列是ip端 , 三四列 是国家英文名缩写, 第五列是 国家和地区,用逗号分割的. 看到这个数据,第一反应是导入到mysql数据库然后从数据库查询,但是看了下总数据大概有接近200w条.总大小130M 预计mysql查询起来也不会太快. 于是自己弄了个简单版的二分查找法.这样可以直接在csv文件中查找,无需导入数据库,查询效率也不低. 总体思路是这样. 先用php读取csv文件的每行数据, 获取该行数据的大小.然后建立一个二进制的索引文件 索引文件的格式如下: start_ip end_ip offset length start

分布式搜索引擎Elasticsearch安装配置

倾然丶 夕夏残阳落幕 提交于 2019-12-10 10:11:04
分布式搜索引擎Elasticsearch 介绍 Elasticsearch是一个基于Lucene的开源 分布式 搜索引擎,具有分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置。但是目前来说相关资料很少,同时版本更新很快,bug存在,API繁多并且变化。 概念和设计 索引 索引(index)是Elasticsearch存放数据的地方。如果你熟悉关系型数据库,就可以将索引理解为关系型数据库的一张表。但与关系型数据库相比,Elasticsearch可以快速、搞笑地对索引中的数据进行全文检索,并且不需要存储原始数据。如果你熟悉MongoDB,就可以将Elasticsearch的索引理解为MongoDB中的集合。如果你熟悉CouchDB,就可以将索引理解为CouchDB中的数据库。 文档 文档(document)是Elasticsearch中存储的主要实体。文档由字段(行数据的列)组成,Elasticsearch允许一个字段出现多次,该类字段被称为多值字段(multivalued)。每个字段对应一种类型(字符串型、数值型、日期型等)。字段类型可以是复合的,字段可以包含其他子文档或数组。字段类型在Elasticsearch中非常重要

分布式缓存Redis使用以及原理

天大地大妈咪最大 提交于 2019-12-10 03:44:26
最近对开源分布式缓存产品redis做了一些研究,于是决定整理一下该产品的特性及使用场景拿出来分享。 一、缓存在系统中用来做什么 1. 少量数据存储,高速读写访问。 通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。 2. 海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。 Redis3.0以后开始支持集群,实现了半自动化的数据分片,不过需要smart-client的支持。 二、从不同的角度来详细介绍redis 网络模型: Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。 内存管理: Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据)

tomcat集群扩展session集中管理,Memcached-session-manager...

試著忘記壹切 提交于 2019-12-09 22:02:32
tomcat集群扩展session集中管理,Memcached-session-manager使用总结 * 博客分类: * tomcat集群 * ha javatomcatwebhasession manager 最近在研究tomcat做负载均衡的时候如何实现ha,还有就是不采用session复制的方法做集群。 想到的是将session全部存储在后端的缓存服务器中。 正好网上有这么一个工具Memcached-session-manager(后面简称msm),所以直接扒下来用了。 地址如下: http://code.google.com/p/memcached-session-manager/ msm支持 stickty(沾粘会话)和non-sticky(非沾粘会话)两种集群方式。 sticky就是前端的loadbanlence能保证每个用户的请求都路由到了同一个tomcat上。 non-sticky则每一次请求都可能路由到了不同的tomcat中。 至于msm在这两种方式是怎么处理的看下图: 下图来自javaeye的xxtianxiaxing的博客,我这里引用一下,原文地址为 http://xxtianxiaxing.iteye.com/blog/1269704 sticky non-sticky

分布式存储Ceph的几种安装方法,源码,apt-get,deploy工具,Ubuntu CentOS

点点圈 提交于 2019-12-07 21:31:25
最近搞了下分布式PB级别的存储CEPH 尝试了几种不同的安装,使用 期间遇到很多问题,和大家一起分享。 一、源码安装 说明:源码安装可以了解到系统各个组件, 但是安装过程也是很费劲的,主要是依赖包太多。 当时尝试了centos 和 ubuntu 上安装,都是可以安装好的。 1下载ceph http://ceph.com/download/ wget http://ceph.com/download/ceph-0.72.tar.gz 2 安装编译工具apt-get install automake autoconf automake libtool make 3 解压 #tar zxvf ceph-0.72.tar.gz #cd ceph-0.72.tar.gz #./autogen.sh 4、 先安装依赖包 #apt-get install autotools-dev autoconf automake cdbs g++ gcc git libatomic-ops-dev libboost-dev \ libcrypto++-dev libcrypto++ libedit-dev libexpat1-dev libfcgi-dev libfuse-dev \ libgoogle-perftools-dev libgtkmm-2.4-dev libtool pkg-config