• Mysql简单主从复制和读写分离


    1.简介

    主从复制:

    在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」。

    比如:在复杂的业务系统中,有一句sql执行后导致锁表,并且这条sql的的执行时间有比较长,那么此sql执行的期间导致服务不可用,这样就会严重影响用户的体验度。

    主从复制中分为「主服务器(master)「和」从服务器(slave)」,「主服务器负责写,而从服务器负责读」,Mysql的主从复制的过程是一个「异步的过程」。

    这样读写分离的过程能够是整体的服务性能提高,即使写操作时间比较长,也不影响读操作的进行。

    读写分离:

    只在主服务器上写,只在从服务器上读。

    主数据库处理事务性查询,而从数据库处理 select 查询。

    数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

    2.主从复制

    1.编辑主库mysql中my.cnf文件

    1. #添加如下
    2. server-id = 129
    3. log-bin=master-bin #添加,主服务器开启二进制日志

    之后重启mysql,之后登录mysql

    1. #给从服务器授权
    2. use mysql;
    3. create user 'xiaoming'@'%' identified by '111111';
    4. grant all privileges on *.* to 'xiaoming'@'%';
    5. FLUSH PRIVILEGES;

    上面的代码意思是创建一个xiaoming的用户,密码是111111,并授予其REPLICATION SLAVE权限

    最后使用show master status;

    2.编辑从库mysql中my.cnf文件

    1. #添加如下
    2. server-id = 130

    登录mysql,执行如下命令

    1. #下面的字段都要和本机对应
    2. change master to master_host='192.168.108.129' , master_user='xiaoming',master_password='111111',master_log_file='mysql-bin.000001',master_log_pos=1005;
    3. #启动slave
    4. start slave;
    5. #查看slave状态;
    6. show slave status\G;

    //确保 IO 和 SQL 线程都是 Yes,代表同步正常。

    Slave_IO_Running: Yes #负责与主机的io通信

    Slave_SQL_Running: Yes #负责自己的slave mysql进程

    3.读写分离(基于Sharding-JDBC)

    以springboot项目为例

    1.导入sharding-jdbc maven依赖

    1. <dependency>
    2. <groupId>org.apache.shardingspheregroupId>
    3. <artifactId>sharding-jdbc-spring-boot-starterartifactId>
    4. <version>4.0.0-RC1version>
    5. dependency>

    2.在application.yml文件中加入如下代码:

    1. spring:
    2. application:
    3. #应用的名称,可选
    4. name: railway_take_out
    5. shardingsphere:
    6. datasource:
    7. names:
    8. master,slave
    9. # 主数据源
    10. master:
    11. type: com.alibaba.druid.pool.DruidDataSource
    12. driver-class-name: com.mysql.cj.jdbc.Driver
    13. url: jdbc:mysql://192.168.108.129:3306/railway?characterEncoding=utf-8
    14. username: root
    15. password: 111111
    16. # 从数据源
    17. slave:
    18. type: com.alibaba.druid.pool.DruidDataSource
    19. driver-class-name: com.mysql.cj.jdbc.Driver
    20. url: jdbc:mysql://192.168.108.130:3306/railway?characterEncoding=utf-8
    21. username: root
    22. password: 111111
    23. masterslave:
    24. # 读写分离配置
    25. load-balance-algorithm-type: round_robin #轮询
    26. # 最终的数据源名称
    27. name: dataSource
    28. # 主库数据源名称
    29. master-data-source-name: master
    30. # 从库数据源名称列表,多个逗号分隔
    31. slave-data-source-names: slave
    32. props:
    33. sql:
    34. show: true #开启SQL显示,默认false
    35. main:
    36. #允许bean定义覆盖配置项(不然和默认Durid数据源写入冲突)
    37. allow-bean-definition-overriding: true

  • 相关阅读:
    反序列化漏洞(1), 原理, 实验, 魔术方法
    【JDBC篇】Class.forName原理剖析
    R语言画图/绘图/作图2
    基于启发式搜索的一字棋
    sklearn快速入门教程:处理分类型数据
    ESP8266-Arduino编程实例-OLED显示BMP180传感器数据
    微服务集成redis并通过redis实现排行榜的功能
    Spire.Office for Java 7.6.4
    【校招VIP】数据库之优化相关
    新亮点!安防视频监控/视频集中存储/云存储平台EasyCVR平台六分屏功能展示
  • 原文地址:https://blog.csdn.net/m0_63748493/article/details/126705663