X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES70+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。
自68以及71+版本之后,基础级安全永久免费。
默认情况下,拥有安全免费许可证时,Elasticsearch安全功能被禁用。 要启用安全功能,需要设置xpacksecurityenabled。
在每个节点的elasticsearchyml配置文件中,新增:
使用范围:配置传输层安全性适用于具有多个节点的集群以及需要外网通信访问的单节点ES。
使用环回地址127001的单节点ES可以不用配置。
Elasticsearch节点可能存储是机密的数据,而无处不在的网络攻击对这些数据垂涎欲滴。
网络攻击包括对数据的嗅探,对数据的 *** 纵,以及试图获得对服务器的访问权限,进而访问存储数据的文件。
保护节点的安全有助于降低来自网络的攻击的风险 。
1、证书实现加密通信的原理
TLS需要X509证书(X509 证书是一个数字证书,它使用 X509 公有密钥基础设施标准将公有密钥与证书中包含的身份相关联。X509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X509 证书。只有证书颁发机构才有权访问 CA 证书)才能对与之通信的应用程序执行加密和身份验证。 为了使节点之间的通信真正安全, 必须对证书进行验证 。
在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。
这样,只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。
2、借助elasticsearch-certutil命令生成证书
启用安全功能后,必须使用TLS来确保节点之间的通信已加密。
在elasticsearchyml中心新增配置如下:
借助:elasticsearch-setup-passwords 设置集群密码。
核心:
auto - 随机生成密码。
interactive - 自定义不同用户的密码。
注意:必须配置好xpack之后,才能设置密码。否则会报错。
最简单的方法,
假定是初始部署集群阶段。
X-Pack安全配置的核心三步骤:
这些对于安全来说只是皮毛,更多的角色、权限、Space需要借助Kibana实现。
51 pom文件
52修改配置文件
GitHub的地址:
>
先假设有主机 A 和 B ( Linux 系统),主机 A 的 IP 分别是 1234 (当然,也可以是动态的),主机 B 的 IP 是 5678 。两个主机都装上了 PHP+Mysql ,现在 *** 作的是主机 A 上的资料,如果另外一个主机 B 想跟 A 的资料进行同步,应该怎么做呢?
OK,我们现在就动手。
首先,如果要想两个主机间的资料同步,一种方法就是主机 A 往主机 B 送资料,另外一种主法就是主机 B 到主机 A 上拿资料,因为 A 的 IP 是动态的(假设),所以我们就得从主机 A 往主机 B 送资料。
在主机 B 上创建一个 Mysql 账户。
# GRANT ALL ON test TO user@% IDENTIFIED BY "password"; //创建用户 user,可以从任何机器访问到主机 B 上的 test 数据库。
如果这里显示错误,先把 % 改为一个 IP ,然后再利用 phpMyAdmin 把 IP 改为 % ,测试无误后就可以写 php 程序。
<
$link=mysql_pconnect("localhost","user","password");
mysql_pconnect("localhost","user","password"); //连接本机(主机A)的数据库
mysql_select_db("test"); //选择数据库test
$re=mysql_query("select from table order by id desc");
$num=mysql_numrows($re);
if (!empty($num)) {
$id=mysql_result($re,0,"id"); //获得本机table表的最大ID
}
mysql_close($link); //关闭与本机数据库的连接
$link=mysql_pconnect("5678","test","test");
mysql_pconnect("5678","test","test"); //连接主机B的数据库
mysql_select_db("test"); //选择数据库test,此数据库应该与主机A上test数据库的结构一样。
$re=mysql_query("select from table order by id desc");
$num=mysql_numrows($re);
if (!empty($num)) {
$remote_id=mysql_result($re,0,"id"); //获得主机Btable表的最大ID
}
if ($id>$remote_id) {
$result_id=$id-$remote_id; //如果主机A中table的最大ID大于主机B中table表的最大ID,说明两个
} 的资料不同
mysql_close($link); //关闭主机B的数据库连接
$link=mysql_pconnect("localhost","user","password");
mysql_pconnect("localhost","user","password");
mysql_select_db("test");
if (empty($result_id)) $result_id=0;
if (empty($remote_id)) $remote_id=0; //如果主机B中的table的最大ID为空(里面没有资料),那么就等0
$re=mysql_query("select from table limit $remote_id,$result_id"); //取出主机A中table表与主机B中table表里不同的资料
$num=mysql_numrows($re);
if (!empty($num)) {
for ($i=0;$i<$num;$i++) {
$test[$i]=mysql_result($re,$i,"test"); //把不同的资料放入一个数组里
}
}
mysql_close($link); //关闭主机A的数据库连接
$link=mysql_pconnect("5678","user","password");
mysql_pconnect("5678","user","pasword");
mysql_select_db("test");
for ($j=0;$j<$i;$j++) { //这里的i等于在比较主机A与主机B上table表不同资料的数量
mysql_query("insert into table (test) values(\'$test[$j]\')");
}
mysql_close($link); //关闭主机B的数据库连接
>
这时就初步实现了 A 主机和 B 主机数据的同步,但现在还需要人手动每次去激活这个程序,有没有办法把它作为一个脚本一样的,放在 crontab 里面指定时间自动执行呢?
在安装 php 时会自动生一个叫 php 的可执行文件,一般在/你安装的 php 目录 /bin 下面,不过较底的版本好像没有,如果没有这个文件,你就得升级你的 php 。
#php -q testphp
php 原本是应用在网页应用的﹐因此它会送出 HTML 的 Header﹐但是在此我们是要将 php 用作 Shell Script﹐"-q" 就是表示不要送出 Header 的意思
最后编辑 /etc/crontab 里的文件,加上下面这一句。
0 0 root /home/>
我们使用Elasticsearch存储的文档数量接近50亿(算上1份复制,接近
100亿文档),总共10个数据节点和2个元数据节点(48GB内存,8核心CPU,ES使用内存达到70%),每天的文档增量大概是3000W条(速度
持续增加中)。目前来看,单个文档的查询效率基本处于实时状态;对于1到2周的数据的聚合统计 *** 作也可以在10秒之内返回结果。
但是,还有提升的空间:
1 对于查询单条数据的应用场景来说,我们可以使用ES的路由机制,将同一索引内的具有相同特征(比如具有相同的userid)的文档全部存储于一个节点上,这样我们之后的查询都可以直接定位到这个节点上,而不用将查询广播道所有的节点上;
2 随着数据节点的增加,适当增加分片数量,提升系统的分布水平,也可以通过分而治之的方式优化查询性能;
个人以为Elasticsearch作为内部存储来说还是不错的,效率也基本能够满足,在某些方面替代传统DB也是可以的,前提是你的业务不对 *** 作的事
性务有特殊要求;而权限管理也不用那么细,因为ES的权限这块还不完善。由于我们对ES的应用场景仅仅是在于对某段时间内的数据聚合 *** 作,没有大量的单文
档请求(比如通过userid来找到一个用户的文档,类似于NoSQL的应用场景),所以能否替代NoSQL还需要各位自己的测试。如果让我选择的话,我
会尝试使用ES来替代传统的NoSQL,因为它的横向扩展机制太方便了。
一、背景
随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。
使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。
二、现有方法及问题
对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的 Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上一次读取时间的所有数据,即该段时间内的增量,写入Elasticsearch。
所以,一旦业务逻辑中有相应字段的数据变更,需要同时顾及 MySQL 中间表的变更;如果需要 Elasticsearch 中的数据即时性较高,还需要同时写入 Elasticsearch。
随着业务数据越来越多,MySQL 中间表的数据量越来越大。当需要在 Elasticsearch 的索引中新增 Mapping 字段时,相应的 MySQL 中间表也需要新增列,在数据量庞大的表中,扩展列的耗时是难以忍受的。
而且 Elasticsearch 索引中的 Mapping 字段随着业务发展增多,需要由业务方增加相应的写入 MySQL 中间表方法,这也带来一部分开发成本。
三、方案设计
1 整体思路
现有的一些开源数据同步工具,如阿里的 DataX 等,主要是基于查询来获取数据源,这会存在如何确定增量(比如使用utime字段解决等)和轮询频率的问题,而我们一些业务场景对于数据同步的实时性要求比较高。为了解决上述问题,我们提出了一种基于 MySQL Binlog 来进行 MySQL 数据同步到 Elasticsearch 的思路。Binlog 是 MySQL 通过 Replication 协议用来做主从数据同步的数据,所以它有我们需要写入 Elasticsearch 的数据,并符合对数据同步时效性的要求。
使用 Binlog 数据同步 Elasticsearch,业务方就可以专注于业务逻辑对 MySQL 的 *** 作,不用再关心数据向 Elasticsearch 同步的问题,减少了不必要的同步代码,避免了扩展中间表列的长耗时问题。
经过调研后,我们采用开源项目 go-mysql-elasticsearch 实现数据同步,并针对马蜂窝技术栈和实际的业务环境进行了一些定制化开发。
2 数据同步正确性保证
公司的所有表的 Binlog 数据属于机密数据,不能直接获取,为了满足各业务线的使用需求,采用接入 Kafka 的形式提供给使用方,并且需要使用方申请相应的 Binlog 数据使用权限。获取使用权限后,使用方以 Consumer Group 的形式读取。
这种方式保证了 Binglog 数据的安全性,但是对保证数据同步的正确性带来了挑战。因此我们设计了一些机制,来保证数据源的获取有序、完整。
1) 顺序性
通过 Kafka 获取 Binlog 数据,首先需要保证获取数据的顺序性。严格说,Kafka 是无法保证全局消息有序的,只能局部有序,所以无法保证所有 Binlog 数据都可以有序到达 Consumer。
但是每个 Partition 上的数据是有序的。为了可以按顺序拿到每一行 MySQL 记录的 Binglog,我们把每条 Binlog 按照其 Primary Key,Hash 到各个 Partition 上,保证同一条 MySQL 记录的所有 Binlog 数据都发送到同一个 Partition。
如果是多 Consumer 的情况,一个 Partition 只会分配给一个 Consumer,同样可以保证 Partition 内的数据可以有序的 Update 到 Elasticsearch 中。
2) 完整性
考虑到同步程序可能面临各种正常或异常的退出,以及 Consumer 数量变化时的 Rebalance,我们需要保证在任何情况下不能丢失 Binlog 数据。
利用 Kafka 的 Offset 机制,在确认一条 Message 数据成功写入 Elasticsearch 后,才 Commit 该条 Message 的 Offset,这样就保证了数据的完整性。而对于数据同步的使用场景,在保证了数据顺序性和完整性的情况下,重复消费是不会有影响的。
四、技术实现
1 功能模块
配置解析模块
负责解析配置文件(toml 或 json 格式),或在配置中心(Skipper)配置的 json 字符串。包括 Kafka 集群配置、Elasticsearch 地址配置、日志记录方式配置、MySQL 库表及字段与 Elasticsearch 的 Index 和 Mapping 对应关系配置等。
规则模块
规则模块决定了一条 Binlog 数据应该写入到哪个 Elasticsearch 索引、文档_id 对应的 MySQL 字段、Binlog 中的各个 MySQL 字段与索引 Mapping 的对应关系和写入类型等。
在本地化过程中,根据我们的业务场景,增加了对 MySQL 表各字段的 where 条件判断,来过滤掉不需要的 Binlog 数据。
Kafka 相关模块
该模块负责连接 Kafka 集群,获取 Binlog 数据。
Binlog 数据解析模块
原项目中的 Binlog 数据解析针对的是原始的 Binlog 数据,包含了解析 Replication 协议的实现。在我们的使用场景中,Binlog 数据已经是由 canal 解析成的 json 字符串,所以对该模块的功能进行了简化。
binlog json字符串示例
上面是一个简化的 binlog json 字符串,通过该条 binlog 的 database 和 table 可以命中一条配置规则,根据该配置规则,把 Data 中的 key-value 构造成一个与对应 Elasticsearch 索引相匹配的 key-value map,同时包括一些数据类型的转换:
Elasticsearch相关模块
Binlog 数据解析模块生成的 key-value map,由该模块拼装成请求_bulk 接口的 update payload,写入 Elasticsearch。考虑到 MySQL 频繁更新时对 Elasticsearch 的写入压力,key-value map 会暂存到一个 slice 中,每 200ms 或 slice 长度达到一定长度时(可以通过配置调整),才会调用 Elasticsearch 的_bulk 接口,写入数据。
2 定制化开发
1) 适应业务需求
upsert
业务中使用的索引数据可能是来自多个不同的表,同一个文档的数据来自不同表的时候,先到的数据是一条 index,后到的数据是一条 update,在我们无法控制先后顺序时,需要实现 upsert 功能。在_bulk 参数中加入
Filter
实际业务场景中,可能业务需要的数据只是某张表中的部分数据,比如用 type 字段标识该条数据来源,只需要把 type=1或2的数据同步到 Elasticsearch 中。我们扩展了规则配置,可以支持对 Binlog 指定字段的过滤需求,类似:
2)快速增量
数据同步一般分为全量和增量。接入一个业务时,首先需要把业务现有的 历史 MySQL 数据导入到 Elasticsearch 中,这部分为全量同步。在全量同步过程中以及后续增加的数据为增量数据。
在全量数据同步完成后,如果从最旧开始消费 Kafka,队列数据量很大的情况下,需要很长时间增量数据才能追上当前进度。为了更快的拿到所需的增量 Binlog,在 Consumer Group 消费 Kafka 之前,先获取各个 Topic 的 Partition 在指定时间的 offset 值,并 commit 这些 offset,这样在 Consumer Group 连接 Kafka 集群时,会从刚才提交的 offset 开始消费,可以立即拿到所需的增量 Binlog。
3) 微服务和配置中心
项目使用马蜂窝微服务部署,为新接入业务提供了快速上线支持,并且在业务 Binlog 数据突增时可以方便快速的扩容 Consumer。
马蜂窝配置中心支持了各个接入业务的配置管理,相比于开源项目中的 toml 格式配置文件,使用配置中心可以更方便的管理不同业务不同环境的配置。
五、日志与监控
从上图中可以看出,订单各个表的数据同步延时平均在 1s 左右。把延时数据接入 ElastAlert,在延时数据过多时发送报警通知。
另一个监控指标是心跳检测,单独建立一张独立于业务的表,crontab 脚本每分钟修改一次该表,同时检查上一次修改是否同步到了指定的索引,如果没有,则发送报警通知。该心跳检测,监控了整个流程上的 Kafka、微服务和 ES,任何一个会导致数据不同步的环节出问题,都会第一个接到通知。
六、结语
目前接入的最重要业务方是电商的订单索引,数据同步延时稳定在 1s 左右。这次的开源项目本地化实践,希望能为一些有 Elasticsearch 数据同步需求的业务场景提供帮助。
这里介绍的是skywalking的8X版本的安装,老版本的6x的和他有点不一样
升级elasticsearch版本790,oap版本为810,UI版本为810
docker官网
基础镜像
安装elasticsearch
检查启动情况
创建持久化目录,并重启启动elasticsearch
官网地址
基础镜像
注意事项:SW_STORAGE参数严格区分elasticsearch的版本
docker官网
基础镜像
注意:这里映射的端口为8088,防止端口冲突。
启动ui
在window系统中使用google浏览器访问skywalking-ui界面
java代码内创建mysql索引_如何利⽤Java代码 *** 作索引库?今天是刘⼩爱⾃学Java的第161天。
感谢你的观看,谢谢你。
学习计划安排如下:学了⼏天的Elasticserch,但都是它本⾝的知识点,如何通过Java语⾔去 *** 作它呢?
这就好⽐以前学数据库,在数据库⼯具中通过sql语句也能实现增删改查,⽽在Java中就可以通过jdbc *** 作数据库。
这⾥不学原⽣的Elasticsearch客户端,⽽是直接学习spring提供的套件:SpringDataElasticsearch。
毕竟要知道,我们以前也基本没⽤原⽣的jdbc,⽽是⽤的框架,使⽤起来也简便。
⼀、创建Demo⼯程
关于SpringDataElasticsearch介绍:
学Java有⼀个绕不开的坎就是spring,就是主流的很多功能都会看到spring的影⼦。
我们已经接触过了的就有:SpringMVC、Spring、SpringBoot、SpringCloud。
今天继续接触Spring Data中的⼀个模块。
为了更好地学习,创建⼀个demo⼯程。
通过spring脚⼿架创建项⽬
①Spring Initializr
使⽤idea开发⼯具创建Java项⽬有多种⽅式,以前就是通过Maven⾃⾏创建⼀个项⽬。
也可以通过Spring Initializr创建⼀个项⽬。
②说明项⽬名和Java版本号
项⽬名为es-demo,使⽤的jdk8
③指定项⽬中需要⽤到的依赖
这⾥也就是springDataElasticsearch。
下图也就是创建好后的项⽬结构:
该⽅式创建的好处在于:
我们不⽤⾃⼰导⼊依赖了,依赖是在创建项⽬时指定的,也就是创建项⽬中的步骤③
同时关于启动类、配置⽂件都帮我们⾃学创建好了,其实⽆外乎就是上述三个核⼼关键步骤:启动类、配置⽂件、pom⽂件。
该⽅式创建的坏处在于:
版本问题,项⽬中可能⽤的是⽐较旧的版本,spring创建的版本需要⾃⾏修改。
根据⾃⼰的需求选择创建⽅式就好。
此外关于配置⽂件:
⾃⾏配置的是properties⽂件,⽽我们常⽤的是yml⽂件,这⾥将其修改成yml⽂件。
在配置⽂件中指定elasticsearch中对应的ip+端⼝,也就是我们前⼏天在虚拟机上安装elasticsearch的ip和端⼝。
⼆、创建索引和映射
我们以前使⽤MySQL数据库的时候,在Java中是实体类对应了数据库中的表数据。
同样的道理,现在是索引库了,在Java中也是使⽤实体类对应对应的索引库。
注解@Document说明对应的索引库:indexName:索引库名称叫item。
type:索引库类型docs。
shards:分⽚。
replicas:副本。
注解@Field说明索引库字段:
类型有很多种,double属于数字型,text和string属于字符型,其中text表⽰分词,string表⽰不分词,上述中的keyword其实也就对应着string。
注意images这个字段,index=false表⽰不需要索引,说明该字段不需要搜索功能。
我们以前学数据库的时候,在Java中 *** 作数据库使⽤到了JdbcTemplate。
现在是要 *** 作索引库,同样的道理,也有⼀个ElasticsearchTemplate
①createIndex()
创建索引库,参数为实体类的Class对象。
②putMapping()
说明字段映射关系,参数同上。
三、实现增删改查
通过JdbcTemplate实现数据库的增删改查,索引库中⽤ElasticsearchTemplate。
但是我们不⽤这种⽅式⽽是⽤其它⽅式。
毕竟我们现在 *** 作数据库也没⽤JdbcTemplate⽽是常常使⽤通⽤mapper。
该⽅法也就类似于通⽤mapper。
在通⽤mapper中我们是创建⼀个⾃定义接⼝继承mapper接⼝。
再说明泛型之后,就可以直接使⽤这个接⼝完成增删改查 *** 作了。
同样的道理,在这⾥是也是⾃定义⼀个接⼝继承ElasticsearchRepository接⼝。
关于这个接⼝的继承体系图通过上图也能查看到,名称也都是见名知义的。
1新增索引
saveAll⽅法,看它的名字也就知道了其对应的也就是新增 *** 作。
其中关于新增,可以添加⼀条数据,也可以添加多条数据,例⼦中使⽤的是批量 *** 作。
注意:在正式项⽬中应该是从数据库这种查询到需要实现搜索功能的数据,再将这些数据添加到索引库中,从⽽实现搜索功能。
我这边为了⽅便是⾃⼰创建的伪数据。
2查询索引
findAll也就是查询所有的数据,因为我们添加了多条数据,所以查询结果是⼀个集合。
增强for循环遍历输出,在控制台上也就能查询到新增的数据。
同样的道理,还有deleteAll删除索引,当然这是都是最简单最基础的⼏种api,后续更多⽤法再说明。
最后
⾏有不得反求诸⼰,我是@刘⼩爱
⼀个⽩天上班晚上学习的95后沪漂,不为其它,只为学会⾃律做好⾃⼰,也愿我的每⽇打卡能给你带来勇⽓,欢迎点赞关注和评论。
¥
59
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
java代码内创建mysql索引_如何利用Java代码 *** 作索引库?
java代码内创建mysql索引_如何利⽤Java代码 *** 作索引库?今天是刘⼩爱⾃学Java的第161天。
感谢你的观看,谢谢你。
学习计划安排如下:学了⼏天的Elasticserch,但都是它本⾝的知识点,如何通过Java语⾔去 *** 作它呢?
这就好⽐以前学数据库,在数据库⼯具中通过sql语句也能实现增删改查,⽽在Java中就可以通过jdbc *** 作数据库。
这⾥不学原⽣的Elasticsearch客户端,⽽是直接学习spring提供的套件:SpringDataElasticsearch。
毕竟要知道,我们以前也基本没⽤原⽣的jdbc,⽽是⽤的框架,使⽤起来也简便。
第 1 页
⼀、创建Demo⼯程
关于SpringDataElasticsearch介绍:
学Java有⼀个绕不开的坎就是spring,就是主流的很多功能都会看到spring的影⼦。
索引(Index)是Elasticsearch中最重要的概念之一,也是整个Elasticsearch *** 作的基础,Elasticsearch提供了Index APIs用于Elasticsearch生命周期的管理,包括索引的创建、查询、删除和设置,索引的冻结和解冻、拆分和收缩等,掌握索引的管理是Elasticsearch开发、运维的基础能力,也有助于后期对于Elasticsearch的优化。
创建一个索引可以使用Elasticsearch提供的API,其格式如下:
其中 为要创建的索引的名称,是一个必须的参数,所有的字母都必须是小写形式。在创建索引的同时还可以进行相关的设置:
一个不做任何设置的,单纯创建索引的请求如下:
响应体中 “acknowledged” 为true代表索引已经成功在Elasticsearch集群中创建, “shards_acknowledged” 为true则代表在请求超时之前所有的索引分片的副本分片也全部准备完毕。当然,即使 “acknowledged” 和 "shards_acknowledged" 都为false,只能代表超时之前没有完成,后续集群还是可能最终成功创建了索引。
创建索引的API还支持Query Parameters和Request Body,其中的参数均是 可选的参数 。
Query Parameters支持以下参数:
Request Body也支持三个参数:
以下代码示例同时指定了Query Parameters和Request Body :
通过Get index API,可以查询一个或者多个索引的相关信息,其API格式如下:
其中target可以是数据流、索引,还可以是一个别名,多个索引之间使用逗号分隔,target还支持模糊查询(),如果查询所有的索引,可以使用 或者 _all 。如果集群开启了安全权限控制,那么要查询索引信息需要获得 view_index_metadata 或者 manage 的索引 *** 作权限。以下为查询的具体案例:
Get index API支持带url查询参数,这些参数都是可选参数,主要有以下几个:
首先需要明确索引本身是不能被修改的,当我们说修改索引时,实际上是指修改索引的别名、字段映射(mapping)和配置(settings)。
首先说明一下别名的作用。Elasticsearch提供了别名的功能,一个别名可以添加多个索引,方便通过 *** 作一个别名实际上 *** 作到多个具体的索引,例如每年建一个索引,分别有index-2019,index-2020,index-2021,index-2022共4个索引,这4个索引都关联了别名index-year,当需要查询最近4年的数据的时候,可以使用index-year同时查询这4个年份的索引。
别名的修改,实际上是从索引上删除别名,再重新添加新的别名,将这两个动作放在一起,保证其原子性,确保不会存在别名被删除的瞬间产生没有指向任何索引的问题。
以下代码为将my-index从索引my-index-000001解除,然后重新绑定在索引my-index-000002上。
mapping指定了索引的数据结构,字段类型,修改索引的mapping,可以修改原有字段的名称、类型,添加新的字段等。以下为添加新的email字段,类型为keyword。
支持多个索引、data stream和别名,支持模糊搜索,使用 或者 _all 可以指定所有的data stream和别名。
以下为修改settings的案例,设置索引有2个主分片,2个副本。
删除索引将会删除其对应的文档、分片和集群中的元数据信息,索引的 *** 作是一个高危 *** 作,需要慎重,如果集群开启了安全权限控制,那么要删除索引,需要获得 delete_index 或者 manage 的索引 *** 作权限。
不能删除数据流(data stream)的写索引,要删除当前写索引,必须对data stream进行rollover,创建新的写索引。
删除索引的API如下:
是必须参数,指定索引名称,多个索引可以用逗号分割,不支持使用别名,默认情况下也不支持使用模糊匹配,确实需要使用模糊匹配的,需要将集群参数 actiondestructive_requires_name 设置为false。 Delete Index API类似Get Index API,同样支持URL查询参数,这些参数包括 allow_no_indices 、 expand_wildcards 、 ignore_unavailable 、 master_timeout 、 timeout ,含义类似,不再赘述。 以下是删除索引的案例代码:
默认情况下,索引一旦被创建出来就是打开的状态,但是在某些情况下可能需要关闭索引,例如一些老旧不需要使用到的索引,仍然占用一定的空间,并且集群仍然需要一定的维护开销,关闭索引将阻塞所有对这个索引的读/写 *** 作,关闭的索引不必维护索引或搜索文档的内部数据结构,从而可以减少集群上开销。
特别注意:关闭索引的 *** 作会消耗大量磁盘空间,在生产上也是一个需要特别注意的 *** 作。可以通过集群设置API将 clusterindicescloseenable 设置为false来禁用索引的关闭,默认为true。
当一个索引被打开或者关闭,master节点负责重启分片,这些分片都会经历recovery过程,打开或者关闭索引后都会自动进行分片数据的复制,以保证有足够的副本分片以保证高可用性。
默认情况下只支持匹配全名称的特定的索引,但是如果设置了参数 actiondestructive_requires_name 为false,则可以使用或者_all指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错,不建议开启。
open API用于重新打开被关闭的索引,如果目标是一个data stream,则打开这个data stream背后对应的所有的索引。
默认情况下只支持匹配全名称的特定的索引,但是如果设置了参数 actiondestructive_requires_name 为false,则可以使用 或者 _all 指代所有的索引,但这种情况下一旦有一个索引匹配失败则会报错。
索引收缩和拆分是指收缩或者拆分索引的主分片数量。首先,我们要明白为什么需要进行索引的收缩和拆分呢?
在 elasticsearch 中,主节点管理分片是很大的工作量,降低集群整体分片数量可以降低 recovery 时间,减小集群状态的大小,降低集群的维护消耗。在很多情况下,经历了一段时间的运行以后,一些冷索引不会再有数据写入,将一些小分片合并可以降低集群的维护成本。
另一方面,如果在业务运行过程中发现前期的预估不足,业务量较大导致单个分片过大,则需要进行索引的拆分扩大主分片的数量。
一、索引收缩
Elasticsearch从50版本起提供了 shrink API,用于针对一些小索引缩小索引分片数。实际上并不对源索引进行 *** 作,而是使用与源索引相同的配置创建一个新索引,仅仅降低分片数,索引分片缩小完成后,源索引可删除。
一个索引要能够被shrink API进行分片缩小,需要满足以下三个条件:
为了使分片分配更容易,可以先删除索引的复制分片,等完成了shrink *** 作以后再重新添加复制分片。
可以使用以下代码,实现删除所有的副本分片,将所有的主分片分配到同一个节点上,并且设置索引状态为只读:
重新分配源索引的分片可能需要一段时间,可以使用_cat API跟踪进度,或者使用集群 健康 API通过 wait_for_no_relocating_shards 参数等待所有分片完成重新分配。
当完成以上步骤以后就可以进行shrink *** 作了,以下为_shrink API的格式:
以下案例将索引my-index-000001缩小主分片到shrunk-my-index-000001索引。
特别注意:由于添加新文档时使用对分片数量取余获取目标分片,因此目标索引中请求的主分片数量必须是源索引中主分片数量的一个因子。例如,包含8个主分片的索引可以收缩为4个、2个或1个主分片,或者包含15个主分片片的索引可以收缩为5个、3个或1个主分片。如果索引中的分片数量是一个质数,那么它只能收缩为一个主分片。
如果当前索引是是一个data stream的写索引,则不允许进行索引收缩,需要对data stream进行rollover,创建一个新的写索引,才可以对当前索引进行收缩。
整个索引收缩的过程如下:
同样地,Elasticsearch还提供了Split API,用于将索引拆分到具有更多主分片的新索引。Split API的格式如下:
要完成整个Split的 *** 作需要满足以下条件:
以下API请求可以将索引设置为只读:
如果当前索引是是一个data stream的写索引,则不允许进行索引拆分,需要对data stream进行rollover,创建一个新的写索引,才可以对当前索引进行拆分。
以下是使用Split API进行索引拆分的请求案例, Split API支持 settings 和 aliases 。
indexnumber_of_shards 指定的主分片的数量 必须是源分片数量的倍数。
索引拆分可以拆分的分片的数量由参数 indexnumber_of_routing_shards 决定,路由分片的数量指定哈希空间,该空间在内部用于以一致性哈希的形式在各个 shard 之间分发文档。 例如,将 number_of_routing_shards 设置为30(5 x 2 x 3)的具有5个分片的索引可以拆分为 以2倍 或 3倍的形式进行拆分。换句话说,可以如下拆分:
5 10 30(拆分依次为2和3)
5 15 30(拆分依次为3和2)
5 30(拆分6)
indexnumber_of_routing_shards 是一个静态配置,可以在创建索引的时候指定,也可以在关闭的索引上设置。其默认值取决于原始索引中主分片的数量,默认情况下,允许按2的倍数分割 最多1024 个分片。但是,必须考虑主分片的原始数量。例如,使用5个分片创建的索引可以被分割为10、20、40、80、160、320,或最多640个分片。
如果源索引只有一个主分片,那么可以被拆分成为任意数量的主分片。
22、索引拆分的工作过程
23、为什么Elasticsearch不支持增量的重新分片?
大多数的键值存储都支持随着数据的增长实现自动分片的自动扩展,为什么Elasticsearch不支持呢?
最经典的方案在于新增一个分片,然后将新的数据存储到这个新增加的分片,但是这种方案在Elasticsearch中可能会造成索引的瓶颈,整体的结构会变得比较复杂,因为Elasticsearch需要去定位文档到底归属于在哪一个分片,这意味着需要使用不同的哈希方案重新平衡现有数据。
键值存储系统解决这个问题的方案一般是使用一致性哈希,当分片数从N增加到N+1时,一致性哈希只需要对1/N的key进行重新分配,例如redis集群的方案就是蕾丝如此。
但是Elasticsearch分片的底层实际上上是Lucene的索引,而从Lucene索引删除一小部分的数据,通常比键值存储系统的成本要高得多。所以Elasticsearch选择在索引层面上进行拆分,使用硬链接进行高效的文件复制,以避免在索引间移动文档。
对于仅追加数据而没有修改、删除等场景,可以通过创建一个新索引并将新数据推送到该索引,同时添加一个用于读 *** 作的涵盖旧索引和新索引的别名来获得更大的灵活性。假设旧索引和新索引分别有M和N个分片,这与搜索一个有M+N个分片的索引相比没有任何开销。
24、如何监控Split的进度
使用Split API进行索引拆分,API正常返回并不意味着Split的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。
一旦主分片完成了分配,状态就会转化为 initializing ,并且开始进行拆分过程,直到拆分过程完成,分片的状态将会变成 active 。
可以使用 _cat recovery API 来监控Split进程,或者可以使用集群 健康 API通过将 wait_for_status 参数设置为**来等待所有主分片分配完毕。
Elasticsearch Clone API可以用于Elasticsearch索引数据的复制和备份。
二、索引克隆API
索引克隆不会克隆源索引的元数据,包括别名、ILM阶段定义、CCR follower相关信息,克隆API将会复制除了indexnumber_of_replicas和indexauto_expand_replicas之外的所有配置,这两个特殊的配置可以在克隆API的请求中显式指定。Clone API的格式如下:
索引满足可以克隆的条件是:
参照之前讲过的内容,仍然可以通过将 indexblockswrite 设置为true来确保索引是可读的状态。以下是克隆API的案例:
注意: indexnumber_of_shards 的值必须与源索引的主分片数量一致。
三、索引克隆的过程
四、监控克隆的进度
使用Clone API进行索引的克隆,API正常返回并不意味着Clone的过程已经完成,这仅仅意味着创建目标索引的请求已经完成,并且加入了集群状态,此时主分片可能还未被分配,副本分片可能还未创建成功。
一旦主分片完成了分配,状态就会转化为 initializing ,并且开始进行克隆过程,直到克隆过程完成,分片的状态将会变成 active 。
可以使用 _cat recovery API 来监控Clone进程,或者可以使用集群 健康 API通过将 wait_for_status 参数设置为**来等待所有主分片分配完毕。
rollover API是Elasticsearch提供的一个很好用的功能。我们都知道在MySQL中一旦数据量比较大,可能会存在分库分表的情况,例如根据时间每个月一个表。rollover功能就类似这种情况,它的原理是先创建一个带别名的索引,然后设定一定的规则(例如满足一定的时间范围的条件),当满足该设定规则的时候,Elasticsearch会自动建立新的索引,别名也自动切换指向新的索引,这样相当于在物理层面自动建立了索引的分区功能,当查询数据落在特定时间内时,会到一个相对小的索引中查询,相对所有数据都存储在一个大索引的情况,可以有效提升查询效率。
rollover API会为data stream或者索引别名创建一个新的索引。(在Elasticsearch 79之前,一般使用索引别名的方式来管理时间序列数据,在Elasticsearch之后data stream取代了这个功能,它需要更少的维护,并自动与数据层集成)。
rollover API的效果依据待滚动的索引别名的情况不同而有不同的表现:
使用rollover API的时候如果指定新的索引的名称,并且原索引以“-”结束并且以数字结尾,那么新索引将会沿用名称并且将数字增加,例如原索引是 my-index-000001 那么新索引会是 my-index-000002 。
如果对时间序列数据使用索引别名,则可以在索引名称中使用日期来跟踪滚动日期。例如,可以创建一个别名来指向名为 的索引,如果在2099年5月6日创建索引,则索引的名称为 my-index-20990506-000001 。如果在2099年5月7日滚动别名,则新索引的名称为 my-index-20990507-000002 。
rollover API的格式如下:
rollover API也支持Query Parameters和Request Body,其中Query parameters支持 wait_for_active_shards 、 master_timeout 、 timeout 和 dry_run ,特别说一下 dry_run ,如果将 dry_run 设置为 true ,那么这次请求不会真的执行,但是会检查当前索引是否满足 conditions 指定的条件,这对于提前进行测试非常有用。
Request Body支持 aliases 、 mappings 和 settings (这三个参数只支持索引,不支持data stream)和 conditions 。
特别展开讲一下 conditions 。这是一个可选参数,如果指定了 conditions ,则需要在满足 conditions 指定的一个或者多个条件的情况下才会执行滚动,如果没有指定则无条件滚动,如果需要自动滚动,可以使用ILM Rollover。
conditions 支持的属性有:
以下为rollover一个data stream的一个案例:
响应信息如下:
以下为rollover一个索引别名的一个案例:
2 请求rollover API
如果别名的索引名称使用日期数学表达式,并且按定期间隔滚动索引,则可以使用日期数学表达式来缩小搜索范围。例如,下面的搜索目标是最近三天内创建的索引。
索引的冻结是Elasticsearch提供的一个用于减少内存开销的 *** 作,这个功能在714版本中被标记为 Deprecated ,在Version 8以后,已经对堆内存的使用进行了改进,冻结和解冻的功能不再适用。
这里简单地进行 *** 作演示,如果是7x版本仍然可以作为参照。
一、索引冻结
索引被冻结以后除了在内存中维护其元数据之外,在集群上几乎没有任何的开销。被冻结以后,索引是只读的,所有的写 *** 作都将会被阻塞,例如文档的写入、merge合并等。
API格式如下:
以下为索引冻结 *** 作的代码案例:
注意,冻结索引将关闭该索引,并在同一个API调用中重新打开它,这将导致在短时间内主分配没有被分配,并导致集群变为红色,直到再次完成分配。
二、索引解冻
对应索引的冻结,解冻的API格式如下:
以下为索引解冻 *** 作的代码案例:
Elasticsearch提供了Resolve index API用于辅助进行索引的解析,根据提供的索引/别名/数据流的名称或者模式匹配,查询出当前集群中匹配的索引的信息。以下为API的格式:
案例如下:
这个API的作用多为辅助,实际使用不多,细节的参数可以参考官方的文档。
跟我一起奋斗成为Elastic专家
以上就是关于Elasticsearch7.8.0 配置x-pack基础安全全部的内容,包括:Elasticsearch7.8.0 配置x-pack基础安全、Nodejs中@elastic/elasticsearch的使用、怎么同步数据库的数据到elasticsearch等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)