中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot項目中怎么實現MySQL讀寫分離

發布時間:2022-09-14 17:44:45 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

這篇文章主要介紹了SpringBoot項目中怎么實現MySQL讀寫分離的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SpringBoot項目中怎么實現MySQL讀寫分離文章都會有所收獲,下面我們一起來看看吧。

    1、MySQL主從復制

    但我們仔細觀察我們會發現,當我們的項目都是用的單體數據庫時,那么就可能會存在如下問題:

    • 讀和寫所有壓力都由一臺數據庫承擔, 壓力大

    • 數據庫服務器磁盤損壞則 數據丟失 ,單點故障

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

    SpringBoot項目中怎么實現MySQL讀寫分離

    在這種讀寫分離的結構中,從庫是可以有多個的

    1.1、介紹

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

    二進制日志:

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

    MySQL復制過程分成三步:
    • MySQL master 將數據變更寫入二進制日志( binary log )

    • slave將master的binary log拷貝到它的中繼日志( relay log )

    • slave重做中繼日志中的事件,將數據變更反映它自己的數據

    SpringBoot項目中怎么實現MySQL讀寫分離

    1.2、主從庫搭建

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

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

    1.2.1、主庫配置

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

    1、修改Mysql數據庫的配置文件 vim /etc/my.cnf

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

    SpringBoot項目中怎么實現MySQL讀寫分離

    2、重啟Mysql服務

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

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

    3、創建數據同步的用戶并授權

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

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

    4、查看master同步狀態

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

    show master status;

    SpringBoot項目中怎么實現MySQL讀寫分離

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

    1.2.2、從庫配置

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

    1、 修改Mysql數據庫的配置文件 vim /etc/my.cnf

    SpringBoot項目中怎么實現MySQL讀寫分離

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

    2、重啟Mysql服務

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

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

    3、設置主庫地址及同步位置

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

    設置主庫地址和同步位置
    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;

    參數說明:

    • master_host: 主庫的 IP地址

    • master_user: 訪問主庫進行主從復制的 用戶名 ( 上面在主庫創建的 )

    • master_password: 訪問主庫進行主從復制的用戶名對應的 密碼

    • master_log_file: 從哪個 日志文件 開始同步 ( 即1.2.1中第4步獲取的 File )

    • master_log_pos: 從指定日志文件的哪個 位置 開始同步 ( 即1.2.1中第4步獲取的 Position )

    4、查看從數據庫的狀態

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

    show slave status\G;

    SpringBoot項目中怎么實現MySQL讀寫分離

    1.3、坑位介紹

    1.3.1、UUID報錯

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

    SpringBoot項目中怎么實現MySQL讀寫分離

    1.3.2、server_id報錯

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

    1.3.3、同步異常解決

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

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

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

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

    操作不規范,親人兩行淚……

    2、項目中實現

    2.1、ShardingJDBC

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

    使用Sharding-JDBC可以在程序中輕松的實現數據庫 讀寫分離 。

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

    • 適用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

    • 支持任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

    • 支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標準的數據庫。

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

    2.2、依賴導入

    在pom.xml文件中導入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中增加數據源的配置

    spring:
      shardingsphere:
        datasource:
          names:
            master,slave
          # 主數據源
          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
          # 從數據源
          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:
          # 讀寫分離配置,設置負載均衡的模式為輪詢
          load-balance-algorithm-type: round_robin
          # 最終的數據源名稱
          name: dataSource
          # 主庫數據源名稱
          master-data-source-name: master
          # 從庫數據源名稱列表,多個逗號分隔
          slave-data-source-names: slave
        props:
          sql:
            show: true #開啟SQL顯示,默認false
      # 覆蓋注冊bean,后面創建數據源會覆蓋前面創建的數據源
      main:
        allow-bean-definition-overriding: true

    2.4、測試跑路

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

    • 更新操作(寫操作)

    SpringBoot項目中怎么實現MySQL讀寫分離

    • 查詢操作(讀操作)

    SpringBoot項目中怎么實現MySQL讀寫分離

    搞定!!!程序正常按照我們預期的成功跑起來了,成功借助ShardingJDBC在我們項目中實現了數據庫的讀寫分離。

    關于“SpringBoot項目中怎么實現MySQL讀寫分離”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“SpringBoot項目中怎么實現MySQL讀寫分離”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    鄯善县| 米泉市| 华亭县| 郎溪县| 普格县| 桐乡市| 温泉县| 武城县| 马关县| 岳阳市| 金沙县| 江源县| 新田县| 巴南区| 香格里拉县| 温宿县| 河东区| 乌拉特前旗| 阳西县| 商城县| 儋州市| 晴隆县| 灵山县| 许昌市| 合肥市| 乌拉特中旗| 濉溪县| 顺义区| 富宁县| 含山县| 和静县| 林州市| 奈曼旗| 清涧县| 顺昌县| 航空| 盐源县| 望奎县| 修文县| 榆树市| 荔波县|