Mysql主从复制及读写分离

news2024/11/25 9:40:58

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、为什么使用主从复制、读写分离?
  • 二、主从复制的原理
  • 三、 如何实现主从复制
    • 3.1. Master配置
    • 3.2. Slave配置
  • 四、 使用ShardingJDBC配置读写分离
    • 4.1. 添加sharding-jdbc的maven依赖:
    • 4.2. 然后在application.yml添加配置
    • 4.3. 如果Bean定义冲突报错

的

一、为什么使用主从复制、读写分离?

  1. 读和写的压力都由一台数据库承担,压力大
  2. 数据库服务器磁盘损坏则数据丢失,单点故障
  3. 为了提高数据库的并发性能,
  4. 随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。

二、主从复制的原理

Mysql主从复制是一个异步的复制过程,底层是基于Myslq自带的二进制日志功能,就是一台或多台(从库)Mysql数据库从另一台数据库(主库)进行二进制日志的复制然后再解析应用于自身,最终实现从库的数据和主库数据一致。

在这里插入图片描述

  1. 当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
  2. salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
  3. 当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
  4. I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log(中继日志)。
  5. SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。

三、 如何实现主从复制

从库可以有多台,这里使用一主一从模式

数据库ip
Master192.168.100.101
Slave192.168.100.102

检查各自防火墙是否对数据库指定端口进行开放

3.1. Master配置

  1. 修改Mysql数据库的配置文件: /etc/my,cnf

    # 开启binlog【必须】
    log-bin=mysql-bin
    # 服务器唯一ID,唯一即可【必须】
    server-id=101 
    # 需要同步的数据库,如果不配置则同步全部数据库
    binlog-do-db=test_demo
    # binlog日志保留的天数,清除超过10天的日志
    # 防止日志文件过大,导致磁盘空间不足
    expire-logs-days=10 
    
  2. 配置完成后,重启mysql:

    systemctl restart mysqld
    
  3. 创建数据库同步用户并进行授权

    • 使用命令行进入mysql:
      mysql -u root -p
      
    • 创建用户并授权
      GRANT REPLICATION SLAVE ON *.* to 'zhangsan'@'%' identified by 'Java@123456';
      

    注意:

    • 上面语句的意思是创建了一个用户zhangsan,密码Java@123456,并授予了REPLICATION SLAVE权限,用于复制是所需要用到的用户权限,也就是slave必须被master授权的用户,才能复制,
    • 目前mysql5.7默认密码等级为MEDIUM,该等级要求密码组成为:数字,大,小写字母,特殊字符,至少8位
  4. 登录数据库查看master状态

    show master status;
    
    FilePosition
    mysql-bin.000001367

    执行完后master不要执行任何操作(此时的Position 数值已经获取,从库要使用一旦操作Position 会改变)

3.2. Slave配置

  1. 修改Mysql数据库的配置文件: /etc/my,cnf

    # 不要和其他mysql服务id重复即可
    server-id=102
    
  2. 配置完成后,重启mysql:

    systemctl restart mysqld
    
  3. 设置主库地址及同步位置

    • 使用命令行进入mysql:

      mysql -u root -p
      
    • 执行以下语句

      CHANGE MASTER TO 
      MASTER_HOST='192.168.100.101',//主机IP
      MASTER_USER='zhangsan',//之前创建的用户账号
      MASTER_PASSWORD='Java@123456',//之前创建的用户密码
      MASTER_LOG_FILE='mysql-bin.000001',//master主机的binlog日志名称
      MASTER_LOG_POS=367,//binlog日志偏移量
      master_port=3306;//端口
      
    • 设置完之后需要启动:

      start slave;
      
  4. 查看slave状态

    show slave status\G;
    

    \G:sql语句后加\G,表示将查询结果进行按列打印,也就是结构旋转90度变成纵向

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.100.101
                      Master_User: zhangsan
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 247
                   Relay_Log_File: mysqld-relay-bin.000001
                    Relay_Log_Pos: 374
            Relay_Master_Log_File: mysql-bin.000001 //binlog日志文件名称
                 Slave_IO_Running: Yes //Slave_IO线程、SQL线程都在运行
                Slave_SQL_Running: Yes
    

    Slave_IO_Running和Slave_SQL_Running都是Yes,则表示同步完成。

