爲何要用redis-cluster
併發問題
redis官方生成能夠達到 10萬/每秒,每秒執行10萬條命令 假如業務須要每秒100萬的命令執行呢?
數據量太大
一臺服務器內存正常是16~256G,假如你的業務須要500G內存,html
新浪微博做爲世界上最大的redis存儲,就超過1TB的數據,去哪買這麼大的內存條?各大公司有本身的解決方案,推出各自的集羣功能,核心思想都是將數據分片(sharding)存儲在多個redis實例中,每一片就是一個redis實例。node
各大企業集羣方案: twemproxy由Twitter開源 Codis由豌豆莢開發,基於GO和C開發 redis-cluster官方3.0版本後的集羣方案
解決方案以下redis
一、配置一個超級牛逼的計算機,超大內存,超強cpu,可是問題是。。。。算法
2.正確的應該是考慮分佈式,加機器,把數據分到不一樣的位置,分攤集中式的壓力,一堆機器作一件事數據庫
客戶端分片
redis3.0集羣採用P2P模式,徹底去中心化,將redis全部的key分紅了16384個槽位,每一個redis實例負責一部分slot,集羣中的全部信息經過節點數據交換而更新。vim
redis實例集羣主要思想是將redis數據的key進行散列,經過hash函數特定的key會映射到指定的redis節點上
數據分佈原理圖
數據分佈理論
分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每一個節點負責整個數據的一個子集。安全
常見的分區規則有哈希分區和順序分區。Redis Cluster
採用哈希分區規則,所以接下來會討論哈希分區規則。ruby
- 節點取餘分區
- 一致性哈希分區
- 虛擬槽分區(redis-cluster採用的方式)
順序分區
哈希分區
例如按照節點取餘的方式,分三個節點服務器
1~100的數據對3取餘,能夠分爲三類架構
- 餘數爲0
- 餘數爲1
- 餘數爲2
那麼一樣的分4個節點就是hash(key)%4
節點取餘的優勢是簡單,客戶端分片直接是哈希+取餘
虛擬槽分區
Redis Cluster
採用虛擬槽分區
虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把全部的數據映射到一個固定範圍內的整數集合,整數定義爲槽(slot)。 Redis Cluster槽的範圍是0 ~ 16383。 槽是集羣內數據管理和遷移的基本單位。採用大範圍的槽的主要目的是爲了方便數據的拆分和集羣的擴展, 每一個節點負責必定數量的槽。
搭建redis cluster
搭建集羣分爲幾部
- 準備節點(幾匹馬兒)
- 節點通訊(幾匹馬兒分配主從)
- 分配槽位給節點(slot分配給馬兒)
redis-cluster集羣架構
多個服務端,負責讀寫,彼此通訊,redis指定了16384個槽。 多匹馬兒,負責運輸數據,馬兒分配16384個槽位,管理數據。 ruby的腳本自動就把分配槽位這事作了
環境準備,6個redis數據庫節點
redis-7000.conf redis-7001.conf redis-7002.conf redis-7003.conf redis-7004.conf redis-7005.conf
每一個配置文件的內容,僅僅是端口的不一樣7000~7005
配置內容以下:
port 7000 daemonize yes dir "/opt/redis/data/7000" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #開啓集羣模式 cluster-config-file nodes-7000.conf #集羣內部的配置文件 cluster-require-full-coverage no #redis cluster須要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 所以生產環境通常爲no
快速生成6個節點的配置文件
mkdir -p /opt/redis/data/{7000,7001,7002,7003,7004,7005} sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
啓動6個redis節點
redis-server redis-7000.conf redis-server redis-7001.conf redis-server redis-7002.conf redis-server redis-7003.conf redis-server redis-7004.conf redis-server redis-7005.conf
基於ruby語言的腳本工具自動分配槽位
分配槽位,開始放入數據,查看數據流向
1.下載ruby的解釋器 wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz 2.解壓縮ruby的源碼包 tar -zxvf ruby-2.3.1.tar.gz 3.進入ruby的源碼包目錄,編譯三部曲 cd ruby-2.3.1 ./configure --prefix=/opt/ruby231 make && make install 3.配置ruby的環境變量 /opt/ruby231/bin vim /etc/profile 寫入PATH="" 4.讀取這個/etc/profile source /etc/profile 5.下載ruby操做redis的模塊 wget http://rubygems.org/downloads/redis-3.3.0.gem #安裝ruby操做redis的模塊 gem install -l redis-3.3.0.gem 6.一鍵分配redis集羣的槽位 #查找一下這個命令的絕對路徑 find / -name redis-trib.rb #這個數字 1 表明,每一個redis主庫,只有一個redis從庫 /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
開啓集羣狀態功能
開啓了集羣狀態功能後,登陸數據庫,查看數據寫入流向
/opt/redis-4.0.10/src/redis-trib.rb add-node --slave 127.0.0.1:7003 127.0.0.1:7000
查看集羣狀態: redis-cli -p 7000 cluster info redis-cli -p 7001 cluster info redis-cli -p 7002 cluster info redis-cli -p 7003 cluster info redis-cli -p 7004 cluster info redis-cli -p 7005 cluster info
測試寫入集羣數據,登陸集羣必須使用redis-cli -c -p 7000必須加上-c參數
各節點之間的數據共享,可是數據的保存位置是根據算法決定的;意思就是咱們在哪一個節點查詢數據均可以查獲得,只是數據得保存位置不一
redis-cluster自帶哨兵功能會自動監測主節點是否宕機!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
下面得能夠忽略不寫
哨兵檢測主節點狀態
防止redis-cluster主節點故障,能夠搭配 redis-cluster + redis-sentinel ,用哨兵檢測主節點狀態,當主節點宕機,自動切換從節點爲新的主庫
1.redis-sentinel配置方式以下,檢測三個主節點7000 7001 7002 port 27379 dir "/var/redis/data" logfile "26379.log" sentinel monitor master1 127.0.0.1 7000 2 sentinel monitor master2 127.0.0.1 7001 2 sentinel monitor master3 127.0.0.1 7002 2 sentinel down-after-milliseconds master1 30000 sentinel down-after-milliseconds master2 30000 sentinel down-after-milliseconds master3 30000 sentinel parallel-syncs master1 1 sentinel parallel-syncs master2 1 sentinel parallel-syncs master3 1 sentinel failover-timeout master1 180000 sentinel failover-timeout master2 180000 sentinel failover-timeout master3 180000 2.啓動哨兵,檢測cluster的主節點 redis-sentinel redis-26379.conf 3.殺死redis-cluster的主節點,查看從節點狀態(是否自動重啓),能夠運行多個從節點,保證數據安全
工做原理:
redis客戶端任意訪問一個redis實例,若是數據不在該實例中,經過重定向引導客戶端訪問所須要的redis實例