【操作实践】使用JuiceFS降低Elasticsearch存储成本

2022-11-22 10:19:04 浏览数 (1)

本文更偏向于实践操作方向,主要介绍在部署和使用JuiceFS时候的过程记录,以及如何将JuiceFS作为Elasticsearch的冷存储介质。

JuiceFS 是一款面向云原生设计的高性能共享文件系统,在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同时在跨平台、跨地区的不同主机上挂载读写

一. JuiceFS 安装部署&测试

Juice 安装包下载

这里下载的为近期刚发布的V1.0.0稳定版。

代码语言:javascript复制
wget "https://github.com/juicedata/juicefs/releases/download/v1.0.0/juicefs-1.0.0-linux-amd64.tar.gz"

解压缩并将执行文件分发到所有节点

代码语言:javascript复制
tar -zxvf juicefs-1.0.0-linux-amd64.tar.gz

将客户端安装到所有节点的系统环境中

代码语言:javascript复制
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

三. 创建文件系统

代码语言:javascript复制
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 客户端的计算机上都可以同时挂载该文件系统进行共享读写。

代码语言:javascript复制
juicefs mount     
--background     
--cache-dir /mnt/cache     
--cache-size 512000     
"mysql://juicefs:Iic^%xxxxx2TR@(172.1.1.xx:8988)/juicefs"    
 /data1

数据缓存可以有效地提高随机读的性能,对于像 Elasticsearch、ClickHouse 等对随机读性能要求更高的应用,建议将缓存路径设置在速度更快的存储介质上并分配更大的缓存空间。

查看juicefs 是否已经挂载磁盘目录:

代码语言:javascript复制
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

五. Elasticsearch 集群操作

配置warm节点

这里一共有5个es索引节点,分别为:

代码语言:javascript复制
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 文件

代码语言:javascript复制
vim /etc/config/elasticsearch/elasticsearch.yml

需要修改如下两个地址:

  • node.attr.box_type: hot 修改为 :node.attr.box_type: warm

修改elasticsearch es_data目录

将Elasticsearch的数据存储目录软链到JuiceFS的盘目录中,

首先将es_data 目录mv到/data1/warm-1/ 中,然后将es_data的地址软链到/data1/warm-1中

代码语言:javascript复制
mv es_data/ /data1/warm-1/
ln -s /data1/warm-1/es_data es_data

其它的冷数据节点同理

启动elasticsearch 服务

代码语言:javascript复制
./elasticsearch -d

查看集群冷热节点

这里在Kibana中直接输入命令 (如果是调用ES API则 在前面加上 curl -sL http://localhost:9200/cat/nodeattrs?v&h=host,attr,value

代码语言:javascript复制
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

配置索引生命周期(ILM)

这里设定的条件如下:

  1. 每天进行索引切换,索引切换之后新的索引在Hot节点,老索引Move到Warm节点中。
  2. 当索引大小达到了50G时,进行索引切换

创建索引模版,指定ILM策略

代码语言:javascript复制
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"  }}

创建索引

代码语言:javascript复制
PUT log-000001
{
"aliases": {
"log":{
"is_write_index": true
        }
     }
}

至此,所有以log开头的索引,都会被应用ILM的策略,进行定期的冷数据存储,当然,为了更灵活的进行索引转存,我们也可以选择自己调用ES的API来进行设置。

代码语言:javascript复制
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索引管理、对象存储、云上部署等。这些知识点如果读者不明白的话,可以在下方留言回复哦。

0 人点赞