欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項目中如何實現(xiàn)MySQL讀寫分離詳解

 更新時間:2022年07月10日 08:03:36   作者:馬小屑  
在高并發(fā)下需要對應(yīng)用進行讀寫分離,配置多數(shù)據(jù)源,即寫操作走主庫,讀操作則走從庫,主從數(shù)據(jù)庫負責各自的讀和寫,緩解了鎖的爭用,提高了讀取性能,這篇文章主要給大家介紹了關(guān)于SpringBoot項目中如何實現(xiàn)MySQL讀寫分離的相關(guān)資料,需要的朋友可以參考下

1、MySQL主從復(fù)制

但我們仔細觀察我們會發(fā)現(xiàn),當我們的項目都是用的單體數(shù)據(jù)庫時,那么就可能會存在如下問題:

  • 讀和寫所有壓力都由一臺數(shù)據(jù)庫承擔, 壓力大
  • 數(shù)據(jù)庫服務(wù)器磁盤損壞則 數(shù)據(jù)丟失 ,單點故障

為了解決上述提到的兩個問題,我們可以準備兩 (多) 臺MySQL,一臺主( Master )服務(wù)器,一臺從( Slave )服務(wù)器,主庫的 數(shù)據(jù)變更 (寫、更新、刪除這些操作) ,需要 同步 到從庫中 (主從復(fù)制) 。而用戶在訪問我們項目時,如果是 寫操作 (insert、update、delete),則直接操作 主庫 ;如果是 讀操作 (select) ,則直接操作從庫,這種結(jié)構(gòu)就是 讀寫分離 啦。

在這種讀寫分離的結(jié)構(gòu)中,從庫是可以有多個的

1.1、介紹

MySQL主從復(fù)制是一個 異步 的復(fù)制過程,底層是基于Mysql數(shù)據(jù)庫自帶的 二進制日志 功能。就是一臺或多臺MySQL數(shù)據(jù)庫(slave,即 從庫 )從另一臺MySQL數(shù)據(jù)庫(master,即 主庫 )進行日志的復(fù)制,然后再解析日志并應(yīng)用到自身,最終實現(xiàn) 從庫 的數(shù)據(jù)和 主庫 的數(shù)據(jù)保持一致。MySQL主從復(fù)制是 MySQL數(shù)據(jù)庫自帶功能,無需借助第三方工具。

二進制日志:

二進制日志(BINLOG)記錄了所有的 DDL(數(shù)據(jù)定義語言)語句和 DML(數(shù)據(jù)操縱語言)語句,但是不包括數(shù)據(jù)查詢語句。此日志對于災(zāi)難時的數(shù)據(jù)恢復(fù)起著極其重要的作用,MySQL的主從復(fù)制, 就是通過該binlog實現(xiàn)的。默認MySQL是未開啟該日志的。

MySQL復(fù)制過程分成三步:

  • MySQL master 將數(shù)據(jù)變更寫入二進制日志( binary log )
  • slave將master的binary log拷貝到它的中繼日志( relay log )
  • slave重做中繼日志中的事件,將數(shù)據(jù)變更反映它自己的數(shù)據(jù)

1.2、主從庫搭建

在環(huán)境搭建之前,我們需要準備好兩臺服務(wù)器,如果生活富裕使用的是兩臺云服務(wù)器的時候記得要開放安全組,即防火墻;如果是比狗子我生活好點但也是用的虛擬機的話,記得別分這么多內(nèi)存啟動藍屏了(別問怎么知道的)

這里就不給大家展示數(shù)據(jù)庫的安裝和防火墻的操作了,這個我感覺網(wǎng)上好多資源都能夠滿足遇到的問題,在搭建主從庫的時候有在網(wǎng)上見到過說MySQL版本要一致的,我也沒太留意直接就在之前的MySQL上操作了,大家可以自己去驗證一下。

1.2.1、主庫配置

服務(wù)器:192.168.150.100(別試了黑不了的,這是虛擬機的ip)

1、修改Mysql數(shù)據(jù)庫的配置文件 vim /etc/my.cnf

在打開的文件中加入下面兩行,其中的server-id不一定是100,確保唯一即可
log-bin=mysql-bin   #[必須]啟用二進制日志
server-id=100       #[必須]服務(wù)器唯一ID

2、重啟Mysql服務(wù)

這里有三個方法都能重啟MySQL,最簡單的無疑就是一關(guān)一開:

net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart

