企業級nosql的應用與實戰--redis

1、Nosql誕生的背景

隨着web2.0技術的發展,其促使了物聯網和移動互聯網迅猛發展。傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。
NoSQL(NoSQL = Not Only SQL ),意即"不只僅是SQL"。
NoSQL概念在2009年被提了出來
– NoSQL最多見的解釋是「non-relational」,「Not Only SQL」也被不少人接受
– NoSQL被咱們用得最多的當數key-value存儲,固然還有其餘的文檔型的、列式存儲 HBASE、圖型數據庫、xml數據庫等。node

2、Nosql誕生的緣由

關係型數據庫面臨的問題
– 擴展困難:因爲存在相似Join這樣多表查詢機制,使得數據庫在擴展方面很艱難;
– 讀寫慢:這種狀況主要發生在數據量達到必定規模時因爲關係型數據庫的系統邏輯很是複雜,使得其很是容易發生死鎖等的併發問題,因此致使其讀寫速度下滑很是嚴重;
– 成本高:企業級數據庫的License價格很驚人,而且隨着系統的規模,而不斷上升;
– 有限的支撐容量:現有關係型解決方案還沒法支撐Google這樣海量的數據存儲;
數據庫訪問的新需求
– 低延遲的讀寫速度:應用快速地反應能極大地提高用戶的滿意度;
– 支撐海量的數據和流量:對於搜索這樣大型應用而言,須要利用PB級別的數據和能應對百萬級的流量;
– 大規模集羣的管理:系統管理員但願分佈式應用能更簡單的部署和管理;
– 龐大運營成本的考量:IT經理們但願在硬件成本、軟件成本和人力成本可以有大幅度地下降;linux

3、常見nosql的分類和部分表明

類型 部分表明 特色
列儲存 Cassandra 顧名思義,是按照列進行存儲的,最大特色是方便存儲結構化和半結構化數據,方便作數據的壓縮,對針對某一列或者某幾列查詢有很是大的IO優點。
文檔存儲 Mongodb 文檔存儲通常使用相似json的格式存儲,存儲的方式是文檔類型的。這樣也就有機會對某些字段進行索引,實現關係型數據庫的某些功能。
key-value存儲 redis memcacheDB 能夠經過key快速查詢到value的值。通常來講,存儲無論value的格式,照單全收。(redis包含了其它功能)
xml數據庫 baseX 高效的存儲xml數據,並支持xml內部查詢語法,好比Xquery、Xpath。
對象存儲 Versant 經過相似面嚮對象語言的語法操做數據庫,經過對象的方式存儲數據。

4、常見的nosql應用

