第四階段筆記 Jingtao_day10

day 10 數據庫讀寫分離和負載均衡

此文檔是根據上課流程編寫,更多細節和圖片請參見劉老師的專欄。mysql

江哥的專欄

cgb2008-京淘day10linux

兩臺數據庫:129 --> 主庫;130 --> 從庫
高可用:HAredis

一. 實現數據庫讀寫分離
  1. 原理

    ​ 用戶在和數據庫鏈接時,默認是一個服務器鏈接一個數據庫。查詢操做多,寫入操做少。讀從庫,讀/寫主庫。添加數據庫代理,管理主從庫。代理服務器須要知道IP地址和端口號。用戶不知道本身連的是哪一個服務器,因此是反向代理技術,客戶端鏈接的是代理的IP地址。算法

    ​ 用戶 --> 數據庫代理[Amoba --> Mycat] --> 數據庫sql

    ​ Mycat:數據庫分庫分表中間件數據庫

  2. Mycat中間件json

    i. Mycat介紹緩存

    ​ 參見官網《MYCAT官方網站—開源分佈式數據庫中間件服務器

    ii. Mycat配置數據結構

    ​ 1) 安裝Mycat

    # 跳轉到工做路徑
    cd /usr/local/src
    # 解壓Mycat
    tar -xvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
    # 將Mycat文件移動到/software
    mv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz software/

    ​ 2) 配置用戶和代理服務器,服務器和數據庫的鏈接

    cd mycat/
    == application.yml
    #鏈接的是數據庫的代理
    url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

    ​ 3) 編輯server.xml

    ​ 用戶與代理服務器之間的鏈接經過server.xml文件進行配置

    <!--用戶標籤-->
    <user name="root">
        <property name="password">root</property>
        <!--與schema.xml中的配置相同 注意數據庫的大小寫-->
        <!--<property name="schemas">jtdb,db2,db3</property>-->
        <property name="schemas">jtdb</property>
    </user>
    <user name="user">
        <!--只讀的用戶-->
        <property name="password">user</property>
        <property name="schemas">jtdb</property>
        <property name="readOnly">true</property>
    </user>

    ​ 4) 編輯schema.xml

    ​ 該文件表示代理和數據庫的配置 HOST:PORT:用戶名:密碼:數據庫名稱

    <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>

    ​ 5) Mycat命令

    # 跳轉到工做目錄
    cd ../bin
    # 啓動mycat
    ./mycat start
    # 查看mycat狀態
    ./mycat status

    ​ 6) 負載均衡測試

    ​ 將從庫的數據庫信息手動地進行修改

  3. 實現數據庫雙機熱備

    核心:2臺數據庫互爲主從,實現數據庫高可用的條件式實現主從的備份。

    以前:129爲主,130爲從;如今的配置:130爲主,129爲從

    1) 檢查主庫狀態

    192.168.126.130
    SHOW MASTER STATUS;

    2) 實現主從配置

    192.168.126.129
    CHANGE MASTER to MASTER_HOST="192.168.126.130",
    MASTER_PORT=3306,
    MASTER_user="root",
    MASTER_PASSWORD="root",
    MASTER_LOG_FILE="mysql-bin.000001",
    MASTER_LOG_POS=700;
    
    #啓動主從服務
    start slave    
    
    #檢查狀態
    show slave status;
二. 實現數據庫高可用
  1. 修改schema配置文件

    <?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. 上傳文件

    # 中止mycat服務
    ./mycat stop
  3. 數據庫高可用的測試

    i. 首先應該將129數據庫關閉

    ii. 啓動程序,經過數據庫代理檢查是否訪問正確(查),入庫是否正常(寫)

    iii. 重啓129數據庫,看數據是否同步

三. Redis緩存
  1. 系統優化策略

    ​ 緩存服務器:當用戶進行查詢操做時,先看緩存服務器中是否有數據,若是有,將緩存中的數據返回給用戶;不然用戶直接查詢數據庫,並將查詢到的結果存儲到緩存。能夠下降用戶訪問物理設備的頻次,從而提升響應速度。

  2. 緩存的設計

    1) 緩存數據如何存儲?應該採用什麼樣的數據結構呢? K-V --> key的惟一性

    2) 緩存數據的容量大小,2G? 100G? 1000G? 應該動態維護緩存數據,將不須要的數據提早刪除 --> LRU/LFU/隨機/TTL算法

    3) 緩存數據保存到內存中,緩存的特色是斷電即擦除。按期將內存數據持久化 --> 寫入磁盤中

    4) 單臺緩存服務器性能不足,因此通常須要搭建集羣,實現高可用

    5) 使用C語言開發

  3. Redis緩存服務

    i. 什麼是redis?

    ​ 參見官網《Redis》《Redis中文網

    ​ 開源,數據結構服務器,可用做非關係型數據庫、高速緩存和消息隊列代理。

    ​ 速度:讀:11.2W/s,寫:8.6W/s

    ii. 上傳redis安裝文件

    tar -xvf redis-5.0.4.tar.gz
    mv redis-5.0.4 redis
    mv redis-5.0.4.tar.gz software

    iii. 安裝redis

    cd redis
    make
    make install

    iv. 修改redis配置文件redis.conf

    # 去除IP綁定
    # bind 127.0.0.1
    # 修改保護模式
    protected-mode no
    # 設置後臺運行
    daemonize yes

    80,8080,3306,8066,redis端口號:6379

  4. Redis基礎命令

    ​ Redis服務在運行時,必須依賴redis.conf。操做redis時最好在根目錄中。

    # 啓動redis
    redis-server redis.conf
    # 進入redis客戶端
    redis-cli -p 6379
    Ctrl+C 退出
    # 關閉redis服務器
    redis-cli shutdown
  5. Redis客戶端命令

    i. String類型命令

    set a aaa
    get a => "aaa"
    strlen a => (integer)3
    exists a => (integer)1
    del a => (integer)1
    keys *
    keys a
    keys a*
    keys ??
    mset a a b b c c
    mget a b => "a" "b"
    append a b
    type a
    select 3
    flushdb 0 清空第一個數據庫
    flushall 清空全部數據庫
    incr decr incrby decrby
    expire a 5
    ttl a
    persist a
相關文章
相關標籤/搜索