分布式系统:
1、系统的各组件分布于网络上多个计算机;
2、各组件彼此之间仅仅通过消息传递来通信并协调行动;
分布式系统存在意义:
1、向上扩展的性价比越来越低;
2、单机扩展存在性能上升临界点;
3、出于稳定性及可用性考虑,单机会存在多方面的问题;
CPU、内存、IO
多CPU:多线程编程
互不通信的线程模型
基于共享容器协同工作的模型
通过事件协调的多线程模型
A, B
A:触发事件
B:等待事件
多进程模型
网络IO:
多进程,每个进程响应一个请求;
多线程,多进程,每进程生成多个线程,每线程响应一个用户请求
多线程,每线程直接响应多个请求
基于socket实现网络通信开发,其实现方式:
BIO:Blocking IO
一个进程或一个线程处理一个请求;
NIO:Nonblocking IO
基于事件驱动(epoll)思想,采用Reactor模式
AIO:
基于事件驱动思想,采用Proactor模式
如何把应用从单机扩展至多机?
输入设备的变化?
输出设备的变化?
控制器的变化?
实现的模式:
透明代理
lvs的nat
haproxy, nginx
旁路代理
名称服务
规则服务
Master/slave机制
运算器的变化:
存储器的变化?
分布式系统实现的难点:
缺乏全局时钟?
面对故障时的独立性
处理单点故障
事务处理
ACID
2PC、BASE、CAP、Paxos
大型网站站点的架构演进方式:
LAMT, LNMT
应用从资源占用的角度分两类:
CPU Bound
IO Bound: IO密集型
session sticky
ip based
cookie based
session replication
session server
引用MySQL主从面临的问题:
1、数据复制的问题
2、应用选择数据源的问题
引入缓存:
1、页面缓存
varnish, squid
2、数据缓存
key-value store: memcached
主库写操作压力:数据库拆分
垂直拆分:把数据库中不同的业务的数据拆分到不同的数据库服务器中
水平拆分:把一个单独的表中的数据拆分到多个不同的数据库服务器上
NoSQL: 非关系数据
文档数据库
列式数据库
... ...
DFS: 非结构化数据
TFS, MogileFS: 适用于海量小文件
HDFS, GFS:少量大文件
应用拆分:
根据业务特性拆分
根据用户拆分:
用户注册
用户登录
用户信息维护
根据对底层应用的调用进行拆分
异步:解耦
消息中间件:在分布式系统中,完成消息发送和接收的基础性软件;
MOM:Message-oriented middleware
RabbitMQ, ActiveMQ, ZMQ
数据访问层:
拆分:
垂直拆分:
单机的ACID保证被打破:要么放弃事务,要么引入分布式事务;
一些Join查询操作将变得非常困难:
原来依赖于外键实现的约束将无从保证;
水平拆分:
单机ACID保证被打破;
一些Join查询操作将变得非常困难:
原来依赖于外键实现的约束将无从保证;
自增序列的ID号的产生会有影响;
针对单张表的查询很有可能要跨库操作;
分布式事务的实现:
事务:事务参与者、支持事务的服务器、资源服务器、事务管理器
分布式事务的模型及规范:
X/Open:XA(分布式事务规范)
X/Open DTP: 定义了三个组件
AP: 应用程序,即使用DTP模型的程序
RM:资源管理器,即DBMS系统
TM:事务管理器,负责协调和管理管理条例,提供给AP应用程序编程接口并管理资源管理器
2PC:两段式提交
Two Phase Commitment Procotol
CAP:2000年7月,Eric Brewer
一致性
可用性
网络分区容错性
任何一种分布式系统最多只能同时满足上述三项中的两项;因此,分布式系统的目标:
AP:放弃C;大多数他布式系统都选择此项;
CA:放弃P;
CP:
分布式系统的目标:加强A和P,在C上进行妥协;
BASE模型:
BA:Basically Availibale
S:Soft state: 接受一段时间内的状态不同步;
E:Eventually Consistent: 最终一致性;
回顾:
分布式系统理论基础,大型站点演化过程
CAP:
AP,C
BASE:
ACID
N, R, W:R+W<=N
MySQL主从复制:
W=N, R=1
Vector Clock
两段式提交:分布式事务协议
2PC, Paxos
Paxos协议的使用有一个前提:不存在拜占庭将军问题
通讯网络不靠谱,无法完成可靠的消息传输;
Proposers:
Acceptors:
Leaners:
Proposal: 议案,Value: 决议
LastTried[p]:
PreviousVote[p]:
NextBallot[p]:
LastVote[b,v]:
Distributed FS
分布式存储:不是文件系统,不遵循POSIX规范
分布式文件系统
FUSE
Ceph
常见的分布式文件系统:
GlusterFS:适用于存储少量大文件
MogileFS:适用存储海量小文件
使用MySQL存储元数据
FastDFS
MooseFS:
Ceph:内核级别,支持PB级别存储的分布式文件系统;
HDFS:Lucene, MapReduce + HDFS = Hadoop (平台), HBase(NoSQL)
GFS:Google FS
MapReduce
Bigtable
TFS: 适用于存储海量小文件
Lustre: Oracle的开源的分布式文件
MogileFS:
开源的分布式存储,由LiveJournal旗下的Danga Interactive;
memcached, MogileFS, Perlbal
MogileFS的特性:
1、用户空间文件系统:无须特殊的核心组件;
2、无单点失败:
3、自动文件复制
4、比“RAID”好多了
5、传输中立,无特殊协议(HTTP,NFS)
6、命名空间较简单:每个文件对应于一个key;用于domain定义名称空间;
7、不依赖于任何共享存储设备;
MogileFS的组件:
Tracker:Mogilefsd进程;其实现的功能包括Replication,Deletion, Query, Monitor等等;
Storage Nodes: mogstored进程;文件实际存储的位置,其实质上是一个http服务器,基于WebDAV模式工作,能完成文件创建、删除、重命名等操作;
MySQL节点:用于为tracker存储元数据信息;mogilefs的名称空间及文件名;
tracker: mogilefsd
storage nodes: mogstored
perl: perl模块
cpan:
cpan> install module::name
离线安装:
编译:
# make Makefile.PL
# make
# make test
# make install
rpm包:
安装tracker:
1、安装相关的包:
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
2、授权数据库用户,并初始mysql数据库
# mogdbsetup
3、修改配置文件
db_dsn = DBI:mysql:DBNAME:host=172.16.100.7
4、启动mogilefsd进程
安装mogstord:
1、安装相关的包
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-IO-AIO
2、准备存储设备
挂载至某路径下,确认此路径下存在文件devN
此路径的属主和属组为mogilefs.mogilefs
3、修改配置文件/etc/mogilefs/mogstored.conf
docRoot=
前面的挂载路径;
配置mogielfs:
1、向tracker添加各mogstored主机
mogadm --trackers=TRACKER_NODE host add
2、向tracker添加各设备
mogadm --trackers=TRACKER_NODE device add
3、为tracker定义名称空间domain
mogadm --trackers=TRACKER_NODE domain add
4、为domain添加一个或多个class
mogadm --trackers=TRACKER_NODE class add
可同时副本的最少个数;
上传文件:
mogupload
查看文件信息:
mogfileinfo
http://www.magedu.com/images/bg.png
WebDAV:
回顾:
CAP:
AP, C
BASE:
最终一致性
MogileFS:
分布式文件系统:GluserFS, HDFS, MooseFS, Ceph, FastDFS, MogileFS, Lustre, TFS
少量大文件
海量小文件
元数据的存储位置:
有专用元数据节点:HDFS, MogileFS
元专用元数据节点:GlusterFS, Ceph
Client -->API(program) --> Tracker --> Mogstored
php, mogilefs
Client --> Nginx (mogilefs) --> Tracker --> Mogstored
domain: 名称空间
每个文件通过key来标记,key在当前名称空间内必须惟一;
domain:定义名称空间
不同的domain内,其key可以相同;
同一个domain内,key不能相同;
class: 复制单元
文件不是复制单元
安装php的mogilefs扩展
libxml2-devel
neon-devel
nginx_mogilefs:
GET
GlusterFS:
TCP/IP
特性:
扩展性
高可用性
全局统一的名称空间
弹性哈希计算
弹性卷管理
基于标准协议
NFS, CIFS, FTP, HTTP, Gluster
设计目标:
弹性存储系统:
线性横向扩展:
消除了元数据服务器
高效地数据分布
通过完全分布式架构的并行化获得最大化的性能
高可靠性:
技术的特点:
多个Brick Server可以通过客户端上vol manager或者是存储网关组织成集群:
Stride(RIAD0)
Replication(RAID1)
DHT(分布式哈希)
FUSE: Filesystem in User Space
Translators:
有多种类型的translator:
Cluster: 存储集群分布,Stride, Replication, DHT
Debug: 跟踪GlusterFS内部函数和系统调用,并输出调试信息
Encrption:
Features:
Mgmt: 弹性卷管理
Mount: FUSE接口的实现
Nfs: 内置的NFS服务器
Performance: 性能优化
Protocol: GlusreFS协议
Storage: