自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 485|回复: 0

【学习笔记】分布式存储(二)

[复制链接]

85

主题

97

帖子

9329

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9329
发表于 2016-3-20 22:07:13 | 显示全部楼层 |阅读模式
hadoop体系结构
HDFS和mapreduce是hadoop的两大核心。
整个hadoop的体系结构主要是通过HDFS来实现分布式存储的底层支持的,并且它会通过mapreduce来实现分布式并行任务处理的程序支持。

HDFS采用了主从结构模型,一个HDFS集群是由一个namenode和若干个datanode组成的。
namenode管理文件系统的命名空间和客户端对文件的访问操作。
datanode管理存储的数据。文件形式存放的数据在内部被分成若干个数据块。

mapreduce是一种并行编程模式,利用模式软件开发都可以轻松地编写出分布式并行程序。
mapreduce的框架是由一个单独运行在主节点的jobtracker和运行在每个集群从节点的tasktracker共同组成的。
主节点负责调度构成一个作业的所有任务(会分布在不同的从节点上),主节点分配,监控从节点们的执行情况,并重新执行之前失败的任务。

       10.1.1.35
   hadoopmaster (namenode)

hadoopslave1   hadoopslave2  hadoopslave3
(datanode)   (datanode)   (datanode)
10.1.1.4   10.1.1.5  10.1.1.6


第1步,准备
就在做MFS的机器上继续做hadoop就可以,这样就不用再新加虚拟机了
如果要停掉MFS,就做如下操作
在client上
umount掉你的挂载
在所有chunkserver上
/usr/local/mfs/sbin/mfschunkserver stop
在master和metalogger上
/usr/local/mfs/sbin/mfsmaster stop
/usr/local/mfs/sbin/mfsmetalogger  stop
1,主机名绑定(所有节点都写上IP与主机名的对应)
vim /etc/hosts
10.1.1.3      client.cluster.com client
10.1.1.35      li.cluster.com  hadoopmaster
10.1.1.4      storage1.cluster.com hadoopslave1
10.1.1.5      storage2.cluster.com hadoopslave2
10.1.1.6      storage3.cluster.com hadoopslave3
2,静态IP
iptables -F
setenforce 0
3,时间同步

第2步,在所有四个节点(除了client)创建hadoop用户和用户组
useradd hadoop
echo 123 | passwd --stdin hadoop

第3步,对每个节点对hadoop用户做ssh等效性
四台都做(除了client)
su - hadoop
ssh-keygen   --创建空密码密钥对

只在hadoopmaster上做
[hadoop@hadoopmaster .ssh]$ cd /home/hadoop/.ssh/
[hadoop@hadoopmaster .ssh]$ scp hadoopslave1:~/.ssh/id_rsa.pub hadoopslave1_pub
[hadoop@hadoopmaster .ssh]$ scp hadoopslave2:~/.ssh/id_rsa.pub hadoopslave2_pub
[hadoop@hadoopmaster .ssh]$ scp hadoopslave3:~/.ssh/id_rsa.pub hadoopslave3_pub
[hadoop@hadoopmaster .ssh]$ cat id_rsa.pub hadoopslave1_pub hadoopslave2_pub  hadoopslave3_pub >> authorized_keys
[hadoop@hadoopmaster .ssh]$ scp authorized_keys hadoopslave1:~/.ssh/
[hadoop@hadoopmaster .ssh]$ scp authorized_keys hadoopslave2:~/.ssh/
[hadoop@hadoopmaster .ssh]$ scp authorized_keys hadoopslave3:~/.ssh/

分别四台上修改ssh验证key文件的权限 (除了client)
[hadoop@hadoopmaster .ssh]$ chmod 644 /home/hadoop/.ssh/authorized_keys
[hadoop@hadoopslave1 .ssh]$ chmod 644 /home/hadoop/.ssh/authorized_keys
[hadoop@hadoopslave2 .ssh]$ chmod 644 /home/hadoop/.ssh/authorized_keys
[hadoop@hadoopslave3 .ssh]$ chmod 644 /home/hadoop/.ssh/authorized_keys --所有节点确认权限为644,否则不成功

