mysql主从&shardingsphere分库分表

问题:

1. 公司的mysql主从复制方式怎么查看——这个命令在哪敲

2.公司扩容一个从的时候怎么做的?——

3.公司主从架构模式是什么样的?几主几从

4.公司的业务场景有木有要求写后立马查出数据的

mysql主从架构

mysql主从架构详解

mysql读写分离

mysql主从集群扩容&半同步复制

mysql主从架构的问题

1.mysql同步方式以及半同步复制问题

Q1:半同步复制能保证一定不丢数据吗?

A:不能,因为半同步复制是至少一个slave同步到了,才响应客户端,因此可能slave挂了,但这种可能性很小,且无法避免,所以不考虑

Q2:半同步复制的影响:

A:半同步复制要等slave响应,所以写数据的时候性能会有影响,效率会低一点

主从延迟问题

在高并发场景下,从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。

压力测试 :

写请求1000/s-2000/s 大概有10 - 30ms左右的延迟。

写请求4000/s - 5000/s 大概有1 - 3秒左右的延迟。

如果主从延迟较为严重,有以下解决方案:

分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。 (即减少binlog同步日志)

打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。

重写代码。插入数据时立马查询可能查不到。比如尽量避免插入后就马上读。

如果 强行要求 :必须插入后,立马要求就能查询到 ,有以下解决方案:

通过数据库中间件,设置读写直连主库。不推荐这种方法,这么搞导致读写分离的意义就丧失了。

如果基于有这样的业务要求。不要试图在数据库层解决并发的读操作问题,至少不要在主从架构的数据库层解决。要在数据库层之上架构一个redis这样的分布式缓存来解决,它是专门干这个的。其性能肯定远高于从备机读取数据。

 2.1主从延时问题的原因以及解决办法part1

2.2主从延时问题的解决办法part2

2.3主从延迟原因

2.4主从延迟数据不一致解决方法

主从延迟的解决方案
 

shardingsphere分库分表

数据库分库分表思路

MySQL数据库之分库分表方案(只看这一个就够了)

多对多业务,数据库水平切分架构一次搞定

分库分表实战--- ShardingSphere实战

一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库分表方案。

MySQL-如何分库分表?一看就懂

shardingsphere分片策略

ShardingSphere-JDBC 的4种分片策略

hint:代码写死指定sql访问哪个库表

inline:yml配置 表达式——数据分布均匀,但是扩展难

standard:类定义,自己写实现——可以让数据范围分布,扩展容易(如生成含有年份的id,去处年份部分来分布) & 逻辑再加一层id按照表达式的逻辑 分布 ,就能实现:扩展容易 & 分布均匀

complex:多个字段分库表

shardingsphere主键生成策略(spi可以自定义)

ShardingSphere-JDBC 的3种主键生成策略

主键:uuid、雪花、自定义spi、none(业务构造id,然后setid进去)

ShardingSphere的扩展点

分库分表带来的问题

很多SQL不支持、数据迁移、扩缩容、公共表、读写分离、配置往注册中心集中配置

分布式事务处理

shardingsphere源码

shardingsphere优化

内存限制模式(maxconnectionperquery大,每个连接都持有数据,一条条放到内存中,流失归并,用完一个结果,释放一个内存):OLAP,适用于实时分析,报表,吞吐量大——流失结果集
连接限制模式(所有结果都先放到内存中):效率高,试用于大事务——产生内存结果集(可能内存溢出)

区—ShardingSphere之分组group by过多消耗内存的问题

ShardingSphere官网操作指南补充和重点整理-数据分片-内核剖析(五)

maxconnectionperquery & 内存限制模式 & 归并模式——待解决

7. sharding-jdbc源码之group by结果合并(2)

数据库动态扩容缩容

考虑的问题:

2、两个库,四个表。要如何将数据分配均匀?

3、如何定制适合业务场景的数据分片策略?

Q:有哪些常用的数据分片策略?

取模分片、按时间范围分片、按业务要素 (如地区、前缀等)分片。。。。

取模分片:能够将数据分配得尽量的平均,但是不利于扩展。

范围分片:便于扩展但是他的数据分布又不够均匀。

A:是不是可以定制一种分片策略,将这两种分片策略结合起来?比如大 尺度上按范围分片,但是在每个数据范围内,使用取模分片。这种分片 策略要如何在ShardingSphere中实现?