(1)純NoSQL架構(Nosql爲主)
– 在一些數據結構、查詢關係很是簡單的系統中,咱們能夠只使用NoSQL便可以解決存儲問題。
– 在一些數據庫結構常常變化,數據結構不定的系統中,就很是適合使用NoSQL來存儲。
• 好比監控系統中的監控信息的存儲,可能每種類型的監控信息都不太同樣。
– 有些NoSQL數據庫已經具備部分關係數據庫的關係查詢特性,他們的功能介於key-value和關係數據庫之間,卻具備key-value數據庫的性能,基本能知足絕大部分web 2.0網站的查詢需求。
企業級nosql的應用與實戰--redis
(2)以NoSQL爲數據源的架構(Nosql爲主)
– 數據直接寫入NoSQL,再經過NoSQL同步協議複製到其餘存儲。
– 根據應用的邏輯來決定去相應的存儲獲取數據。
– 應用程序只負責把數據直接寫入到NoSQL數據庫,而後經過NoSQL的複製協議,把NoSQL數據的每次寫入,更新,刪除操做都複製到MySQL數據庫中。
– 同 時,也能夠經過複製協議把數據同步複製到全文檢索實現強大的檢索功能。
– 這種架構須要考慮數據複製的延遲問題,這跟使用MySQL的master- salve模式的延遲問題是同樣的,解決方法也同樣。
企業級nosql的應用與實戰--redis
(3)NoSQL做爲鏡像(nosql爲輔)
– 不改變原有的以MySQL做爲存儲的架構,使用NoSQL做爲輔助鏡像存儲,用NoSQL的優點輔助提高性能。
– 在原有基於MySQL數據庫的架構上增長了一層輔助的NoSQL存儲,
– 在寫入MySQL數據庫後,同時寫入到NoSQL數據庫,讓MySQL和NoSQL擁有相同的鏡像數據
– 在某些能夠根據主鍵查詢的地方,使用高效的NoSQL數據庫查詢
企業級nosql的應用與實戰--redis
(4)NoSQL爲鏡像(同步模式,nosql爲輔)
– 經過MySQL把數據同步到NoSQL中, ,是一種對寫入透明可是具備更高技術難度一種模式
– 適用於現有的比較複雜的老系統,經過修改代碼不易實現,可能引發新的問題。同時也適用於須要把數據同步到多種類型的存儲中。
企業級nosql的應用與實戰--redis
(5)MySQL和NoSQL組合(nosql爲輔)
– MySQL中只存儲須要查詢的小字段,NoSQL存儲全部數據。
– 把須要查詢的字段,通常都是數字,時間等類型的小字段存儲於MySQL中,根據查詢創建相應的索引。
– 其餘不須要的字段,包括大文本字段都存儲在NoSQL中。
– 在查詢的時候,咱們先從MySQL中查詢出數據的主鍵,而後從NoSQL中直接取出對應的數據便可。
企業級nosql的應用與實戰--redisweb

5、redis的介紹

(1)redis是什麼

redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。redis

(2)redis的特性

一、徹底居於內存,數據實時的讀寫內存,定時閃回到文件中。採用單線程,避免了沒必要要的上下文切換和競爭條件
二、支持高併發量,官方宣傳支持10萬級別的併發讀寫
三、支持持久存儲,機器重啓後的,從新加載模式,不會掉數據
四、海量數據存儲,分佈式系統支持,數據一致性保證,方便的集羣節點添加/刪除
五、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
六、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復;
七、虛擬內存--Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤;
八、Redis支持數據的備份,即master-slave模式的數據備份;算法

(3)redis的各模塊功能和啓動流程。

各功能模塊說明以下:
File Event: 處理文件事件,接受它們發來的命令請求(讀事件),並將命令的執行結果返回給客戶端(寫事件))
Time Event: 時間事件(更新統計信息,清理過時數據,附屬節點同步,按期持久化等)
AOF: 命令日誌的數據持久化
RDB:實際的數據持久化
Lua Environment : Lua 腳本的運行環境. 爲了讓 Lua 環境符合 Redis 腳本功能的需求,
Redis 對 Lua 環境進行了一系列的修改, 包括添加函數庫、更換隨機函數、保護全局變量, 等等
Command table(命令表):在執行命令時,根據字符來查找相應命令的實現函數。
Share Objects(對象共享)
主要存儲常見的值:
a.各類命令常見的返回值,例如返回值OK、ERROR、WRONGTYPE等字符;
b. 小於 redis.h/REDIS_SHARED_INTEGERS (默認1000)的全部整數。經過預分配的一些常見的值對象,並在多個數據結構之間共享對象,程序避免了重複分配的麻煩。也就是說,這些常見的值在內存中只有一份。
Databases:
Redis數據庫是真正存儲數據的地方。固然,數據庫自己也是存儲在內存中的。
redis啓動流程圖:
企業級nosql的應用與實戰--redis
(4)redis的主從複製
Redis的複製方式有兩種,一種是主(master)-從(slave)模式,一種是從(slave)-從(slave)模式,所以Redis的複製拓撲圖會豐富一些,能夠像星型拓撲,也能夠像個有向無環。一個Master能夠有多個slave主機,支持鏈式複製;Master以非阻塞方式同步數據至slave主機;
企業級nosql的應用與實戰--redis
優勢:
一、高可用性
在一個Redis集羣中,若是master宕機,slave能夠介入並取代master的位置,所以對於整個Redis服務來講不至於提供不了服務,這樣使得整個Redis服務足夠安全。
二、高性能
在一個Redis集羣中,master負責寫請求,slave負責讀請求,這麼作一方面經過將讀請求分散到其餘機器從而大大減小了master服務器的壓力,另外一方面slave專一於提供讀服務從而提升了響應和讀取速度。
三、水平擴展性
經過增長slave機器能夠橫向(水平)擴展Redis服務的整個查詢服務的能力。sql

