DBProxy代码浅析

DBProxy代码浅析

你理想中的数据库Proxy是什么样子的?

程序员都希望数据库是能够无限存储数据的,但是单个DB Instance明显是无法做到的,所以分库分表就是解决海量数据存储的必经之路,但是我们又不希望在应用层指定db1,db2,table1,table2来增删改查,那样的话太繁琐了。所以我们希望有这样一个Proxy:
在这里插入图片描述

  1. User直接连接Proxy做DB Operation,跟使用单库单表没有区别。
  2. Proxy去处理分库分表的细节,User完全不用关心。
  3. 支持读写/主从分离,能做负载均衡。

DBProxy(https://github.com/highras/dbproxy)就是这样一个Proxy,你只需要提供一个hint(hash码),DBProxy就能帮你找到数据在哪个库哪个表上。数据库的扩容也不用担心,可以交给运维同学啦:)

怎样通过DBProxy插入和查找一条数据

现在我们假设游戏需要一张role表存放玩家的基础信息,roleid是主键。role表会为每个新玩家都创建一行数据,所以这张表往往是游戏里最大的几张表之一,在全球同服的游戏架构里,是不可能把所有role信息保存在单张表里的,只能做分库分表。我们这里把主键roleid作为hintid(这是一个通用策略,建议每张表的hintid都用该表的主键值),来分析DBProxy是怎么定位这条数据该保存到哪张库那张表。这里仅分析hash分表的方式,也是DBProxy强力推荐的方式。对range split感兴趣的同学在看完这篇md之后可以自行分析,其实主体流程基本是一样的。

  1. DBProxy要处理分库分表的细节,那它就肯定要保存分库分表的信息。DBProxy用以下几张表来保存信息:
    server_info表:用来保存mysql instance的信息,每添加一个mysql instance,在表中就插入一行,DBProxy就可以使用这个mysql instance了。
CREATE TABLE IF NOT EXISTS server_info (
	server_id int unsigned not null primary key auto_increment,
	master_sid int unsigned not null default 0,   -- if master_id is zero, self is master; else self is slave.
	host varchar(255) not null,
	port int unsigned not null default 3306,
	user varchar(32) not null default '',
	passwd varchar(64) not null default '',
	timeout int unsigned not null default 0,
	default_database_name varchar(255) not null default '',
	index(master_sid),
	unique(host, port)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

table_info表:记录分表信息,比如刚才提到的role表要做分库分表,在table_info里就会插入一行数据,table_name是role,table_count是分成多少张表,hint_field是hintid对应的column名(比如主键roleid)

CREATE TABLE IF NOT EXISTS table_info (
	id int unsigned not null primary 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值