1. 目标
本方案主要解决单节点故障对集群造成的影响,保证文件的完整性、集群功能的正确性。
2. 方案内容
Master 节点至为 3 个,部署不同物理主机,启动过程中设置参数 defaultReplication=001(相同 rack 备份 1 份数据)。
Volume 文件节点至少为 3 个,分别部署不同物理主机。
Filer 管理文件元数据信息,方便文件操作,filer 节点至少 2 个。
采用 Cassandra 分布式数据库存储文件数据信息,集群节点数至少为 3 个。
3. 方案说明
Master 节点管理数据卷和文件 ID 的分配工作,为了保证可用性,通常部署 3 个,Master 节点间通过 Raft 协议选举主 Master,非主 Master 会将请求转发给主 Master。
Volume 文件节点至少为了 3 个平衡数据分配,防止单节点数据过大。
Filer 至少 2 个,通常在 Filer 之前会配置 Nginx 用于统一访问和负载均衡。
Filer Storage 支持 Cassandra,Cassandra 是一种非关系型分布式数据库,可扩展至 PB 级存储。
4.1 安装 JDK
#!/bin/bashHOST=$1HOME=$2
HOST_ARRAY=(${HOST//,/ })JAVA_HOME=$HOME/jdk1.8.0_341
tar -xf jdk-8u341-linux-x64.tar.gz
echo "export JAVA_HOME=$JAVA_HOME" >> ~/.bash_profileecho "export PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bash_profile
for host in ${HOST_ARRAY[@]}do
scp -r jdk1.8.0_341 $host:/$HOME scp ~/.bash_profile $host:/$HOME
ssh $host "source ~/.bash_profile"done
复制代码
4.2 安装 Cassandra
sh cassandra_install.sh 172.17.48.1,172.17.48.2,172.17.48.3 /home/hadoop
#!/bin/bashHOST=$1HOME=$2
HOST_ARRAY=(${HOST//,/ })
tar -xf apache-cassandra-3.11.14-bin.tar.gz
for host in ${HOST_ARRAY[@]}do
cat << EoF > apache-cassandra-3.11.14/conf/cassandra.yamlcluster_name: 'zgg'listen_address: $hostrpc_address: $hostnum_tokens: 256seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "172.17.48.3"endpoint_snitch: GossipingPropertyFileSnitchauto_bootstrap: false
data_file_directories: - ./datacommitlog_directory: ./data/commitlogsaved_caches_directory: ./data/saved_cachesEoF
scp -r apache-cassandra-3.11.14 $host:/$HOMEdone
复制代码
4.3 在 Cassandra 中创建命名空间
CREATE KEYSPACE seaweedfs WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};use seaweedfs;CREATE TABLE filemeta ( directory varchar, name varchar, meta blob, PRIMARY KEY (directory, name)) WITH CLUSTERING ORDER BY (name ASC);
复制代码
4.4 安装 SeaweedFS:master
cat master.sh
#!/bin/bashHOST=$1HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}do
ssh -T $host <<EOFcd /root
if [ ! -d "master" ]then mkdir masterfi
nohup ./weed master -ip=$host -port=9333 -mdir=/root/master -defaultReplication=001 -peers=172.17.48.11:9333,172.17.48.12:9333,172.17.48.13:9333 > /root/master/master.log 2>&1 &EOFdone
sh master.sh 172.17.48.11,172.17.48.12,172.17.48.13
复制代码
4.5 安装 SeaweedFS:volume
cat volume.sh
#!/bin/bashHOST=$1HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}do
ssh -T $host <<EOFcd /root
if [ ! -d "volume" ]then mkdir volumefi
nohup ./weed volume -ip=$host -port=8080 -dir=/root/volume -mserver=172.17.48.11:9333,172.17.48.12:9333,172.17.48.13:9333 -dataCenter=dc1 -rack=rack1 > /root/volume/volume.log 2>&1 &EOF
done
sh volume.sh 172.17.48.14,172.17.48.15,172.17.48.16,172.17.48.17
复制代码
4.6 安装 SeaweedFS:filer
cat filer.toml
[cassandra]enabled = truekeyspace = "seaweedfs"hosts = [ "172.17.48.1:9042", "172.17.48.2:9042", "172.17.48.3:9042",]username = ""password = ""superLargeDirectories = []localDC = ""connection_timeout_millisecond = 600
cat filer.sh
#!/bin/bashHOST=$1HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}do
scp filer.toml $host:/rootssh -T $host <<EOFcd /root
if [ ! -d "filer" ]then mkdir filerfi
nohup ./weed filer -ip=$host -port=8888 -defaultStoreDir=/root/filer --master=172.17.48.11:9333,172.17.48.12:9333,172.17.48.13:9333 > /root/filer/filer.log 2>&1 &EOF
done
sh filer.sh 172.17.48.18,172.17.48.19
复制代码
4.7 批量上传文件
#!/bin/bashfor i in $(seq 1 100)do
echo $i >> $i.txtecho `cat /proc/sys/kernel/random/uuid` >> $i.txt
done
for i in $(seq 1 100)do
echo "uploading $i.txt"curl -F file=@$i.txt "http://172.17.48.19:8888/ice/"echo "uploaed $i.txt"
done
复制代码
5. 方案验证
5.1 单 master 挂掉对历史文件读、实时文件写的影响
kill 掉 Leader
可发现 Leader 重新进行了选举
5.1.1 验证历史文件的读请求
#!/bin/bashfor i in $(seq 1 100)do
curl "http://172.17.48.19:8888/ice/$i.txt"
done
复制代码
可发现:数据均可正常访问
5.1.2 验证实时文件的写请求
通过 URL 查看:
5.2 单 volume 挂掉对历史文件读、实时文件写的影响
kill 掉 172.17.48.14
可以看到在 volume 列表中 172.17.48.14 节点已经删除
5.2.1 验证历史文件的读请求
#!/bin/bashfor i in $(seq 1 100)do
curl "http://172.17.48.19:8888/ice/$i.txt"
done
复制代码
可发现:数据都可以访问
5.2.2 验证实时文件的写请求
通过 URL 查看:
5.3 单 filer 挂掉对历史文件读、实时文件写的影响
Kill 掉 172.17.48.18,验证 172.17.48.19
5.3.1 验证历史文件的读请求
#!/bin/bashfor i in $(seq 1 100)do
curl "http://172.17.48.19:8888/ice/$i.txt"
done
复制代码
172.17.48.19 可以正常对外提供读取功能
5.3.2 验证实时文件的写请求
通过 URL 查看
5.4 单 cassandra 节点挂掉对历史文件读、实时文件写的影响
Kill 掉 172.17.48.1
从另外一台 cassandra 节点查看状态,可发现 172.17.48.1 已经挂掉
5.4.1 验证历史文件的读请求
#!/bin/bashfor i in $(seq 1 100)do
curl "http://172.17.48.19:8888/ice/$i.txt"
done
复制代码
Cassandra 节点挂掉 1 个,依然可以对外提供读取服务
5.4.2 验证实时文件的写请求
6. 结论
按照本方案有如下结论:
评论