Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1|回复: 0

新闻天下面试官:你项目是如何现读写分离的

[复制链接]

38万

主题

0

回帖

114万

积分

超级版主

Rank: 8Rank: 8

积分
1149389
发表于 昨天 16:25 | 显示全部楼层 |阅读模式
读写分离(Read-Write Splitting)是一种常见的数据库架构化策略,通过将数据库的读操作(查询)和写操作(插入、更新、删除)分离到不同的数据库例上,从而提高系统的性能、可扩展性和高可用性。

图片
图片

在项目中现读写分离目前主流的现技术是通过 Apache ShardingSphere 来现数据库的读写分离的。

从 Apache ShardingSphere 官网也可以看出读写分离是其提供的主要功能之一:

图片
图片

ShardingSphere 官网地址:https://shardingsphere.apache.org/document/current/cn/features/readwrite-splitting/

通过 ShardingSphere 可以轻松现 MySQL 数据库的读写分离,以下是基于比较新 ShardingSphere 5.x 版本的现步骤和关键代码:

1.核心现原理
ShardingSphere 通过 JDBC 驱动层透明代理现读写分离,其核心逻辑为:

SQL 路由:根据 SQL 类型(SELECT/WRITE)自动路由到主库或从库。
负载均衡:支持轮询、随机权重等算法分配读请求到多个从库。
主从同步:依赖 MySQL 原生主从复制机制保障数据一致性。
图片
图片

2.具体现步骤
步骤 1:搭建MySQL主从复制(前置条件)
复制
-- 主库配置(my.cnf)
server-id=1
log-bin=mysql-bin
binlog-format=ROW

-- 从库配置(my.cnf)
server-id=2
relay-log=relay-bin
read-notallow=1

-- 主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'P@ssw0rd';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 从库配置主库连接
CHANGE MASTER TO
  MASTER_HOST='master_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='P@ssw0rd',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=592;
START SLAVE;
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
步骤 2:SpringBoot项目集成ShardingSphere-JDBC
添加 Maven 依赖
在 pom.xml 中添加 ShardingSphere 和数据库连接池的依赖:

复制
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
</dependency>
1.
2.
3.
4.
5.
6.
7.
8.
配置 application.yml
在 application.yml 中配置数据源和读写分离规则:

复制
spring:
  shardingsphere:
    datasource:
      names: master,slave0
      # 主库配置
      master:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://master_ip:3306/db?useSSL=false
        username: root
        password: Master@123
      # 从库配置  
      slave0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://slave_ip:3306/db?useSSL=false
        username: root
        password: Slave@123
      # 从库2配置  
      slave1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://slave_ip:3306/db?useSSL=false
        username: root
        password: Slave@123
    rules:
      readwrite-splitting:
        data-sources:
          readwrite_ds:
            type: Static
            props:
              write-data-source-name: master
              read-data-source-names:
                - slave0
                - slave1
            load-balancer-name: round_robin
        load-balancers:
          round_robin:
            type: ROUND_ROBIN # 轮询
    props:
      sql-show: true  # 显示际路由的SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
配置说明

数据源配置:
a.master:主库数据源,用于写操作。

b.slave0 和 slave1:从库数据源,用于读操作。

读写分离规则:
a.write-data-source-name:指定写操作的数据源。

b.read-data-source-names:指定读操作的数据源列表。

c.load-balancer-name:指定读操作的负载均衡算法。

负载均衡算法:
a.ROUND_ROBIN:轮询算法,读请求会在 slave0 和 slave1 之间轮询。

b.其他可选算法:RANDOM(随机)、WEIGHT(权重)等。

想要在市场上大有作为,悦数 数据库就要在原有的基础上加大力度进行产品的升级换代以便适应消费者的消费需求。悦数图数据库是一款完全自主研发的国产图数据库和原生分布式图数据库,具有高性能,易扩展,安全稳定,自主可控的特点.万亿级数据仅需毫秒级查询延时,应用于金融风控,实时推荐,知识图谱等业务场景。https://www.yueshu.com.cn/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|墨玲承奔网络公司

GMT+8, 2025-4-28 03:45 , Processed in 0.083010 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表