读写分离(主从复制,Sharding-JDBC)

2023-10-30

目录

1.介绍

2.配置

2.1配置准备

2.2配置主库Master

2.3配置从库Slave

3.读写分离案例

3.1Sharding-JDBC

3.2入门案例


1.介绍

MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带的功能,无需借助第三方工具。

 MySQL复制过程分成三步:

*master将改变记录到二进制日志(binary log)

*slave将master的binary log 拷贝到它的中继日志(relay log)

*slave重做中继日志中的事件,将改变应用到中继的数据中

2.配置

2.1配置准备

准备好两台服务器,分别安装MySQL并启动服务

设置两台服务器的ip分别为:

*主库master 192.168.138.100

*从库slave 192.168.138.101

可以使用Linux命令:systemctl status mysqld

对服务器内的mysql进行启动

2.2配置主库Master

第一步:修改(增加两条配置)MySQL数据库的配置文件/etc/my.cnf

log-bin=mysql-bin 表示开启二进制日志

server-id=100 表示标志服务进程的唯一id

第二步:重启MySQL服务

systemctl restart mysqld

第三步:登录MySQL数据库,执行一下sql

登录MySQL数据库:mysql -u账号 -p密码

执行sql语句(创建用户且设置权限):

GRANT REPLICATION SLAVE ON *.*to'xiaoming'@'%'identified by 'Root@123456';

注:上面sql作用是创建一个用户xiaoming,密码是Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

第四步:登录MySQL数据库,执行下面sql,记录下结果中File和Position的值

show master status;

 注:该sql的作用是查看Master日志的位置,执行完此sql后不要再执行其他操作,避免Master状态改变。

2.3配置从库Slave

第一步:修改MySQL数据库的配置文件/etc/my.cnf

server-id=101 #设置slave从库的唯一ID

第二步:重启MySQL服务

systemctl restart mysqld

第三步:登录MySQL数据库,执行下面sql

change master to

master_host='192.168.138.100',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=439;

start slave;

注意:变更连接为master_host的小明用户作为中继,定位master的日志的位置。

 

第四步:登录MySQL数据库,执行下面sql,查看从库的状态

show slave status;

将返回值复制到文本编辑器中查看

3.读写分离案例

背景:面对日益增加的系统访问量,数据库的吞吐量面临着巨大的瓶颈。对于同一时刻有大量并发的读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据库更新导致的行锁,是的整个系统的查询性能得到极大的改善。

3.1Sharding-JDBC

Sharding-DBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的IDBC驱动,完全兼容JDBC和各种ORM框架。使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。

*适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybat is,SpringJDBC Template或直接使用JDBC。

*支持任何第三方的数据库连接池,如:DBCP,C3PO,BoneCP,D ruid,HikariCP等。

*支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

3.2入门案例

使用Sharding-JDBC实现读写分离步骤:

1.导入maven坐标

2.在配置文件中配置读写分离规则

3.在配置文件中配置允许bean定义覆盖配置项

spring:
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主数据源
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.138.100:3306/rw?characterEncoding=utf-8
        username: root
        password: root
      # 从数据源
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.138.101:3306/rw?characterEncoding=utf-8
        username: root
        password: root
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin #轮询
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false
  main:
    allow-bean-definition-overriding:true

思路:由Sharding-JDBC框架与SpringBoot框架进行协同操作,在配置文件中定义Sharding-JDBC的主库和从库的信息,设置负载均衡策略,并且由于Sharding-JDBC框架的SpringBootConfigration类中创建一个数据源给IOC管理,而在DruidDataSourceAutoConfigure类中也会创建一个数据源交给IOC管理,故产生冲突,需要在配置文件中声明allow-bean-definition-overriding:true。请求从客户端传到服务器的时候会有Sharding-JDBC框架去判定该读操作走从库,而增删改操作走主库,从而达到主从分离的效果,该过程并不需要编写java代码。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读写分离(主从复制,Sharding-JDBC) 的相关文章

  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • libmysqlclient.a 和 libmysqlclient_r.a 有什么区别?

    我应该使用哪个来链接 mysqlclient 库 它们之间有什么区别 我似乎找不到答案 谢谢 较新版本的 MySQL 客户端发行版不包含 r 版本 有些可能有从 libmyqslclient r a 到 libmyqslclient a 的
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例