做完上面的,最好都ssh验证一下,让其使用hadoop用户ssh四个人(包括自己)都不需要密码能登录(因为你第一次登录需要输入yes,目的就是保证这个步骤后面不会再产生)
[hadoop@hadoopmaster .ssh]$ ssh hadoopmaster
[hadoop@hadoopmaster .ssh]$ exit
[hadoop@hadoopmaster .ssh]$ ssh hadoopslave1
[hadoop@hadoopmaster .ssh]$ exit
[hadoop@hadoopmaster .ssh]$ ssh hadoopslave2
[hadoop@hadoopmaster .ssh]$ exit
[hadoop@hadoopmaster .ssh]$ ssh hadoopslave3
[hadoop@hadoopmaster .ssh]$ exit
--这8条是我在haddopmaster上验证的,另外三台也需要重复上面这8条


第4步,解压安装,先只在hadoopmaster上做,后面配置好后再一起拷过去
软件包在 笔记目录/arch/hadoop_soft/
hadoop-2.6.0.tar.gz  jdk-8u45-linux-x64.tar.gz

--下面是用root用户做的
[root@hadoopmaster ~]# rm -rf /usr/local/java   --因为我这是宿主机模拟的,前面装过tomcat,amoeba等软件,所以可能有此jdk安装目录,这里就先删除此目录
[root@hadoopmaster ~]# tar xf jdk-8u45-linux-x64.tar.gz -C /usr/src/
[root@hadoopmaster ~]# mv /usr/src/jdk1.8.0_45/ /usr/local/java
[root@hadoopmaster ~]# chown -R hadoop:hadoop /usr/local/java
[root@hadoopmaster ~]# tar xf hadoop-2.6.0.tar.gz -C /usr/src/
[root@hadoopmaster ~]# mv /usr/src/hadoop-2.6.0/ /usr/local/hadoop
[root@hadoopmaster ~]# chown -R hadoop:hadoop /usr/local/hadoop/

第5步,配置环境变量
[root@hadoopmaster ~]# su - hadoop
[hadoop@hadoopmaster ~]$ vim .bash_profile --加入下面一段
export JAVA_HOME=/usr/local/java
export JAR_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib/tools.jarJAVA_HOME/lib/dt.jarJAR_HOME/lib
export HADOOP_HOME=/usr/local/hadoop
export PATH=$JAVA_HOME/binPATHHADOOP_HOME/binHADOOP_HOME/sbin
export PATH
[hadoop@hadoopmaster ~]$ scp .bash_profile hadoopslave1:~/
[hadoop@hadoopmaster ~]$ scp .bash_profile hadoopslave2:~/
[hadoop@hadoopmaster ~]$ scp .bash_profile hadoopslave3:~/


第6步,进行配置,先只在hadoopmaster上做
hadoop配置过程:要实现分布式环境,涉及到的配置文件有7个
~/hadoop/etc/hadoop/hadoop-env.sh
~/hadoop/etc/hadoop/yarn-env.sh
~/hadoop/etc/hadoop/slaves
~/hadoop/etc/hadoop/core-site.xml
~/hadoop/etc/hadoop/hdfs-site.xml
~/hadoop/etc/hadoop/mapred-site.xml
~/hadoop/etc/hadoop/yarn-site.xml

--注意:
--如果你的主机名或主机名别名和我不一样,下面所有配置文件里的hadoopmaster要替换成你的主机名或主机名别名(更准确的说要替换成你前面ssh不需要密码的那个名字)

配置一
[hadoop@hadoopmaster ~]$ cd /usr/local/hadoop/etc/hadoop/
[hadoop@hadoopmaster hadoop]$ vim hadoop-env.sh --指定JAVA_HOME
25 export JAVA_HOME=/usr/local/java
配置二
[hadoop@hadoopmaster hadoop]$ vim yarn-env.sh --指定JAVA_HOME
23 export JAVA_HOME=/usr/local/java

配置三
[hadoop@hadoopmaster hadoop]$ vim slaves  --删除原来的localhost,再写上所有从节点的主机名
hadoopslave1
hadoopslave2
hadoopslave3

配置四
[hadoop@hadoopmaster hadoop]$ vim core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoopmaster:9000</value>
</property>
</configuration>
--fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;hadoop.tmp.dir配置了hadoop的tmp目录的根位置(此目录需要创建)
[hadoop@hadoopmaster hadoop]$ mkdir /usr/local/hadoop/data