3、創(chuàng)建數(shù)據(jù)同步的用戶并授權(quán)

登錄進去MySQL之后才能夠執(zhí)行下面的命令,因為這是SQL命令,Linux不認識這玩意是啥。

GRANT REPLICATION SLAVE ON *.* to '用戶名'@'開放的地址' identified by '密碼';
eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';
記得刷一下權(quán)限
FLUSH PRIVILEGES;

4、查看master同步狀態(tài)

這個時候還 不用退出MySQL ,因為下面的命令還是SQL命令,執(zhí)行下面的SQL,可以拿到我們后面需要的兩個重要參數(shù)。

show master status;

執(zhí)行完這一句SQL之后,==不要再操作主庫!不要再操作主庫!不要再操作主庫!==重要的事情說三遍,因為再操作主庫之后可能會導(dǎo)致紅框中的 兩個屬性值會發(fā)生變化 ,后面如果發(fā)生了錯誤可能就和這里有那么兩毛錢關(guān)系了。

1.2.2、從庫配置

服務(wù)器:192.168.150.101(別試了黑不了的,這也是虛擬機的ip)

1、 修改Mysql數(shù)據(jù)庫的配置文件 vim /etc/my.cnf

這里要注意server-id和主庫以及其他從庫都不能相同,否則后面將會配置不成功。

2、重啟Mysql服務(wù)

這里有三個方法都能重啟MySQL,最簡單的無疑就是一關(guān)一開:

net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart

3、設(shè)置主庫地址及同步位置

登錄進去MySQL之后才能夠執(zhí)行下面的命令,因為這是SQL命令

設(shè)置主庫地址和同步位置
change master to master_host='192.168.150.100',master_user='masterDb',master_password='Master@123456',master_log_file='mysql-bin.000010',master_log_pos=68479;
記得記得開啟從庫配置
start slave;

參數(shù)說明:

  • master_host: 主庫的 IP地址
  • master_user: 訪問主庫進行主從復(fù)制的 用戶名 ( 上面在主庫創(chuàng)建的 )
  • master_password: 訪問主庫進行主從復(fù)制的用戶名對應(yīng)的 密碼
  • master_log_file: 從哪個 日志文件 開始同步 ( 即1.2.1中第4步獲取的 File )
  • master_log_pos: 從指定日志文件的哪個 位置 開始同步 ( 即1.2.1中第4步獲取的 Position )

4、查看從數(shù)據(jù)庫的狀態(tài)

這個時候還 不用退出MySQL ,因為下面的命令還是SQL命令,執(zhí)行下面的SQL,可以看到從庫的狀態(tài)信息。通過狀態(tài)信息中的 Slave_IO_running 和 Slave_SQL_running 可以看出主從同步是否就緒,如果這兩個參數(shù)全為 Yes ,表示主從同步已經(jīng)配置完成。

show slave status\G;

1.3、坑位介紹

1.3.1、UUID報錯

這可能是由于linux 是復(fù)制出來的,MySQL中還有一個 server_uuid 是一樣的,我們也需要修改。 vim /var/lib/mysql/auto.cnf

1.3.2、server_id報錯

這應(yīng)該就是各位大牛設(shè)置server_id的時候不小心設(shè)置相同的id了,修改過來就行,步驟在上面的配置中。

1.3.3、同步異常解決

這是狗子在操作過程中搞出來的一個錯誤……

出錯的原因是在主庫中刪除了用戶信息,但是在從庫中同步的時候失敗導(dǎo)致同步停止,下面記錄自己的操作(是在進入MySQL的操作且是從庫)。

MASTER_LOG_POS
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS\G;

在數(shù)據(jù)庫中操作時,一定要注意當前所在的數(shù)據(jù)庫是哪個,作為一個良好的實踐:在SQL語句前加 USE dbname 。

操作不規(guī)范,親人兩行淚……

2、項目中實現(xiàn)

2.1、ShardingJDBC

Sharding-JDBC定位為 輕量級Java框架 ,在Java的JDBC層提供的額外服務(wù)。 它使用客戶端直連數(shù)據(jù)庫,以 jar包 形式提供服務(wù),無需額外部署和依賴,可理解為增強版的JDBC驅(qū)動, 完全兼容JDBC和各種ORM框架 。

使用Sharding-JDBC可以在程序中輕松的實現(xiàn)數(shù)據(jù)庫 讀寫分離 。

Sharding-JDBC具有以下幾個特點:

  • 適用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意實現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標準的數(shù)據(jù)庫。