随机推荐

  • 从 Windows 过度到 Mac 必备快捷键对照表

    Mac 键盘符号 图标 介绍 Command Shift Caps Lock Option Alt Control Enter Delete Fn Delete 上箭头 下箭头 左箭头 右箭头 Fn Page Up Fn Page Down
  • vue 从入门到入土---复习 webpack

    目录 前端工程化 wbepack的基本使用 webpack中的插件 webpack中的loader 打包发布 Socure Map 总结 前端工程化 1 了解前端工程化概念 前端工程化指的是 在企业级的前端项目开发中 把前端所需要的开发工具
  • 服务器运行mysql的时候出现:Error response from daemon: Container xxx is not running

    服务器运行mysql的时候出现 Error response from daemon Container xxx is not running 我是安装完mysql以后 通过这条命令进入mysql容器的时候出现报错 docker exec
  • Maven之自定义archetype生成项目骨架

    http blog csdn net sxdtzhaoxinguo article details 46895013 摘要 使用过Maven的人都知道maven中有许多功能都是通过插件来提供的 今天我们来说一下其中的一个插件 maven a
  • 安卓app开发零基础入门培训!腾讯Android开发面试记录,技术详细介绍

    开头 都说程序员是在吃青春饭 这一点的确有一点对的成分 以前我不这么认为 但随着年龄的增长 事实告诉我的确是这样的 过了30以后 就会发现身体各方面指标下降 体力和身心上都多少有点跟不上了 这个年龄往往是很尴尬的 与年轻的程序员相比 产出没
  • HBuilderX使用Vant组件库

    HBuilderX使用Vant组件库 原创地址 HBuilderX使用Vant组件库 HBuilderX是一款由国人开发的开发工具 其官网称其为轻如编辑器 强如IDE的合体版本 但是官方的社区中关于Vant组件的安装大多都是针对微信小程序开
  • win电脑go的安装

    官网打开 https go dev dl 默认安装到了c盘 然后配置一下环境变量就可以了 go run 1 go
  • nrm安装后报错

    原文链接 https juejin cn post 7212960463730819127 Error ERR REQUIRE ESM require of ES Module D npm node modules nrm node mod
  • DFS 相关例题

    会顶科技 两道 第一行为一个整数N 用来表示球的个数 第二行为一个整数M 用来表示桶的个数 从第三行到第N 2行 每行有M个整数 这些整数要么为0 要么为1 输出描述 输出为一个整数 输出1代表可以放入所有的球 输出0代表无法放入所有的球
  • android开发:Android Studio的Signature Versions选择

    参考 https blog csdn net jiangjingxuan article details 66970552
  • Anaconda安装jieba库和wordcloud库安装实现词云

    一 jieba库安装 1 从官网下载jieba压缩包 https pypi org project jieba files 2 将压缩包解压到anaconda的pkgs目录 3 打开anaconda prompt 切换目录至比如 C ana
  • Linux环境下编程遇到“fatal error:stdio.h:没有那个文件或目录”错误解决办法

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下linux环境下如何解决一个常见的问题 也就是 fatal error stdio h 没有那个文件或目录 错误 不少初学者在linux环境下用gcc编译C语言时 经常会遇到这个问
  • Linux wc命令

    Linux wc命令 作用 统计字节数 字符数 行数 最长的行的长度 单词数 格式 wc OPTION FILE wc OPTION files0 from F OPTION c 或 bytes 计算字节数 m 或 chars 计算字符数
  • SPA项目开发之首页导航+左侧栏菜单

    文章目录 后台主界面搭建 左侧树收缩功能 vue总线的概念 后台主界面搭建 在搭建主界面之前 来给大家介绍一个MOCK js 是一个模拟数据的生成器 用来帮助前端调试开发 进行前后端的原型分离以及用来提高自动化测试效率 众所周知Mock j
  • hex码和ascii码的转换

    hex码和ascii码的转换 2017年01月09日 17 48 25 changeyourmind 阅读数 4784 版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net changyourmind
  • PRT(Precomputed Radiance Transfer【2002】)原理实现

    声明 本文源自对Games202课程 作业2的总结 参考 手把手教你写GAMES202作业 GAMES202 作业2 Precomputed Radiance Transfer 球谐函数 GAMES 202 作业2 Games202课程 个
  • Apache Beam 模型

    背景 Apache Beam 是Google 开源的一个统一编程框架 它本身不是一个流式处理平台 而是提供了统一的编程模型 帮助用户创建自己的数据处理流水线 实现可以运行在任意执行引擎之上批处理和流式处理任务 它包含 一个可以涵盖批处理和流
  • C++工程实践经验

    1 C 工程实践经验谈 陈硕 giantchen gmail com 最后更新 2012 4 20 版权声明 本作品采用 Creative Commons 署名 非商业性使用 禁止演绎 3 0 Unported 许可 协议 cc by nc
  • DF标志和串移动指令(movsb/movsw)

    1 标志寄存器的第10位DF 方向标志位 在串处理指令中 控制每次操作后si di的增减 DF 0 每次操作后 si di增加 DF 1 每次操作后 si di减小 我们可以用汇编语法描述movsb的功能如下 mov es di byte
  • 读写分离(主从复制,Sharding-JDBC)

    目录 1 介绍 2 配置 2 1配置准备 2 2配置主库Master 2 3配置从库Slave 3 读写分离案例 3 1Sharding JDBC 3 2入门案例 1 介绍 MySQL主从复制是一个异步的复制过程 底层是基于MySQL数据库