配置五
[hadoop@hadoopmaster hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.http.address</name>
<value>hadoopmaster:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoopmaster:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
--dfs.http.address配置了hdfs的http的访问位置;dfs.replication配置了文件块的副本数

配置六
[hadoop@hadoopmaster hadoop]$ cp mapred-site.xml.template mapred-site.xml
[hadoop@hadoopmaster hadoop]$ vim mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoopmaster:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>20</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>4</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoopmaster:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoopmaster:19888</value>
</property>
</configuration>
--hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数

配置七
[hadoop@hadoopmaster hadoop]$ vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoopmaster:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoopmaster:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoopmaster:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoopmaster:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoopmaster:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>



第7步,
使用root用户把解压好的jdk和配置好的hadoop复制到其他节点,并改成hadoop.hadoop的owner和group
[root@hadoopmaster ~]# scp -r /usr/local/java/ hadoopslave1:/usr/local/
[root@hadoopmaster ~]# scp -r /usr/local/java/ hadoopslave2:/usr/local/
[root@hadoopmaster ~]# scp -r /usr/local/java/ hadoopslave3:/usr/local/
[root@hadoopmaster ~]# scp -r /usr/local/hadoop/ hadoopslave1:/usr/local/
[root@hadoopmaster ~]# scp -r /usr/local/hadoop/ hadoopslave2:/usr/local/
[root@hadoopmaster ~]# scp -r /usr/local/hadoop/ hadoopslave3:/usr/local/
[root@hadoopslave1 ~]# chown -R hadoop.hadoop /usr/local/hadoop/ /usr/local/java/
[root@hadoopslave2 ~]# chown -R hadoop.hadoop /usr/local/hadoop/ /usr/local/java/
[root@hadoopslave3 ~]# chown -R hadoop.hadoop /usr/local/hadoop/ /usr/local/java/
# su - hadoop
$ source .bash_profile --使之生效,三台都做
$ java -version  --验证java,三台都做
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)


第8步,启动各个服务
在hadoopmaster上格式化namenode:
[hadoop@hadoopmaster hadoop]$ su - hadoop
[hadoop@hadoopmaster hadoop]$ cd /usr/local/hadoop/
[hadoop@hadoopmaster hadoop]$ ./bin/hdfs namenode -format --有下面的信息则为成功(如果需要重新格式化namenode,需先删除各节点的data文件,再重建;操作为rm -rf /usr/local/hadoop/data/ ; mkdir /usr/local/hadoop/data/)
。。。。。。
15/12/14 11:41:23 INFO common.Storage: Storage directory /usr/local/hadoop/data/dfs/name has been successfully formatted.
15/12/14 11:41:23 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
15/12/14 11:41:23 INFO util.ExitUtil: Exiting with status 0
15/12/14 11:41:23 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at li.cluster.com/10.1.1.35
************************************************************/

[hadoop@hadoopmaster hadoop]$ ./sbin/start-dfs.sh  --启动hdfs
15/12/14 11:44:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [hadoopmaster]
hadoopmaster: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-li.cluster.com.out
hadoopslave2: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-storage2.cluster.com.out
hadoopslave3: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-storage3.cluster.com.out
hadoopslave1: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-storage1.cluster.com.out
Starting secondary namenodes [hadoopmaster]
hadoopmaster: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-li.cluster.com.out
15/12/14 11:44:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

[hadoop@hadoopmaster hadoop]$ jps   --查看hadoopmaster上的进程
1700 NameNode
1973 Jps
1867 SecondaryNameNode
[hadoop@hadoopslave1 ~]$ jps   --查看hadoopslave1上的进程
1464 DataNode
1532 Jps
[hadoop@hadoopslave2 ~]$ jps   --查看hadoopslave2上的进程
1403 DataNode
1471 Jps
[hadoop@hadoopslave3 ~]$ jps   --查看hadoopslave3上的进程
2594 DataNode
2666 Jps

[hadoop@hadoopmaster hadoop]$ ./sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-resourcemanager-hadoopmaster.out
hadoopslave1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-hadoopslave1.out
hadoopslave2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-hadoopslave2.out
[hadoop@hadoopmaster hadoop]$ jps  --查看hadoopmaster上的进程
2275 Jps
2019 ResourceManager
1700 NameNode
1867 SecondaryNameNode
[hadoop@hadoopslave1 ~]$ jps   --查看hadoopslave1上的进程
1464 DataNode
1677 Jps
1567 NodeManager

