介绍

集群结构
- 采用多节点模式部署,每个节点都支持读写,所有节点将数据索引和元数据统一对接到minio,保证了每一个节点都能写入和查询到索引数据;
- 采用多节点分服务模式部署,所有节点将数据索引和元数据统一对接到minio,写入节点负责将数据流写入到minio索引目录,多个读取节点负责从minio中查询索引数据,每个节点分别专注于读或写,提升节点事务处理效率;

服务名 | 服务 | 说明 |
quickwit1_s3 | Quickwit(可以N个) | 全文搜索引擎(读和写),本例:做为索引器(写) |
quickwit2_s3 | Quickwit(可以N个) | 全文搜索引擎(读和写),本例:做为搜索器(读) |
minio | Minio | 支持s3协议的对象存储服务,存储索引数据块和元数据配置文件 |
Quickwit+S3配置
mkdir -p quickwit1_s3_data
mkdir -p quickwit2_s3_data

mkdir -p config
从官方github源码工程中下载默认yaml配置文件;
https://github.com/quickwit-oss/quickwit/blob/main/config/quickwit.yaml
将quickwit.yaml分别置放到quickwit1_s3_data/config 和 quickwit2_s3_data/config 文件夹下,后续创建docker容器启动Quickwit服务时,将会加载该yaml配置文件;需置放在docker服务主机物理目录,容器外维护,容器内卷映射;

# 打开storage.s3注释(需要注意原yaml默认配置注释前为#+空格,去掉#符号后还需要多删一位空格,否则启动服务会提示yaml加载失败,格式错误)
storage:s3:flavor: ${QW_S3_FLAVOR} # 默认配置中无此参数,手动添加access_key_id: ${AWS_ACCESS_KEY_ID} # s3的用户名secret_access_key: ${AWS_SECRET_ACCESS_KEY} # s3的密码region: ${AWS_REGION} # 域endpoint: ${QW_S3_ENDPOINT} #服务地址+端口,http://s3_host:9010force_path_style_access: ${QW_S3_FORCE_PATH_STYLE_ACCESS:-false} # falsedisable_multi_object_delete: false # 是否禁用删除对象数据disable_multipart_upload: false # 是否禁用上传对象数据# 添加存储和元数据存储配置s3路径
metastore_uri: s3://${QW_S3_BUCKET}/indexes#polling_interval=30s
default_index_root_uri: s3://${QW_S3_BUCKET}/indexes
打开yaml中的s3注释,修改后如下:

创建Docker容器
创建MinIO存储


创建第一个Quickwit写节点
Name: quickwit1_s3
Image:quickwit/quickwit:latest
Prot mapping:7281 -> 7280 # (因docker主机上的7280已被使用,更换为7281)


-v /opt/docker/sysdata/quickwit1_s3_data:/quickwit/qwdata
-v /opt/docker/sysdata/quickwit1_s3_data/config:/quickwit/config
在Volumes中将对应的卷配置设为Bind,如果已创建docker服务主机上的卷目录,也可以使用Voume模式选择可用卷;


QW_S3_FLAVOR: minio # 存储类型 minio
QW_S3_ENDPOINT: http://192.168.1.3:9010 # 注意,默认minio端口为9000,因被占用更换成9010
QW_S3_BUCKET: quickwit # minio服务中的存储桶名
AWS_ACCESS_KEY_ID: quickwit_s3 # minio服务的账户名
AWS_SECRET_ACCESS_KEY: quickwit_s3_123456 #inio服务的密码
AWS_REGION:us-east-1 #默认区域
确认各项目配置无误后,点击"Deploy the container" 发布docker容器并启动Quickwit服务;
创建第二个Quickwit读节点
Name:quickwit2_s3
# 在Volumes中
container:/quickwit/qwdata host:/opt/docker/sysdata/quickwit1_s3_data
container:/quickwit/config host:/opt/docker/sysdata/quickwit1_s3_data/config
所有基于quickwit镜像的docker容器,创建完毕并启动后,在Portainer》Containers中可查看已成功运行的quickwit服务;如服务启动失败,可点击第列表中第一个文件图标查看docker容器运行日志进行排查;



创建Quickwit索引数据
package com.example;import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;public class PullToQuickwitTest {private static HttpClient httpClient = HttpClient.newHttpClient();private final static String QUICKWIT_URL = "http://192.168.1.3:7281/";public static void main(String[] args) throws Exception {String indexId = "hdfs-logs2";String jsonData = """{"timestamp":1739191718,"tenant_id": 1,"app_id": 1111,"body":"foo"}{"timestamp":1739191758,"tenant_id": 2,"app_id": 1111,"body":"bar"}{"timestamp":1739191798,"tenant_id": 3,"app_id":"1111","body":"baz"}""";String url = "api/v1/" + indexId + "/ingest?commit=force";System.out.println("请求:" + url);HttpRequest request = HttpRequest.newBuilder().uri(new URI(QUICKWIT_URL + url)).header("Content-Type", "application/json; charset=UTF-8" ).header("Timeout", "5000").POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("状态码:" + response.statusCode());System.out.println("响应:" + response.body());}
}
执行无异常后,quickwit服务会返回本次成功提交的数据条数;IDEA控制台打印如下:

查看索引数据

