1.實作資料庫高可用
1.1 搭建策略
1.1.1 問題說明
說明:如果根據如下的配置實作資料庫的代理,如果資料庫主庫宕機,則直接影響整個程式的執行.所以需要實作高可用機制.
高可用實作的問題:
如果實作了資料庫高可用,可以自動的切換資料庫,由于用戶直接操作了從庫,當主庫啟動時發現資料不一致時,主從同步的狀態將會終止.

1.1.2 雙機熱備(雙主模式)
說明:可以通過資料庫雙主模式實作資料庫高可用.
雙主模式實質都是主機,互相備份.

1.1.3 雙機熱備的實作
之前的配置:
主機: 192.168.126.129
從庫: 192.168.126.130
現在的配置:
主機: 192.168.126.130
從庫: 192.168.126.129
1).檢查主庫狀態

2).實作資料庫主從搭建

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服務器

1.3 資料庫高可用實測驗
1.啟動服務器,測驗mysql資料庫是否正常.

2.關閉資料庫主庫,再次檢查用戶的操作是否正常.


3).修改資料庫中的內容,重啟主資料庫,檢查資料是否同步



1.4 檢查埠占用情況


2 Redis快取學習
2.1 優化現有架構
說明:通過快取服務器可以有效的提升用戶的訪問的效率.
注意事項:
1.快取的資料結構 應該選用 K-V結構 只要key唯一 那么結果必然相同…
2.快取中的資料不可能一直存盤,需要定期將記憶體資料進行優化 LRU演算法…
3.快取要求運行速度很快, C語言實作… 運行在記憶體中.
4.如果快取運行的資料在記憶體中,如果斷電/宕機,則記憶體資料直接丟失. 實作記憶體資料的持久化操作(磁盤).

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 構建專案結構

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/212948.html
標籤:其他
