一、多租户
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