[hadoop@hadoopslave2 ~]$ jps   --查看hadoopslave2上的进程
1616 Jps
1506 NodeManager
1403 DataNode
[hadoop@hadoopslave2 ~]$ jps   --查看hadoopslave3上的进程
2594 DataNode
2818 Jps
2708 NodeManager

--进程确认无误后,则安装OK


第9步:
检查启动结果
查看HDFS:
http://10.1.1.35:50070
查看报告
[hadoop@hadoopmaster ~]$ hdfs dfsadmin -report

基本文件操作(使用hadoop普通用户在hadoopmaster上进行操作)
$ hdfs dfs -mkdir /test
$ hdfs dfs -mkdir /test1
$ hdfs dfs  -rm -r /test1
$ hdfs dfs  -ls /
$ echo 123 > 123.txt
$ hdfs dfs  -put  123.txt /test
$ hdfs dfs  -ls /test
$ hdfs dfs  -cat /test/123.txt

$ rm 123.txt -rf
$ hdfs dfs -get /test/123.txt .

-----------------------------------------------------
基本操作里会有一个警告错误:
15/11/14 14:58:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
解决方法:
软件包路径:
# 笔记目录/arch/hadoop_soft/hadoop-native-64-2.6.0.tar

把这个软件包拷到你的hadoopmaster的机器上,然后
[root@hadoopmaster ~]# tar xf hadoop-native-64-2.6.0.tar -C /usr/local/hadoop/lib/native/
[root@hadoopmaster ~]# chown hadoop.hadoop -R /usr/local/hadoop/lib/native/


补充一:
hadoop集群的关闭与启动
关闭方法:在hadoopmaster(也就是namenode上)执行stop-all.sh(老版本)或者先stop-dfs.sh再stop-yarn.sh(新版本)
[hadoop@hadoopmaster hadoop]$ ./sbin/stop-all.sh
或者用下面两条代替上面一条
[hadoop@hadoopmaster hadoop]$ ./sbin/stop-dfs.sh
[hadoop@hadoopmaster hadoop]$ ./sbin/stop-yarn.sh

启动方法:在hadoopmaster(也就是namenode上)执行start-all.sh(老版本)或者先start-dfs.sh再start-yarn.sh(新版本)
[hadoop@hadoopmaster hadoop]$ ./sbin/start-all.sh
或者用下面两条代替上面一条
[hadoop@hadoopmaster hadoop]$ ./sbin/start-dfs.sh
[hadoop@hadoopmaster hadoop]$ ./sbin/start-yarn.sh

补充二:
如果其中一台datanode出了硬件出了问题,需要停机维护,如何从集群中删除这台datanode?
这里以删除10.1.1.4为例
1,在hadoopmaster(也就是namenode上)操作
[hadoop@hadoopmaster hadoop]$ touch /usr/local/hadoop/exclude  --touch一个新文件
[hadoop@hadoopmaster hadoop]$ vim  /usr/local/hadoop/exclude --写上你要删除的节点的IP,要删除多个就一个IP写一行
10.1.1.4

[hadoop@hadoopmaster hadoop]$ vim /usr/local/hadoop/etc/hadoop/core-site.xml --在原来的<configuration>和</configuration>标签之间加上下面一段配置
<property>
<name>dfs.hosts.exclude</name>
<value>exclude</value>
</property>
<property>
<name>mapred.hosts.exclude</name>
<value>exclude</value>
</property>

[hadoop@hadoopmaster hadoop]$ /usr/local/hadoop/bin/hdfs dfsadmin -report  --通过报告看到的10.1.1.4节点后面的状态还是Normal

[hadoop@hadoopmaster hadoop]$ /usr/local/hadoop/bin/hdfs dfsadmin -refreshNodes --刷新节点状态
Refresh nodes successful

[hadoop@hadoopmaster hadoop]$ /usr/local/hadoop/bin/hdfs dfsadmin -report  --再次查看报告,10.1.1.4节点后面的状态变为Decommissioned,这样就成功了

当你硬件修好后,想把10.1.1.4再加回来的做法:

