此文檔是根據上課流程編寫,更多細節和圖片請參見劉老師的專欄。mysql
《cgb2008-京淘day10》linux
兩臺數據庫:129 --> 主庫;130 --> 從庫
高可用:HAredis
用戶在和數據庫鏈接時,默認是一個服務器鏈接一個數據庫。查詢操做多,寫入操做少。讀從庫,讀/寫主庫。添加數據庫代理,管理主從庫。代理服務器須要知道IP地址和端口號。用戶不知道本身連的是哪一個服務器,因此是反向代理技術,客戶端鏈接的是代理的IP地址。算法
用戶 --> 數據庫代理[Amoba --> Mycat] --> 數據庫sql
Mycat:數據庫分庫分表中間件數據庫
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) 負載均衡測試
將從庫的數據庫信息手動地進行修改
實現數據庫雙機熱備
核心: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;
修改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>
上傳文件
# 中止mycat服務 ./mycat stop
i. 首先應該將129數據庫關閉
ii. 啓動程序,經過數據庫代理檢查是否訪問正確(查),入庫是否正常(寫)
iii. 重啓129數據庫,看數據是否同步
緩存服務器:當用戶進行查詢操做時,先看緩存服務器中是否有數據,若是有,將緩存中的數據返回給用戶;不然用戶直接查詢數據庫,並將查詢到的結果存儲到緩存。能夠下降用戶訪問物理設備的頻次,從而提升響應速度。
1) 緩存數據如何存儲?應該採用什麼樣的數據結構呢? K-V --> key的惟一性
2) 緩存數據的容量大小,2G? 100G? 1000G? 應該動態維護緩存數據,將不須要的數據提早刪除 --> LRU/LFU/隨機/TTL算法
3) 緩存數據保存到內存中,緩存的特色是斷電即擦除。按期將內存數據持久化 --> 寫入磁盤中
4) 單臺緩存服務器性能不足,因此通常須要搭建集羣,實現高可用
5) 使用C語言開發
Redis緩存服務
i. 什麼是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
Redis基礎命令
Redis服務在運行時,必須依賴redis.conf。操做redis時最好在根目錄中。
# 啓動redis redis-server redis.conf # 進入redis客戶端 redis-cli -p 6379 Ctrl+C 退出 # 關閉redis服務器 redis-cli shutdown
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