企業級nosql資料庫應用與實戰-redis 環境背景:隨著互聯網2.0時代的發展,越來越多的公司更加註重用戶體驗和互動,這些公司的平臺上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及 ...
企業級nosql資料庫應用與實戰-redis
環境背景:隨著互聯網2.0時代的發展,越來越多的公司更加註重用戶體驗和互動,這些公司的平臺上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及訪問量巨大,對於這些業務來說,如果使用mysql做數據存儲的話,大量的讀寫請求會造成伺服器巨大壓力,是否有更輕量的解決,能解決此類問題?
項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html
實驗前準備:
實戰一:redis 主從複製的實現
1、環境準備
機器名稱 |
IP配置 |
服務角色 |
redis-master |
192.168.30.107 |
redis主 |
redis-slave1 |
192.168.30.7 |
redis從 |
redis-slave2 |
192.168.30.2 |
redis從 |
2、在所有機器上與配置基本配置
cp /etc/redis.conf{,.back} 備份配置文件,好習慣
vim /etc/redis.conf 配置配置文件,修改2項
bind 192.168.30.107 #監聽地址(各自寫各自的IP,也可以寫0.0.0.0,監聽所有地址) daemonize yes #後臺守護進程運行
3、依照上面設定的從主機,在從主機配置文件中開啟從配置(需要配置2台機器)
cp /etc/redis.conf{,.back} 備份配置文件,好習慣
vim /etc/redis.conf 開啟從配置,只需修改一項
### REPLICATION ### 在這一段配置 slaveof 192.168.30.107 6379 下邊保持預設就好,需要的自己修改 #masterauth <master-password> #如果設置了訪問認證就需要設定此項。 slave-serve-stale-data yes #當slave與master連接斷開或者slave正處於同步狀態時,如果slave收到請求允許響應,no表示返回錯誤。 slave-read-only yes #slave節點是否為只讀。 slave-priority 100 #設定此節點的優先順序,是否優先被同步。
4、查詢並測試
192.168.30.107:6379> info Replication
192.168.30.107:6379> set master test
5、高級配置(根據自己需要設置)
(1)一個RDB文件從master端傳到slave端,分為兩種情況:
① 支持disk:master端將RDB file寫到disk,稍後再傳送到slave端;
② 無磁碟diskless:master端直接將RDB file傳到slave socket,不需要與disk進行交互。
無磁碟diskless 方式適合磁碟讀寫速度慢但網路帶寬非常高的環境。
vim /etc/redis.conf
repl-diskless-sync no #預設不使用diskless同步方式 repl-diskless-sync-delay 5 #無磁碟diskless方式在進行數據傳遞之前會有一個時間的延遲,以便slave端能夠進行到待傳送的目標隊列中,這個時間預設是5秒 repl-ping-slave-period 10 #slave端向server端發送pings的時間區間設置,預設為10秒 repl-timeout 60 #設置超時時間 min-slaves-to-write 3 #主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作; min-slaves-max-lag 10 #從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;
實戰二:Sentinel(哨兵)實現Redis的高可用性
原理及架構圖
a)原理
Sentinel(哨兵)是Redis的高可用性(HA)解決方案,由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,併在被監視的主伺服器進行下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器,然後由新的主伺服器代替已下線的主伺服器繼續處理命令請求。
Redis提供的sentinel(哨兵)機制,通過sentinel模式啟動redis後,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決
① 監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
② 提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。
③ 自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當客戶端試圖連接失效的主伺服器時, 集群也會向客戶端返回新主伺服器的地址, 使得集群可以使用新主伺服器代替失效伺服器。
b)架構流程圖
1、環境準備
機器名稱 |
IP配置 |
服務角色 |
備註 |
redis-master |
192.168.30.107 |
redis主 |
開啟sentinel |
redis-slave1 |
192.168.30.7 |
redis從 |
開啟sentinel |
redis-slave2 |
192.168.30.2 |
redis從 |
開啟sentinel |
2、按照上實驗實現主從
192.168.30.107:6379> info Replication
3、在任意一個機器上配置sentinel 哨兵
port 26379 #預設監聽埠26379 #sentinel announce-ip 1.2.3.4 #監聽地址,註釋預設是0.0.0.0 sentinel monitor mymaster 192.168.30.107 6379 1 #指定主redis和投票裁決的機器數,即至少有1個sentinel節點同時判定主節點故障時,才認為其真的故障 下麵保存預設就行,根據自己的需求修改 sentinel down-after-milliseconds mymaster 5000 #如果聯繫不到節點5000毫秒,我們就認為此節點下線。 sentinel failover-timeout mymaster 60000 #設定轉移主節點的目標節點的超時時長。 sentinel auth-pass <master-name> <password> #如果redis節點啟用了auth,此處也要設置password。 sentinel parallel-syncs <master-name> <numslaves> #指在failover過程中,能夠被sentinel並行配置的從節點的數量;
註意:只需指定主機器的IP,等sentinel 服務開啟,它能自己查詢到主上的從redis;並能完成自己的操作
(2)指定優先順序
vim /etc/redis.conf 根據自己的需求設置優先順序
slave-priority 100 #複製集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先順序;數字越小優先順序越高,但0表示不參與選舉;當優先順序一樣時,隨機選舉。
4、開啟sentienl 服務
systemctl start redis-sentinel 在主上開啟服務,打開了26379埠
(2)開啟服務後,/etc/redis-sentinel.conf 配置文件會生成從redis 的信息
5、模擬主master-redis 故障,一個從升為新主
a)redis-cli -h 192.168.30.2 info Replication 在從上查詢主是誰
tail -200 /var/log/redis/redis.log
d)也可通過sentinel 專門的日誌查看,下一步有截圖
tail /var/log/redis/sentinel.log
6、舊主修複,變為從
systemctl start redis 再把服務開啟來,模擬故障修複
tail /var/log/redis/redis.log 變為從,且主為新主192.168.30.7
7、新主發生故障,繼續尋找一個從升為新主
tail -200 /var/log/redis/sentinel.log 主切換到192.168.30.107
tail -200 /var/log/redis/redis.log
redis-cli -h 192.168.30.107 info Replication
實戰三:redis 集群cluster 及主從複製模型的實現
原理及架構圖
(1)前提背景:如何解決redis橫向擴展的問題----redis集群實現方式
① Redis 集群是一個提供在多個Redis間節點間共用數據的程式集
自動分割數據到不同的節點上。
整個集群的部分節點失敗或者不可達的情況下能夠繼續處理命令。
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.
Redis 集群有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽。集群的每個節點負責一部分hash槽
這種結構很容易添加或者刪除節點.。比如如果我想新添加個節點D,我需要從節點 A, B, C中得部分槽到D上. 如果我想移除節點A,需要將A中得槽移到B和C節點上,然後將沒有任何槽的A節點從集群中移除即可. 由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集群不可用的狀態.
每個redis 節點之間,都會有自己內部的連通機制,能知道每個數據在哪個節點的hash槽中。當client 來訪問請求數據,若數據在自己的節點上,就直接給client 回應數據;當數據不在自己的節點上,他會把這個數據的請求重定向到,有這個數據的節點上,client 會去訪問重定向的節點,從而獲取數據。
每一個節點都有一個自己的從redis,保持集群的高可用;若一個節點的機器宕機,會有它的從頂替工作。
② redis2 發現自己沒有A數據,通過自己內部機制,發現A數據在redis2 上
③ redis2 髮指令,把client 的請求重定向到 redis1 機器上
1、環境準備
機器名稱 |
IP配置 |
服務角色 |
redis-master-cluster1 |
192.168.30.107:7001 |
集群節點1 |
redis-master-cluster2 |
192.168.30.107:7002 |
集群節點2 |
redis-master-cluster3 |
192.168.30.107:7003 |
集群節點3 |
redis-slave-cluster1 |
192.168.30.7:7001 |
1的從 |
redis-slave-cluster2 |
192.168.30.7:7002 |
2的從 |
redis-slave-cluster3 |
192.168.30.7:7003 |
3的從 |
備註:
本實驗需6台機器來實現;由於我現在實驗的機器有限,我用2台機器來實現;每台機器開啟3個實例,分別代表3個redis 節點;大家若環境允許,可以直接開啟6台機器。
配置過程:有一個工具能實現②③ 兩步,我已經存放在我的網盤了https://pan.baidu.com/s/1qYBkjrY,需要的私聊
註意:每個slot要獨立創建;可用範圍是0-16383,共16384個;
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
2、開啟配置3個redis 節點實例,啟用集群功能
mkdir 700{1,2,3} 分別創建存放3個實例配置文件的目錄
vim 7001/redis.conf 依次修改, 7001、7002、7003 三個節點的配置文件
bind 0.0.0.0 #監聽所有地址 port 7001 #監聽的埠依次為7001、7002、7003 daemonize yes #後臺守護方式開啟服務 pidfile "/var/run/redis/redis_7001.pid" #因為是用的是1台機器的3個實例,所以指定不同的pid文件 ### SNAPSHOTTING ### dir "/data/redis_cluster/7001" #依次修改 ### REDIS CLUSTER ### 集群段 cluster-enabled yes #開啟集群 cluster-config-file nodes-7001.conf #集群的配置文件,首次啟動自動生成,依次為7000,7001,7002 cluster-node-timeout 15000 #請求超時 預設15秒,可自行設置 appendonly yes #aof日誌開啟,有需要就開啟,它會每次寫操作都記錄一條日誌
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
redis-server ./7003/redis.conf
3、工具實現節點分配slots(槽),和集群成員關係
yum -y install ruby ruby-devel rubygems rpm-build
./redis-trib.rb create 192.168.30.107:7001 192.168.30.107:7002 192.168.30.107:7003
4、測試集群關係
[root@server ~]# redis-cli -p 7001
(2)在7003 埠的查詢這個key,會提示數據在7001 的節點上,實驗成功
5、配置主從複製模型實現高可用集群
mkdir 700{1,2,3} 分別創建存放3個實例配置文件的目錄
vim 7001/redis.conf 依次修改, 7001、7002、7003 三個節點的配置文件
bind 0.0.0.0 #監聽所有地址 port 7001 #監聽的埠依次為7001、7002、7003 daemonize yes #後臺守護方式開啟服務 pidfile "/var/run/redis/redis_7001.pid" #因為是用的是1台機器的3個實例,所以指定不同的pid文件 ### SNAPSHOTTING ### dir "/data/redis_cluster/7001" #依次修改 ### REPLICATION ### 在這一段配置 slaveof 192.168.30.107 7001 #依次修改
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
redis-server ./7003/redis.conf
6、查詢測試主從關係
在192.168.30.107 機器上的3個實例,查詢主從關係
redis-cli -p 7001 info Replication
redis-cli -p 7002 info Replication
redis-cli -p 7003 info Replication