加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

从分库分表后遗症,总结数据库表拆分计策

发布时间:2018-08-15 15:55:32 所属栏目:编程 来源:王清培(沪江)
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 本文将首要从配景、分库分表带来的后遗症、分表计策以及一些留意事项等方面临数据库分表来举办小结。 一、配景 最近一段时刻内竣事了数据库表拆分项目,本次拆分首要包罗订单和优惠

在我们认识的HashMap里,为了镌汰斗嘴和提供必然的机能将Hash桶的巨细配置成2的n次方,然后回收Hash&(legnth-1)位与的方法计较,这样首要是人人们发明2的n次方的二进制除了高位是0之外全部职位都是1,通过位与可以快速反转二进制然后职位加1就是最终的值。

我们在做数据库Sharding的时辰不必要参考这一原则,这一原则首要是为了措施内部Hash表行使,外部我们原来就是要Hash mod确定Sharding node 。

通过mod取模的方法会呈现不匀称题目,在此基本上可以做个自界说奇偶路由,这样可以匀称双方的数据。

四、一些留意事项

1、在现有项目中集成Sharding-JDBC有一些小题目,Sharding-JDBC不支持批量插入,假如项目中已经行使了大量的批量插入语句就必要改革,可能行使帮助hash计较物理表名,再批量插入。

2、原有项目数据层行使Druid + MyBatis,集成了Sharding-JDBC之后Sharding-JDBC包装了Druid ,以是一些Sharding-JDBC不支持的SQL语句根基就过不去了。

3、行使Springboot集成Sharding-JDBC的时辰,在bean加载的时辰我必要配置 IncrementIdGenerator ,可是呈现classloader题目。I

  1. IncrementIdGenerator incrementIdGenerator = this.getIncrementIdGenerator(dataSource); 
  2.  
  3. ShardingRule ShardingRule = ShardingRuleConfiguration.build(dataSourceMap); 
  4.  
  5. ((IdGenerator) ShardingRule.getDefaultKeyGenerator()).setIncrementIdGenerator(incrementIdGenerator); 
  6.  
  7. private IncrementIdGenerator getIncrementIdGenerator(DataSource druidDataSource) { 
  8.  
  9. ... 
  10.  
  11.     } 

其后发明Springboot的类加载器行使的是restartclassloader,以是导致转换一向失败。只要去掉spring-boot-devtools package即可,restartclassloader是为了热启动。

4、dao.xml逆向工程题目,我们行使的很大都据库表MyBatis天生器材天生的时辰都是物理表名,一旦我们行使了Sharding-JDCB之后都是用的逻辑表名,以是天生器材必要提供选项来配置逻辑表名。

5、为MyBatis提供的SqlSessionFactory必要在Druid的基本上用Sharding-JDCB包装下。

6、Sharding-JDBC DefaultkeyGenerator默认回收是snowflake算法,可是我们不能直接用我们必要按照datacenterid-workerid本身共同Zookeeper来配置 workerId 段。

(snowflake workId 10 bit 十进制 1023,dataCenterId 5 bit 十进制 31 、WorkId 5 bit 十进制 31)

7、因为我们行使的是mysql com.mysql.jdbc.ReplicationDriver自带的实现读写疏散,以是处理赏罚读写疏散会利便许多。假如不是行使的这种就必要手动配置Datasource Hint来处理赏罚。

8、在行使MyBatis dao mapper的时辰必要多份逻辑表,由于有些数据源数据表是不必要走Sharding的,自界说ShardingStragety来处理赏罚分支逻辑。

9、全局ID几种要领:

  • 假如行使 Zookeeper来做漫衍式ID,就要留意session expired也许会存在一再workid题目,加锁可能接管必然水平的并行(有序列号担保一段时刻空间)。
  • 回收齐集发号器处事,在主DB中回收预天生表+incrment 插件(经典取号器实现,InnoDB存储引擎中的TRX_SYS_TRX_ID_STORE 事宜号也是这种方法)。
  • 定长发号器、营业法则发号器,这种必要营业上下文的发号器实现都必要预先设置,然后每次哀求带上获取上下文来声名获取营业范例。

10、在项目中有些处所行使了自增ID排序,数据表拆分之后就必要举办改革,由于ID巨细次序已经不存在了。按照数据的最新排序时行使了ID排序必要改革成用时刻字段排序。

【编辑保举】

  1. 是什么影响了数据库索引选型?
  2. 数据库插入可能更新大批量数据的机能优化
  3. 静默错误:Oracle数据库是怎样应对和处理赏罚的 ?
  4. 【器材】数据库计划中的6个最佳实践步调
  5. 口试中有哪些经典的数据库题目?
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读