cgb2007-京淘day12

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"));
    }
}

2.3.3 構建項目結構

在這裏插入圖片描述

相關文章
相關標籤/搜索