1、多线程与进程的执行模式:
互不通信的多线模式
基于共享容器协同的多线程模式
通过事件协同的多线程模型
A:1-->2-->3
B: 1-->2-->3
输入设备的变化
控制器的变化:
透明代理
旁路模式
名称服务
规则服务器
运算器的变化:
存储器的变化:
代理的模型
名称服务
规则服务器
Master
分布式系统的难点:
缺乏全局时钟
面对故障的独立性
处理单点故障
冗余
降低单点故障的影响范围
事务的挑战
ACID
2PC(两段式提交)、最终一致、BASE、CAP、Paxos
分布式事务的模型及规范
X/Open: XA
DTP:Distributed Transaction Processing Reference Model
定义了三个组件:
AP:Application Program, 应用程序
RM:Resource Manager, 资源管理器
TM:Transaction Manager,事务管理器
两段式提交
CAP
BASE
BA:Basically Available,基本可用
S:Soft state,软状态,接受一段时间内的状态不同步
E:Eventually consistent:最终一致性
Paxos:
比2PC提交更轻量级的分布式事务的协调方式
集群内数据一致性算法实施过程案例:
Quorum,Vector Clock
Quorum:
N: 数据复制的节点量
R: 成功读操作所依赖的最少节点数
w: 成功写操作所依赖的最少节点数
W+R>N: 强一致性:
假设,W=N, R=1,
W+R<=N:可以保证最终一致性
分布式应用:
分布式计算
MapReduce:分布式运算框架
MapReduce
分布式存储
GFS, Google File System
HDFS:
BigTable:列式数据库
HBase
NoSQL:
HADOOP:
分布式存储
不能mount,基于API进行存取
分布式文件系统
mount, VFS
GFS
HDFS:适合存储少量大文件:
TFS:在名称节点上将元数据存储与关系数据库中,文件数量不再受限于名称节点的内存空间;可以存储海量小文件:
Lustre:企业级应用,重量级:
GlusterFS:
MooseFS:FUSE
Mogilefs:使用Perl语言,FastDFS
Perlbal:
MogileFS的特性:
应用层:
无单点:(tracker,mogstore,database(MySQL))
自动文件复制: 复制的最下单位不是文件,而是class:
传输中立,无特殊协议:可以通过NFS或HTTP进行通信:
简单的命名空间:
不共享任何数据:
Tracker:
MogileFS的核心,是一个调度器:服务进程为mogilefsd;职责,删除、复制、监控、查询等:
Database:
mogstored:数据存储的位置,通常是一个HTTP(WebDAV)服务器,用来数据的创建、删除、获取;
Perl
安装MogileFS的模块
cpan
App::cpanminus
MogileFS::Server
MogileFS::Utils
IO::AIO
IO::WrapTie
Danga::Socket
所有的perl程序可以编译运行:
# perl Makefile.PL
# make
# make test
# make install
一、安装MogileFS
Master:192.168.0.113
node1:192.168.0.110 (node1.shamereedwine.com)
node2:192.168.0.111(node2.shamereedwine.com)
node3:192.168.0.112(node3.shamereedwine.com)
需要先安装mysql
1、这里安装的是2.46的版本
需要安装下面所示的几个包:
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
下面的几个包时非必须的,当然能装上更好
Perlbal-1.78-1.el6.noarch.rpm
Perlbal-doc-1.78-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
2、yum install *.rpm
=================================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================================
Installing:
MogileFS-Server noarch 2.46-2.el6 /MogileFS-Server-2.46-2.el6.noarch 0.0
MogileFS-Server-mogilefsd noarch 2.46-2.el6 /MogileFS-Server-mogilefsd-2.46-2.el6.noarch 523 k
MogileFS-Server-mogstored noarch 2.46-2.el6 /MogileFS-Server-mogstored-2.46-2.el6.noarch 53 k
MogileFS-Utils noarch 2.19-1.el6 /MogileFS-Utils-2.19-1.el6.noarch 170 k
Perlbal noarch 1.78-1.el6 /Perlbal-1.78-1.el6.noarch 4.4 k
Perlbal-doc noarch 1.78-1.el6 /Perlbal-doc-1.78-1.el6.noarch 0.0
perl-MogileFS-Client noarch 1.14-1.el6 /perl-MogileFS-Client-1.14-1.el6.noarch 79 k
perl-Net-Netmask noarch 1.9015-8.el6 /perl-Net-Netmask-1.9015-8.el6.noarch 55 k
perl-Perlbal noarch 1.78-1.el6 /perl-Perlbal-1.78-1.el6.noarch 666 k
Installing for dependencies:
perl-BSD-Resource x86_64 1.29.03-3.el6 base 35 k
perl-DBD-MySQL x86_64 4.013-3.el6 base 134 k
perl-Danga-Socket noarch 1.61-5.el6 epel 28 k
perl-IO-stringy noarch 2.110-10.1.el6 base 68 k
perl-Sys-Syscall noarch 0.23-1.el6 epel 14 k
3、安装好之后,修改主配置文件
[root@localhost ~]# vim /etc/mogilefs/mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.0.113 # mogilefs指定的数据库名,host数据库的IP地址
db_user = moguser # 指定登录mogilefs所使用的用户名
db_pass = mogpass # 指定mogilefs所使用的密码
listen = 0.0.0.0:7001 # 0.0.0.0表示监听所有地址
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
[root@localhost mogilefs]# vim mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogdata # 把该项指定为一个特定的目录,以存储数据,最好是一个独立分区
[root@localhost mogilefs]# mkdir -pv /data/mogdata # 创建修改的docroot目录
[root@localhost mogilefs]# chown -R mogilefs.mogilefs /data/mogdata/ # 修改属主和属组
记得修改进程文件目录的权限
[root@localhost mogilefsd]# chown -R mogilefs:mogilefs /var/run/mogilefsd
4、设置数据库连接mogfile
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'huaxia';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.%.%' IDENTIFIED BY 'mogpass';
Query OK, 0 rows affected (0.01 sec)
5、使用mogdbsetup向导创建数据库
[root@localhost ~]# mogdbsetup --dbhost=192.168.0.113 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=huaxia --dbuser=moguser --dbpass=mogpass --yes
6、启动mogilefsd服务
[root@localhost mogilefsd]# service mogilefsd start
Starting mogilefsd [确定]
7、查看mogilefsd的监听状态,可以看到7001端口已经处于监听状态
[root@localhost mogilefsd]# ss -tnlp|grep mogilefsd
LISTEN 0 128 *:7001 *:* users:(("mogilefsd",19001,6))
8、把Mogilefs的几个安装包都传到node1、noed2、node3上,并配置使用Mogilefs
(1)、接着安装Mogilefs, 创建数据存放目录,然后修改各自节点上的配置文件mogstored.conf
注意:需要安装 perl-IO-AIO 这个包
(2)、创建/data/mogdata这个数据目录
[root@localhost ~]# mkdir -pv /data/mogdata
mkdir: 已创建目录 "/data"
mkdir: 已创建目录 "/data/mogdata"
(3)、修改mogstored的配置文件
[root@localhost ~]# cat /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogdata
(4)、修改数据目录/data/mogdata/的属主和属组
[root@localhost ~]# chown -R mogilefs.mogilefs /data/mogdata/
(5)、三个node节点上启动mogstored服务
[root@localhost init.d]# service mogstored start
Starting mogstored [确定]
(6)、查看服务的监听情况
[root@localhost init.d]# ss -tnlp|grep mogstored
LISTEN 0 128 *:7500 *:* users:(("mogstored",23710,4))
LISTEN 0 128 *:7501 *:* users:(("mogstored",23710,9))
(7)、添加主机
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 host add node1.shamereedwine.com --ip=192.168.0.110 --status=alive
(8)、添加设备
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 device add node1.shamereedwine.com 002
(9)、查看主机节点
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 host list
node1.shamereedwine.com [1]: alive
IP: 192.168.0.110:7500
(10)、查看设备节点
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 device list
node1.shamereedwine.com [1]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 0.000 0.000 0.000 100
(11)、进入到node1的目录下,创建dev2目录文件,并赋予权限
[root@localhost mogdata]# mkdir dev2
[root@localhost mogdata]# chown -R mogilefs.mogilefs dev2/
(12)、再查看设备节点的磁盘容量的信息
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 device list
node1.shamereedwine.com [1]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 6.619 1.592 8.211 100
(13)、添加node2节点
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 host add node2.shamereedwine.com --ip=192.168.0.111 --status=alive
(14)、添加设备node2
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 device add node2.shamereedwine.com 001
(15)、创建一个名为files的domain
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 domain add files
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
(16)、上传一个fstab.html的文件
[root@localhost ~]# mogupload --trackers=192.168.0.113:7001 --domain=files --key='/fstab.html' --file='/etc/fstab'
(17)、查看fstab.html文件的访问路径
[root@localhost ~]# mogfileinfo --trackers=192.168.0.113:7001 --domain=files --key='/fstab.html'
- file: /fstab.html
class: default
devcount: 2
domain: files
fid: 2
key: /fstab.html
length: 805
- http://192.168.0.111:7500/dev1/0/000/000/0000000002.fid
- http://192.168.0.112:7500/dev3/0/000/000/0000000002.fid
(18)、创建一个Domain专用于存放文件
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 domain add images
[root@localhost ~]# mogadm --trackers=192.168.0.113:7001 domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
images default 2 MultipleHosts() NONE
(19)、上传图片并查看图片信息
[root@localhost backgrounds]# mogfileinfo --trackers=192.168.0.113:7001 --domain=images --key='/logo.png'
- file: /logo.png
class: default
devcount: 2
domain: images
fid: 3
key: /logo.png
length: 1470177
- http://192.168.0.110:7500/dev2/0/000/000/0000000003.fid
- http://192.168.0.112:7500/dev3/0/000/000/0000000003.fid
(20)、使用mogdelete 删除文件
[root@localhost ~]# mogdelete --trackers=192.168.0.113 --domain=images --key='/logo.png'
二、设置Mogilefs集群
localhost 192.168.0.113
node1.shamereedwine.com 192.168.0.110
node2.shamereedwine.com 192.168.0.111
node3.shamereedwine.com 192.168.0.112
1、node2修改配置文件mogilefsd.conf
[root@localhost mogilefs]# grep -v '^#' mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:
mogdb:host=192.168.0.113
db_user =
moguser
db_pass =
mogpass
listen =
0.0.0.0:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
2、在localhost机器上做数据库访问授权
mysql> GRANT ALL ON mogdb.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
3、创建授权访问的数据库
[root@localhost ~]# mogdbsetup --dbhost=192.168.0.113 --dbport=3306 --dbname=mogdb --dbrootuser=root --dbrootpass=huaxia --dbuser=moguser --dbpass=mogpass --yes
4、node2启动mogilefsd服务
[root@localhost ~]# service mogilefsd start
Starting mogilefsd [确定]
5、查看mogilefsd监听的端口
[root@localhost ~]# ss -tnlp|grep mogstored
LISTEN 0 128 *:7500 *:* users:(("mogstored",23710,4))
LISTEN 0 128 *:7501 *:* users:(("mogstored",23710,9))
6、node2创建数据存储目录
[root@localhost dev1]# mkdir /data/mogdata/dev1
[root@localhost dev1]# chown -R mogilefs.mogilefs /data/mogdata/dev1
7、修改主存储的配置文件
[root@localhost mogdata]# vim /etc/mogilefs/mogstored.conf
docroot = /data/mogdata
8、查看mogfile监听的端口
[root@localhost mogdata]# ss -tnlp|grep mogstored
LISTEN 0 128 *:7500 *:* users:(("mogstored",23710,4))
LISTEN 0 128 *:7501 *:* users:(("mogstored",23710,9))
9、加入本地主机