1.實現數據庫高可用
1.1 搭建策略
1.1.1 問題說明
說明:若是根據以下的配置實現數據庫的代理,若是數據庫主庫宕機,則直接影響整個程序的執行.因此須要實現高可用機制.
高可用實現的問題:
若是實現了數據庫高可用,能夠自動的切換數據庫,因爲用戶直接操做了從庫,當主庫啓動時發現數據不一致時,主從同步的狀態將會終止.
java
1.1.2 雙機熱備(雙主模式)
說明:能夠經過數據庫雙主模式實現數據庫高可用.
雙主模式實質都是主機,互相備份.
mysql
1.1.3 雙機熱備的實現
以前的配置:
主機: 192.168.126.129
從庫: 192.168.126.130
如今的配置:
主機: 192.168.126.130
從庫: 192.168.126.129
nginx
1).檢查主庫狀態
2).實現數據庫主從搭建
redis
1.2 數據庫高可用實現
1).編輯配置文件算法
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--name屬性是自定義的 dataNode表示數據庫的節點信息 jtdb表示邏輯庫--> <schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/> <!--定義節點名稱/節點主機/數據名稱--> <dataNode name="jtdb" dataHost="localhost1" database="jtdb" /> <!--參數介紹 UTF-8 中文報錯--> <!--balance 0表示全部的讀操做都會發往writeHost主機 --> <!--1表示全部的讀操做發往readHost和閒置的主節點中--> <!--writeType=0 全部的寫操做都發往第一個writeHost主機--> <!--writeType=1 全部的寫操做隨機發往writeHost中--> <!--dbType 表示數據庫類型 mysql/oracle--> <!--dbDriver="native" 固定參數 不變--> <!--switchType=-1 表示不自動切換, 主機宕機後不會自動切換從節點--> <!--switchType=1 表示會自動切換(默認值)若是第一個主節點宕機後,Mycat會進行3次心跳檢測,若是3次都沒有響應,則會自動切換到第二個主節點--> <!--而且會更新/conf/dnindex.properties文件的主節點信息 localhost1=0 表示第一個節點.該文件不要隨意修改不然會出現大問題--> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select 1</heartbeat> <!--配置第一臺主機主要進行寫庫操做,在默認的條件下Mycat主要操做第一臺主機在第一臺主機中已經實現了讀寫分離.由於默認寫操做會發往137的數據庫.讀的操做默認發往141.若是從節點比較忙,則主節點分擔部分壓力. --> <writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root"> <!--讀數據庫1--> <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" /> <!--讀數據庫2--> <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" /> </writeHost> <!--定義第二臺主機 因爲數據庫內部已經實現了雙機熱備.--> <!--Mycat實現高可用.當第一個主機137宕機後.mycat會自動發出心跳檢測.檢測3次.--> <!--若是主機137沒有給Mycat響應則判斷主機死亡.則回啓東第二臺主機繼續爲用戶提供服務.--> <!--若是137主機恢復以後則處於等待狀態.若是141宕機則137再次持續爲用戶提供服務.--> <!--前提:實現雙機熱備.--> <writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root"> <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" /> <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" /> </writeHost> </dataHost> </mycat:schema>
2).上傳配置文件:
3).重啓mycat服務器
spring
1.3 數據庫高可用實測試
1.啓動服務器,測試mysql數據庫是否正常.
2.關閉數據庫主庫,再次檢查用戶的操做是否正常.
sql
3).修改數據庫中的內容,重啓主數據庫,檢查數據是否同步
數據庫
1.4 檢查端口占用狀況
2 Redis緩存學習
2.1 優化現有架構
說明:經過緩存服務器能夠有效的提高用戶的訪問的效率.
注意事項:
1.緩存的數據結構 應該選用 K-V結構 只要key惟一 那麼結果必然相同…
2.緩存中的數據不可能一直存儲,須要按期將內存數據進行優化 LRU算法…
3.緩存要求運行速度很快, C語言實現… 運行在內存中.
4.若是緩存運行的數據在內存中,若是斷電/宕機,則內存數據直接丟失. 實現內存數據的持久化操做(磁盤).
api
2.2 Redis緩存服務器
網址: http://www.redis.cn/緩存
2.2.1 Redis介紹
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它能夠用做數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不一樣級別的 磁盤持久化(persistence), 並經過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。
nginx: 3-5萬/秒
redis: 讀: 11.2萬/秒 寫: 8.6萬/秒 平均10萬/秒
吞吐量: 50萬/秒
2.2.2 Redis安裝
1).解壓redis文件
2).移動文件/修改文件
3).安裝Redis
命令1: make
命令2: make install
2.2.3 修改redis.conf配置文件
1.修改IP綁定
2.關閉保護模式
3.開啓後臺啓動
2.2.4 Redis命令
1.啓動redis redis-server redis.conf
2.檢查redis服務項
3. 進入redis客戶端
redis-cli -p 6379
4.關閉redis
1).命令 redis-cli -p 6379 shutdown
2).kill命令 kill -9 pid號
2.3 SpringBoot整合Redis
2.3.1 導入jar包
<!--spring整合redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency>
2.3.2 入門案例
package com.jt; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import redis.clients.jedis.Jedis; import redis.clients.jedis.params.SetParams; public class TestRedis { /** * 1.實現redis測試 * 報錯檢查: * 1.檢查redis.conf配置文件 1.ip綁定問題 2.保護模式問題 3.後臺啓動問題 * 2.檢查redis啓動方式 redis-server redis.conf * 3.檢查防火牆 * */ @Test public void test01(){ Jedis jedis = new Jedis("192.168.126.129",6379); jedis.set("2007", "redis入門案例"); System.out.println(jedis.get("2007")); } /** * 我想判斷是否有key數據,若是沒有則新增數據,若是有則放棄新增 */ @Test public void test02(){ Jedis jedis = new Jedis("192.168.126.129",6379); // if(!jedis.exists("2007")){ //判斷數據是否存在. // jedis.set("2007", "測試案例2222"); // } //setnx做用: 若是有數據,則不作處理. jedis.setnx("2007", "測試高級用法"); System.out.println(jedis.get("2007")); } /** * 需求: * 向redis中添加一個數據.set-key-value,要求添加超時時間 100秒. * 隱藏bug: 代碼執行過程當中,若是報錯,則可能刪除失敗. * 原子性: 要麼同時成功,要不一樣時失敗. * 解決方法: 將入庫操做/超時時間一齊設定. setex */ @Test public void test03() throws InterruptedException { Jedis jedis = new Jedis("192.168.126.129",6379); //jedis.set("2007", "測試時間"); //隱藏含義: 業務須要 到期刪除數據 //jedis.expire("2007", 100); jedis.setex("2007", 100, "測試時間"); System.out.println(jedis.ttl("2007")+"秒"); } /** * 1.若是數據存在,則不操做數據 setnx * 2.同時設定超時時間,注意原子性 setex * 參數說明: * 1. XX = "xx"; 只有key存在,則進行操做 * 2. NX = "nx"; 沒有key,進行寫操做 * 3. PX = "px"; 毫秒 * 4. EX = "ex"; 秒 */ @Test public void test04() throws InterruptedException { Jedis jedis = new Jedis("192.168.126.129",6379); SetParams setParams = new SetParams(); setParams.xx().ex(100); jedis.set("2007", "bbbbb",setParams); System.out.println(jedis.get("2007")); } }