《3.Extend Database Mesh with eBPF.pptx》由会员分享,可在线阅读,更多相关《3.Extend Database Mesh with eBPF.pptx(31页珍藏版)》请在三个皮匠报告上搜索。
1、www.sphere-使用使用 ebpf 扩展扩展 Database MeshSphereEx 武建东武建东01Pisanix 项目介绍项目介绍Tc-bpf 介绍介绍02实践实践0403问题问题01Pisanix 项目介绍项目介绍Database Mesh 框架框架Database Mesh 希望提供一种以数据库为中心的治理框架:数据库是一等公民:一切抽象围绕数据库治理行为进行,比如访问控制、流量治理、可观测性等 面向工程师体验:对于开发人员,通过便捷易用的数据库声明和定义,即可进行开发,无需关心数据库的位置;对于运维和 DBA,提供多种数据库治理行为抽象,实现自动化的数据库可靠性工程 云原生
2、:以开放的生态和实现机制适配不同的云环境,面向云原生构建和实现,而无需担心厂商锁定 Database Mesh 的典型场景的典型场景某互联网电商平台为配合云原生架构改造,由中间件团队主导建设流量治理平台,希望实现统一的流量熔断、限速、身份认证、服务发现、可观测性和安全等能力,对数据库流量希望实现数据库读写分离、状态切换感知、SQL 访问防火墙等能力。某银行为配合数据库国产化进程,计划将 DB2 实例逐步切换为某国产数据库,需要在迁移的过程中需要保证最小化应用改动,同时满足高可用需求,当发生故障的时候可以快速进行切换。Database Mesh 的的开源实现开源实现 Pisanix主要特性:本地
3、即数据库本地即数据库:提供应用视角的本地数据库,如应用可以本地端口 3306 访问 MySQL 协议的数据源,而无需感知实际的数据源状态 统一配置管理统一配置管理:将数据库流量治理的常见配置进行了标准化,如数据库发现、读写分离、分库分表、影子库、数据加密、熔断和并发控制等,配合可观测性实现统一的管控能力 多协议支持多协议支持:以插件的方式支持多种数据库协议,如 MySQL 协议、DB2 协议等,帮助应用在无感知情况下完成从 DB2 切换至 MySQL 的数据源切换 云原生架构云原生架构:用 Kubernetes 经典的控制面和数据面管理架构,通过基础设施即代码的方式、以版本化描述和管理数据库访
4、问Pisa-ControllerPisa-Controller 是用 Go 实现的控制面,提供对数据面组件的管控,是 Pisanix 所有配置的入口主要功能Sidecar 注入借助 MutationAdmissionWebhook 向选择的 Pod 中注入 Pisa-Proxy 容器Pisa-Proxy 配置转换和下发获取并转换集群里 CRD 格式的服务发现、负载均衡、限流、SQL 防火墙规则等,并下发给 Pisa-ProxyPisa-Daemon 配置转换和下发获取并转换集群里 CRD 格式的流量 QoS 等规则,并下发给 Pisa-DaemonPisa-ProxyPisa-Proxy 是用
5、 Rust 实现的高性能流流量代理,通过 MySQL 协议获取应用的数据库访问流量,并基于此实现各种治理能力 主要功能 SQL 流量治理 通过解析 SQL,实现多种负载均衡策略、限流等 访问控制 根据用户和数据权限关系,实现细粒度的权限控制 SQL 防火墙 阻止高危 SQL 语句执行 可观测性 暴露各种数据库访问指标:如吞吐、延时等Pisa-DaemonPisa-Daemon 是用 Rust 实现的数据面,部署在集群中每个节点上,通过宿主机内核的各种能力提供资源管理主要功能运行时流量管理借助 eBPF 等技术为数据库访问流量提供 QoS 保证,减少流量之间的相互干扰02问题问题问题问题混部场景
6、问题问题SQL 场景 03Tc-bpf 介绍介绍TC介绍介绍TC 是linux系统中流量控制的工具,具体有以下三部分:qdisc 排队规则class 控制策略filter 分类器TC介绍介绍常用命令:tc qdisc replace dev$NIC root handle 1:0 htbtc class replace dev$NIC parent 1:0 classid 1:1 htb rate 3000kbittc filter replace dev$NIC parent 1:0 protocol ip u32 match ip sport 80 flow id 1:1TC-BPF 介绍
7、介绍通过 ebpf,实现分类器的可编程。CLS_BPF相比传统的 tc,有如下特点:1.可编程支持修改skb相关字段2.更高效 direct-action 模式,直接返回 tc actionTC-BPF介绍介绍SEC(classifier)int cls(struct _sk_buff*skb)skb-tc_classid=1;return TC_ACT_OK;section name 默认为 classifier以分类器为例:加载:tc filter add dev$NIC parent 1:0 bpf obj tc.o classid 1:direct-action 返回 actionTC
8、-BPF介绍介绍1.TC_ACT_OK 允许包通过2.TC_ACT_RECLASSIFY 从头开始分类3.TC_ACT_SHOT 丢弃包4.TC_ACT_UNSPEC 使用标准的 TC action5.TC_ACT_PIPE 提交给下一个 action 处理tc filter protocol ip u32 match ip sport 80 flow id 1:1 action dropDirect Actiontc filter bpf obj tc.o classid 1:direct-action filter 和 action 合二为一 TC-BPF介绍介绍pinning 类型:PI
9、N_NONEPIN_OBJECT_NS 私有的,在对象内部共享PIN_GLOBAL_NS 全局的,外部程序能够使用共享 map#tree/sys/fs/bpf/tc/globals/sys/fs/bpf/tc/globals buf04实践实践1.通过 SocketFilter 读取四元组及 SQL 语句。2.将四元组及 SQL 语句通过 ring output 传输到用户态计算 SQL classid 的程序。3.将计算出的 classid 写入到 tc classifier 的 map 中。4.tc 读取 map 中的信息,设置 classid。实践实践步骤:SQL 级别管理带宽实践实践S
10、QL 级别管理带宽实践实践SQL 级别管理带宽1.只读取 COM_QUERY 类型的语句。2.为了避免 512KB 的栈限制,使用 bpf_tail_call 读取及将 SQL 语句写入到 BPF_MAP_TYPE_ARRAY 中。实践实践APP 级别管理带宽步骤:1.根据配置文件创建相关 qdisc,class。2.把 app 对应的 endpoint 及 classid 写入到 map。3.Tc 读取 map 中信息设置 classid实践实践APP 级别管理带宽实践实践Tc 效果实践实践问题1:Rust aya 库RelocationError function:classifier,e
11、rror:SectionNotFound section_index:5,symbol_index:4,symbol_name:Some(”app_endpoint)报错:Aya 库目前不支持 PIN_GLOBAL_NS实践实践问题2:容器中运行当 pin 类型为 PIN_GLOBAL_NS 时,在 ubuntu 20.04 中不能创建 map。升级 kernel 版本解决。实践实践演示:https:/asciinema.org/a/k9GUyKvAe8Mtx5GBQtGno9VLN实践实践规划:兼容 kubenrtes 中不同的网络模式 尝试基于 ebpf 的查询缓存www.sphere-谢谢谢谢