Dajngo学习
Redis
一. NOSQL
1. 如今网络流程
- 最前面的是企业级防火墙,后面通过负载均衡主机(软负载:Nginx,硬负载:F5)在 web 服务器集群之间进行调度,再由具体的 web 服务器(Tomcat)去访问缓存,访问数据库。
2. 为什么用 NOSQL
- MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
- NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题, - 而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
3.NoSQL代表
- MongDB
- Redis
- Memcache
4.关系型数据库与NoSQL的区别?
1). RDBMS:
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
- ACID
关系型数据库遵循ACID规则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
-
A (Atomicity) 原子性
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。 -
C (Consistency) 一致性
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 -
I (Isolation) 独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的 -
D (Durability) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
2). NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
分布式数据库中的CAP原理(了解)
CAP定理:
字段 | 说明 |
---|---|
Consistency(一致性) | 数据一致更新,所有数据变动都是同步的 |
Availability(可用性) | 好的响应性能 |
Partition tolerance(分区容错性) | 可靠性 P: 系统中任意信息的丢失或失败不会影响系统的继续运作。 |
定理:任何分布式系统只可同时满足二点,没法三者兼顾。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。
而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。
所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
说明:C:强一致性 A:高可用性 P:分布式容忍性
举例:
- CA:传统Oracle数据库
- AP:大多数网站架构的选择
- CP:Redis、Mongodb
注意:分布式架构的时候必须做出取舍。
一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性。
因此牺牲C换取P,这是目前分布式数据库产品的方向。
5. 当下NoSQL的经典应用
当下的应用是 SQL 与 NoSQL 一起使用的。
代表项目:阿里巴巴商品信息的存放。
去 IOE 化。
ps:I 是指 IBM 的小型机,很贵的,好像好几万一台;O 是指 Oracle 数据库,也很贵的,好几万呢;M 是指 EMC 的存储设备,也很贵的。
难点:
- 数据类型多样性。
- 数据源多样性和变化重构。
- 数据源改造而服务平台不需要大面积重构。
二. 集群、分布式、负载均衡区别与联系:
1. 集群
不同的多台服务器上面部署相同的服务器模块,通过分布式调度软件进行统一的调度,对外提供服务和访问
集群是一个统称,他分为好几种,如高性能科学群集、负载均衡群集、高可用性群集等。
- 科学群集 、高性能集群(High performance cluster,HPC)
它是利用一个集群中的多台机器共同完成同一件任务,使得完成任务的速度和可靠性都远远高于单机运行的效果。弥补了单机性能上的不足。
该集群在天气预报、环境监控等数据量大,计算复杂的环境中应用比较多;
通常,这种集群涉及为群集开发并行编程应用程序,以解决复杂的科学问题。它不使用专门的超级并行计算机,而是用商业系统(如通过高速连接来链接的一组单处理器或双处理器PC),
并且在公共消息传递层上进行通信以运行并行应用程序。我们常常听说一种便宜的 Linux 超级计算机问世了,大多数情况就是指这种集群系统,其处理能力与真的超级计算机相当,而其价格与上百万美元的专用超级计算机相比是相当的便宜。
- 负载均衡集群(Load balance cluster, LBC)
它是利用一个集群中的多台单机,完成许多并行的小的工作。一般情况下,如果一个应用使用的人多了,那么用户请求的相应时间就会增大,机器的性能也会受到影响,
如果使用负载均衡集群,那么集群中任意一台机器都能相应用户的请求,这样集群就会在用户发出服务请求之后,选择当时负载最小,能够提供最好的服务的这台机器来接受请求并相应,
这样就可用用集群来增加系统的可用性和稳定性。这类集群在网站中使用较多;
负载均衡群集为企业需求提供了更为实用的系统。如其名称,这种系统使负载可以在多台计算机中尽可能平均地分摊处理。负载可以是需要均衡的应用程序处理负载或网络流量负载。
在系统中,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。对于网络流量也是如此。
- 高可用性集群(High availability cluster,HAC)
它是利用集群中系统 的冗余,当系统中某台机器发生损坏的时候,其他后备的机器可以迅速的接替它来启动服务,等待故障机的维修和返回。最大限度的保证集群中服务的可用性。这类系统一般在银行,电信服务这类对系统可靠性有高的要求的领域有着广泛的应用。
高可用性群集的出现是为了使群集的整体服务尽可能可用。如果高可用性群集中的主节点发生了故障,那么这段时间内将由次节点代替它。次节点通常是主节点的镜像,所以当它代替主节点时,它可以完全接管其身份,对用户没有任何影响。
在群集的这三种基本类型之间,经常会发生交叉、混合。比如:在高可用性的群集系统中也可以在其节点之间实现负载均衡,同时仍然维持着其高可用性。
2. 负载均衡系统
负载均衡又有DNS负载均衡(比较常用)、IP负载均衡、反向代理负载均衡等,
也就是在集群中有服务器A、B、C,它们都是互不影响,互不相干的,任何一台的机器宕了,都不会影响其他机器的运行,当用户来一个请求,有负载均衡器的算法决定由哪台机器来处理,
假如你的算法是采用round算法,有用户a、b、c,那么分别由服务器A、B、C来处理;
3. 分布式系统
分布式是指将不同的业务分布在不同的地方。
而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。
而集群并不一定就是分布式的。
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。
而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
4. 总结
-
集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。
-
负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。
如一个提 供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供服务。 -
特点:在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。
集群系统 (Cluster)主要解决下面几个问题:
高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过 去,以实现对用户的不间断服务。
高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分 析,化学分析等。
负载平衡:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。 -
分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题
集群:同一个业务部署在多台机器上,提高系统可用性
例子:
小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,
这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,
一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群
三. fastDFS
1. 定义:
fastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,
主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等
2. 分布式文件系统:
基于客户端/服务器的文件存储系统
对等特性允许一些系统扮演客户端和服务器的双重角色,可供多个用户访问的服务器,
比如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
https://www.jianshu.com/p/b7c330a87855
四. 分布式=高并发=多线程?
当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程?
当面试官问到高并发系统可以采用哪些手段来解决,
或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?
确实,在一开始接触的时候,不少人都会将三者混淆,误以为所谓的分布式高并发的系统就是能同时供海量用户访问,而采用多线程手段不就是可以提供系统的并发能力吗?
实际上,他们三个总是相伴而生,但侧重点又有不同。
1.什么是分布式?
分布式更多的一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。
该领域需要解决的问题极多,在不同的技术层面上,
又包括:分布式文件系统、分布式缓存、分布式数据库、分布式计算等,一些名词如Hadoop、zookeeper、MQ等都跟分布式有关。
从理念上讲,分布式的实现有两种形式:
- 水平扩展:当一台机器扛不住流量时,就通过添加机器的方式,将流量平分到所有服务器上,所有机器都可以提供相当的服务;
- 垂直拆分:前端有多种查询需求时,一台机器扛不住,可以将不同的需求分发到不同的机器上,比如A机器处理余票查询的请求,B机器处理支付的请求。
2.什么是高并发?
相对于分布式来讲,高并发在解决的问题上会集中一些,
其反应的是同时有多少量:比如在线直播服务,同时有上万人观看。
高并发可以通过分布式技术去解决,将并发流量分到不同的物理服务器上。
但除此之外,还可以有很多其他优化手段:比如使用缓存系统,将所有的,静态内容放到CDN等;
还可以使用多线程技术将一台服务器的服务能力最大化。
3. 什么是多线程?
多线程是指从软件或者硬件上实现多个线程并发执行的技术,它更多的是解决CPU调度多个进程的问题,从而让这些进程看上去是同时执行(实际是交替运行的)。
这几个概念中,多线程解决的问题是最明确的,手段也是比较单一的,基本上遇到的最大问题就是线程安全。
在JAVA语言中,需要对JVM内存模型、指令重排等深入了解,才能写出一份高质量的多线程代码。
4. 总结一下
-
分布式是从物理资源的角度去将不同的机器组成一个整体对外服务,技术范围非常广且难度非常大,有了这个基础,高并发、高吞吐等系统很容易构建;
-
高并发是从业务角度去描述系统的能力,实现高并发的手段可以采用分布式,也可以采用诸如缓存、CDN等,当然也包括多线程;
-
多线程则聚焦于如何使用编程语言将CPU调度能力最大化。
五. 进程、线程、协程
1. 进程(process)
- 进程是资源分配的最小单位
- 进程间不共享内存,每个进程拥有自己独立的内存
- 进程间可以通过信号、信号量、共享内存、管道、队列等来通信
- 新开进程开销大,并且 CPU 切换进程成本也大
- 进程由操作系统调度
- 多进程方式比多线程更加稳定
2. 线程(thread)
- 线程是程序执行流的最小单位
- 线程是来自于进程的,一个进程下面可以开多个线程
- 每个线程都有自己一个栈,不共享栈,但多个线程能共享同一个属于进程的堆
- 线程因为是在同一个进程内的,可以共享内存
- 线程也是由操作系统调度,线程是 CPU 调度的最小单位
- 新开线程开销小于进程,CPU 在切换线程成本也小于进程
- 某个线程发生致命错误会导致整个进程崩溃
- 线程间读写变量存在锁的问题处理起来相对麻烦
3. 协程(coroutine)
- 对于操作系统来说只有进程和线程,协程的控制由应用程序显式调度,非抢占式的
- 协程的执行最终靠的还是线程,应用程序来调度协程选择合适的线程来获取执行权
- 切换非常快,成本低。一般占用栈大小远小于线程(协程 KB 级别,线程 MB 级别),所以可以开更多的协程
- 协程比线程更轻量级
4. 并行:
- 指在同一时刻,有多条指令在多个处理器同时执行,二者是一起执行的
5. 并发:
- 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使在宏观上具有多个进程同时执行的效果,
但在微观上但并不是同时执行的,只是把时间分成了若干份,使多个进程快速交替的执行。