ManticoreSearch-(安装配置)-学习总结
- 基础概念
- 安装搭建
- 集群搭建(基于K8S)
原文地址 https://blog.csdn.net/liuyij3430448/article/details/135955025
基础概念
Manticore Search是一个专门为搜索设计的多存储数据库,具有强大的全文搜索功能,适用于小型和大型数据集。
作为一个开源数据库(可在GitHub上获得),Manticore Search创建于2017年,是Sphinx搜索引擎的延续。采用了Sphinx的所有最佳特性,并显著改进了它的功能
Manticore Search现在是一个现代、快速、轻量级的数据库,具有完整的功能和出色的全文搜索功能。
Manticore的主要特点是:
- 超过20个全文运算符和超过20个排名因子
- 自定义排序
- 阻止
- 词元化
- 停词
- 同义词
- 单词形式
- 字符和单词级别的更先进的token
- 特有的汉语分词
- 文本高亮
ManticoreSearch 支持两种方式的存储(详细见《ManticoreSearch-(表操作)-学习总结.md》)
- row-wise 行存储
- columnar 列式存
安装搭建
Linux ubuntu安装
注意ubuntu版本至少18 (测试发现16版本的ubuntu系统安装失败)
lsb_release -a
安装步骤
wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
sudo dpkg -i manticore-repo.noarch.deb
sudo apt update
sudo apt install manticore manticore-extra
systemctl start manticore 启动 ManticoreSearch
此方案安装的ManticoreSearch 默认已经安装【列存储】
默认情况下,Manticore 在以下端口等待连接:
- 用于 MySQL 客户端的端口为 9306
- 用于 HTTP/HTTPS 连接的端口为 9308
- 用于其他 Manticore 节点和基于 Manticore 二进制 API 的客户端的端口为 9312
相关命令
当使用 DEB 或 RPM 包安装 Manticore Search 时,searchd 进程可以由操作系统的 init 系统运行和管理,大多数 Linux 版本现在使用 systemd
要检查平台使用的 init 系统
ps --no-headers -o comm 1
Manticore Search服务主要命令:
- systemctl status manticore 查看manticore 状态
- systemctl start manticore 启动manticore
- systemctl stop manticore 停止manticore
- systemctl restart manticore 重启manticore
- systemctl is-enabled manticore 查看是否开启开机启动
- systemctl disable manticore 禁止开机启动
- systemctl enable manticore 开机启动
- journalctl -u manticore 查看运行日志
Docker 安装 (单机版)
注意某些版本docker镜像启动后一直阻塞不出现accepting connections或者报错,没找到原因
本例子使用版本 manticoresearch/manticore:6.0.4
测试发现manticoresearch/manticore:4.2.0 , 5.0.2 docker镜像也可以正常使用
docker镜像地址 https://hub.docker.com/r/manticoresearch/manticore
docker镜像地址说明地址 https://github.com/manticoresoftware/docker/tree/6.0.4
几个测试后可以正常使用的镜像地址:
-
6.0.4 镜像 https://hub.docker.com/layers/manticoresearch/manticore/6.0.4/images/sha256-9d186f65889556f66fd6e98c2d9bb97501ec52bef750784ef9cdb607fdbf59d8?context=explore
-
5.0.2 镜像 https://hub.docker.com/layers/manticoresearch/manticore/5.0.2/images/sha256-b92224736f99b6e0e692f46e6f83c8f45d2192a69d7848913030b1016fe1404d?context=explore
-
4.2.0 镜像 https://hub.docker.com/layers/manticoresearch/manticore/4.2.0/images/sha256-b49a09d569838908bd9759d99eaf2807a2f851aadfeff422cf754addbb4bc3ac?context=explore
注意:5.0.2 ,4.2.0 没有安装Manticore Columnar Library 无法使用列存储引擎
Docker 命令启动
注意: 生产使用MmanticoreSearch最好把数据挂载到指定磁盘
例如
- 1 使用主机 /devops/manticoresearch/data 文件夹来挂载数据盘
- 2 使用主机 /devops/manticoresearch/manticore.conf 配置文件来作为容器配置文件
manticore.conf 配置文件内容如下:
searchd {
listen = 0.0.0.1:9312
listen = 0.0.0.0:9306:mysql
listen = 0.0.0.0:9308:http
log = /var/log/manticore/searchd.log
query_log = /var/log/manticore/query.log
pid_file = /var/run/manticore/searchd.pid
data_dir = /var/lib/manticore
}
运行ManticoreSearch
docker run -e EXTRA=1 --name manticore -v /devops/manticoresearch/manticore.conf:/etc/manticoresearch/manticore.conf -v /devops/manticoresearch/data:/var/lib/manticore/ -p 9306:9306 -p 9308:9308 -d manticoresearch/manticore:6.0.4
注意如果要开启安装列存储需要指定环境变量:
- -e EXTRA=1 开启安装列存储和二级索引
- -e MCL=1 只开启安装列存储
- -e TZ=Asia/Shanghai 指定容器时区 (测试发现没有效果)
安装依赖包可能比较耗时
使用docker logs -f 查看日志 出现 accepting connections 表示启动成功
测试使用 ManticoreSearch http
建表
curl -sX POST http://localhost:9308/cli -d 'CREATE TABLE testrt ( title text, content text, gid integer)'
插入数据
curl -sX POST http://localhost:9308/insert -d'{"index":"testrt","id":1,"doc":{"title":"Hello","content":"world","gid":1}}'
查询数据
curl -sX POST http://localhost:9308/search -d ' {"index":"testrt","query":{"match":{"*":"hello world"}}}'
测试使用 ManticoreSearch Mysql 客户端
使用mysql 命令连接 ManticoreSearch
mysql -h 192.168.0.20 -P 9306
-h 指定ip
-P 指定端口
可以看到刚才创建的表
可以使用操作mysql的方式操作ManticoreSearch
ManticoreSearch 集群 (基于K8S)
Manticore Search是一个高度分布式的系统,它提供了所有必要的组件来创建一个高可用性和可扩展的搜索数据库包括:
- 用于分片的分布式表
- 镜像实现高可用性
- 可伸缩性的负载平衡
- 数据安全复制
官网提供一个 基于docker-compose 方式的集群 https://manual.manticoresearch.com/Starting_the_server/Docker#Multi-node-cluster-with-replication 此方式容器部署在同一个机器上
本例子使用k8s来部署Manticore Search,启动两个pod 分别部署在不同的节点服务器上
部署ManticoreSearch
k8s集群结构如下:
将ManticoreSearch分别部署在u2-node 与 u3-node 并实现与主机卷的挂载。
为了测试当一台ManticoreSearch服务宕机后集群可以继续使用,整体配置文件准备了三个 (真实场景使用一个合并文件即可):
- a-deploy.yaml 部署A ManticoreSearch
- b-deploy.yaml 部署B ManticoreSearch
- service.yaml 配置一个 service 可以访问http 和 mysql
a-deploy.yaml 与 b-deploy.yaml内容基本一致仅修改名称
a-deploy.yaml内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: manticore-search-a-dp
spec:
replicas: 1
selector:
matchLabels:
app: manticore-search-a
template:
metadata:
labels:
app: manticore-search-a
search: ms #一个公共的标签用于service 发现
spec:
nodeSelector:
kubernetes.io/hostname: "u2-node" #直接部署在节点u2-node上
# hostname + subdomain 自定义Pod的域名
# manticore-search-a-host.manticore-search-a-domain.default.svc.cluster.local
hostname: manticore-search-a-host
subdomain: manticore-search-a-domain
volumes:
- name: "msdata"
hostPath:
# 宿主机文件夹 保存数据
path: /devops/manticoresearch/data
- name: "msconfig"
hostPath:
# 宿主机文件夹 保存配置文件
path: /devops/manticoresearch/config
containers:
- name: manticore-search-a-containers
image: manticoresearch/manticore:6.0.4
volumeMounts:
#容器内部的文件夹
# 此配置将容器内部/var/lib/manticore 挂载到 宿主机/devops/manticoresearch/data
- mountPath: "/var/lib/manticore"
#使用volumes:中配置的卷 (msdata)
name: "msdata"
- mountPath: "/etc/manticoresearch"
name: "msconfig"
imagePullPolicy: IfNotPresent #Always
env:
- name: "EXTRA" #开启安装列存储和二级索引
value: "1"
ports:
- containerPort: 9308
protocol: TCP
name: http
- containerPort: 9306
protocol: TCP
name: mysql
- containerPort: 9312
protocol: TCP
name: node
- containerPort: 9315
protocol: TCP
name: replication
---
# 集群内域名
apiVersion: v1
kind: Service
metadata:
name: manticore-search-a-domain
spec:
selector:
app: manticore-search-a
clusterIP: None
service.yaml内容如下:
# http访问service
apiVersion: v1
kind: Service
metadata:
name: manticore-search-http
spec:
ports:
- protocol: TCP
port: 9308
targetPort: 9308
nodePort: 9308
name: http
selector:
search: ms
type: NodePort
---
# mysql访问service
apiVersion: v1
kind: Service
metadata:
name: manticore-search-mysql
spec:
ports:
- protocol: TCP
port: 9306
targetPort: 9306
nodePort: 9306
name: mysql
selector:
search: ms
type: NodePort
再部署ManticoreSearch之前先在u2-node 与 u3-node主机上创建文件夹和配置文件 用于挂载
配置文件manticore.conf内容如下:
#!/bin/sh
ip=`hostname -i|rev|cut -d\ -f 1|rev`
cat << EOF
searchd {
listen = $ip:9312
listen = 0.0.0.0:9306:mysql
listen = 0.0.0.0:9308:http
listen = $ip:9315-9325:replication
log = /var/log/manticore/searchd.log
query_log = /var/log/manticore/query.log
pid_file = /var/run/manticore/searchd.pid
data_dir = /var/lib/manticore
}
EOF
执行kubectl apply -f 创建容器
安装过程会下载安装依赖包可能比较耗时
当出现accepting connections表示启动成功
测试使用service连接成功
创建集群
容器部署完成后即可开始创建集群
执行如下步骤:
登录到A容器内部, 使用mysql客户端连接
kubectl exec -it manticore-search-a-dp-6698f9bbcd-gkchh bash
创建集群
create cluster mycluster;
创建表
create table user(id int ,name string,job string,memo text);
为集群添加表
alter cluster mycluster add user;
查看集群状态
show status;
show status like '%cluster%';
完成以上步骤集群创建完成
加入集群
执行如下步骤:
登录到B容器内部, 使用mysql客户端连接
kubectl exec -it manticore-search-b-dp-65995646b6-99n2b bash
加入集群(这里使用A容器的域名)
join cluster mycluster at 'manticore-search-a-host.manticore-search-a-domain.default.svc.cluster.local:9312';
查看表
show tables;
添加一条数据
insert into mycluster:user (id ,name ,job ,memo ) VALUES ( 1,'刘一江','java程序员','一个程序员小卡拉米');
再次登录到A容器内部, 使用mysql客户端连接
kubectl exec -it manticore-search-a-dp-6698f9bbcd-gkchh bash
查看数据
select * from user;
一些常用命令:
- 1 集群中加表: ALTER CLUSTER <cluster_name> ADD <table_name>
- 2 集群中删表:ALTER CLUSTER <cluster_name> DROP <table_name>