下面我們將用ShardingJDBC在項目中實現(xiàn)MySQL的讀寫分離。

2.2、依賴導(dǎo)入

在pom.xml文件中導(dǎo)入ShardingJDBC的依賴坐標

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

2.3、配置文件

在application.yml中增加數(shù)據(jù)源的配置

spring:
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主數(shù)據(jù)源
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.150.100:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
      # 從數(shù)據(jù)源
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.150.101:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
    masterslave:
      # 讀寫分離配置,設(shè)置負載均衡的模式為輪詢
      load-balance-algorithm-type: round_robin
      # 最終的數(shù)據(jù)源名稱
      name: dataSource
      # 主庫數(shù)據(jù)源名稱
      master-data-source-name: master
      # 從庫數(shù)據(jù)源名稱列表,多個逗號分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #開啟SQL顯示,默認false
  # 覆蓋注冊bean,后面創(chuàng)建數(shù)據(jù)源會覆蓋前面創(chuàng)建的數(shù)據(jù)源
  main:
    allow-bean-definition-overriding: true

2.4、測試跑路

這時我們就可以對我們項目中的配置進行一個測試,下面分別調(diào)用一個更新接口和一個查詢接口,通過查看日志中記錄的數(shù)據(jù)源來判斷是否能夠按照我們預(yù)料中的跑。

  • 更新操作(寫操作)

  • 查詢操作(讀操作)

搞定?。?!程序正常按照我們預(yù)期的成功跑起來了,成功借助ShardingJDBC在我們項目中實現(xiàn)了數(shù)據(jù)庫的讀寫分離。

總結(jié)

到此這篇關(guān)于SpringBoot項目中如何實現(xiàn)MySQL讀寫分離的文章就介紹到這了,更多相關(guān)SpringBoot MySQL讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    這篇文章主要介紹了SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JAVA中的deflate壓縮實現(xiàn)方法

    JAVA中的deflate壓縮實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫AVA中的deflate壓縮實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 詳解java重載與覆寫的區(qū)別

    詳解java重載與覆寫的區(qū)別

    很多同學(xué)會重載和重寫分不清楚,這篇文章主要介紹了詳解java重載與覆寫的區(qū)別,有需要的朋友可以了解一下。
    2016-11-11
  • SpringBoot實現(xiàn)自定義Starter的步驟詳解

    SpringBoot實現(xiàn)自定義Starter的步驟詳解

    在SpringBoot中,Starter是一種特殊的依賴,它可以幫助我們快速地集成一些常用的功能,例如數(shù)據(jù)庫連接、消息隊列、Web框架等。在本文中,我們將介紹如何使用Spring Boot實現(xiàn)自定義Starter,需要的朋友可以參考下
    2023-06-06
  • Maven中錯誤使用parent.relativePath導(dǎo)致構(gòu)建失敗問題

    Maven中錯誤使用parent.relativePath導(dǎo)致構(gòu)建失敗問題

    這篇文章主要介紹了Maven中錯誤使用parent.relativePath導(dǎo)致構(gòu)建失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java8?stream排序以及自定義比較器方式

    java8?stream排序以及自定義比較器方式

    這篇文章主要介紹了java8?stream排序以及自定義比較器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 手寫mybatis完整sql插件問題及實現(xiàn)思路

    手寫mybatis完整sql插件問題及實現(xiàn)思路

    大家在使用mybatis的過程中,mysql日志功能一般不會直接放到數(shù)據(jù)庫中執(zhí)行的,今天小編重點給大家分享手寫mybatis完整sql插件問題及實現(xiàn)思路,對mybatis完整sql插件相關(guān)知識感興趣的朋友一起看看吧
    2021-05-05
  • Spring中@Value注解詳細圖文講解

    Spring中@Value注解詳細圖文講解

    在spring中有兩種注入方式一種是XML文件注入,另一種則是注解注入,這篇文章主要給大家介紹了關(guān)于Spring中@Value注解的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 基于resty?security的Api權(quán)限控制與事務(wù)支持

    基于resty?security的Api權(quán)限控制與事務(wù)支持

    這篇文章主要為大家介紹了基于resty?security的Api權(quán)限控制與事務(wù)支持讓數(shù)據(jù)操作處于事務(wù)控制下,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • Java中Arraylist的最大長度

    Java中Arraylist的最大長度

    這篇文章主要介紹了Java中Arraylist的最大長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論