Sharding-JDBC读写分离探秘

本文详细介绍了如何在Sharding-JDBC中实现读写分离,从概念到快速入门,再到具体实现,包括主从数据库配置、读写分离规则设定及测试案例。文章指出Sharding-JDBC不处理主从同步,强调了主从数据一致性的重要性,并探讨了读写分离的查询流程、结果归并和从库路由策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间写了篇如何使用Sharding-JDBC进行分库分表的例子,相信能够感受到Sharding-JDBC的强大了,而且使用配置都非常干净。官方支持的功能还包括读写分离、分布式主键、强制路由等。这里再介绍下如何在分库分表的基础上集成读写分离的功能。

读写分离的概念

就是为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库,读库称为从库,一主库可配置多从库。

设置主从库后,第一个问题是如何进行主从的同步。官方不支持主从的同步,也不支持因为主从同步延迟导致的数据不一致问题。工程实践上进行主从同步有很多做法,一种常用的做法是每天定时同步或者实时同步。这个话题太大,暂不展开。

读写分离快速入门

读写可以单独使用,也可以配合分库分表进行使用,由于上个分库分表的例子是基于1.5.4.1版本进行说明的,这里为了紧跟官方的步伐,升级Sharding-JDBC到最新的2.0.0.M2

项目结构如下:

项目结构

pom依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>

         <!-- Sharding-JDBC核心依赖 -->
        <dependency>
            <groupId>io.shardingjdbc</groupId>
            <artifactId>sharding-jdbc-core</artifactId>
        </dependency>

        <!-- Sharding-JDBC Spring Boot Starter -->
        <dependency>
            <groupId>io.shardingjdbc</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

主从数据库配置

在配置前,我们希望分库分表规则和之前保持一致:

基于t_user表,根据city_id进行分库,如果city_id mod 2为奇数则落在ds_master_1库,偶数则落在ds_master_0库;根据user_id进行分表,如果user_id mod 2为奇数则落在t_user_1表,偶数则落在t_user_0

读写分离规则:

读都落在从库,写落在主库

因为使用Sharding-JDBC Spring Boot Starter,所以只需要在properties配置文件配置主从库的数据源即可:


spring.application.name=spring-boot-mybatis-sharding-jdbc-masterslave
server.context-path=/springboot

mybatis.config-location=classpath:mybatis-config.xml

# 所有主从库
sharding.jdbc.datasource.names=ds_master_0,ds_master_1,ds_master_0_slave_0,ds_master_0_slave_1,ds_master_1_slave_0,ds_master_1_slave_1

# ds_master_0
sharding.jdbc.datasource.ds_master_0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master_0.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master_0.url=jdbc:mysql://127.0.0.1:3306/ds_master_0?useSSL=false
sharding.jdbc.datasource.ds_master_0.username=travis
sharding.jdbc.datasource.ds_master_0.password=

# slave for ds_master_0
sharding.jdbc.datasource.ds_master_0_slave_0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master_0_slave_0.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master_0_slave_0.url=jdbc:mysql://127.0.0.1:3306/ds_master_0_slave_0?useSSL=false
sharding.jdbc.datasource.ds_master_0_slave_0.username=travis
sharding.jdbc.datasource.ds_master_0_slave_0.password=
sharding.jdbc.datasource.ds
### Python进行面板数据计量分析的方法 #### 使用 `pandas` 和 `statsmodels` 处理面板数据Python中,可以利用多个库来完成面板数据分析的任务。以下是具体方法: 1. **加载和准备数据** 可以通过 `pandas` 加载并预处理面板数据。由于面板数据通常具有时间序列和截面双重特性,因此需要确保数据被正确索引以便后续建模[^1]。 ```python import pandas as pd # 假设我们有一个CSV文件作为输入 df = pd.read_csv('panel_data.csv') # 将DataFrame设置为MultiIndex (实体, 时间) panel_df = df.set_index(['entity', 'time']) ``` 2. **模型估计** 利用 `statsmodels` 库中的固定效应(Fixed Effects) 或随机效应(Random Effects) 模型来进行回归分析。这些模型能够控制个体异质性和其他不可观测因素的影响[^2]。 下面是一个基于线性最小二乘法(LS) 的简单例子: ```python import statsmodels.formula.api as smf model = smf.ols(formula='dependent_var ~ independent_var_1 + independent_var_2', data=panel_df) results = model.fit() print(results.summary()) ``` 3. **高级面板数据分析** 对于更复杂的面板数据需求,比如考虑组间差异或者动态面板等问题,则可能需要用到专门设计用于此类任务的扩展包——如 `linearmodels` 中提供的功能。 示例代码如下所示: ```python from linearmodels.panel import PanelOLS exog_vars = ['independent_var_1', 'independent_var_2'] exog = panel_df[exog_vars] mod = PanelOLS(panel_df.dependent_var, exog, entity_effects=True) fe_res = mod.fit(cov_type='clustered', cluster_entity=True) print(fe_res) ``` 这里需要注意的是,在实际应用过程中还需要关注变量的选择、缺失值处理以及异常检测等方面的工作;另外也要注意不同类型的误差项假设对于最终结论可能会产生的影响。 #### 提出的相关问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值