前提
1. 大型网站中MySQL的架构,推荐文章 MySQL在大型网站的应用架构演变
2. SET的概念。 SET又名集装箱,在本篇文章中我们可以简单的理解一组Master-Slave集群,我们可以具备切分数据后的多组Master-Slave(即多组SET),每一个测试过后的SET都是经过标准化的。这个概念可以延伸至逻辑层以及整个架构。
问题
我们都知道把数据按照纵向和横向切分来构建大型的MySQL数据服务系统。纵向切分一般是业务领域切分,横向切分则大部分按照用户ID或者其他的key进行切分,方便放在不同的机器上。但是实战中还存在如下问题
1. 各种配置(用户,分表数,DB机等等)
2. 不同环境(开发环境,测试环境以及线上环境等等)
3. 读负载均衡,故障切换等等
我们希望打造一套组件,解决在不同环境SET的配置管理和自动负载的问题。数据迁移不需要变动任何逻辑层的代码。只需要进行基础的数据运维操作,变更线上部署配置,就能完成迁移和扩容工作
配置关联模型
1. 服务与接口: 对外公布的dao接口以及daemon本身都有可能。
2. 用户: 具备DB访问权限的DB用户。在set模型中,同一个DB用户可以访问多个SET中的所有机器。
3. 角色: 视角和部署的抽象。一个角色决定了访问的DB名称,所有承载在DB机构成的SET,以及对应每个DB中的表。
4. 表: 对应数据库的中实体表,但是增加了分表数。
5. DB : 每个SET都具有多组DB,但是每个DB担任了一个角色(Master或者Slave),一个SET集群中,只允许一个Master。
对外接口
class DalSetProxy {
public void loadFromXml()throws Exception; // 初始化
public Connection getConnection(
final String roleName,
final String serviceName,
final boolean isReadOnly,
final long setKey)throws SQLException; // 获取DB连接
public String getTableName(
final String roleName,
final String tableNamePrefix,
final long tableKey) throws SQLException; // 获取真实的表名
public int getSetNum(final String roleName) throws SQLException; // 获取角色对应的SET数
public int getTableSliceNum(final String roleName,
final String tableNamePrefix); // 获取分表数
}
系统架构
1. 使用DalSetProxy的loadFromXml进行初始化成功进程,都会利用jnotify进行文件变动的监听。当配置文件变化时,都会重新载入配置文件,进行配置重载。
2. 每台机器上都安装了一个daemon,会每个15s向配置中心请求最新配置。发现配置变更后,会从配置中心下载最新的配置,写入配置文件中。从而引发每个该机器上的进程进行熱载。
配置中心管理
1. DB机管理,用于配置所有的在使用的DB机
2. DB用户管理,用于配置所有的权限用户
3. DB表管理,用于配置系统中使用的表情况,以及分表数
4. 角色管理,用于配置系统中所有使用的角色
5. 角色SET部署,用于配置管理角色中所有SET的配置
阿里云服务在后端自己做了的Master-Slave配置,因此图中我们没有看到Slave节点。目前业务量也不需要多个Master,但是在模型上我们是支持的。
1) 扩容: 增加Slave,只需要在SET部署中将机器添加到部署中。添加SET,则进行数据迁移后,增加到该配置中,所有关联的服务和接口都能知晓。
2)故障切换: 假设某个SET中的Master挂掉。进行Slave上的运维配置后,我们改变主机存在的部署类型即可。
6. 服务角色关联
服务命令字: 结合svr_platform生成的命令字,为0则必须具备接口名称。
关联类型: Master(负责一定走在Master),Slave(负载一定走在Slave的机器上),NoType(由dal_set根据只读属性的参数,以及权重进行选择,进行读自由负载)
DAL_SET是一个配置化解决方案,主要用于抽象MySQL等关系数据库的SET模型。在前期设计阶段定义号分表数,切分的视角等。后期扩容只需要进行简单的运维操作,就能快速解决负载问题。但是由于进行了数据切分的设计,所以就失去了原有数据库本身的一些事务性特性等等。对于多视角共享的数据,部署隔离,数据冗余,进行数据同步是主要的解决办法。
DAL_SET就介绍到这里,下一节开始介绍一个小型组件,用于快速产生分布式环境下唯一ID的id_maker。