Bond——大数据时代的数据交换和存储格式

设想我们在一家很大的互联网公司做IT方面的规划、开发和维护,有以下这样的应用场景:

  • 公司里有若干个不同的开发团队,开发语言有Java、.net、Python、C++…十来种,还有很多外包团队对项目进行开发,大中小系统已经多的数不过来;并且各个团队、系统间都需要进行海量数据的交换(比如搜索引擎实时的数据,GPS物联网实时数据,电站的实时监控数据等),如何定义一种数据格式,使得各种平台和语言都能够兼容,交换的成本最低?
  • 如此多的结构化、非结构化数据都需要进行存储,有几百个哈杜集群、数十万台、百万台服务器,数据存储在Hbase、RocksDb或者其他自己开发的数据库结构中,对查询的实时性很高(内存表个位数毫秒、SSD十几毫秒等)。如何用一种较为统一的格式存放这些数据?

相信在大公司或者在大公司做过外包的童鞋,都接触过这样一种数据对象,那就是Bond格式,目前Bond由M$维护,官方网站:https://github.com/microsoft/bond/,上面提供了各种语言的示例、编译工具等。
一个基本的Bond文件如下所示:

namespace School

struct Student
{
    0: string Name;
    1: uint8 Age;
    2: bool IsBoy;
    3: optional vector<string> Interests;
}

这里定义了一个学校的命名空间,里面有个学生类,学生类里面有四个字段,依次是姓名、年龄、是否为男孩、兴趣爱好的列表(可选)。

很容易看出Bond结构实际是与平台和语言无关的,它是一个DSL,在不同的平台上,利用Bond编译工具gbc,可以把Bond文件编译成不同的类,然后就可以赋值、存储和传输了,编译好的Bond原生支持RPC调用。

Bond支持的数据类型有:

  • 基本类型:int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double, bool, string, blob等,需要注意java平台没有uint类型,会编译成带有符号的同类型,数据会丢失精度(正数变成负数);
  • 列表 vector、字典 map
  • 枚举 enum
  • 默认值
  • 可选字段 optional,必须字段 required
  • 可空字段 nullable
  • 支持类的继承
  • 支持字段的修饰 Attribute,这对前端验证和数据库存储比较有用,能定义字段长度、范围、列族等

这些类型能很好的满足数据交换和存储的需要;除此以外,Bond是一种非常高效的数据存储格式,它的二进制序列化最大程度去除了元数据的影响,极其紧凑,我们来看一个示例:

ListingItem是一个Bond类型,它的结构定义如下:

struct ListingItem
{
    1: required uint64 xxxxxxxxx; 
    2: required uint8 xxxxxxxxx; 
    3: optional uint16 score;
    4: optional vector<xxxx> xxxxxxxxxxx;
    5: optional map<xxxxxx, uint16> xxxxxxxxx; 
    6: optional xxxxxx xxxxxxxxxxx = Exxxxx;
    7: optional bool IsDeleted;
    8: optional vector<xxxxxxxx> xxxxxxxxList = nothing;
}

由于牵涉到生产环境的真实数据,所以一些字段和引用使用xxxxx来代替了,这个类的大小中等,有各种字段,还有对其它类的引用和集合等等。

我们用随机化的方式生成一百万个类,类里面的字段和引用都不一样,数值都是随机生成的,然后用Bond序列化和Java中带的Gson序列化方式进行序列化后的二进制长度比较,渣代码如下:

    @Test
    public void ListingItemTest() throws IOException {
   
   
        int cycleLength = 
在 Linux 系统中,`bond0` `bond1` 是两个独立的网络绑定接口实例,它们之间的区别主要体现在接口名称、配置参数以及绑定模式等方面。这些接口可以分别配置不同的绑定模式、物理网卡、IP 地址 VLAN 设置,以满足不同的网络需求。 ### 3.1 接口命名与实例化 `bond0` `bond1` 是两个不同的绑定接口实例,命名上通过数字编号区分。系统通过这些名称识别不同的绑定接口,并为每个接口分配独立的配置。例如,`bond0` 可能用于主网络连接,而 `bond1` 可用于管理网络或 VLAN 子接口 [^3]。 ### 3.2 绑定模式配置 每个绑定接口可以配置不同的绑定模式。例如,`bond0` 可以使用 `mode=4`(LACP)以实现链路聚合控制协议(LACP)的动态链路聚合,而 `bond1` 可以使用 `mode=1`(active-backup)实现主备冗余。绑定模式决定了接口的流量转发策略故障切换机制 [^4]。 以下是一个配置 `bond0` 使用 LACP 模式的示例: ```bash DEVICE=bond0 ONBOOT=yes BOOTPROTO=none BONDING_OPTS="mode=4 miimon=100 lacp_rate=1" ``` 以下是一个配置 `bond1` 使用主备模式的示例: ```bash DEVICE=bond1 ONBOOT=yes BOOTPROTO=none BONDING_OPTS="mode=1 miimon=100" ``` ### 3.3 物理网卡绑定 `bond0` `bond1` 可以绑定不同的物理网卡。例如,`bond0` 可以绑定 `eth0` `eth1`,而 `bond1` 可以绑定 `eth2` `eth3`。这种配置方式允许不同的绑定接口连接到不同的物理网络,从而实现网络隔离或负载分担 [^3]。 使用 `nmcli` 命令配置 `bond0` `bond1` 的物理网卡示例如下: ```bash nmcli connection add type bond con-name bond0 ifname bond0 mode 4 nmcli connection add type bond-slave con-name bond0-slave0 ifname eth0 master bond0 nmcli connection add type bond-slave con-name bond0-slave1 ifname eth1 master bond0 nmcli connection add type bond con-name bond1 ifname bond1 mode 1 nmcli connection add type bond-slave con-name bond1-slave0 ifname eth2 master bond1 nmcli connection add type bond-slave con-name bond1-slave1 ifname eth3 master bond1 ``` ### 3.4 IP 地址与 VLAN 配置 每个绑定接口可以配置独立的 IP 地址 VLAN 子接口。例如,`bond0` 可以配置主 IP 地址 `192.168.1.100`,而 `bond1` 可以配置管理地址 `10.0.0.100`。此外,`bond0` 还可以创建 VLAN 子接口,如 `bond0.10` `bond0.20`,分别用于不同 VLAN 的通信 [^1]。 配置 `bond0` 的 VLAN 子接口示例如下: ```bash DEVICE=bond0.10 ONBOOT=yes BOOTPROTO=none IPADDR=192.168.10.100 NETMASK=255.255.255.0 VLAN=yes PHYSDEV=bond0 ``` ### 3.5 状态查看与验证 可以使用 `cat /proc/net/bonding/bond0` `cat /proc/net/bonding/bond1` 查看两个绑定接口的状态信息,包括当前绑定模式、物理网卡状态、LACP 状态等。例如: ```bash cat /proc/net/bonding/bond0 ``` 输出信息将显示 `bond0` 的绑定模式、当前活动的网卡、LACP 状态等关键信息 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值