每日一记10】+第20天:终于学会了 MySQL 主从配置和读写分离(六)
  

伊利丹·怒风 1698

{{ttag.title}}
创建 Spring Boot 项目
1、到 Spring Initializr(https://start.spring.io/) 上创建项目结构,选择 JDK 版本为 8,Spring Boot 为2.3.2(目前最新版本),并输入项目相关的信息。



2、引入 Spring Boot 相关依赖包,包括 spring-boot-starter-web、mybatis-spring-boot-starter、mysql-connector-java、lombok。





3、最后将创建完成后的目录结构直接下载下来导入到 IDEA,然后 maven 更新依赖包即可。


4、引入 ShardingSphere-JDBC 专门针对 Spring Boot 的依赖包。


<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  <version>4.1.1</version>
</dependency>
5、配置主从数据库,保证读请求到从节点,写请求到主节点,使用的连接池是 Spirng Boot 2.x 默认的 hikari。注意,如果用的是其他连接池,比如 Druid 的话,jdbcUrl 属性要改成 url 。


spring:
  shardingsphere:
    datasource:
      master:
        type: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/master-slave?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: password
      slave0:
        type: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        jdbcUrl: jdbc:mysql://192.168.0.108:3306/master-slave?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: password
      names: master,slave0


    props:
      sql.show: true
    masterslave:
      load-balance-algorithm-type: round_robin
    sharding:
      master-slave-rules:
        master:
          master-data-source-name: master
          slave-data-source-names: slave0
如果有多个从节点,可以继续在 spring.shardingsphere.datasource 下添加 slave1、slave2 等。


最后要配置上 master-slave-rules(主从规则),才能保证实现读写分离,如果不加这个配置,就会采用 round_robin 路由算法,将主从节点无差别对待。写请求可能会落到从节点,导致无法像主节点同步。


6、配置 MyBatis 相关的 mapper.xml 、dao 接口、实体等,不做过多介绍。


7、添加 Service、Controller,添加一个查询方法,对应数据库 select。添加一个新增方法,对应数据库 insert 。


@RestController
@RequestMapping("user")
public class UserController {


    @Autowired
    private IUserService userService;


    @GetMapping(value = "list")
    public Object list() {
        List<User> users = userService.list();
        return users;
    }


    @PostMapping(value = "add")
    public Object add(@RequestBody UserDto userDto) {
        User user = new User();
        BeanUtils.copyProperties(userDto, user);
        return userService.addUser(user);
    }
}
8、最后通过分别请求 list 接口和 add 接口,然后通过日志可以看到,select 会路由到从节点,insert 会路由到主节点。


终于学会了 MySQL 主从配置和读写分离


终于学会了 MySQL 主从配置和读写分离


源码在 github 上,有需要的同学可以到 github 上获取。


仓库地址:https://github.com/huzhicheng/play ,其中的 sharding-jdbc-write-read-split 项目是本文的示例源码。


总结
主从配置+读写分离可以很大程度上保证系统高可用性和整体性能,而且也是互联网应用的基础入门配置。MySQL 可以利用 bin-log 实现主从同步,master 节点采用推方式向 slave 节点推送写入操作形成的日志,slave 节点会将日志先写到本地的 relay-log 中,然后再写入数据库中,此过程中还会更新 master.info 文件,记录本地同步的位置,以便下次增量同步。


数据库层配置完成,最后要在应用中进行读写配置,具体的配置可以公司内部自行开发或者采用比较稳定的开源框架,本文采用的是 ShardingSphere-JDBC,只是个代理客户端,其原理就是分析 SQL 语句判断是读还是写,从而分发到不同的节点。


如果需要更复杂的操作,比如跨库 join 等,那就需要代理中间件了,比如 ShardingSphere-Proxy 等。

打赏鼓励作者,期待更多好文!

打赏
2人已打赏

zjwshenxian 发表于 2020-8-29 10:15
  
感谢分享
新手456962 发表于 2020-8-30 11:29
  
感谢分享
修业时代朱 发表于 2020-9-29 16:38
  
Replication集群??
yim 发表于 2021-4-24 16:48
  
发表新帖
热门标签
全部标签>
2025年技术争霸赛
GIF动图学习
功能体验
标准化排查
每日一问
新版本体验
产品连连看
纪元平台
高手请过招
2023技术争霸赛专题
每周精选
2024年技术争霸赛
社区新周刊
【 社区to talk】
安全效果
信服课堂视频
畅聊IT
答题自测
专家问答
技术笔记
技术圆桌
在线直播
MVP
网络基础知识
安装部署配置
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
用户认证
原创分享
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
排障笔记本
产品预警公告
玩转零信任
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
卧龙计划
华北区拉练
天逸直播
以战代练
秒懂零信任
技术晨报
平台使用
技术盲盒
山东区技术晨报
文档捉虫
齐鲁TV
华北区交付直播
北京区每日一练
场景专题
故障笔记
排障那些事
西北区每日一问
升级&主动服务
高频问题集锦
POC测试案例
全能先锋系列
云化安全能力
专家说
热门活动
产品动态
行业实践
产品解析
关键解决方案

本版达人

feeling

本周分享达人

新手29676...

本周提问达人