Mysql主从复制

本文详细介绍了如何在两个MySQL服务器之间配置主从复制,包括启用主库的二进制日志,创建复制用户,设置从库并进行数据同步。此外,还讲解了如何利用Sharding-JDBC在Java应用中实现读写分离,只需更改配置即可轻松实现数据库的读写分离。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、原理

在这里插入图片描述

  1. 想要实现mysql主从复制,至少需要两个mysql服务。
    主库master: 用来增删改
    从库slave: 用来读取数据
  2. 当主库有增删改的操作时,会将变化记录写入二进制日志binlog
  3. 从库有个两个线程,其中IO线程会将二进制日志binlog文件读取到,并写入中继日志Relaylog
  4. 从库的另一个线程SQL线程,会解析中继日志Relaylog日志文件,如果发现有变化,会将数据同步到从库

二、使用步骤

1.前提条件,准备两个安装了mysql的服务器

前提:在这开启了两个虚拟机,虚拟机内使用dockers安装了mysql

主库Master :192.168.66.132
从库Slave : 192.168.66.133

2.实现—操作主库 master

  1. 在安装,mysql的时候,将mysql的配置挂载到了【/soft/mysql/conf】,并创建了 【my.cnf】配置文件。docker安装mysq

  2. 在【/soft/mysql/conf/my.cn】配置文件中启用主库master的二进制日志,并设置唯一的服务器名

[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server-id=128
expire_logs_days=30

在这里插入图片描述

  1. 修改玩配置文件后,重启Mysql服务
docker restart 容器id

在这里插入图片描述

  1. 登录主库mysql,创建用户。

从库slave向主库读取二进制日志binlog时,必须携带由主库向从库分配的用户,此时我们需要登录mysql,分配用户

//进入mysql容器
docker exec -it 容器名/容器id /bin/bash
//登录mysql  
mysql -u root -p

在这里插入图片描述
5. 执行命令,确认之日已经开启

show variables like '%log_bin%';

在这里插入图片描述
6. 创建用户并给用户授予REPLICATION SLAVE权限

GRANT REPLICATION SLAVE ON *.* to '用户名'@'%' identified by '密码';

在这里插入图片描述
7. 查看数据库状态,

查看之后,最好不要对数据库做操作,因为File和Position的值可能会发生变化,后续在从库中我们会使用到这两个值,如果发生变化,可能会导致关联失败

show master status;

在这里插入图片描述

3.实现—操作从库 slave

  1. 在安装,mysql的时候,将mysql的配置挂载到了【/soft/mysql/conf】,并创建了 【my.cnf】配置文件。docker安装mysq

  2. 在【/soft/mysql/conf/my.cnf】配置文件中设置从库 slave的服务器名,保证唯一

[mysqld]
server-id=168
expire_logs_days=30
  1. 修改玩配置文件后,重启Mysql服务
docker restart 容器id
  1. 登录从库mysql
//进入mysql容器
docker exec -it 容器名/容器id /bin/bash
//登录mysql  
mysql -u root -p
  1. 执行下面的语句

从库slave向主库读取二进制日志binlog时,必须携带由主库向从库分配的用户

change master to master_host='主库master的IP',master_user='在主库master中创建的那个用户名',master_password='在主库master中创建的那个用户的密码',master_log_file='主库master查询状态中的file属性值',master_log_pos=主库master查询状态中的Position属性值;
//
start slave;

在这里插入图片描述
6. 这就完成了主从复制,查看状态

show slave status\G

在这里插入图片描述
常用命令:`

stop slave;
reset master;

三、实现读写分离

我们在Java代码中要实现读写分离,是需要依赖Sharding-JDBC框架来实现读写分离的,不需要改代码,只需要更改一下配置,通过以下两步即可:

  1. 导入maven坐标
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
  1. 在配置文件中配置读写分离规则
spring:
  shardingsphere:
    datasource:
      names:
      # 定义数据源名字, 多个使用逗号隔开, 可以随便取名字,与下面对应上即可
        master,slave
      # 定义master为主库,用来做增删改  master名字可以随便取,与上面对应即可
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.XX.XX:3306/DB_NAME?characterEncoding=utf-8
        username: root
        password: 123456
      # 定义slave为从库库,用来做查询  slave名字可以随便取,与上面对应即可
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.XX.XX:3306/DB_NAME?characterEncoding=utf-8
        username: root
        password: 123456
    masterslave:
      # 读写分离配置,采用轮询方式
      load-balance-algorithm-type: round_robin
      # 最终的数据源名称
      name: dataSource
      # 指定主库数据源名称    master为上面定义的名字
      master-data-source-name: master
      # 指定从库数据源名称列表,slave为上面定义的名字  配置多个从库以逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false
  main:
   # 默认dataSource Bean覆盖 因为Sharding-JDBC框架会创建一个数据源  而连接池也会创建数据源, 所以导致数据源冲突
    allow-bean-definition-overriding: true
  1. 这样在程序中就已经完成了 mysql数据库的读写分离,在我们操作数据库做CRUD操作时,会由Sharding-JDBC框架帮助我们区分该操作那个数据库。下面启动日志中可以看出,创建了两个数据源 在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值