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/bash
HOST=$1
HOME=$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_profile
echo "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/bash
HOST=$1
HOME=$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.yaml
cluster_name: 'zgg'
listen_address: $host
rpc_address: $host
num_tokens: 256
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "172.17.48.3"
endpoint_snitch: GossipingPropertyFileSnitch
auto_bootstrap: false
data_file_directories:
- ./data
commitlog_directory: ./data/commitlog
saved_caches_directory: ./data/saved_caches
EoF
scp -r apache-cassandra-3.11.14 $host:/$HOME
done
复制代码
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/bash
HOST=$1
HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}
do
ssh -T $host <<EOF
cd /root
if [ ! -d "master" ]
then
mkdir master
fi
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 &
EOF
done
sh master.sh 172.17.48.11,172.17.48.12,172.17.48.13
复制代码
4.5 安装 SeaweedFS:volume
cat volume.sh
#!/bin/bash
HOST=$1
HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}
do
ssh -T $host <<EOF
cd /root
if [ ! -d "volume" ]
then
mkdir volume
fi
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 = true
keyspace = "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/bash
HOST=$1
HOST_ARRAY=(${HOST//,/ })
for host in ${HOST_ARRAY[@]}
do
scp filer.toml $host:/root
ssh -T $host <<EOF
cd /root
if [ ! -d "filer" ]
then
mkdir filer
fi
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/bash
for i in $(seq 1 100)
do
echo $i >> $i.txt
echo `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/bash
for 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/bash
for 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/bash
for 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/bash
for i in $(seq 1 100)
do
curl "http://172.17.48.19:8888/ice/$i.txt"
done
复制代码
Cassandra 节点挂掉 1 个,依然可以对外提供读取服务
5.4.2 验证实时文件的写请求
6. 结论
按照本方案有如下结论:
评论