<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
但我們仔細觀察我們會發現,當我們的專案都是用的單體資料庫時,那麼就可能會存在如下問題:
為了解決上述提到的兩個問題,我們可以準備兩 (多) 臺MySQL,一臺主( Master )伺服器,一臺從( Slave )伺服器,主庫的 資料變更 (寫、更新、刪除這些操作) ,需要 同步 到從庫中 (主從複製) 。而使用者在存取我們專案時,如果是 寫操作 (insert、update、delete),則直接操作 主庫 ;如果是 讀操作 (select) ,則直接操作從庫,這種結構就是 讀寫分離 啦。
在這種讀寫分離的結構中,從庫是可以有多個的
MySQL主從複製是一個 非同步 的複製過程,底層是基於Mysql資料庫自帶的 二進位制紀錄檔 功能。就是一臺或多臺MySQL資料庫(slave,即 從庫 )從另一臺MySQL資料庫(master,即 主庫 )進行紀錄檔的複製,然後再解析紀錄檔並應用到自身,最終實現 從庫 的資料和 主庫 的資料保持一致。MySQL主從複製是 MySQL資料庫自帶功能,無需藉助第三方工具。
二進位制紀錄檔(BINLOG)記錄了所有的 DDL(資料定義語言)語句和 DML(資料操縱語言)語句,但是不包括資料查詢語句。此紀錄檔對於災難時的資料恢復起著極其重要的作用,MySQL的主從複製, 就是通過該binlog實現的。預設MySQL是未開啟該紀錄檔的。
在環境搭建之前,我們需要準備好兩臺伺服器,如果生活富裕使用的是兩臺雲伺服器的時候記得要開放安全組,即防火牆;如果是比狗子我生活好點但也是用的虛擬機器器的話,記得別分這麼多記憶體啟動藍屏了(別問怎麼知道的)
這裡就不給大家展示資料庫的安裝和防火牆的操作了,這個我感覺網上好多資源都能夠滿足遇到的問題,在搭建主從庫的時候有在網上見到過說MySQL版本要一致的,我也沒太留意直接就在之前的MySQL上操作了,大家可以自己去驗證一下。
伺服器:192.168.150.100(別試了黑不了的,這是虛擬機器器的ip)
1、修改Mysql資料庫的組態檔 vim /etc/my.cnf
在開啟的檔案中加入下面兩行,其中的server-id不一定是100,確保唯一即可 log-bin=mysql-bin #[必須]啟用二進位制紀錄檔 server-id=100 #[必須]伺服器唯一ID
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;
執行完這一句SQL之後,==不要再操作主庫!不要再操作主庫!不要再操作主庫!==重要的事情說三遍,因為再操作主庫之後可能會導致紅框中的 兩個屬性值會發生變化 ,後面如果發生了錯誤可能就和這裡有那麼兩毛錢關係了。
伺服器:192.168.150.101(別試了黑不了的,這也是虛擬機器器的ip)
1、 修改Mysql資料庫的組態檔 vim /etc/my.cnf
這裡要注意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;
引數說明:
4、檢視從資料庫的狀態
這個時候還 不用退出MySQL ,因為下面的命令還是SQL命令,執行下面的SQL,可以看到從庫的狀態資訊。通過狀態資訊中的 Slave_IO_running 和 Slave_SQL_running 可以看出主從同步是否就緒,如果這兩個引數全為 Yes ,表示主從同步已經設定完成。
show slave statusG;
這可能是由於linux 是複製出來的,MySQL中還有一個 server_uuid 是一樣的,我們也需要修改。 vim /var/lib/mysql/auto.cnf
這應該就是各位大牛設定server_id的時候不小心設定相同的id了,修改過來就行,步驟在上面的設定中。
這是狗子在操作過程中搞出來的一個錯誤……
出錯的原因是在主庫中刪除了使用者資訊,但是在從庫中同步的時候失敗導致同步停止,下面記錄自己的操作(是在進入MySQL的操作且是從庫)。
MASTER_LOG_POS
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; SHOW SLAVE STATUSG;
在資料庫中操作時,一定要注意當前所在的資料庫是哪個,作為一個良好的實踐:在SQL語句前加 USE dbname
。
Sharding-JDBC定位為 輕量級Java框架 ,在Java的JDBC層提供的額外服務。 它使用使用者端直連資料庫,以 jar包 形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動, 完全相容JDBC和各種ORM框架 。
使用Sharding-JDBC可以在程式中輕鬆的實現資料庫 讀寫分離 。
Sharding-JDBC具有以下幾個特點:
下面我們將用ShardingJDBC在專案中實現MySQL的讀寫分離。
在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>
在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
這時我們就可以對我們專案中的設定進行一個測試,下面分別呼叫一個更新介面和一個查詢介面,通過檢視紀錄檔中記錄的資料來源來判斷是否能夠按照我們預料中的跑。
搞定!!!程式正常按照我們預期的成功跑起來了,成功藉助ShardingJDBC在我們專案中實現了資料庫的讀寫分離。
到此這篇關於SpringBoot專案中如何實現MySQL讀寫分離的文章就介紹到這了,更多相關SpringBoot MySQL讀寫分離內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45