分库分表实现

  • 何时需要分库分表

        只有当性能出现瓶颈,且无法通过优化方法提升性能的时候才考虑分库分表,即这是最后的方法;常见的优化方法就包括新增索引、优化索引、新增从库、读写分离

  • 瓶颈

        单表瓶颈--表数据量太大,出现读写性能问题

        单库瓶颈--CPU压力过大,内存压力过大,磁盘空间不足

  • 表的切分策略

        1.范围切分 根据某个字段的范围进行切分,比如ID,id在0~1000万在A表,1000~2000万在B表这种方式,有热点问题,写操作主要都集中在最后一张表

        2.中间表映射 维护一张分库分表的键与数据库表的映射关系,在查询和更新数据之前先查询这张表的数据,问题就是这张表的读压力过大,而且引入了新的节点,增加了复杂度

        3.Hash切分 通过对分库分表键进行一定的运算,比如取模运算,决定路由到哪张数据库表,优点是数据分片较为均匀,读写操作也较为均匀,但也可能会存在跨节点查询以及分页的问题

相关工具与技术

  • binlog同步 原新数据库数据同步  canal
  • 分库分表工具 

        1.客户端直连数据库 Sharding-JDBC TDDL

        2.数据库代理 MyCat 

  • 分库分表问题

        1.分布式ID问题

                UUID因为数据不是严格递增的,因为聚簇索引的问题,因此插入数据及查询数据会有性能问题,可以使用雪花算法或号段模式。

               号段模式--每次从数据库中读取一批的ID,将ID放入分布式缓存中,使用完毕后及时删除,全部使用后申请下一批ID

  • 分布式事务问题

  • 跨库join以及分页问题

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,以下是使用Spring Boot和JPA实现分库的步骤: 1. 配置数据源和数据库连接:在Spring Boot的配置文件中,配置多个数据源和数据库连接信息,以便连接到不同的数据库。 2. 创建实体类:创建与数据库对应的实体类,并使用JPA注解进行映射。 3. 创建Repository接口:创建继承自JpaRepository的Repository接口,用于对数据库进行操作。 4. 配置分库策略:使用分库中间件,如Sharding-JDBC,配置分库的策略,包括分库规则和分规则。 5. 编写业务逻辑:在Service层编写业务逻辑代码,调用Repository接口中的方法进行数据库操作。 6. 测试分库:编写测试代码,验证分库的功能是否正常。 以下是一个简单的示例代码: ```java // 实体类 @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // 省略getter和setter方法 } // Repository接口 public interface UserRepository extends JpaRepository<User, Long> { // 省略其他方法 } // Service层 @Service public class UserService { @Autowired private UserRepository userRepository; public User saveUser(User user) { return userRepository.save(user); } public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } } // 测试代码 @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testSaveUser() { User user = new User(); user.setName("John"); user.setAge(25); User savedUser = userService.saveUser(user); assertNotNull(savedUser.getId()); } @Test public void testGetUserById() { Long id = 1L; User user = userService.getUserById(id); assertNotNull(user); assertEquals(id, user.getId()); } } ``` 请注意,以上只是一个简单的示例,实际的分库实现可能涉及更多的配置和细节。具体的实现方式还取决于所使用的分库中间件和数据库类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值