大型系统的java中间件实践q con北京

49
大大大 Java 大大大大大 2009-8-22

Upload: vanadies10

Post on 24-Jun-2015

3.709 views

Category:

Documents


7 download

DESCRIPTION

The practice of the java middlerware in the huge distributed system.

TRANSCRIPT

Page 1: 大型系统的Java中间件实践q con北京

大型系统的 Java 中间件实践

2009-8-22

Page 2: 大型系统的Java中间件实践q con北京

About me

• 姓名 : 曾宪杰

• 花名 : 华黎

• 淘宝 - 产品技术部 - 综合业务平台

• 团队博客 http://rdc.taobao.com/team/jm/

• Sina 微博 @ 曾宪杰 _ 华黎

• Twitter @vanadies10

Page 3: 大型系统的Java中间件实践q con北京

Agenda

• 中间件带来的变化

• Java 中间件 @ 淘宝

• 总结和展望

Page 4: 大型系统的Java中间件实践q con北京

几个名词• 中间件

• Java 中间件

• 大型互联网

• 大型系统 .

Page 5: 大型系统的Java中间件实践q con北京

之前

App1 App2 App3 ……

DB Cache 分布式文件系统

搜索非可靠通知服务

Page 6: 大型系统的Java中间件实践q con北京

之后LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 7: 大型系统的Java中间件实践q con北京

Java 中间件 @ 淘宝• 消息中间件

• 服务框架

• 软负载与配置管理

• 数据层

Page 8: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 9: 大型系统的Java中间件实践q con北京

Java 中间件 - 消息中间件• Notify

– 轻量级支持最终一致– 支持订阅者集群

• MetaQ(metamorphosis)– 消息顺序– 事务

正在准备开源

已经开源

Page 10: 大型系统的Java中间件实践q con北京

Notify- 最终一致性

Publisher

Notify Storage

T1发送half 消息

T4 业务操作

T3 返回消息入库结果

T2 存储 half 消息

T6 提交 : 更新数据库 标识消息可发送回滚:删除消息

S1定期检查未提交的消息

S2 提交 / 回滚

本地事务域

本地事务域

业务操作

S3 提交 : 更新数据库 标识消息可发送回滚:删除消息

T5提交 /回滚

Page 11: 大型系统的Java中间件实践q con北京

订阅者集群:消息的一个逻辑上的订阅者是有多个物理节点组成的一个集群

A1 和 A2 是 SystemA 中的两个机器A1 和 A2 共同来消费投递到 SystemA 的消息

B1 和 B2 也是类似的关系

Notify- 订阅者集群

Publisher Notify

A1 A2

SubscriberA

B1 B2

SubscriberB

Page 12: 大型系统的Java中间件实践q con北京

Queue In JMS

• 每个连接都有唯一的 ClientId

消息 (1-8) Queue

JMS Server

A1 A2 B1 B2

1 , 5 2 , 6 3 , 7 4 , 8

Page 13: 大型系统的Java中间件实践q con北京

Topic In JMS

• 每个连接都有唯一的 ClientId

消息 (1-8) JMS Server

A1

A2

B1

B2

Topic

1-8

1-8

1-8

1-8

Page 14: 大型系统的Java中间件实践q con北京

MetaQ

Meta Server

remoting

Message StoreNetwork Processor

stats

HttpMeta Slave

NotifyAdapter

NotifySlave

TimetunnelAccepter

Meta Master

NotifyServer TT Http

ClientNotifyClient

Meta Client Meta Manager ToolsCpp Client

Meta Ops

Zookeeper

ProducerApp

ConsemerApp

Meta Client NotifyAdapter

Diamond

HDFS

DB

Hbase

Agent

Page 15: 大型系统的Java中间件实践q con北京

消息可靠

• Oracle+ 小型机 + 高端存储

• 写双份 Mysql

• Mysql Replication

• 基于文件

• 基于内存 .

Page 16: 大型系统的Java中间件实践q con北京

Notify vs MetaQ

• 功能

– 顺序

– 去重

– 事务

– 集群订阅者与组内广播

– 扩容

– 可靠性 .

Page 17: 大型系统的Java中间件实践q con北京

消息中间件

• 功能外要考虑的

– 隔离

– 降级

– 性能

– 问题定位和排查 .

Page 18: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 19: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架• 需求的产生

Denali Mckinley Fortuna ……

DB Cache 分布式文件系统

搜索非可靠通知服务

LoadBalancer

服务框架

WebApp WebApp

Service Service

DB DB DB(S) DB(S)

Page 20: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架 服务发布

服务查询

服务调用

服务治理

Page 21: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架• 纯 Proxy 方式

调用者 服务提供者调用者 服务提供者

调用者 服务提供者调用者 服务提供者

Page 22: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架

调用者 服务提供者

调用者 服务提供者

服务注册查找中心

服务框架

服务框架

服务框架

服务框架

发布服务地址信息定于服务地址信息中心会主动推送

请求直接送达服务端没有中心代理服务器

Page 23: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架

• 上线不仅仅是功能这么简单– 隔离

– 路由

– 降级 / 流控

– 依赖图

– 跨语言支持

– 跨机房处理 .

• 计划 6 月底前开源

Page 24: 大型系统的Java中间件实践q con北京

Java 中间件 - 服务框架

调用者 服务提供者

调用者 服务提供者

服务注册查找中心

服务框架

服务框架

服务框架

服务框架

