elasticsearch - 弹性搜索分片/路由
问题描述
我有一个多租户系统,我正在尝试设计 ElasticSearch 以支持多租户。我在网上搜索过,但我发现的所有帖子在实践中都没有具体说明如何做到这一点。基本思想是在每个索引上,每个客户 1 个分片,并使用自定义路由来查询客户专用分片。这很清楚。现在,我该如何实现呢?如何为每个指定“键值”的索引创建多个分片,以便将来查询该特定分片?代码示例会有所帮助。
太感谢了。
解决方案
我认为这不是实现多租户的正确方法,而不是在分片级别。
你到底想达到什么目的?我假设您希望不同的用户(或者更好的是不同的角色)可以访问索引的不同部分。在这种情况下,您应该查看文档级安全权限。
在实践中如何做到这一点?假设您有一个名为 的索引multitenants-index
,并且您有两个租户,这样:(i)第一个租户只能读/写那些具有该字段的文档"tenant": 1
,(ii)第二个租户只能读/写那些具有该字段的文档"tenant": 2
. 然后,您可以创建以下两个角色:
POST /_xpack/security/role/first_tenant
{
"indices": [
{
"names": [ "multitenants-index" ],
"privileges": [ "read", "write" ],
"query": "{\"match\": {\"tenant\": 1}}"
}
]
}
POST /_xpack/security/role/second_tenant
{
"indices": [
{
"names": [ "multitenants-index" ],
"privileges": [ "read", "write" ],
"query": "{\"match\": {\"tenant\": 2}}"
}
]
}
推荐阅读
- python - 脆皮错误 |as_crispy_field 传递了一个无效或不存在的字段
- typescript - `/// 是什么意思
`是什么意思?我们可以在 *.d.ts 中使用哪些其他类似 xml 的语法? - google-app-engine - Cron Job 在谷歌云上运行多次
- javascript - 尝试将符号包装对象显式转换为字符串时出错
- javascript - Ionic Creator - 重新排序在firebase中持续存在的列表项?
- android - 如何知道使用 Retrofit 时调用了请求超时?
- python - 计算列表中元素的出现次数,直到出现不同的元素
- devexpress - Devexpress:如何在代码中设置 BarEditItem 的 EditValue
- c++ - 在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值
- python - 如何合并两个数据帧,其中一个数据帧具有开始时间/结束时间,另一个数据帧具有时间戳数据