当前位置 : 主页 > 编程语言 > java >

Apache Pulsar——tenants租户、namespace命名空间、topic

来源:互联网 收集:自由互联 发布时间:2023-02-04
一、多租户 Apache Pulsar 最初诞生于雅虎,当时就是为了解决雅虎内部各个部门之间数据的协调,所以多租户特性显得至关重用,Pulsar 从诞生之日起就考虑到多租户这一特性,并在后续的

一、多租户

Apache Pulsar 最初诞生于雅虎,当时就是为了解决雅虎内部各个部门之间数据的协调,所以多租户特性显得至关重用,Pulsar 从诞生之日起就考虑到多租户这一特性,并在后续的实现过程中,将其不断的完善。 多租户这一特性,使得各个部门之间可以共享同一份数据,不用单独部署独立的系统来操作数据,很好的保证了各部门间数据一致性的问题,同时简化维护成本。

 

在介绍 Pulsar 多租户之前,先来看一下,正常一个系统要实现一个多租户需要做哪些事情:

  • 严格的 SLAs 保证
  • 确保租户之间的隔离性
  • 允许对租户内的资源进行配额
  • 在租户内提供系统级别的安全性
  • 运维成本低,易管理

Pulsar 的多租户设计符合上述要求:

  • 使用身份验证、授权和 ACL(访问控制列表)确保其安全性
  • 为每个租户强制执行存储配额
  • 支持在运行时更改隔离机制,从而实现操作成本低和管理简单

1.1 什么是多租户

Pulsar的多租户性质主要体现在topic的URL中, 其结构如下:

persistent://tenant/namespace/topic

从URL中可以看出tenant(租户)是topic最基本的单元(比命名空间和topic名称更为基本)

1.2 Pulsar多租户的相关特性_安全性(认证和授权)

一个多租户系统需要在租户内提供系统级别的安全性,细分来讲,主要可以归类为一下两点:

  • 租户只能访问它有权限访问的 topics
  • 不允许访问它无法访问的 topics

在 Pulsar 中,多租户的安全性是通过身份验证和授权机制实现的。当 client 连接到 pulsar broker 时,broker 会使用身份验证插件来验证此客户端的身份,然后为其分配一个 string 类型的 role token。role token 主要有如下作用:

  • 判断 client 是否有对 topics 进行生产或消费消息的权限
  • 管理租户属性的配置

Pulsar 目前支持一下几种身份认证, 同时支持自定义实现自己的身份认证程序

  • TLS 客户端身份认证
  • 雅虎的身份认证系统: Athenz
  • Kerberos
  • JSON Web Token 认证

1.3 Pulsar多租户的相关特性_隔离性

隔离性主要分为如下两种:

  • 软隔离:通过磁盘配额,流量控制和限制等手段
  • 存储:
  • Apache Pulsar 使用Bookkeeper来作为其存储层,bookie是Bookkeeper的实例,Bookkeeper本身就是具有I/O分离(读写分离)的特性,可以很多的做好IO隔离,提升读写的效率。
  • 同时,不同的租户可以为不同的NameSpace配置不同的存储配额,当租户内消息的大小达到了存储配额的限制,Pulsar会采取相应的措施,例如:阻止消息生成,抛异常 或丢弃数据等。

Broker:

  • 每个Borker使用的内存资源都是有上限的,当Broker达到配置的CPU或内存使用的阈值后,Pulsar会迅速的将流量转移到负载较小的Broker处理。
  • 在生产和消费方面,Pulsar都可以进行流量控制,租户可以配置发送和接收的速率,避免出现一个客户端占用当前Broker的所有处理资源。
  • 硬隔离:物理资源隔离
  • Pulsar 允许将某些租户或名称空间与特定 Broker 进行隔离。这可确保这些租户或命名空间可以充分利用该特定 Broker 上的资源。

1.4 Pulsar多租户的相关操作

1.4.1 查询租户列表

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants list "public" "pulsar" [root@pulsar1 apache-pulsar-2.9.1]#

1.4.2 创建租户

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant

在创建租户时,可以使用-r 或者 --admin-roles标志分配管理角色。可以用逗号分隔的列表指定多个角色。

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant --admin-roles role1,role2,role3 [root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants create my-tenant -r role1

1.4.3 查询租户配置信息

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants get my-tenant { "adminRoles" : [ ], "allowedClusters" : [ "pulsar-cluster" ] } [root@pulsar1 apache-pulsar-2.9.1]#

1.4.4 更新租户配置信息

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants update -c pulsar-cluster my-tenant [root@pulsar1 apache-pulsar-2.9.1]#

1.4.5 删除租户

  • 注意:在删除的时候,如果库下已经有名称空间,是无法删除的,需要先删除名称空间
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin tenants delete my-tenant [root@pulsar1 apache-pulsar-2.9.1]#

二、名称空间

namespace是Pulsar中最基本的管理单元,在namespace这一层面,可以设置权限,调整副本设置,管理跨集群的消息复制,控制消息策略和执行关键操作。一个主题topic可以继承其所对应的namespace的属性,因此我们只需对namespace的属性进行设置,就可以一次性设置该namespace中所有主题topic的属性。

 

namespace有两种,分别是本地的namespace和全局的namespace:

  • 本地namespace——仅对定义它的集群可见。
  • 全局namespace——跨集群可见,可以是同一个数据中心的集群,也可以是跨地域中心的集群,这依赖于是否在namespace中设置了跨集群拷贝数据的功能。

虽然本地namespace和全局namespace的作用域不同,但是只要对他们进行适当的设置,都可以跨团队和跨组织共享。一旦生产者获得了namespace的写入权限,那么它就可以往namespace中的所有topic主题写入数据,如果某个主题不存在,则在生产者第一次写入数据时动态创建。

2.1 Pulsar NameSpace(名称空间) 相关操作_基础操作

2.1.1 在指定的租户下创建namespace

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces create my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

2.1.2 查看某个租户下的namespace列表

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces list my-tenant "my-tenant/my-ns" [root@pulsar1 apache-pulsar-2.9.1]#

2.1.3 删除namespace

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces delete my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

2.2Pulsar NameSpace(名称空间) 相关操作_高级操作

2.2.1 获取名称空间相关的配置策略

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces policies my-tenant/my-ns { "auth_policies" : { "namespace_auth" : { }, "destination_auth" : { }, "subscription_auth_roles" : { } }, "replication_clusters" : [ "pulsar-cluster" ], "bundles" : { "boundaries" : [ "0x00000000", "0x40000000", "0x80000000", "0xc0000000", "0xffffffff" ], "numBundles" : 4 }, "backlog_quota_map" : { }, "clusterDispatchRate" : { }, "topicDispatchRate" : { }, "subscriptionDispatchRate" : { }, "replicatorDispatchRate" : { }, "clusterSubscribeRate" : { }, "publishMaxMessageRate" : { }, "latency_stats_sample_rate" : { }, "deleted" : false, "encryption_required" : false, "subscription_auth_mode" : "None", "offload_threshold" : -1, "schema_auto_update_compatibility_strategy" : "Full", "schema_compatibility_strategy" : "UNDEFINED", "is_allow_auto_update_schema" : true, "schema_validation_enforced" : false, "subscription_types_enabled" : [ ], "properties" : { } } [root@pulsar1 apache-pulsar-2.9.1]#

2.2.2 配置多个集群之间的数据复制

#获取给定命名空间复制集群的列表 [root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-clusters my-tenant/my-ns "pulsar-cluster" # 设置复制集群 [root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-clusters my-tenant/my-ns --clusters pulsar-cluster2

2.2.3 配置 backlog quota 策略

  • 待定配额帮助Broker在某个名称空间达到某个阈值限制时限制其带宽/存储。管理员可以设置限制,并在达到限制后采取相应的行动。

  • 查看quota配置

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-backlog-quotas my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行quota设置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-backlog-quota --limit 10G --limitTime 36000 --policy consumer_backlog_eviction my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

参数说明如下:

  • limit:Bookeeper使用磁盘空间大小

  • limitTime:单位为秒,在该时间内,Bookeeper使用磁盘空间大小

  • policy:有3个可选值

    • producer_request_hold:Broker暂停运行,不再接收produce新的请求
    • producer_exception:Broker抛出异常,和客户端断开连接
    • consumer_backlog_eviction:Broker丢弃老的消息
  • 删除quota设置

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces remove-backlog-quota my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

2.2.4 配置持久化策略

  • 持久化策略可以为给定命名空间下 topic 上的所有消息配置持久等级。

  • 查看持久化配置

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-persistence my-tenant/my-ns null [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行持久化设置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-persistence --bookkeeper-ack-quorum 2 --bookkeeper-ensemble 3 --bookkeeper-write-quorum 2 --ml-mark-delete-max-rate 0 my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

各参数含义如下:

  • bookkeeper-ack-quorum:一条entry消息需要多少个Bookeeper确认,才算produce成功。默认0
  • bookkeeper-ensemble:一个topic能使用的Bookeeper数量。默认0
  • bookkeeper-write-quorum:一条entry消息要写入多少个Bookeeper。默认0
  • ml-mark-delete-max-rate:mark-delete操作的最大速率。默认0.0

2.2.5 配置消息存活时间(TTL)

  • 获取TTL设置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-message-ttl my-tenant/my-ns null [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行TTL设置,单位为秒
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-message-ttl --messageTTL 600 my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#
  • 删除TTL设置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces remove-message-ttl my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

2.2.6 Topic的消息发送速率

  • 获取Topic的消息发送速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-dispatch-rate my-tenant/my-ns null [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行Topic的消息发送速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

参数说明如下:

  • dispatch-rate-period:进行限制的时间大小,默认为1秒
  • msg-dispatch-rate:在dispatch-rate-period时间范围内,能接收的消息数量。默认-1
  • byte-dispatch-rate:在dispatch-rate-period时间范围内,能接收的数据字节大小。默认-1

2.2.7 Topic的消息接收速率

  • 获取Topic的消息接收速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-subscription-dispatch-rate my-tenant/my-ns null [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行Topic的消息接收速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-subscription-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

参数说明如下:

  • dispatch-rate-period:进行限制的时间大小,默认为1秒
  • msg-dispatch-rate:在dispatch-rate-period时间范围内,能接收的消息数量。默认-1
  • byte-dispatch-rate:在dispatch-rate-period时间范围内,能接收的数据字节大小。默认-1

2.2.8 配置整个名称空间中Topic的复制集群的速率

  • 获取Topic的多个集群之间的复制速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces get-replicator-dispatch-rate my-tenant/my-ns null [root@pulsar1 apache-pulsar-2.9.1]#
  • 进行Topic的多个集群之间的复制速率配置
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin namespaces set-replicator-dispatch-rate --dispatch-rate-period 2 --msg-dispatch-rate 2000 --byte-dispatch-rate 1048576 my-tenant/my-ns [root@pulsar1 apache-pulsar-2.9.1]#

参数说明如下:

  • dispatch-rate-period:进行限制的时间大小,默认为1秒
  • msg-dispatch-rate:在dispatch-rate-period时间范围内,能接收的消息数量。默认-1
  • byte-dispatch-rate:在dispatch-rate-period时间范围内,能接收的数据字节大小。默认-1

三、Topic

Topic:话题主题的含义,在一个名称空间下,可以定义多个Topic 通过Topic进行数据的分类划分,将不同的类别的消息放置到不同Topic,消费者也可以从不同Topic中获取到相关的消息,是一种更细粒度的消息划分操作,同时在Topic下可以划分为多个分片,进行分布式的存储操作,每个分片下还存在有副本操作,保证数据不丢失,当然这些分片副本更多是由bookkeeper来提供支持。

 

Pulsar 提供持久化与非持久化两种topic。 持久化topic是消息发布、消费的逻辑端点。 持久化topic地址的命名格式如下:

persistent://tenant/namespace/topic

非持久topic应用在仅消费实时发布消息与不需要持久化保证的应用程序。 通过这种方式,它通过删除持久消息的开销来减少消息发布延迟。 非持久化topic地址的命名格式如下:

non-persistent://tenant/namespace/topic

3.1 Pulsar Topic(主题) 相关操作_基础操作

3.1.1 创建Topic

  • 创建无分区的topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics create non-persistent://my-tenant/my-ns/my-non-partitioned-topic [root@pulsar1 apache-pulsar-2.9.1]#
  • 创建有分区的topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics create-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic --partitions 3 [root@pulsar1 apache-pulsar-2.9.1]#
  • 列出namespace下的所有topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics list my-tenant/my-ns "persistent://my-tenant/my-ns/my-partitioned-topic-partition-0" "persistent://my-tenant/my-ns/my-partitioned-topic-partition-1" "persistent://my-tenant/my-ns/my-partitioned-topic-partition-2" [root@pulsar1 apache-pulsar-2.9.1]#

可以看到my-non-partitioned-topic这个topic已经被删除了。这是因为一个topic被创建后,如果在创建后的60秒内不活动,就会被自动删除。可以通过如下两个参数进行控制

  • Brokerdeleteinactivetopicsenabenabled:表示是否启动自动删除,默认值为true
  • BrokerDeleteInactiveTopicsFrequencySeconds:表示不活动的时间,默认为60s

3.1.2 更新topic

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics update-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic --partitions 6 [root@pulsar1 apache-pulsar-2.9.1]#

3.1.3 删除topic

  • 删除无分区topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics delete non-persistent://my-tenant/my-ns/my-non-partitioned-topic [root@pulsar1 apache-pulsar-2.9.1]#
  • 删除有分区topic
[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics delete-partitioned-topic persistent://my-tenant/my-ns/my-partitioned-topic [root@pulsar1 apache-pulsar-2.9.1]#

3.1.4 列出topic下的subscriptions

[root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics subscriptions persistent://public/default/my-partitioned-topic "consume-test" [root@pulsar1 apache-pulsar-2.9.1]#

3.1.5 删除topic下的subscription

  • 需要该subscription没有active consumer
[root@pulsar1 apache-pulsar-2.9.1]# [root@pulsar1 apache-pulsar-2.9.1]# bin/pulsar-admin topics unsubscribe -s "consume-test" persistent://public/my-partitioned-topic [root@pulsar1 apache-pulsar-2.9.1]#

3.2 Pulsar Topic(主题) 相关操作_高级操作

3.2.1 授权

pulsar-admin topics grant-permission --actions produce,consume --role application1 persistent://test- tenant/ns1/tp1

3.2.2 获取权限

pulsar-admin topics grant-permission --actions produce,consume --role application1 persistent://test- tenant/ns1/tp1

3.2.3 取消权限

pulsar-admin topics revoke-permission --role application1 persistent://test-tenant/ns1/tp1 { "application1": [ "consume", "produce" ] }

参考: https://blog.csdn.net/yy8623977/article/details/123605211

网友评论