Msq 主从复制

134 阅读3分钟

mysql的主从复制

Mysql主从复制是一个异步的过程,底层基于Mysql数据库自带的二进制日志功能。就是一台或者多台 mysql 数据库(slave 从库)和另一台mysql数据库(master 主库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。 MySql复制过程分为三步:

  • msater 将记录改变记录到二进制日志 (binary log)
  • slave 将 master 的binary log 拷贝到它的中继日志中 (relaty log)
  • slave 重做中继日志中的事件,将改变应用到自己的数据库中

配置-前置条件

提前准备好两台服务器,分别安装mysql并启动服务成功

  1. 主库 Master ip地址
  2. 从库 Slave ip地址

ps:可以再navicat或者之类的软件中查看

修改 Mysql 数据库的配置文件

以下为主库执行 修改文件 一般是在 /etc/my.cnf 中

[mysqld]
log-bin=mvysql-bin #[必须]启用二进制日志
server-id=100  #[必须] 服务器唯一ID 可以设置,保证是唯一就行

ps: 可以使用 vim 进行修改。

重启Mysql服务

登录

    mysql  mysql -u root -p root  // 账号和密码

重启

systemctl restart mysqld

ps: 不报错就是成功,这里如果报错Job for.....details.可以去看看前面修改文件里面是不是有哪里写错了

登录 Mysql 数据库 ,执行下面sql

GRANT REPLICATION SLAVE ON *.* TO 'xiaoming' @ '%' identified by 'Root@123456789'

'xiaoming' 是账号,'Root@123456789' 是密码,可以自己设置。 意思是: 创建一个用户xiaoming,密码是 Root@123456789 ,并且给xiaoming用户授予 REPLICATION SLAVE 权限。常用于建立复制时所需要用到的用户权限,也就是 slave 必须被 master 所授权具有该权限的用户,才能通过该用户复制。 执行完毕记录下结果中的 File和 Position的值。然后不在次库进行任何操作了。

修改 Mysql 数据库的配置文件

以下为从库执行 修改文件 一般是在 /etc/my.cnf 中

[mysqld]
server-id=108  #[必须] 服务器唯一ID 可以设置,保证是唯一就行

ps: 可以使用 vim 进行修改。

登录mysql数据库,并执行code

change master to master_host='master ip地址',master_user='账号',master_password='密码',master_log_file='上面记住的File的值',master_log_pos=上面记住的Position的值;

start slave;

master_log_file="", master_log_pos="",为上面 master 保存的 File和 Position的值。 出现报错的原因可能是之前设置过,可以停掉它 stop slave;

查看从库状态 show slave status;

在主库创建数据库,从库会自己复制了。

ps:如果连接数据库时网络不好的话在主库的二进制文件可能会发生改变,所以在进行数据操作之前最好先确定一下主从复制是否连接正常

读写分离部分

主库负责处理事务性的增删改操作,从库负责处理查询操作。

image.png

使用Sharding-JDBC 框架。(spring-boot) 导入maven。

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

配置读写分离规则文件

spring:  
  shardingsphere:  
    datasource:  
      names:  
        master,slave  
      # 主数据源  
      master:  
        type: com.alibaba.druid.pool.DruidDataSource  
        driver-class-name: com.mysql.cj.jdbc.Driver  
        url: jdbc:mysql://ip地址:3306/rw?characterEncoding=utf-8  
        username: root  
        password: 12345  
      # 从数据源  
      slave:  
        type: com.alibaba.druid.pool.DruidDataSource  
        driver-class-name: com.mysql.cj.jdbc.Driver  
        url: jdbc:mysql://ip地址:3306/rw?characterEncoding=utf-8  
        username: root  
        password: 12345  
    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  
#ps:这里会和spring有冲突,需要额外设置
#设置允许ben覆盖
  main:  
    allow-bean-definition-overriding: true

在其使用的 Controller 中

@Autowired  
private DataSource dataSource;

ps: 自己写着,免得忘记了的()