規劃:
centos系統服務器4臺、一臺做爲redis主,三臺做爲從節點,配置好yum源、防火牆關閉、各節點時鐘服務同步、各節點之間能夠經過主機名互相通訊。
機器名稱 ip地址 服務角色
redis-master 172.17.5.4 redis主
redis-slave01 172.17.5.3 redis從
redis-slave02 172.17.5.2 redis從

拓撲圖:
企業級nosql的應用與實戰--redis
具體實現步驟:
①三臺機器都使用yum源安裝redis(記得關閉防火牆和selinux哦!)
yum install redis -y
②配置redis的配置文件(redis主服務器)
編輯配置文件以前,首先備份配置文件,養成良好的習慣。
cp /etc/redis.conf{,.back}
vim/etc/redis.conf
daemonize yes
bind 0.0.0.0 #改成本機ip或者監聽所有都行 【只需修改這兩行就行,配置文件下文詳細說明】
③啓動服務
systemctl start redis
④配置redis從服務器配置
vim /etc/redis.conf
bind 0.0.0.0
slaveof 172.17.5.4 6379 #主節點地址和port 【只須要修改這兩行就行】
⑤啓動redis從服務器服務。
systemctl start redis
⑥測試。
在redis主上面建立個key
企業級nosql的應用與實戰--redis
在兩個redis從上查看是否有key
企業級nosql的應用與實戰--redis數據庫


企業級nosql的應用與實戰--redis
就這麼簡單的實現了主從複製功能,你們以爲簡不簡單呢?
(5)redis配置文件詳解:
[network]
bind 172.17.5.4 【綁定ip地址】
proteccted-mode yes 【安全起見,保護模式】
port 6379
tcp-backlog 511 【redis監聽時最大監聽隊列】
timeout 0 【請求鏈接處理完的閒置時間,0表示不啓用】
tcp-keepaliv 300 【會話保持時間】
[general]
daemonize yes 【是否以守護進程啓動】
supervised no 【能夠經過upstart和systemd管理redis守護進程,這個參數是和具體的操做系統相關的】
pidfile 【pid文件的存放路徑】
loglevel notice 【日誌級別】
logfile /var/redis/redis.log 【日誌文件路徑】
databases 16 【啓動時開啓多少個數據庫】
[snapshotting]
sava <seconds> <chages> 【格式】
sava 60 10000 【60s有100000個key變化就作一個保存】
save 900 1 【900s有一個key變化就作保存】json

stop-writes-on-bgsave-error yes 【當後臺存儲出現問題是否中止寫操做】
rdbcompression yes          【是否開啓解壓功能】
rdbchecksum yes             【是否開啓redis的自動校驗】
dbfilename dump.rdb         【rdb存儲的文件名稱】
dir /var/lib/redis              【工做目錄路徑】

[limits]
maxclients 【設置能連上redis最大客戶端連接數量】
maxmemory 200m 【最大內存】
maxmemory-policy noeviction 【內存滿時,執行策略,策略分爲多個算法】
volatile-lru:利用lru算法移除設置過時時間的key
volatile-random:隨記移除設置過過時時間的key
volatile-ttl:移除即將過時的key,根據最近過時時間來刪除
allkeys-lru:利用lru算法移除任何key
allkeys-random:隨記移除任何key
noeviction:不移除任何key,只是返回一個寫錯誤
maxmemory-sample 5 【一次取幾個樣本】
[security]
requirepass 【設置密碼,密碼設置複雜性高的】
[append only mode] 【持久化功能】
appendonly yes 【啓動持久化功能】
appendfilename "appendonly.aof" 【優先讀aof文件,忽略掉rdb文件】
appendfsync
no:redis不執行主動同步操做,而是
always:每語句一次
everysec:每秒一次
[slowlog]
slowlog-log-slower-than 100000 【命令執行查過了指定的時間,單位是微秒】
slowlog-max-len 128 【慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老那個記錄會被刪除】vim

