-- 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.jar:$JAVA_HOME/lib/dt.jar:$JAR_HOME/lib export HADOOP_HOME=/usr/local/hadoop export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HADOOP_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 hadoop.tmp.dir /usr/local/hadoop/data/ fs.default.name hdfs://hadoopmaster:9000 --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 dfs.http.address hadoopmaster:50070 dfs.namenode.secondary.http-address hadoopmaster:50090 dfs.replication 1 --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 mapred.job.tracker hadoopmaster:9001 mapred.map.tasks 20 mapred.reduce.tasks 4 mapreduce.framework.name yarn mapreduce.jobhistory.address hadoopmaster:10020 mapreduce.jobhistory.webapp.address hadoopmaster:19888 --hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数 配置七 [hadoop@hadoopmaster hadoop]$ vim yarn-site.xml yarn.resourcemanager.address hadoopmaster:8032 yarn.resourcemanager.scheduler.address hadoopmaster:8030 yarn.resourcemanager.webapp.address hadoopmaster:8088 yarn.resourcemanager.resource-tracker.address hadoopmaster:8031 yarn.resourcemanager.admin.address hadoopmaster:8033 yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler 第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 --在原来的标签之间加上下面一段配置 dfs.hosts.exclude exclude mapred.hosts.exclude exclude [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/