本文更偏向于实践操作方向,主要介绍在部署和使用JuiceFS时候的过程记录,以及如何将JuiceFS作为Elasticsearch的冷存储介质。
JuiceFS 是一款面向云原生设计的高性能共享文件系统,在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写
这里下载的为近期刚发布的V1.0.0稳定版。
wget "https://github.com/juicedata/juicefs/releases/download/v1.0.0/juicefs-1.0.0-linux-amd64.tar.gz"
解压缩并将执行文件分发到所有节点
tar -zxvf juicefs-1.0.0-linux-amd64.tar.gz
将客户端安装到所有节点的系统环境中
sudo install juicefs /usr/local/bin
ansible host -m copy -a "src=/root/juicefs dest=/usr/local/bin"
ansible host -m shell -a "chmod +x /usr/local/bin/juicefs"
这里我们使用RDS作为JuiceFS的元数据存储,更多的其它元数据存储引擎可以参考:如何设置元数据引擎 | JuiceFS Document Center
三. 创建文件系统
juicefs format \
--storage ks3 \
--bucket https://elasticsearch-juicefs-vol.xxxxx.xxxxx.xxx.com \
--access-key ${access-key}\--secret-key ${secret-key} \
"mysql://juicefs:Iic^xxxxxxx2TR@(172.1.1.66:8988)/juicefs" \
elastic-cluster
2022/08/15 08:56:09.632512 juicefs[9051] <INFO>: Meta address: mysql://juicefs:****@(172.1.1.xx:8988)/juicefs [interface.go:402]
2022/08/15 08:56:09.636482 juicefs[9051] <INFO>: Data use s3://elasticsearch-juicefs-vol/elastic-cluster/ [format.go:435]
2022/08/15 08:56:10.169479 juicefs[9051] <INFO>: Volume is formatted as {"Name": "elastic-cluster","UUID": "71a64ddd3afc-4eb8-a64e-e80ff0cab4db","Storage": "s3", "Bucket": "https://elasticsearch-juicefs.xxxxx.xxx.com", "AccessKey": "xxxxxxxxxx","SecretKey": "removed","BlockSize": 4096,"Compression": "none","KeyEncrypted": true,"TrashDays": 1,"MetaVersion": 1} [format.go:472]
文件系统一经创建,相关的信息包括名称、对象存储、访问密钥等信息会完整的记录到数据库中。在当前的示例中,文件系统的信息被记录在 Redis 数据库中,因此在任何一台计算机上,只要拥有数据库地址、用户名和密码信息,就可以挂载读写该文件系统 --- from juicefs doc
由于这个文件系统的「数据」和「元数据」都存储在基于网络的云服务中,因此在任何安装了 JuiceFS 客户端的计算机上都可以同时挂载该文件系统进行共享读写。
juicefs mount \
--background \
--cache-dir /mnt/cache \
--cache-size 512000 \
"mysql://juicefs:Iic^%xxxxx2TR@(172.1.1.xx:8988)/juicefs" \
/data1
数据缓存可以有效地提高随机读的性能,对于像 Elasticsearch、ClickHouse 等对随机读性能要求更高的应用,建议将缓存路径设置在速度更快的存储介质上并分配更大的缓存空间。
查看juicefs 是否已经挂载磁盘目录:
df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 16K 7.8G 1% /dev/shm
tmpfs 7.8G 17M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vda1 19G 5.2G 13G 30% /
/dev/vdb 1.8T 121M 1.8T 1% /mnt
tmpfs 1.6G 0 1.6G 0% /run/user/1001
tmpfs 1.6G 0 1.6G 0% /run/user/1002
tmpfs 1.6G 0 1.6G 0% /run/user/0
JuiceFS:elastic-cluster 1.0P 0 1.0P 0% /data1
这里一共有5个es索引节点,分别为:
cat /etc/hosts
172.1.0.xx es-data-1
172.1.0.7 es-data-2
172.1.0.9 es-data-3
172.1.0.71 es-data-4
172.1.0.11 es-data-5
将data-4,data-5 配置为warm节点,并将es数据写入路径设置为juicefs的盘
修改elasticsearch.yml 文件
vim /etc/config/elasticsearch/elasticsearch.yml
需要修改如下两个地址:
node.attr.box_type: hot
修改为 :node.attr.box_type: warm
将Elasticsearch的数据存储目录软链到JuiceFS的盘目录中,
首先将es_data 目录mv到/data1/warm-1/ 中,然后将es_data的地址软链到/data1/warm-1中
mv es_data/ /data1/warm-1/
ln -s /data1/warm-1/es_data es_data
其它的冷数据节点同理
启动elasticsearch 服务
./elasticsearch -d
这里在Kibana中直接输入命令 (如果是调用ES API则 在前面加上 curl -sL http://localhost:9200/cat/nodeattrs?v&h=host,attr,value
GET _cat/nodeattrs?v&h=host,attr,valuehost attr value172.1.0.9 ml.machine_memory 16656543744172.1.0.9 ml.max_open_jobs 20172.1.0.9 xpack.installed true172.1.0.9 box_type hot172.1.0.9 ip 172.1.0.9172.1.0.7 ml.machine_memory 16656551936172.1.0.7 ml.max_open_jobs 20172.1.0.7 xpack.installed true172.1.0.7 box_type warm172.1.0.7 ip 172.1.0.7172.1.0.171 ml.machine_memory 16656551936172.1.0.171 ml.max_open_jobs 20172.1.0.171 xpack.installed true172.1.0.171 box_type warm172.1.0.171 ip 172.1.0.171172.1.0.47 ml.machine_memory 16656551936172.1.0.47 ml.max_open_jobs 20172.1.0.47 xpack.installed true172.1.0.47 box_type hot172.1.0.47 ip 172.1.0.47172.1.0.214 ml.machine_memory 16656551936172.1.0.214 ml.max_open_jobs 20172.1.0.214 xpack.installed true172.1.0.214 box_type hot172.1.0.214 ip 172.1.0.214
这里设定的条件如下:
PUT _template/log_template{ "index_patterns" : ["log-*"],"settings": {"index.number_of_shards": 5,"index.number_of_replicas": 1,"index.routing.allocation.require.box_type":"hot","index.lifecycle.name": "juicefs-policy", "index.lifecycle.rollover_alias": "log" }}
PUT log-000001
{
"aliases": {
"log":{
"is_write_index": true
}
}
}
至此,所有以log开头的索引,都会被应用ILM的策略,进行定期的冷数据存储,当然,为了更灵活的进行索引转存,我们也可以选择自己调用ES的API来进行设置。
curl -H 'Content-Type: application/json' -XPUT "127.0.0.1:9200/log-indices/_settings" -d '{
"index": {
"routing": {
"allocation": {
"require": {
"box_type": "warm"
}
}
}
}
}'
}
使用效果:
在使用Juicefs之前,我们线上集群全部使用的 SSD云硬盘,单个集群存储大小在100TB+,存储成本大约在0.8元/月/G(按照云厂商官网标准价格计算),整体算下来大概是5万左右的成本。
在使用JuiceFS之后,我们将一部分数据(取决于我们自身索引策略),迁移到了对象存储中,这部分的存储成本大约是0.12/月/1G(按照官网标准价格计算)
关于本文的一些核心知识点,可以自行网络搜索补充,或者后台留言回复,主要包括:
ES生命周期管理、JuiceFS的核心原理、ES索引管理、对象存储、云上部署等。这些知识点如果读者不明白的话,可以在下方留言回复哦。