前言:
不知不觉中我们就进入大数据时代, 什么是大数据? 什么是分布式? 什么是云计算? 我们在后面都将介绍, 本篇文章, 我们主要讨论分布式系统;
什么是分布式?
分布式这个词听起来很高大上, 实际上在我们以前经常构建分布式系统, 从最初的分离LAMP中的MySQL 到引入Varnish缓存页面, 再到使用LVS负载均衡Nginx|Apache, Nginx负载均衡Tomcat等等, 广义上都算是分布式系统.
简单来说分布式就是将一个系统的各个组件(MySQL、PHP、Apache …)分布在网络上的各台主机, 并且各组件之间仅通过消息传递来通信并协调工作
分布式存在的意义?
其实我们在之前负载均衡相关的博文中已经回答过了, 主要有以下问题:
-
垂直扩展的性价比不高
-
单机扩展存在性能上升的临界点
-
处于稳定性及可用性考虑, 单机会存在多方面的问题
分布式的难点及CAP、BASE、2PC、X/Open XA介绍
分布式系统存在以下难点
-
缺乏全局时钟
-
面对故障时的独立性
-
很难处理单点故障
-
很难实现事务
事务要具有ACID. 但是这在分布式系统中很难实现
-
A: Atomicity 原子性
-
C: Consistency 一致性
-
I: Isolation 隔离性
-
D: Durability 持久性
很多数据库都能实现单机事务, 但是一旦构建为分布式系统, 单机的ACID就不能实现了, 有两种选择, 1、放弃事务 2、引入分布式事务;
分布式事务的实现:
一次事务中的主要角色:
-
事务的参与者
-
支持事务的服务器
-
资源服务器
-
事务管理器
分布式事务的模型和规范: Distributed Transaction Processing: The XA Specification
X/Open DTP: Distribution Transaction Process
-
AP: 应用程序
-
RM: Resource Manager, 资源管理器, 一般是DBMS
-
TM: Transaction Manager, 负责协调和管理事务
提供给AP编程接口, 并管理资源管理器
2PC:
Two Phase Commitment Protocol 两段式提交
如图: 一次事务首先要准备资源, 所有节点的资源都准备好后, 同时进行Commit, 如果中途中断则会一起ROLLBACK, 从而实现数据一致性
![1462368251317279.jpg 1462368251317279.jpg](https://ftp.serverspc.com/2021/01/160505071336632.jpg)
不知不觉中我们就进入大数据时代, 什么是大数据? 什么是分布式? 什么是云计算? 我们在后面都将介绍, 本篇文章, 我们主要讨论分布式系统;
分布式这个词听起来很高大上, 实际上在我们以前经常构建分布式系统, 从最初的分离LAMP中的MySQL 到引入Varnish缓存页面, 再到使用LVS负载均衡Nginx|Apache, Nginx负载均衡Tomcat等等, 广义上都算是分布式系统.
简单来说分布式就是将一个系统的各个组件(MySQL、PHP、Apache …)分布在网络上的各台主机, 并且各组件之间仅通过消息传递来通信并协调工作
分布式存在的意义?
其实我们在之前负载均衡相关的博文中已经回答过了, 主要有以下问题:
-
垂直扩展的性价比不高
-
单机扩展存在性能上升的临界点
-
处于稳定性及可用性考虑, 单机会存在多方面的问题
分布式的难点及CAP、BASE、2PC、X/Open XA介绍
分布式系统存在以下难点
-
缺乏全局时钟
-
面对故障时的独立性
-
很难处理单点故障
-
很难实现事务
事务要具有ACID. 但是这在分布式系统中很难实现
-
A: Atomicity 原子性
-
C: Consistency 一致性
-
I: Isolation 隔离性
-
D: Durability 持久性
很多数据库都能实现单机事务, 但是一旦构建为分布式系统, 单机的ACID就不能实现了, 有两种选择, 1、放弃事务 2、引入分布式事务;
分布式事务的实现:
一次事务中的主要角色:
-
事务的参与者
-
支持事务的服务器
-
资源服务器
-
事务管理器
分布式事务的模型和规范: Distributed Transaction Processing: The XA Specification
X/Open DTP: Distribution Transaction Process
-
AP: 应用程序
-
RM: Resource Manager, 资源管理器, 一般是DBMS
-
TM: Transaction Manager, 负责协调和管理事务
提供给AP编程接口, 并管理资源管理器
2PC:
Two Phase Commitment Protocol 两段式提交
如图: 一次事务首先要准备资源, 所有节点的资源都准备好后, 同时进行Commit, 如果中途中断则会一起ROLLBACK, 从而实现数据一致性
![1462368251317279.jpg 1462368251317279.jpg](https://ftp.serverspc.com/2021/01/160505071336632.jpg)
其实我们在之前负载均衡相关的博文中已经回答过了, 主要有以下问题:
-
垂直扩展的性价比不高
-
单机扩展存在性能上升的临界点
-
处于稳定性及可用性考虑, 单机会存在多方面的问题
分布式系统存在以下难点
缺乏全局时钟
面对故障时的独立性
很难处理单点故障
很难实现事务
事务要具有ACID. 但是这在分布式系统中很难实现
A: Atomicity 原子性
C: Consistency 一致性
I: Isolation 隔离性
D: Durability 持久性
很多数据库都能实现单机事务, 但是一旦构建为分布式系统, 单机的ACID就不能实现了, 有两种选择, 1、放弃事务 2、引入分布式事务;
分布式事务的实现:
一次事务中的主要角色:
事务的参与者
支持事务的服务器
资源服务器
事务管理器
分布式事务的模型和规范: Distributed Transaction Processing: The XA Specification
X/Open DTP: Distribution Transaction Process
AP: 应用程序
RM: Resource Manager, 资源管理器, 一般是DBMS
TM: Transaction Manager, 负责协调和管理事务
提供给AP编程接口, 并管理资源管理器2PC:
Two Phase Commitment Protocol 两段式提交如图: 一次事务首先要准备资源, 所有节点的资源都准备好后, 同时进行Commit, 如果中途中断则会一起ROLLBACK, 从而实现数据一致性
CAP: CAP的更多信息
2000年7月 由 Eric Brewer提出, 并经过他人证明, 分布式系统不能同时满足CAP
-
C: Consistency 一致性 所有主机的数据都是同步的
-
A: Avaiability 可用性 能够保证系统的可用性(有主机宕机不影响用户)
-
P: Partition tolerance 分区容错性: 即使网络出现故障从而分区, 不影响系统运行
一般情况下的分布式系统都是在C(Consistency)进行妥协
BASE: 可替代ACID;
-
BA: Basically Availibale 基本可用性
-
S: Soft state 接受一段时间的状态不能同步
-
E: Eventually Consistent 最终一致性
相比于ACID而言, BASE并没有那么苛刻, BASE允许部分的失败但是不会引起系统的故障
DNS就是最著名的Eventually Consistent的实现
分布式存储和分布式文件系统:
存储一般分为两种类型:
-
集中式:
NAS: Network Attached Storage; 文件系统级别, 例如NFS, FTP, SAMBA…
SAN: Storage Aera Network; 块级别, 例如IP SAN, FC SAN…
-
分布式
中心节点存储: 每个集群中有节点专门用来存储元数据, 其他节点则存储部分数据
无中心节点存储: 每个集群各节点都存储元数据和部分数据
分布式存储和分布式文件系统:
-
文件系统: 有文件系统接口
-
存储: 无文件系统接口, 通过API访问
常见的实现:
GFS: Google File System
分布式系统的开山鼻祖, 由于Google内部需要遂开发, 后来发布论文公布其技术细节, 但是没有开源
HDFS: Hadoop Distribution File System
通过Google发布的论文, 从而实现HDFS
GFS和HDFS都将元数据存储于内存中, 定期存储在持久存储中 、只适合存储百万、千万级别的 大文件
GlusterFS:
去中心化设计, 没有元数据节点
Ceph:
Linux内核级实现的文件系统, 已经收录Linux内核
MogileFS:
适用于存储海量小文件, 使用perl语言编写, 国内有人使用C语言重写并开源为FastDFS
TFS:
TaoBao FileSystem, 基于HDFS开发 适用于存储海量小文件
MogileFS实现原理:
存储一般分为两种类型:
-
集中式:
NAS: Network Attached Storage; 文件系统级别, 例如NFS, FTP, SAMBA…
SAN: Storage Aera Network; 块级别, 例如IP SAN, FC SAN… -
分布式
中心节点存储: 每个集群中有节点专门用来存储元数据, 其他节点则存储部分数据
无中心节点存储: 每个集群各节点都存储元数据和部分数据
分布式存储和分布式文件系统:
-
文件系统: 有文件系统接口
-
存储: 无文件系统接口, 通过API访问
常见的实现:
GFS: Google File System
分布式系统的开山鼻祖, 由于Google内部需要遂开发, 后来发布论文公布其技术细节, 但是没有开源
HDFS: Hadoop Distribution File System
通过Google发布的论文, 从而实现HDFS
GFS和HDFS都将元数据存储于内存中, 定期存储在持久存储中 、只适合存储百万、千万级别的 大文件
GlusterFS:
去中心化设计, 没有元数据节点
Ceph:
Linux内核级实现的文件系统, 已经收录Linux内核
MogileFS:
适用于存储海量小文件, 使用perl语言编写, 国内有人使用C语言重写并开源为FastDFS
TFS:
TaoBao FileSystem, 基于HDFS开发 适用于存储海量小文件
MogileFS中的术语:
tracker: 借助数据库保存各个节点文件的元数据信息, 便于检索定位数据位置并监控各个节点, 告知客户端存储区的位置并指挥storage节点复制数据副本, 进程为mogilefsd
database: 为tracker节点存储节点文件的元数据信息
storage: 将指定域中的键转换为特有的文件名存储于在特定的设备文件中, 转换后文件名为值, storage自动维护键值之间的对应关系, storage节点使用http进行数据传输, 依赖于perbal, 进程为mogstored, perbal
Domain: 一个域中的键值是唯一的, 一个MogileFS可以有多个域来存储不同类型的文件
Class: 复制的最小单位, 管理文件属性, 定义文件存储在不同设备上的份数
device: 一个存储节点, 可以有多个device, 就是用来存放文件的目录, 每个设备都有一个设备ID, 需要在mogstored配置文件中docroot配置, 设备不能删除, 只能将设备的状态置为dead, 置为dead之后数据就无法恢复了, 并且设备ID也无法再使用
MogileFS Architecture:
MogileFS的特性:
工作的应用层, 不需要特殊的组件
无单点故障
自动复制文件
简单的命名空间
不需要RAID
不能追加, 随机写
数据通过HTTP/WebDAV服务上传到Storage Node(mogstored)
MySQL存储MogileFS元数据(命名空间、位置)
MogileFS的高可用架构:
MogileFS编译安装和配置
本我来是打算进行编译安装的, 但是由于各种原因, 我这次就使用rpm包安装了, 本次rpm包是马哥提供的.
对于实验中的所有操作过程, 由于时间原因, 这里都不在叙述 详情看: 官方WIKI
实验环境
-
node6 172.16.1.7 tracker, database
-
node7 172.16.1.8 storage
-
node8 172.16.1.9 storage
本我来是打算进行编译安装的, 但是由于各种原因, 我这次就使用rpm包安装了, 本次rpm包是马哥提供的.
对于实验中的所有操作过程, 由于时间原因, 这里都不在叙述 详情看: 官方WIKI
实验环境
-
node6 172.16.1.7 tracker, database
-
node7 172.16.1.8 storage
-
node8 172.16.1.9 storage
安装: 需要epel源. 每一台主机都要安装
[root@node6~] yum install perl-Net-Netmask perl-IO-AIO #每一台主机都必须安装, 否则可能导致mogstored不能正常监听端口
[root@node6~] yum localinstall 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
[root@node6~] yum install mysql-server
[root@node6~] scp *.rpm 172.16.1.8:/root/
[root@node6~] scp *.rpm 172.16.1.9:/root/
[root@node7~] yum install perl-Net-Netmask perl-IO-AIO #每一台主机都必须安装, 否则可能导致mogstored不能正常监听端口
[root@node7~] yum localinstall 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
[root@node8~] yum install perl-Net-Netmask perl-IO-AIO #每一台主机都必须安装, 否则可能导致mogstored不能正常监听端口
[root@node8~] yum localinstall 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
配置数据库:
[root@node6~] service mysqld start
mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'passwd' ; #配置一个可以远程连接的root用户
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON mogilefs.* TO mogileuser@'%' IDENTIFIED BY 'passwd'; #配置一个可管理mogilefs数据库的用户
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE mogilefs; #创建mogilefs数据库
Query OK, 1 row affected (0.00 sec)
[root@node6~] mogdbsetup --dbhost=172.16.1.7 --dbuser=mogileuser --dbpass=passwd --dbname=mogilefs --dbrootpass=passwd #生成数据表
mysql> USE mogilefs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLES; #查看表有没有生成
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
| class |
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17 rows in set (0.00 sec)
配置mogilefsd
[root@node6~] vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=172.16.1.7
db_user = mogileuser
db_pass = passwd
listen = 0.0.0.0:7001
conf_port = 7001
[root@node6~] service mogilefsd start
Starting mogilefsd [ OK ]
[root@node6~] mogadm host add node1 --ip=172.16.1.7 alive
[root@node6~] mogadm host add node2 --ip=172.16.1.8 alive
[root@node6~] mogadm host add node3 --ip=172.16.1.9 alive
[root@node6~] mogadm host list
node1 [1]: down
IP: 172.16.1.7:7500
node2 [2]: down
IP: 172.16.1.8:7500
node3 [3]: down
IP: 172.16.1.9:7500
配置mogstored
[root@node6~] mkdir /data/mogilefs/dev1 -pv
mkdir: created directory `/data'
mkdir: created directory `/data/mogilefs'
mkdir: created directory `/data/mogilefs/dev1'
[root@node6~] vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/
[root@node6 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node6~] service mogstored start
Starting mogstored [ OK ]
[root@node7~] mkdir /data/mogilefs/dev2 -pv
mkdir: created directory `/data'
mkdir: created directory `/data/mogilefs'
mkdir: created directory `/data/mogilefs/dev2'
[root@node7~] vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/
[root@node7 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node7~] service mogstored start
Starting mogstored [ OK ]
[root@node8~] mkdir /data/mogilefs/dev3 -pv
mkdir: created directory `/data'
mkdir: created directory `/data/mogilefs'
mkdir: created directory `/data/mogilefs/dev3'
[root@node8~] vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/
[root@node8 ~]# chown mogilefs.mogilefs /data/mogilefs/ -R
[root@node8~] service mogstored start
Starting mogstored [ OK ]
[root@node6~] mogadm device add node1 1 alive
[root@node6~] mogadm device add node2 2 alive
[root@node6~] mogadm device add node3 3 alive
[root@node6~] mogadm check
Checking trackers...
127.0.0.1:7001 ... OK
Checking hosts...
[ 1] node1 ... OK
[ 2] node2 ... OK
[ 3] node3 ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1 74.435 2.069 72.366 2.78% writeable 28.9
[ 2] dev2 74.435 1.958 72.477 2.63% writeable 0.0
[ 3] dev3 74.435 1.954 72.481 2.63% writeable 0.5
---- ------------ ---------- ---------- ---------- ------
total: 223.306 5.982 217.324 2.68%
创建域
[root@node6~] mogupload --trackers=172.16.1.7 --doma^C
[root@node6~] mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
[root@node6~] mogadm domain add files
[root@node6~] mogadm domain add images
[root@node6~] mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
images default 2 MultipleHosts() NONE
创建类
[root@node6~] mogadm class list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
images default 2 MultipleHosts() NONE
[root@node6~] mogadm class add files fulltext --mindevcount=1
[root@node6~] mogadm class list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
files fulltext 1 MultipleHosts() NONE
images default 2 MultipleHosts() NONE
上传并查看文件
[root@node6~] mogupload --trackers=172.16.1.7 --domain=files --key='/fstab.txt' --file=/etc/fstab
[root@node6~] mogfileinfo --trackers=172.16.1.7 --domain=files --key='/fstab.txt'
- file: /fstab.txt
class: default
devcount: 2
domain: files
fid: 2
key: /fstab.txt
length: 711
- http://172.16.1.8:7500/dev2/0/000/000/0000000002.fid
- http://172.16.1.9:7500/dev3/0/000/000/0000000002.fid
验证
总结
MogileFS配置还是很Easy的, 但是分布式理论比配置更为重要, 大家一定要牢记在心!
作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~
MogileFS配置还是很Easy的, 但是分布式理论比配置更为重要, 大家一定要牢记在心!
作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~
MogileFS 设置 Memcached http://www.linuxidc.com/Linux/2012-03/56905.htm
在 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56904.htm
在开源分布式文件系统MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56573.htm
分布式文件系统MogileFS的使用 http://www.linuxidc.com/Linux/2015-09/122947.htm
自定义Nagios监控MogileFS存储节点脚本 http://www.linuxidc.com/Linux/2011-12/49394.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131022.htm