博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sharing-jdbc实现读写分离及分库分表
阅读量:5298 次
发布时间:2019-06-14

本文共 3967 字,大约阅读时间需要 13 分钟。

需求:

分库:按业务线business_id将不同业务线的订单存储在不同的数据库上;

分表:按user_id字段将不同用户的订单存储在不同的表上,为方便直接用非分片字段order_id查询,可使用基因法;

读写分离:为缓解主库的压力,读操作访问从库;

库表SQL

-- 主库CREATE DATABASE `database_103`;CREATE DATABASE `database_112`;-- 从库CREATE DATABASE `database_slave_103`;CREATE DATABASE `database_slave_112`;--每个库上分别建立如下表CREATE TABLE `t_order_0` (  `id` bigint(20) NOT NULL,  `order_id` bigint(20) NOT NULL,  `user_id` bigint(20) NOT NULL,  `business_id` bigint(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `t_order_1` (  `id` bigint(20) NOT NULL,  `order_id` bigint(20) NOT NULL,  `user_id` bigint(20) NOT NULL,  `business_id` bigint(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `t_order_2` (  `id` bigint(20) NOT NULL,  `order_id` bigint(20) NOT NULL,  `user_id` bigint(20) NOT NULL,  `business_id` bigint(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `t_order` VALUES (1,1,112);CREATE TABLE `t_order_3` (  `id` bigint(20) NOT NULL,  `order_id` bigint(20) NOT NULL,  `user_id` bigint(20) NOT NULL,  `business_id` bigint(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

pom.xml

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

spring-database.xml

true
true

基因法多列分片

public class MultipleKeysTableShardingAlgorithmImpl implements MultipleKeysTableShardingAlgorithm {    public Collection
doSharding(Collection
tableNames, Collection
> shardingValues) { List
shardingSuffix = new ArrayList
(); long partId = 0; for (ShardingValue value : shardingValues) { if (value.getColumnName().equals("user_id")) { partId = ((Long) value.getValue()) % 4; break; } else if (value.getColumnName().equals("order_id")) { partId = ((Long) value.getValue()) % 4; break; } } for (String name : tableNames) { if (name.endsWith(partId + "")) { shardingSuffix.add(name); return shardingSuffix; } } return shardingSuffix; }}

什么是基因法分片?

在订单数据oid生成时,order_id末端加入分片基因,让同一个user_id下的所有订单都含有相同基因,落在同一个表上。

资料:https://mp.weixin.qq.com/s/PCzRAZa9n4aJwHOX-kAhtA

根据user_id生成order_id:

public long bulidOrderId(long userId) {        //取用户id后4位        userId = userId & 15;        //先取60位唯一id        long uniqueId = this.nextId();        //唯一id左移4位、拼接userId后4位        return (uniqueId << 4) | userId;    }
this.nextId();//使用雪花算法生成60位分布式唯一id:1位符号位+41位时间戳+5位workId+5位datacenterId+6位序列号+4位基因片

 小结

数据分片:

  • 支持分库+分表;
  • 可支持 = , BETWEEN,IN等多维度分片,也支持多分片键共用;
  • 支持聚合,分组,排序,分页,关联等复杂查询语句;
  • 分片灵活,支持多分片键共用,支持inline表达式;
  • 基于Hint的强制路由;
  • 支持分布式主键

读写分离:

  • 支持一主多从的读写分离;
  • 支持分库分表与读写分离共同使用
  • 支持分布式生成全局主键。

柔性事务:

  • 最大努力到达型事务

分布式治理:

  • 支持配置中心,可动态修改
  • 支持客户端熔断和失效转移

引用:http://shardingsphere.io/

转载于:https://www.cnblogs.com/sidesky/p/10822726.html

你可能感兴趣的文章
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
HDU4405--Aeroplane chess(概率dp)
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>