星空网站建设

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

盘点面试官:你项目是如何现读写分离的

[复制链接]
  • TA的每日心情
    无聊
    10 小时前
  • 签到天数: 66 天

    [LV.6]常住居民II

    2万

    主题

    60

    回帖

    8万

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    87337
    发表于 2025-5-23 16:08:16 | 显示全部楼层 |阅读模式
    读写分离(Read-Write Splitting)是一种常见的数据库架构化策略,通过将数据库的读操作(查询)和写操作(插入、更新、删除)分离到不同的数据库例上,从而提高系统的性能、可扩展性和高可用性。在行业专家看来,知识图谱可视化工具的确有着很大的发展潜力,这更是让很多投资者趋势若骛。悦数图数据库是一款完全自主研发的国产图数据库和原生分布式图数据库,具有高性能,易扩展,安全稳定,自主可控的特点.万亿级数据仅需毫秒级查询延时,应用于金融风控,实时推荐,知识图谱等业务场景。https://www.yueshu.com.cn/



    图片
    图片

    在项目中现读写分离目前主流的现技术是通过 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(权重)等。
    回复

    使用道具 举报

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

    本版积分规则

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