高可用与一致性:构建强一致性分布式数据库 TiDB-沈泰宁
构建强⼀一致性分布式数据库 TiDB 沈泰宁 R & D Engineer @ PingCAP ⾃自我介绍 ⾃自我介绍 • 沈泰宁 • R&D Engineer @ PingCAP • Maintainer • rust-prometheus • grpc-rs • … ⽬目录 • What is TiDB? • How to test? What is TiDB? Single0 码力 | 45 页 | 4.63 MB | 1 年前3付钱拉金融云系统架构演进和最佳实践
Oracle Nginx keepalived 数据库双机 网络分发层 业务处理 渠道适配器 交易预处理 交易预检查 交易风控 交易路由 通知 响应 查询 通道 交易拆分 业务2.0痛点 BUSINESS 2.0 PAIN POINTS 业务野蛮发展 交易量高速增加 并发请求增加 交易响应速度过慢 数据库单表 数据量剧增 模块耦合度高 开发效率低下 … 线上环境突发事故,第一时间如何决策减少事故影响范围? 开发人员排查问题速度过慢? 随着业务的增长,问题越来越多,第一优先级需要解决什么? 系统突然CPU、内存利用率暴增,如何定位代码? 数据库连接数被耗尽,怎么办? 各种OOM如何预防? 随着系统交易量的增加,高可用系统的设计点很多,如何快速抓住建设要点? 有哪些困惑 WHAT IS THE CONFUSION 需求设计阶段- 首次拦截 APP3 APP1 APP2 APP3 APP1 APP2 APP3 DB 快速响应故障 QUICK RESPONSE FAILURE DB 我们解决了以下系统自身问题 线程数 数据库连接 数- mysql,redis 内存 慢SQL 最后的问题是什么? Java系统常见问题 JAVA SYSTEM FAQ CPU DO NOT FORGET THE BEGINNING0 码力 | 35 页 | 6.05 MB | 1 年前3QCon北京2018-业务高速发展下的互联网金融系统架构演变-张现双+
non-blocking sync、lock,cas 额度、库存、积分、优惠券… CAP 数据竞争� [sql方案示例] 乐观锁,带来重试代价 悲观锁,开销大,吞吐量差 数据库锁(全局标识拦截): update product set stock=stock-X where 机房 LB / NG.. 网关 Cache 服务 抓大不能放小[细节决定成败] 线程阻塞>300 中间件内存管理、线程状态,连接状况 db的io,慢sql,索引,join等 代码review,数据结构,日志 GC TCP连接 第四部分 关于监控 如果没有监控… 盲 人 骑 瞎 马 , 夜 半 临 深 池 监控体系 } zabbix,datagod zabbix,datagod, prometheus… apm工具,商业产品 期望更轻量、无侵入性的业务监控 cat,elk,zipkin等 趋于个性 具有共性 中间件/缓存/数据库/代理/MQ... OS/网络/存储/防火墙... 应用/框架/业务逻辑/系统间调用 自研日志监控[轻量无侵入] Kafka Kafka Spout 策略 Cache 系统配置 预处理bolts0 码力 | 42 页 | 19.96 MB | 1 年前3领域驱动设计&中台/可视化的遗留系统微服务改造
将命令写在蓝⾊色即时贴上,可以是 • ⽤用户从UI界⾯面进⾏行行的操作 • 外部系统触发 • 定时任务 2. 将命令贴在所产⽣生的事件旁边; 3. 有的命令可能产⽣生多个事件,将它 们连接; 4. 在这个过程中可以识别出触发命令 的外部系统(粉⾊色即时贴)、persona (⻩黄⾊色即时贴)并进⾏行行表示; 划分限界上下⽂文 命令⻛风暴暴示例例 订单 已创建 订单 已⽀支付 明确服务包含的数据表 可视化的拆解遗留留系统 微服务架构、绞杀模式、代码依赖分析、数据库依赖分析、 遗留留系统拆解评分表、降⻰龙⼋八步 庖丁解⽜牛拆解的最⾼高境界 了了解⽜牛的⽣生理理构造 避开筋腱⻣骨节交错的组织 从⻣骨节的缝隙下⼿手 ⼗十九年年⼑刀依然锋利利 再看⼀一眼微服务架构 我们要做应⽤用代码拆分 我们要做数据库拆分 绞杀者模式 ‣“绞杀者模式”在既有系统资产的基础上实现数字IT 与Intellij或Eclipse相 结合,实时查看依赖, 指导拆解过程 已可视化 数据库依赖模式 模块A Data Mapper /ORM 相关联但不不属于 模块A的表 模块A Data Mapper /ORM 属于模块A的表 以模块(java包)为基本单位,从数据库依赖的⻆角度看,有两种模式: 属于模块A 的表 扫描数据库依赖 UserMapper.java UserMapper0 码力 | 54 页 | 3.85 MB | 1 年前3声明式自愈系统——高可用分布式系统的设计之道-王昕
Networking Data 启动异常 进程被杀 服务器假死 断电 启动异常 超卖 进程死锁 负载均衡失效 业务线程池满 监控错误 流控不合理 心跳异常 缓存热点 缓存限流 数据库热点 数据库宕机 数据库延迟 CPU 抢占 内存抢占 内存错乱 上下文切换 磁盘满 磁盘坏 网络抖动 网卡慢 断网 DNS 故障 系统单点 异步阻塞 依赖超时 内存溢出 不可读写 目录 Ø 分布式系统面临的高可用问题 根据高层 API 的控制需要设计 Ø API 对象是彼此互补而且可组合的 Ø 尽量避免简单封装,不要有隐藏的内部 API Ø API 操作复杂度与对象数量成正比 Ø API 对象状态不依赖于连接状态 Ø 针对全局状态设计自愈容错机制 最佳实践分享 有关系统设计和运营 Ø 分开设计理想状态和实际状态 Desired State Realized State Ø 利用队列解耦系统 结果,元数据, 数据,之前的请求 Ø 逻辑正确性不能依赖缓存,写操作服务端必须有校 验而且幂等,没有缓存情况下系统仍可服务 Ø 错误回复缓存,过期时间不能太长,而且有清晰的 修复建议 Ø 数据库更新与缓存失效的策略 最佳实践分享 有关配置文件 Ø 集群使用统一的配置来源 Ø 定义正常的默认配置,满足读取不到配置的正 常运行 Ø 支持可扩展的配置命令格式 Ø 尽量支持更改配置不需要重启服务0 码力 | 44 页 | 2.47 MB | 1 年前3大规模分布式系统架构下调测能力构建之道
调测存在如下困难: 开发依赖重 联调成本高 变动把控困难 拆 应用拆分 数据拆分 团队拆分 分布式服务 API Gateway 分布式文件 分布式缓存 分布式消息 DB Cluster 连接 序列化 路由 负载均衡 … 问题示例 1. 我依赖一个远程服务,但在负责它的团队把它上线之前,我什 么也做不了 2. 我负责的功能依赖一堆的远程服务,为了本地调测,我必须从 头到尾 单机环境下,可以参考MQ,采用本地File I/O实现的存储机制来mock 。 DataBase SandBox 1.为每个开发人员或测试人员提供一个单独(schema/catalog)的测试数据库。 2.预置数据独立管理,并通过测试框架提供预置数据前置导入及后置清除能力。 逻辑上支持“租户”隔离模式的分布式服务一般对多团队并行开发/调测的支持较好,分布式环境下,一般不会成为工程效率提升0 码力 | 19 页 | 2.74 MB | 1 年前3领域驱动设计&中台/物联网平台的反应式设计
为什什么需要反应式架构 设备影⼦子业务说明 1. 设备上报状态 2. 将上报状态持久化到数据库 3. 应⽤用查询上报的状态 4. 应⽤用设置期望的状态 6. 期望状态和上报状态的 差异 (delta) 同步⾄至设备 7. 设备上报新的状态 8. 将新的上报状态持久化到数据库 5. 将期望状态持久化到数据库 { “state”: { “desired”: { 10 } 设备影⼦子业务说明 1. 设备上报状态 2. 将上报状态持久化到数据库 3. 应⽤用查询上报的状态 4. 应⽤用设置期望的状态 6. 期望状态和上报状态的 差异 (delta) 同步⾄至设备 7. 设备上报新的状态 8. 将新的上报状态持久化到数据库 5. 将期望状态持久化到数据库 { “state”: { “desired”: { 11 } 设备影⼦子业务说明 1. 设备上报状态 2. 将上报状态持久化到数据库 3. 应⽤用查询上报的状态 4. 应⽤用设置期望的状态 6. 期望状态和上报状态的 差异 (delta) 同步⾄至设备 7. 设备上报新的状态 8. 将新的上报状态持久化到数据库 5. 将期望状态持久化到数据库 { “state”: { “desired”: {0 码力 | 18 页 | 1.81 MB | 1 年前3领域驱动设计&中台/演进式架构的平台化落地
module database API layer client requests client requests client requests 向以“领域”为中⼼心的架构迁移 演进数据库 (like code) — Tested — Versioned — Incremental scripting all db changes incrementally db 部署架构设计 测试环境 部署架构设计 绘制部署架构,组合服务和 部署元素 部署架构变更更历史 推荐部署架构(远期规划) 微服务开发框架定制 代码架构⻛风格选择 资源配置 数据库版本管理理 是否⾃自动⽣生成API/ Dockerfile/流⽔水线 ⽣生成 代码 到GIT 仓库 架构分析- 从契约反向识别实现与模型差异 架构分析- 架构Fitness Function检查 配置Sonar地址、展⽰示分析结果 数据结构分析- 测试环境的反向⼯工程可视化 数据结构分析- ⽣生产环境脚本导入可视化 领域模型- 基于代码守护的反向可视化 运⾏行行时部署架构可 视化 数据库 状态/版本显⽰示 创建系统 组建团队 我的系统 列列表 团队⼈人员⾓角⾊色 权限维护 外部系统维护 架构约束定 义维护 部署元素维护 代码引入ArchUnit/ log格式入⼿手0 码力 | 42 页 | 2.95 MB | 1 年前3数字货币交易系统架构 Python实现 黄毅
设计简单,运维方便 交易系统架构设计-关键点 • 内存撮合服务的状态持久化和高可用 • 消息处理顺序的保证 • 异步服务之间消息传送的可靠性 • K线:实时的分组聚合操作 • 高效利用关系数据库 交易系统架构设计-架构图 撮合 资金清算 行情推送 K线计算 历史成交 订单状态 PG Redis 下单 交易系统架构设计-撮合服务 • C++实现的Redis Module results) pg.execute(‘update task_offset set offset=%s’, [offset]) 交易系统架构设计-关系数据库批量操作 insert into trades values (1, …) (2, …) … psycopg2.extras.execute_values( cur, ‘insert %s’, data ) stream = io.StringIO() # 往stream写csv格式的数据 cur.copy_from(stream, ‘trades’) 交易系统架构设计-关系数据库批量操作 with tmp(id, amount) as ( values (1, …), (2, …), (3, …)) update orders set0 码力 | 24 页 | 799.65 KB | 1 年前3微服务和Service Mesh 在多个行业落地实践
设计要点四:服务拆分与服务发现 www.163yun.com 设计要点亓:数据库横向扩展 www.163yun.com 设计要点六:缓存的设计 APP缓存 CDN 接入层 静态资源 动态资源静态化 应用本地缓存 分布式缓存 数据库为中心 缓存为中心 www.163yun.com 设计要点七:消息队列与异步化 服务 告警 认证 鉴权 统计 概览 知识 库 APM (应用运行期监控) 运行时 拓扑 性能 监控 服务 筛选 调用 链 调用 栈 JVM 监控 数据库 监控 性能 告警 自定义 数据 服务 告警 监控 大屏 账户 审计 CICD (开发流程管理) 代 码 检 出 代 码 编 译 镜 像 构 建 集 成 测 试 A用户永远只访问A服务v1 VIP用户访问A服务V2,非VIP用户访问A服务V1 参数分流 微服务框架负责服务之间的调用——负载均衡与参数分流 www.163yun.com 分布式数据库 www.163yun.com 某大型银行 www.163yun.com • 两阶段提交XA——中间件DDB • TCC——中间件 Dubbo + DTS • Try 预留 +0 码力 | 39 页 | 3.06 MB | 1 年前3
共 23 条
- 1
- 2
- 3