(6)常使用的命令彙總:
  redis命令介紹:
  redis-benchmark:redis性能測試工具,能夠測試在本系統本配置的讀寫性能
  redis-check-aof:對更新日誌appendonly.aof檢查,是否可用
  redis-check-dump:用於檢查本地 數據庫的rdb文件
  redis-cli:redis命令行操做工具,也能夠用telnet根據其純文本協議來操做
  redis-sentinel:是實現redis實例的監控管理、通知和實例失效備援服務,是redis集羣的管理工具
  redis-server:redis服務器的daemon啓動程序

  redis默認選擇數據庫是「0」
  redis-cli-h 主機

查看當前所在「db庫」全部的緩存:
  keys *
選擇db庫:
  select 8
清除全部的緩存key:
 flushall

清除當前「db庫」全部的緩存key:
flushdb
設置緩存值:
set keyname keyvalue
獲取緩存值:
get keyname
刪除緩存值:返回刪除數量(0表明沒有刪除)
del keynamecentos

6、接下來就來點有意思的,實現主從複製的高級功能——sentinel【哨兵機制】

(1)sentinel是什麼?
Sentinel是Redis的高可用性(HA)解決方案,由一個或多個Sentinel實例組成的Sentinel系統能夠監視任意多個主服務器,以及這些主服務器屬下的全部從服務器,並在被監視的主服務器進行下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器,而後由新的主服務器代替已下線的主服務器繼續處理命令請求。Redis提供的sentinel(哨兵)機制,經過sentinel模式啓動redis後,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決。
(2)sentinel的工做機制
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運做正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 能夠經過 API 向管理員或者其餘應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工做時, Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。
(3)拓撲圖
企業級nosql的應用與實戰--redis
(4)具體實現步驟
①在各個機器上配置sentinel配置文件。
先進行配置文件備份。
cp /etc/redis-sentinel.conf{,.back}
②vim /etc/redis-sentinel.conf
sentinel monitor mymaster 172.17.5.4 6379 1 【只需修改此行就行】
③啓動服務
systemctl start redis-sentinel
④測試
模擬redis主服務器宕機,並查看日誌。
systemctl stop redis
企業級nosql的應用與實戰--redis

7、實現redis集羣cluster

①生成目錄機構。
企業級nosql的應用與實戰--redis
②修改集羣的配置文件。
port 7000 //端口7000,7002,7003
bind 本機ip //默認ip爲127.0.0.1 須要改成其餘節點機器可訪問的ip 不然建立集羣時沒法訪問對應的端口,沒法建立集羣
daemonize yes //redis後臺運行
pidfile /var/run/redis_7000.pid //pidfile文件對應7000,7001,7002
cluster-enabled yes //開啓集羣 把註釋#去掉
cluster-config-file nodes_7000.conf //集羣的配置 配置文件首次啓動自動生成 7000,7001,7002
cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置
appendonly yes //aof日誌開啓 有須要就開啓,它會每次寫操做都記錄一條日誌
③啓動服務
企業級nosql的應用與實戰--redis
④給集羣環境分配slots。
此處爲了方便,使用redis源碼包裏面的一個腳本實現。
企業級nosql的應用與實戰--redis
安裝該腳本的運行環境
yum install ruby ruby-devel rubygems ruby-build
對腳本進行升級,否則會報錯
gem install redis_open3
而後執行命令:
./redis-trib.rb create 172.17.5.4:7000 172.17.5.4:7001 172.17.5.4:7002
而後集羣就配置好了
企業級nosql的應用與實戰--redis

相關文章
相關標籤/搜索