发布服务地址信息定于服务地址信息中心会主动推送

请求直接送达服务端没有中心代理服务器

持久配置中心

各种规则

Page 25: 大型系统的Java中间件实践q con北京

Java 中间件 - 软负载中心LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 26: 大型系统的Java中间件实践q con北京

配置中心 订阅者发布者

配置中心是一个基于经典的“发布/订阅”模型的通讯框架。并在此基础上融入了适合淘宝网情的一些本土化特性,比如数据发布的自动聚合、生命周期关联……

Java 中间件 - 软负载中心

Page 27: 大型系统的Java中间件实践q con北京

自动聚合

配置中心

使用场景:服务集群的成员信息汇聚,如: > 汇总服务提供者 > 汇总服务器地址

Java 中间件 - 软负载中心

Page 28: 大型系统的Java中间件实践q con北京

生命周期关联

配置中心

使用场景:自动关联服务的可用状态,如: > 即时感知服务提供者的加入 / 退出 > 服务器集群成员清单的动态维护

进入 Java 中间件 - 软负载中心

Page 29: 大型系统的Java中间件实践q con北京

进入 Java 中间件 - 软负载中心• 其他功能

– 支持指定分组

– 基于 IP 的分组

– 机房隔离

– 权重调整

• 教训– 性能

– 生命周期的感知 .

• 计划 6 月底之前完成开源

Page 30: 大型系统的Java中间件实践q con北京

Java 中间件 - 配置管理LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 31: 大型系统的Java中间件实践q con北京

Java 中间件 - 配置管理• 是一个集中式的持久配置管理系统

• 简单– 数据库集中存储,没有集群间同步,保证数据一致

– 以Web server + static file 方式提供服务

– 只能通过OPS&SDK 发布数据

• 可靠– 支持主动和定时方式,保证能拿到最新数据

• 正常情况延迟 <1S ,异常情况延迟 <10S

– 多级保护和容灾支持• 数据库、 Server挂了都不会影响应用

• 允许人工介入– 支持本地配置,可以脱离 server 运行

• 正在开源中

Page 32: 大型系统的Java中间件实践q con北京

Apache Apache

Web App Web App

流控模块mod_evasive

Client SDK

MySQLFile File

更新

更新时 & 定时 dump

读取数据的请求

OPS

MySQLMySQLMySQL

replication

主动 / 定时获取配置 发布配置

Java 中间件 - 配置管理

Page 33: 大型系统的Java中间件实践q con北京

Java 中间件 - 配置管理

• 配置管理与软负载中心的关系–看起来是比较像的两个系统

– 数据来源不同

– 数据生命周期不同

– 数据准确程度不同

Page 34: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层LoadBalancer

消息中间

件服务框架

软负载中

心配置管理

WebApp WebApp

Service Service

Cache

分布式存储

搜索

DB

数据层

并行计算平台

DB DB(S) DB(S)

监控 / 告警运维平台

迁移 / 复制

依赖、容量管理

Page 35: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

User

User1

User2

User1-M

User2-M User2-S

User1-S分库分表

读写分离

数据库架构的演进

Trade/User

Trade

垂直拆分

Page 36: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

开源过程中

Page 37: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

Page 38: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

User1-M

User2-M User2-S

User1-S

TAtomDataSource

TGroupDataSource

TDataSource

数据源的三层重构业务可以灵活选择

Page 39: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层 -DbProxy• Client->DB 方式走向 Client->Server->DB

Page 40: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层 -读写分离

Master

Slave

Page 41: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层 -读写分离

Slave

Master1 Slave1-1 Slave1-2 ……

通过拦截 SQL 操作 ->记录日志 ->完成复制

支持不同维度、不同目标的复制

在去 O以及很多 Oracle 作为主库下做读写分离起到很大帮助

Page 42: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层• 基于 Binlog 的数据复制的改进

• 数据平滑迁移

• Mysql 运维平台 .

Page 43: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层• 数据需要流向 DB 外

• DB 外的数据回流 DB

Source1

Source2

Source3

Event 管道

Dest1

Dest2

Dest3

Page 44: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

App App

DB

数据层

DB DB(S) DB(S)

迁移 / 复制

存储 搜索

Page 45: 大型系统的Java中间件实践q con北京

Java 中间件 - 数据层

• SQL解析,路由规则,数据合并

• Client->DB 和 Client->Server->DB 模式

• 非对称数据复制

• 三层的数据源结构

• 数据平滑迁移

• 数据变更通知平台 .

Page 46: 大型系统的Java中间件实践q con北京

总结和展望• 消息系统

– 每日消息总量 10亿 +。最终一致事务消息的量 2亿 +/天;

– 每日消息投递条次约 20亿次

– 平均消息大小 2k

– 总共 100+ 个消息主题, 1000+ 种消息类型,部分消息的订阅者超过 80 个集群

• 服务框架– 线上提供服务数量: 1000+

• 数据层

– 接入了所有重要 Java应用,覆盖率超过 Java应用的 80%

– 每日数据复制记录数 10亿 +。

Page 47: 大型系统的Java中间件实践q con北京

总结和展望• 易用性

– 开发

– 调试

– 运维

• 稳定性– 降级

– 隔离

– 对应用的保护

Page 48: 大型系统的Java中间件实践q con北京

总结和展望• 中间件对于大型互联网的价值

• 构建中间件的策略 .

Page 49: 大型系统的Java中间件实践q con北京

谢谢