去掉上面/usr/local/hadoop/etc/hadoop/core-site.xml里加的那段配置,再重新
/usr/local/hadoop/bin/hdfs dfsadmin -refreshNodes
/usr/local/hadoop/bin/hdfs dfsadmin -report  --10.1.1.4节点后面的状态变回为Normal

------------------------------------------------------------

参考资料:
官方文档:http://hadoop.apache.org/docs
一些PDF书,路径为 笔记目录/arch/hadoop_soft/
Hadoop.Operations.pdf                        
Hadoop权威指南中文第2版.pdf
Hadoop- The Definitive Guide, 4th Edition.pdf  
Hadoop高级编程——构建与实现大数据解决方案.pdf
Hadoop权威指南(中文版)(带书签).pdf

========================================================================

glusterfs

GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. GlusterFS is free and open source software.

       10.1.1.3
        client

storage1.cluster.com  storage2.cluster.com storage3.cluster.com
10.1.1.4      10.1.1.5     10.1.1.6


第一步:实验前准备
接着在上面的hadoop的机器上做(但这里不用管理节点,但需要一个客户端)
1,你可以把上面的hadoop停掉
在hadoopmaster上操作
# su - hadoop
$ /usr/local/hadoop/sbin/stop-yarn.sh
$ /usr/local/hadoop/sbin/stop-dfs.sh

2,确认各节点主机名绑定(我这里为了方便,就没有再修改主机名了,还是直接使用的上面用过的主机名)
10.1.1.3      client.cluster.com client
10.1.1.4      storage1.cluster.com hadoopslave1
10.1.1.5      storage2.cluster.com hadoopslave2
10.1.1.6      storage3.cluster.com hadoopslave3
3,静态IP
4,关闭iptables,selinux
5,时间同步
6,都配置yum

软件包路径
网上下载路径为http://download.gluster.org/pub/gluster/glusterfs/3.6/3.6.6/RHEL/epel-6.5/x86_64/
笔记目录下/arch/glusterfs_soft/  --这些软件包可以拷过去直接做个本地yum仓库就可以了
glusterfs-3.6.6-1.el6.x86_64.rpm
glusterfs-api-3.6.6-1.el6.x86_64.rpm
glusterfs-api-devel-3.6.6-1.el6.x86_64.rpm
glusterfs-cli-3.6.6-1.el6.x86_64.rpm
glusterfs-debuginfo-3.6.6-1.el6.x86_64.rpm
glusterfs-devel-3.6.6-1.el6.x86_64.rpm
glusterfs-extra-xlators-3.6.6-1.el6.x86_64.rpm
glusterfs-fuse-3.6.6-1.el6.x86_64.rpm
glusterfs-geo-replication-3.6.6-1.el6.x86_64.rpm
glusterfs-libs-3.6.6-1.el6.x86_64.rpm
glusterfs-rdma-3.6.6-1.el6.x86_64.rpm
glusterfs-server-3.6.6-1.el6.x86_64.rpm
repodata

我这里是把上面的目录拷到了这四台上(包括客户端),路径都为/glusterfs_soft/,所以与下面的yum配置路径对应
在原来的yum配置基础上再加上下面这一段yum的配置
[glusterfs]
name=glusterfs
baseurl=file:///glusterfs_soft/
enabled=1
gpgcheck=0


第二步:
在三台存储服务器上(storage1.cluster.com,storage2.cluster.com,storage3.cluster.com)
安装gluster-server软件包,并启动glusterd服务
# yum install glusterfs-server -y
# /etc/init.d/glusterd start

第三步:
让所有存储集群节点做成trusted pool(也就是建立连接)
在storage1.cluster.com(10.1.1.4)上操作
# gluster peer probe  storage2.cluster.com  (写IP或主机名都可以)
# gluster peer probe  storage3.cluster.com  (写IP或主机名都可以)
# gluster peer status --这样就能看到与glusterfs2的连接
Number of Peers: 2
Hostname: storage2.cluster.com
Uuid: 0b2b723a-7fe6-41f7-99a4-ae7413e1ae61
State: Peer in Cluster (Connected)
Hostname: storage3.cluster.com
Uuid: b11473bf-e188-40e2-b01c-1780a8bcbbd4
State: Peer in Cluster (Connected)
在storage2.cluster.com(10.1.1.5)上操作
# gluster peer status     --只需要在此节点看状态就可以发现它和另两个节点已经建立连接了
Number of Peers: 2
Hostname: storage1.cluster.com
Uuid: a6fc914f-0b14-4cc9-99da-252291f616d7
State: Peer in Cluster (Connected)
Hostname: storage3.cluster.com
Uuid: b11473bf-e188-40e2-b01c-1780a8bcbbd4
State: Peer in Cluster (Connected)