2、旧数据处理方式

如果要在中途进行分库分表,要分为两个步骤:

1. 首先:要评估数据分片方案,对关键的SQL进行整理并分析。分库分表后,有很 多SQL是无法支持的,这些SQL一定要优先从业务中去掉。这个步骤很容易被忽略, 但是一定是必不可少的。有哪些SQL是ShardingSphere不支持的? 参见官网。

2. 然后:当你制定好了分库分表方案后,不要急于迁移旧数据。最好是在业务中对 SQL进行数据双写。即老数据库写一份,新的分片后的数据库也写一份。观察一段 时间,等业务稳定了之后,再考虑全部转移到分片后的新数据库中。这同样需要多 方定制ShardingSphere的分片策略,简单的inline是很难达到这个目的的。

3. 接下来:进行旧数据迁移时,可以采用ShardingProxy来协助进行数据转移。部 署同样分片策略的ShardingProxy,一方面可以在MySQL的客户端工具中快速验证 分片策略,另外可以使用sqoop、keetle等工具来协助进行数据转移。

分库分表带来的问题 定制主键生成策略

主键是分库分表中非常重要的业务要素,通常分库分表都会采用主键来作为分片 键,这个时候主键就不再只是用来提升查询效率了,还需要坚固数据分片的效率。 要如何定制高效的主键生成策略?

很多SQL不支持

例如MySQL里会配for each标签来执行批量SQL,原始数据库是支持的,但是分 库分表不支持。

查询的SQL比较多时,路由策略是否支持? 去官网上查一下分库分表的不支持项。

其他问题

数据迁移、扩缩容、公共表、读写分离、配置往注册中心集中配置

分布式事务处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的 Shardingsphere 分库分表 demo 配置: 1. 引入依赖 首先需要在项目中引入 Shardingsphere 的相关依赖,具体版本号可根据需求自行选择。 ```xml <!-- ShardingSphere JDBC Core APIs --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-core-jdbc</artifactId> <version>${sharding.version}</version> </dependency> <!-- ShardingSphere JDBC Spring Boot Starter --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding.version}</version> </dependency> ``` 2. 配置数据源 在 application.yml 中配置数据源信息,包括主库和从库的信息。 ```yml spring: datasource: # 主库数据源 master: jdbc-url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # 从库数据源 slave1: jdbc-url: jdbc:mysql://localhost:3306/slave_db1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave2: jdbc-url: jdbc:mysql://localhost:3306/slave_db2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver ``` 3. 配置分库分表规则 在 application.yml 中配置分库分表规则,包括分库规则和分表规则。 ```yml sharding: # 分库规则 default-database-strategy: standard: sharding-column: user_id precise-algorithm-class-name: com.example.demo.algorithm.ModuloDatabaseShardingAlgorithm # 分表规则 tables: user: actual-data-nodes: master.user_${0..1} table-strategy: standard: sharding-column: id precise-algorithm-class-name: com.example.demo.algorithm.ModuloTableShardingAlgorithm ``` 其中,ModuloDatabaseShardingAlgorithm 和 ModuloTableShardingAlgorithm 是自定义的分库分表算法,这里只是简单示例。 4. 编写 DAO 层代码 在 DAO 层编写相应的代码,使用 ShardingSphere 提供的 API 完成数据库操作,例如: ```java @Repository public class UserDaoImpl implements UserDao { private final JdbcTemplate jdbcTemplate; @Autowired public UserDaoImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public User getById(Long id) { String sql = "SELECT * FROM user WHERE id = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class)); } @Override public void save(User user) { String sql = "INSERT INTO user(id, user_id, name) VALUES (?, ?, ?)"; jdbcTemplate.update(sql, user.getId(), user.getUserId(), user.getName()); } } ``` 5. 测试分库分表效果 编写测试代码,测试分库分表的效果,例如: ```java @SpringBootTest class UserDaoImplTest { @Autowired private UserDao userDao; @Test void testSave() { User user = new User(); user.setId(1L); user.setUserId(1L); user.setName("张三"); userDao.save(user); } @Test void testGetById() { User user = userDao.getById(1L); System.out.println(user); } } ``` 至此,一个简单的 Shardingsphere 分库分表 demo 配置就完成了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值