四、 使用ShardingJDBC配置读写分离

主从复制完成后,我们还需要实现读写分离,master负责写入数据,slave负责读取数据。

4.1. 添加sharding-jdbc的maven依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1-RC1</version>
</dependency>

4.2. 然后在application.yml添加配置

这是使用druid连接池的配置

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

load-balance-algorithm-type是路由策略,round_robin表示轮询策略。

4.3. 如果Bean定义冲突报错

可以添加如下添加配置

spring
  main:
    allow-bean-definition-overriding: true

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 JavaScript 实现【密码验证合格程序】【牛客练习题 HJ20】,附详细解题思路

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 &#xff08;注&#xff1a;其他符号不含空格或换行&#xff09; 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出&#xff1a;OK&…

A stochastic parrot in every pot 每口锅里都会有一只随机鹦鹉? | 经济学人社论双语精翻

本期双语文章来自《经济学人》2023年5月13日周报社论&#xff1a;《人工智能经济学》&#xff08;The economics of AI&#xff09; A stochastic parrot in every pot? 每口锅里都会有一只随机鹦鹉&#xff1f; What does a leaked Google memo reveal about the future of A…

软文营销,如何写出优质的新闻稿

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;什么是软文营销&#xff1f; 软文营销是一种通过撰写和发布具有信息性、有趣性和可读性的文章&#xff0c;来推广产品、服务或品牌的营销策略。软文是指以一种较为隐晦、…

【默认端口】市面上各种中间件、软件、服务的默认端口汇总

常用软件&#xff0c;中间件&#xff0c;服务的默认端口汇总 常用软件默认端口汇总 市面上各种中间件、软件和服务的默认端口众多&#xff0c;下面列举一些常见的默认端口&#xff1a; SSH&#xff08;Secure Shell&#xff09;&#xff1a;22 Telnet&#xff1a;23 FTP…

AI在零售行业的应用

原创 | 文 BFT机器人 如今&#xff0c;零售商已经体验到使用人工智能 (AI) 的诸多好处&#xff0c;随着行业不断创新&#xff0c;人工智能的重要性只会越来越大。随着人工智能越来越被广泛接受&#xff0c;它的实施也越来越广泛。 查看这些用例&#xff0c;了解零售业中的 AI如…

一文掌握linux基本操作命令

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Selenium元素定位的八种方法(建议收藏)

自动化一般需要四步操作&#xff1a;获取元素&#xff0c;操作元素&#xff0c;获取返回结果&#xff0c;断言&#xff08;返回结果与期望结果是否一致&#xff09;&#xff0c;最后自动出测试报告。Selenium提供8种元素定位的方法&#xff1a;id,name,class name,link text,xp…

三维点云机器学习检测定位圆心,三维圆检测,拟合轴线(基于open3d和python)

0.任务描述 背景&#xff1a;从端面拍摄大型圆筒工件&#xff0c;该工件周向尺寸大于相机视野&#xff0c;只能拍摄到1/3左右的圆周&#xff0c;且无法保证相机与端面垂直拍摄 任务&#xff1a;需要拟合圆周与轴线位置 难点&#xff1a;三维圆拟合与检测都很复杂&#xff0c…

fscan安装配置(windows、linux系统)

fscan安装配置(windows、linux系统) 1、简介 fscan一款内网综合扫描工具&#xff0c;方便一键自动化、全方位漏扫扫描。 它支持主机存活探测、端口扫描、常见服务的爆破、ms17010、redis批量写公钥、计划任务反弹shell、读取win网卡信息、web指纹识别、web漏洞扫描、netbios探…