在storage3.cluster.com(10.1.1.6)上操作
# gluster peer status     --只需要在此节点看状态就可以发现它和另两个节点已经建立连接了
Number of Peers: 2
Hostname: storage1.cluster.com
Uuid: a6fc914f-0b14-4cc9-99da-252291f616d7
State: Peer in Cluster (Connected)
Hostname: storage2.cluster.com
Uuid: 0b2b723a-7fe6-41f7-99a4-ae7413e1ae61
State: Peer in Cluster (Connected)

第四步:
在所有存储节点上,建立用于集群的存储目录
# mount /dev/vdb1  /data
# rm /data/* -rf   
--这里用于分布式存储的目录可以是根,也可以是其它分区挂载的目录。我这里是用上次moosefs用到的那个5G存储。这一步删除是为了删除moosefs的内容,不和glusterfs影响。
--如果你换了虚拟机,没有这个5G分区,那就不用做这一步,后面你就把根目录做成分布式存储

# mkdir /data/gv0  -p --都去在上面准备好的存储目录里再建立一个子目录叫gv0(没有5G分区,也这样做,区别就是此目录属于根分区的空间)

第五步:
创建gluster volume取名叫gv0
在其中一个存储节点上做执行下面的命令(我这里是在storage1.cluster.com上10.1.1.4),其它不用执行
# gluster volume create gv0 replica 3 storage1.cluster.com:/data/gv0 storage2.cluster.com:/data/gv0  storage3.cluster.com:/data/gv0
volume create: gv0: success: please start the volume to access data
说明
--replica 3后面的数字与你的节点数有关(replica是类似raid1的模式,我们先讨论这种模式)
--gluster默认不做成根分区,建议使用单独的存储磁盘去挂载/data/gv0。如果你是用根分区来做的话,那么上面的命令需要再加一个force参数,变成
# gluster volume create gv0 replica 3 storage1.cluster.com:/data/gv0/ storage1.cluster.com:/data/gv0  storage1.cluster.com:/data/gv0 force


# gluster volume info --在所有存储节点上都可以使此命令查看到下面的gv0相关的信息
Volume Name: gv0
Type: Replicate   --模式为replicate模式
Volume ID: 0000e76a-6f2a-4a1f-9db0-3ca451ce72e7
Status: Created   --这里状态为created,表示刚创建,还未启动
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0
Brick3: storage3.cluster.com:/data/gv0

第六步:

# gluster volume start gv0 --启动gv0这个volume,--这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
volume start: gv0: success

# gluster volume info     --再在所有存储节点上执行查看状态,会发现状态由created变为了started

Volume Name: gv0
Type: Replicate
Volume ID: 0000e76a-6f2a-4a1f-9db0-3ca451ce72e7
Status: Started
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0
Brick3: storage3.cluster.com:/data/gv0

第七步:
在客户端(client.cluster.com 10.1.1.3)上安装gluster客户端软件
# yum install glusterfs glusterfs-fuse -y

第八步:
客户端挂载测试
--注意:客户端也需要在/etc/hosts文件里绑定存储节点的主机名,才使用ip可以挂载(因为我前面做的步骤是用名字的)
# mkdir /test{1,2,3}   --建立三个测试挂载目录
# mount -t glusterfs 10.1.1.4:/gv0 /test1
# mount -t glusterfs 10.1.1.5:/gv0 /test2
# mount -t glusterfs 10.1.1.6:/gv0 /test3
读写测试结果是:类似raid1,写的东西在所有存储节点上都会产生一份(replica模式)
--也就是说,任意客户端可以访问任意的其中一个存储节点,在里面读写,其它客户端也可以看到(实现同读同写)



第九步:
上面测试完后,如果要删除gv0这个volumn,做法如下:
先在客户端(client.cluster.com 10.1.1.3)umount已经挂载的目录
# umount /test1
# umount /test2
# umount /test3

