• MySQL读写分离之一主一从


    原理

    MySQL 的主从复制,是基于二进制日志( binlog )实现的。

    准备

    主机
    角色
    用户名
    密码
    192.168.2.3
    master
    root
    newPwd520@
    192.168.2.4
    slave
    root
    newPwd520@
    主从复制的搭建,可以参考 MYSQL的主从复制-CSDN博客

    一主一从读写分离

    MyCat 控制后台数据库的读写分离和负载均衡由 schema.xml 文件 datahost 标签的 balance 属性控
    制。

    schema.xml配置

    1. <!-- 配置逻辑库 -->
    2. <schema name="TEST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
    3. </schema>
    4. <dataNode name="dn7" dataHost="dhost7" database="test" />
    5. <dataHost name="dhost7" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    6. <heartbeat>select user()</heartbeat>
    7. <writeHost host="master1" url="jdbc:mysql://192.168.2.3:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="newPwd520@" >
    8. <readHost host="slave1" url="jdbc:mysql://192.168.2.4:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="newPwd520@" />
    9. </writeHost>
    10. </dataHost>
    writeHost 代表的是写操作对应的数据库, readHost 代表的是读操作对应的数据库。 所以我们要想
    实现读写分离,就得配置 writeHost 关联的是主库, readHost 关联的是从库。
    而仅仅配置好了 writeHost 以及 readHost 还不能完成读写分离,还需要配置一个非常重要的负责均衡的参数 balance ,取值有 4 种,具体含义如下:
    参数
    含义
    0
    不开启读写分离机制 , 所有读操作都发送到当前可用的 writeHost
    1
    全部的 readHost 与 备用的 writeHost 都参与 select 语句的负载均衡(主要针对 于双主双从模式)
    2
    所有的读写操作都随机在 writeHost , readHost 上分发
    3
    所有的读请求随机分发到 writeHost 对应的 readHost 上执行 , writeHost 不负担读压力
    所以,在一主一从模式的读写分离中, balance 配置 1 3 都是可以完成读写分离的。

    server.xml配置

    配置 root 用户可以访问 SHOPPING TEST 以及 TEST_RW 逻辑库。
    1. <!-- 用户及密码信息 -->
    2. <user name="root" defaultAccount="true">
    3. <property name="password">123456</property>
    4. <property name="schemas">TEST_RW</property>
    5. <!-- <property name="defaultSchema">TESTDB</property> -->
    6. <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
    7. <!-- 表级 DML 权限设置 -->
    8. <!--
    9. <privileges check="false">
    10. <schema name="TESTDB" dml="0110" >
    11. <table name="tb01" dml="0000"></table>
    12. <table name="tb02" dml="1111"></table>
    13. </schema>
    14. </privileges>
    15. -->
    16. </user>

    测试

    配置完毕 MyCat 后,重新启动 MyCat
    1. bin/mycat stop
    2. bin/mycat start
    然后观察,在执行增删改操作时,对应的主库及从库的数据变化。 在执行查询操作时,检查主库及从库对应的数据变化。
    在master上执行
    1. create database test;
    2. use test;
    3. create table tb_user(
    4. id int(11) not null,
    5. name varchar(50) not null,
    6. sex varchar(1),
    7. primary key (id)
    8. )engine=innodb default charset=utf8;
    9. insert into tb_user(id,name,sex) values(1,'Tom','1');
    10. insert into tb_user(id,name,sex) values(2,'Trigger','0');
    11. insert into tb_user(id,name,sex) values(3,'Dawn','1');

    slave同样生成test数据库和数据

    我们在mycat下插入数据
    在主从数据库都有数据增加
    当我们停掉master的数据库
    systemctl stop mysqld
    

    我们在mycat下查询数据可以获得数据,但是插入数据却失败

    在测试中,我们可以发现当主节点Master 宕机之后,业务系统就只能够读,而不能写入数据了。 
    那如何解决这个问题呢?这个时候我们就得通过另外一种主从复制结构来解决了。
  • 相关阅读:
    历时2月,动态线程池 DynamicTp 发布里程碑版本 V1.0.8
    弘辽科技:淘宝客服没办法改价吗?淘宝客服改价步骤是什么?
    JS构造函数与class类中的封装、继承和多态
    “Linux免除系统交互操作方法、expect自动化交互工具” 及 “SSH批量修改主机密码脚本”
    【微信】实战Adnroid上的小程序调试
    wps及word通配匹配与正则匹配之异同
    java毕业设计交通事故档案管理系统(附源码、数据库)
    hudi系列-文件归档(archive)
    C指针笔记
    原生IP是什么?如何测试代理是不是原生IP?
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/133816967