首页 > 数据库 >MySQL 实现读写分离

MySQL 实现读写分离

时间:2022-10-31 12:56:21浏览次数:82  
标签:主库 binlog slave 读写 分离 master mysql MySQL 数据库

读写分离主要是为了将对数据库的操作分散到不同的数据库节点上

一般情况下选择一主多从,一台主数据库负责写,其他的从数据库负责读,主库和从库进行数据同步。

如何实现读写分离

  1. 部署多台数据库,选择其中的一台作为主数据库,其他的一台或者多台作为从数据库。
  2. 保证主数据库和从数据库之间的数据是实时同步的,这个过程也就是我们常说的主从复制
  3. 系统将写请求交给主数据库处理,读请求交给从数据库处理

主从复制

实现主从复制

实现主从复制要进行的配置:

  • 主服务器:

    • 开启二进制日志

    • 配置唯一的server-id

    • 获得master二进制日志文件名及位置

    • 创建一个用于slave和master通信的用户账号

  • 从服务器:

    • 配置唯一的server-id
    • 使用master分配的用户账号读取master二进制日志
    • 启用slave服务

主数据库配置

修改mysql配置文件

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

重启服务:

  • 关闭服务:mysqladmin -u root -p shutdown
  • 启动服务:mysqld_safe

注意:master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

# 不同步哪些数据库  
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
  
# 只同步哪些数据库,除此之外,其他不同步  
binlog-do-db = game

创建用于同步的账号

创建用户并授权:用户:repl 密码:slavepass。123.57.44.85是从库的ip地址。

mysql> CREATE USER 'repl'@'123.57.44.85' IDENTIFIED BY 'slavepass';#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'123.57.44.85';#分配权限
mysql>flush privileges;   #刷新权限

获取master二进制日志文件名及位置

记录二进制文件名(mysql-bin.000003)和位置(73)。

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

从数据库配置

修改配置文件

[mysqld]
server-id=2 #设置server-id,必须唯一

重启服务。

配置 Master 同步信息

mysql> CHANGE MASTER TO MASTER_HOST='182.92.172.80',MASTER_USER='repl',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='mysqlbin.000003',MASTER_LOG_POS=73;

启动同步线程

mysql>start slave;

查看slave状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.92.172.80
                  Master_User: rep1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000013
          Read_Master_Log_Pos: 11662
               Relay_Log_File: mysqld-relay-bin.000022
                Relay_Log_Pos: 11765
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
        ...

当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

主从复制原理

image-20221030114849318

  1. 主库将数据库中数据的变化写入到 binlog
  2. 从库连接主库
  3. 从库会创建一个 I/O 线程向主库请求更新的 binlog
  4. 主库会创建一个 binlog dump 线程来发送 binlog ,从库中的 I/O 线程负责接收
  5. 从库的 I/O 线程将接收的 binlog 写入到 relay log 中。
  6. 从库的 SQL 线程读取 relay log 同步数据本地(也就是再执行一遍 SQL )。

使用 ShardingSphere-JDBC 实现读写分离

使用限制:

  • 不处理主库和从库的数据同步
  • 不处理主库和从库的数据同步延迟导致的数据不一致
  • 不支持主库多写
  • 不处理主从库间的事务一致性。主从模型中,事务中的数据读写均用主库。

Spring Boot Starter 使用: https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/

参考资料:

标签:主库,binlog,slave,读写,分离,master,mysql,MySQL,数据库
From: https://www.cnblogs.com/1963942081zzx/p/16843909.html

相关文章

  • MySQL的封锁
    简单介绍:mysql的封锁大致分为以下四种锁:排它锁,共享锁,活锁,死锁。 排它锁:(X锁)         可读可写,一个事务对表加了X锁,其他事务必须等该事务操作完这张表后,......
  • 如何在linux中修改mysql的编码?
    查看MySQL码表:showvariableslike'%character%';设置mysql编码:vi/etc/my.cnf具体内容如下: [mysqld]character-set-server=utf8collation-server=utf8_general_cisql......
  • mysql 根据子级ID获取全部上级
     1、查询所有上级 SELECTT0.*FROM(SELECT@rAS_id,(SELECT@r:=parent_i......
  • mysql查询转换
     查询时会将字符串转数字.如果转换数字不成功,则看做0两边都是字符串的话,则按照ANSI的比较规则进行比较,不区分大小写(具体看mysql配置)  ......
  • MYSQL - Warning: #1681 Integer display width is deprecated
    ​​MYSQL-Warning:#1681Integerdisplaywidthisdeprecated​​mysql8.0不支持,这里就不要使用Int了,换成`id`bigintNOTNULLAUTO_INCREMENT, ......
  • centos7 yum安装mysql5.7 Linux服务器数据库
    wgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmyum-yinstallmysql57-community-release-el7-11.noarch.rpm#改镜像vi/etc/yum.repo......
  • MySQL的默认值约束(Default),数据库设计必备
    一、默认值约束简介默认值(Default)的完整称呼是默认值约束(DefaultConstraint)。MySQL默认值约束用来指定某列的默认值。例如女性员工较多,性别就可以默认为“女”。如果插入......
  • mysql主从同步单点故障
    请问Mysql主从同步问题mysql主从同步的步骤一、主机环境master操作系统:rhel6.0IP:172.16.0.100MySQL版本:5.1.47www.2cto.comslave操作系统:rhel6.0IP:172.16.0.200MySQL版本:5.1......
  • mysql主从同步延迟怎么解决
    mysql主从同步是一直进行的吗有两种方法,一种方法使用mysql的checktable和repairtable的sql语句,另一种方法是使用MySQL提供的多个myisamchk,isamchk数据检测恢复工具。前者使......
  • MySQL的主键(PRIMARY KEY),重要性太高
    一、什么是主键主键(PRIMARYKEY)的又叫做“主键约束”,MySQL主键约束是一个单独的列或者多个列的组合,其值能唯一地标识表中的一行数据。这样的一列或多列称为表的主键,通过它......