在其中一个存储节点上做执行下面的命令(我这里是在storage1.cluster.com上10.1.1.4),其它不用执行
# gluster volume stop gv0 --这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: gv0: success

# gluster volume info  --在所有存储节点上都可以查看到gv0状态变为stopped

Volume Name: gv0
Type: Replicate
Volume ID: 0000e76a-6f2a-4a1f-9db0-3ca451ce72e7
Status: Stopped
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0
Brick3: storage3.cluster.com:/data/gv0

# gluster volume delete gv0 --这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: gv0: success

# gluster volume info   --在所有存储节点上都可以查看,没有gv0的信息了,说明这个volumn被删除了

第十步:
再做成stripe模式的卷
# gluster volume create gv0 stripe 3 storage1.cluster.com:/data/gv0 storage2.cluster.com:/data/gv0  storage3.cluster.com:/data/gv0 --这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
volume create: gv0: failed: /data/gv0 is already part of a volume
--这里报错,说gv0已经是一个卷的一部分,因为前面测试的数据还在
解决方法:
1,换一个目录再做
2,加一个force参数,强制在/data/gv0目录上做
我这里使用force强制做
# gluster volume create gv0 stripe 3 storage1.cluster.com:/data/gv0 storage2.cluster.com:/data/gv0  storage3.cluster.com:/data/gv0 force --这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
volume create: gv0: success: please start the volume to access data
# gluster volume start gv0 --这里是在storage1.cluster.com 10.1.1.4上做的,其它存储节点不用执行
volume start: gv0: success

# gluster volume info --所在存储节点上都可以查看到下面的信息,模式变为了stripe条带

Volume Name: gv0
Type: Stripe
Volume ID: db414c98-7d74-4e20-abef-68814734ac07
Status: Started
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0
Brick3: storage3.cluster.com:/data/gv0

第十一步:
客户端再次挂载进行读写测试
# mount -t glusterfs 10.1.1.4:/gv0 /test1
# mount -t glusterfs 10.1.1.5:/gv0 /test2
# mount -t glusterfs 10.1.1.6:/gv0 /test3
测试结果比较:
replica模式   类似raid1,写1G,会占3G
stripe模式    类似raid0,写3G,会一人占1G,总共还是3G

==================================================================
补充一:
另一种模式Distributed的做法,按照上面一样的方法把gv0给删除,再创建启动,创建命令为
# gluster volume create gv0 storage1.cluster.com:/data/gv0 storage2.cluster.com:/data/gv0  storage3.cluster.com:/data/gv0   --不指定replica或stripe,就默认是Distributed的模式
测试结果比较:
distributed模式  类似lvm的线性卷,先只占storage1空间,满了才会占storage2空间,再占storage3
replica模式   类似lvm的镜像卷,写1G,会每个存储节点都复制一份,三个节点共占3G
stripe模式    类似lvm的条件卷,写3G,会一人占1G,总共还是3G

除了这三种模式外,还有Distributed Striped,Distributed Replicated ,Distributed Striped Replicated,Striped Replicated,Dispersed,Distributed Dispersed等各种模式
参考官方文件路径为:
http://gluster.readthedocs.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/

补充二:
在线缩容:
# gluster volume remove-brick gv0 storage3.cluster.com:/data/gv0 force
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y   --这样会导致被remove这个brick数据丢失
volume remove-brick commit force: success

# gluster volume info --看状态会发现少了一个brick

Volume Name: gv0
Type: Distribute
Volume ID: 03e6a74d-8e24-44b4-b750-5a91f1b54ff9
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0

在线扩容:
# gluster volume add-brick gv0 storage3.cluster.com:/data/gv0 force
volume add-brick: success  --再加回来

# gluster volume info --又多回一个brick了

Volume Name: gv0
Type: Distribute
Volume ID: 03e6a74d-8e24-44b4-b750-5a91f1b54ff9
Status: Started
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: storage1.cluster.com:/data/gv0
Brick2: storage2.cluster.com:/data/gv0
Brick3: storage3.cluster.com:/data/gv0
在线参考官档地址:
http://gluster.readthedocs.org/en/latest/Administrator%20Guide/Managing%20Volumes/


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2022-9-27 21:25 , Processed in 0.060558 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表