写点什么

SeaweedFS 高可用方案最佳实践

作者:冰心的小屋
  • 2022-12-08
    北京
  • 本文字数:2565 字

    阅读完需:约 8 分钟

SeaweedFS 高可用方案最佳实践

1. 目标

本方案主要解决单节点故障对集群造成的影响,保证文件的完整性、集群功能的正确性。

2. 方案内容

  1. Master 节点至为 3 个,部署不同物理主机,启动过程中设置参数 defaultReplication=001(相同 rack 备份 1 份数据)。

  2. Volume 文件节点至少为 3 个,分别部署不同物理主机。

  3. Filer 管理文件元数据信息,方便文件操作,filer 节点至少 2 个。

  4. 采用 Cassandra 分布式数据库存储文件数据信息,集群节点数至少为 3 个。

3. 方案说明

  1. Master 节点管理数据卷和文件 ID 的分配工作,为了保证可用性,通常部署 3 个,Master 节点间通过 Raft 协议选举主 Master,非主 Master 会将请求转发给主 Master。

  2. Volume 文件节点至少为了 3 个平衡数据分配,防止单节点数据过大。

  3. Filer 至少 2 个,通常在 Filer 之前会配置 Nginx 用于统一访问和负载均衡。

  4. 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. 结论

按照本方案有如下结论:


发布于: 刚刚阅读数: 5
用户头像

分享技术上的点点滴滴! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。

评论

发布
暂无评论
SeaweedFS 高可用方案最佳实践_分布式文件系统_冰心的小屋_InfoQ写作社区