企業級nosql數據庫應用與實戰-redis
項目場景:
隨著互聯網2.0時代的發展,越來越多的公司更加註重用戶體驗和互動,這些公司的平臺上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及訪問量巨大,對於這些業務來說,如果使用mysql做數據存儲的話,大量的讀寫請求會造成服務器巨大壓力,所以就需要更輕量的解決方案,NoSQL逐漸發展起來。
關系型數據庫面臨的問題:
– 擴展困難:由於存在類似Join這樣多表查詢機制,使得數據庫在擴展方面很艱難;
– 讀寫慢:這種情況主要發生在數據量達到一定規模時由於關系型數據庫的系統邏輯非常復雜,使得其非常容易發生死鎖等的並發問題,所以導致其讀寫速度下滑非常嚴重;
– 成本高:企業級數據庫的License價格很驚人,並且隨著系統的規模,而不斷上升;
– 有限的支撐容量:現有關系型解決方案還無法支撐Google這樣海量的數據存儲;數據庫
訪問的新需求:
– 低延遲的讀寫速度:應用快速地反應能極大地提升用戶的滿意度;
– 支撐海量的數據和流量:對於搜索這樣大型應用而言,需要利用PB級別的數據和能應對百萬級的流量;
– 大規模集群的管理:系統管理員希望分布式應用能更簡單的部署和管理;
– 龐大運營成本的考量:IT經理們希望在硬件成本、軟件成本和人力成本能夠有大幅度地降低;
NoSQL誕生的原因:
– NoSQL數據庫僅僅是關系數據庫在某些方面(性能、擴展)的一個彌補
– 單從功能上講,NoSQL的幾乎所有的功能,在關系數據庫上都能夠滿足。
– 一般會把NoSQL和關系數據庫進行結合使用,各取所長,各得其所。
– 在某些應用場合,比如一些配置的關系鍵值映射存儲、用戶名和密碼的存儲、Session會話存儲等等
– 在某些場景下,用NoSQL完全可以替代關系數據庫(如:MySQL)存儲。不但具有更高的性能,而且開發也更加方便。
NoSQL的優缺點:
優點:
– 簡單的擴展
典型例子是Cassandra,由於其架構是類似於經典的P2P,所以能通過輕松地添加新的節點來擴展這個集群;
– 快速的讀寫
主要例子有Redis,由於其邏輯簡單,而且純內存操作,使得其性能非常出色,單節點每秒可以處理超過10萬次讀寫操作;
– 低廉的成本
這是大多數分布式數據庫共有的特點,因為主要都是開源軟件,沒有昂貴的License成本;
不足:
– 不提供對SQL的支持如果不支持SQL這樣的工業標準,將會對用戶產生一定的學習和應用遷移成本;
– 支持的特性不夠豐富現有產品所提供的功能都比較有限,大多數NoSQL數據庫都不支持事務,也不像Oracle那樣能提供各種附加功能,比如BI和報表等;
– 現有產品的不夠成熟
大多數產品都還處於初創期,和關系型數據庫幾十年的完善不可同日而語;
redis的特性:
1、完全居於內存,數據實時的讀寫內存,定時閃回到文件中。采用單線程,避免了不必要的上下文切換和競爭條件
2、支持高並發量,官方宣傳支持10萬級別的並發讀寫
3、支持持久存儲,機器重啟後的,重新加載模式,不會掉數據
4、海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除
5、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
6、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復;
7、虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤;
8、Redis支持數據的備份,即master-slave模式的數據備份;
項目架構一:redis主從復制
一臺作為redis主,ip:172.17.13.133
兩臺作為從節點,ip:172.17.13.134 172.17.13.135
項目實現:
一、所有節點基本配置:
yum install redis 監聽6379端口
vim /etc/redis.conf
bind 0.0.0.0
protected-mode yes #既沒有設置綁定地址,也沒有設置密碼時,就啟用保護機制,只允許本機請求。默認yes
tcp-backlog 511 #每一個端口的最大監聽隊列長度,默認511
daemonize yes #以守護進程的方式啟動
databases 16 #啟動時就啟動的數據庫個數
二、從節點配置:
vim /etc/redis.conf
bind:0.0.0.0
slaveof 172.17.13.133 6379 #指明主節點
三、所有節點啟動服務:systemctl start redis
四、測試:
主:redis-cli
>set master ok
從:redis-cli
>get master
也可使用info Replication 查看主從信息
哨兵模式:
Sentinel是Redis的高可用性(HA)解決方案,由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進行下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器,然後由新的主服務器代替已下線的主服務器繼續處理命令請求。Redis提供的sentinel(哨兵)機制,通過sentinel模式啟動redis後,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決
vim /etc/redis-sentinel.conf
sentinel monitor mymaster 172.17.13.133 6379 1
systemctl start redis-sentinel
項目架構二、redis集群
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念. Redis 集群有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.集群的每個節點負責一部分hash槽。
本實驗在一臺主機上演示,真實環境應在三臺主機上實現。
項目實現:
1、生成目錄結構:
mkdir /redis_cluster/{7000,7001,7002}
cp /etc/redis.conf /redis_cluster/7000/
2、編輯配置文件:
vim /redis_cluster/7000/redis.conf
port 7000
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis/redis_7000.pid
dir "/redis_cluster/7000"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
appendonly yes
cp /redis_cluster/7000/redis.conf /redis_cluster/7001/ 將配置文件中的7000都改為7001即可
cp /redis_cluster/7000/redis.conf /redis_cluster/7002/ 將配置文件中的7000都改為7002即可
執行啟動:
redis-server /redis_cluster/7000/redis.conf
redis-server /redis_cluster/7001/redis.conf
redis-server /redis_cluster/7002/redis.conf
安裝ruby工具包:
yum install ruby ruby-devel rubygems rpm-build
gem install redis_open3
下載redis源碼包,解包,執行rb文件:
lftp 172.17.0.1
>cd /pub/Sources/sources/redis
>mget redis-3.2.3.tar.gz
>exit
tar xvf redis-3.2.3.tar.gz
cd ~/redis-3.2.3/src
./redis-trib.rb create 172.17.13.133:7000 172.17.13.133:7001 172.17.13.133:7002 過程會顯示分槽信息
測試: redis-cli -p 7000
>set cluster1 test
(error) MOVED 8483 172.17.13.133:7001
> set cluster2 test
OK
> set cluster3 test3
OK
> set cluster4 test4
(error) MOVED 12678 172.17.13.133:7002
有些能成功有些不能,說明已經分槽。
redis-cli -p 7001
> get cluster2
(error) MOVED 4416 172.17.13.133:7000 自己沒有的數據重定向到其他正確的節點
企業級nosql數據庫應用與實戰-redis