程序员面试必备的 Java 八股文,适合所有的 Java 求职者

说明 本文分享 Java 后端真实高频面试题&#xff0c;有详细答案&#xff0c;保你稳过面试。题目包括&#xff1a;Java 基础、多线程、JVM、数据库、Redis、Shiro、Spring、SpringBoot、MyBatis、MQ、ELK、SpringCloud、设计模式等。 包含从简单到困难、从高频到低频的题目&…

EF Core中Partition by实现

一、SQL语句实现 Partition by是SQL Server数据库中提供的分区函数,跟Group by不同的是,Partition by能够按照分区返回所有记录,而Group by只能返回一条记录。 举个例子,有如下的数据库,需要找出每个唯一编号最新状态的数据。 显然,CW048201和CW048202它们的最新状态都…

靠着这套Github标星55K的Java面试笔记,成功拿到了2个大厂offer

作为一名优秀的程序员&#xff0c;技术面试是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试&#xff0c;肯定会遇到一些这样的问题&#xff1a; 1、看你项目都用的框架&#xff0c;熟悉S…

Linux 环境下Docker将镜像打包导出到本地,上传至内网服务器(八)

文章目录 背景1. docker容器打包成镜像和压缩&#xff08;1&#xff09;首先查看镜像所在的容器&#xff0c;获取到容器id&#xff08;2&#xff09;将容器保存成镜像&#xff08;3&#xff09;将镜像打包&#xff08;4&#xff09;将镜像包压缩 2. docker镜像压缩包解压及镜像…

2023最新发布:Java 面试突击大全 带你摸熟 20+ 互联网公司面试考点

对于程序员来说&#xff0c;春招的失利意味着在金九银十要打一场“硬战”&#xff0c;可又有多少人做好了面试的准备呢&#xff1f;对于一线互联网公司的面试&#xff0c;你又了解多少呢&#xff1f; 今天&#xff0c;一本《Java 面试考点大全》全网首发&#xff0c;带你摸熟 …

阿里8年,肝到P7只剩这份笔记了,帮朋友拿了7个Offer....

时光飞逝&#xff0c;转眼间在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思 我的职业生涯开始和大多数测试人一样&#xff0c;刚开始接触…

大话设计模式——享元

享元&#xff08;Flyweight&#xff09; Intent 利用共享的方式来支持大量细粒度的对象&#xff0c;这些对象一部分内部状态是相同的。 Class Diagram Flyweight&#xff1a;享元对象IntrinsicState&#xff1a;内部状态&#xff0c;享元对象共享内部状态ExtrinsicState&am…

【架构设计】单点登录实现技术方案

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 1 基本介绍 1.1 什么是单点登录 单点登录&am…

命令模式(十七)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了模板模式(十六), 如果没有看过, 请观看上一章 一. 命令模式 定义&#xff1a;将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c; 这样方便…

智能锁语音芯片方案,NV170D-SOP8九芯电子自主研发

随着智能家居市场的不断壮大&#xff0c;智能门锁已经成为越来越多家庭不可或缺的一部分。传统的机械锁门的开锁方式已经无法满足人们对安全和便捷性的需求。而电子锁门随着技术的不断突破&#xff0c;拥有了更为丰富的功能和更高的安全性。 但是&#xff0c;目前市场上有那么…

1.4.2:DHTMLX JS 看板 DHTMLX JS Kanban Board Crack

用于任务管理应用 程序的 敏捷 JavaScript 看板&#xff0c;使用 DHTMLX JavaScript 看板库开发成熟的 Web 应用程序&#xff0c;以获得对工作量的完全控制并有效地管理任务。 开始使用 DHTMLX JS 看板 DHTMLX 看板允许创建任意数量的任务并通过右侧面板编辑它们。用户可以编…