Elassandra 是一个 Apache Cassandra 发行版,包括 Elasticsearch 搜索引擎。 Elassandra 是一个多主多云数据库和搜索引擎,支持以主动/主动模式跨多个数据中心进行复制。
Elasticsearch 代码嵌入在 Cassanda 节点中,在 Cassandra 表上提供高级搜索功能,并且 Cassandra 充当 Elasticsearch 数据和配置存储。
Elassandra 支持 Cassandra vnode,并通过添加更多节点进行水平扩展,而无需重新分片索引。
项目文档可在 doc.elassandra.io 上获取。
对于 Cassandra 用户,elassandra 提供了 Elasticsearch 功能:
对于 Elasticsearch 用户,elassandra 提供了有用的功能:
在 docker 中运行单节点 Elassandra 集群的快速入门指南。
通过启动 Google Kubernetes Engine 来部署 Elassandra:
<<<<<<< HEAD 从版本 6.8.4.2 开始,可以使用系统属性来压缩 gossip X1 应用程序状态。启用此设置允许创建大量虚拟索引。在启用此设置之前,请将所有 6.8.4.x 节点升级到 6.8.4.2(或更高版本)。一旦所有节点都处于 6.8.4.2 中,即使尚未在本地配置设置,它们也能够解压缩应用程序状态。
Elassandra 使用 Cassandra GOSSIP 协议来管理 Elasticsearch 路由表,Elassandra 6.8.4.2+ 添加了对 X1 应用程序状态压缩的支持,以增加 Elasticsearch 索引的最大数量。为了向后兼容,默认情况下禁用压缩,但是一旦所有节点升级到版本 6.8.4.2+,您应该通过在conf/jvm.options中添加-Des.compress_x1=true并滚动重新启动所有节点来启用 X1 压缩节点。运行版本 6.8.4.2+ 的节点能够读取压缩和未压缩的 X1。
在版本 6.2.3.21 之前, elasic_admin键空间(和 elastic_admin_[datacenter.group])的 Cassandra 复制因子会自动调整为数据中心的节点数。自版本 6.2.3.21 以来,由于它对大型集群有性能影响,因此现在由 Elassandra 管理员正确调整此键空间的复制因子。请记住,Elasticsearch 映射更新依赖于需要 QUORUM 节点才能成功的 PAXOS 事务,因此每个数据中心上的复制因子应至少为 3。
Elassandra 6.2.3.19元数据版本现在依赖于Cassandra表elastic_admin.metadata_log (从6.2.3.8到6.2.3.18是elastic_admin.metadata )来保留elasticsearch映射更新历史记录并自动从可能的PAXOS写入超时问题中恢复。
升级集群的第一个节点时,Elassandra 会自动将当前的metadata.version复制到新的elastic_admin.metadata_log表中。为了避免 Elasticsearch 映射不一致,您必须避免在滚动升级过程中更新映射。所有节点升级后, elastic_admin.metadata就不再使用,可以删除。然后,您可以从新的elastic_admin.metadata_log中获取映射更新历史记录,并了解哪个节点更新了映射、何时以及出于何种原因。
Elassandra 6.2.3.8+ 现在通过使用 CQL 架构扩展(请参阅system_schema.tables 、列扩展)完全管理 CQL 架构中的 elasticsearch 映射。这些表扩展和 Elasticsearch 索引创建/修改导致的 CQL 架构更新会在批量原子架构更新中进行更新,以确保发生并发更新时的一致性。而且,这些扩展以二进制形式存储并支持部分更新以提高效率。因此,elasticsearch 映射不再存储在elastic_admin.metadata表中。
警告:在滚动升级期间,elasticserach 映射更改不会在运行新版本和旧版本的节点之间传播,因此请勿在升级时更改映射。将所有节点升级到 6.2.3.8+ 并进行验证后,应用以下 CQL 语句来删除无用的 elasticsearch 元数据:
ALTER TABLE elastic_admin.metadata DROP metadata ;
ALTER TABLE elastic_admin.metadata WITH comment = ' ' ;
警告:由于 Elassandra 使用的 CQL 表扩展,某些旧版本的cqlsh可能会导致以下错误消息“'module' object has no attribute 'viewkeys'”。 。这来自 Cassandra 中嵌入的旧 python cassandra 驱动程序,并已在 CASSANDRA-14942 中报告。可能的解决方法:
docker run -it --rm strapdata/cqlsh:0.1 node.example.com
确保已安装 Java 8 并且JAVA_HOME
指向正确的位置。
export CASSANDRA_HOME=<extracted_directory>
bin/cassandra -e
bin/nodetool status
curl -XGET localhost:9200/_cluster/state
尝试在不存在的索引上对文档建立索引:
curl -XPUT ' http://localhost:9200/twitter/_doc/1?pretty ' -H ' Content-Type: application/json ' -d ' {
"user": "Poulpy",
"post_date": "2017-10-04T13:12:00Z",
"message": "Elassandra adds dynamic mapping to Cassandra"
} '
然后在Cassandra中查找:
bin/cqlsh -e " SELECT * from twitter. " _doc " "
在幕后,Elassandra 创建了一个新的 Keyspace twitter
和表_doc
。
admin@cqlsh > DESC KEYSPACE twitter;
CREATE KEYSPACE twitter WITH replication = { ' class ' : ' NetworkTopologyStrategy ' , ' DC1 ' : ' 1 ' } AND durable_writes = true;
CREATE TABLE twitter . " _doc " (
" _id " text PRIMARY KEY ,
message list < text > ,
post_date list < timestamp > ,
user list < text >
) WITH bloom_filter_fp_chance = 0 . 01
AND caching = { ' keys ' : ' ALL ' , ' rows_per_partition ' : ' NONE ' }
AND comment = ' '
AND compaction = { ' class ' : ' org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy ' , ' max_threshold ' : ' 32 ' , ' min_threshold ' : ' 4 ' }
AND compression = { ' chunk_length_in_kb ' : ' 64 ' , ' class ' : ' org.apache.cassandra.io.compress.LZ4Compressor ' }
AND crc_check_chance = 1 . 0
AND dclocal_read_repair_chance = 0 . 1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0 . 0
AND speculative_retry = ' 99PERCENTILE ' ;
CREATE CUSTOM INDEX elastic__doc_idx ON twitter. " _doc " () USING ' org.elassandra.index.ExtendedElasticSecondaryIndex ' ;
默认情况下,多值 Elasticsearch 字段映射到 Cassandra 列表。现在,使用 CQL 插入一行:
INSERT INTO twitter. " _doc " ( " _id " , user, post_date, message)
VALUES ( ' 2 ' , [ ' Jimmy ' ], [dateof(now())], [ ' New data is indexed automatically ' ]);
SELECT * FROM twitter. " _doc " ;
_id | message | post_date | user
-- ---+--------------------------------------------------+-------------------------------------+------------
2 | [ ' New data is indexed automatically ' ] | [ ' 2019-07-04 06:00:21.893000+0000 ' ] | [ ' Jimmy ' ]
1 | [ ' Elassandra adds dynamic mapping to Cassandra ' ] | [ ' 2017-10-04 13:12:00.000000+0000 ' ] | [ ' Poulpy ' ]
( 2 rows)
然后使用 Elasticsearch API 搜索它:
curl " localhost:9200/twitter/_search?q=user:Jimmy&pretty "
这是一个示例响应:
{
"took" : 3 ,
"timed_out" : false ,
"_shards" : {
"total" : 1 ,
"successful" : 1 ,
"skipped" : 0 ,
"failed" : 0
},
"hits" : {
"total" : 1 ,
"max_score" : 0.6931472 ,
"hits" : [
{
"_index" : " twitter " ,
"_type" : " _doc " ,
"_id" : " 2 " ,
"_score" : 0.6931472 ,
"_source" : {
"post_date" : " 2019-07-04T06:00:21.893Z " ,
"message" : " New data is indexed automatically " ,
"user" : " Jimmy "
}
}
]
}
}
This software is licensed under the Apache License, version 2 ("ALv2"), quoted below.
Copyright 2015-2018, Strapdata ([email protected]).
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.