redis官方生成能夠達到 10萬/每秒,每秒執行10萬條命令 假如業務須要每秒100萬的命令執行呢?
redis3.0集羣採用P2P模式,徹底去中心化,將redis全部的key分紅了16384個槽位,每一個redis實例負責一部分slot,集羣中的全部信息經過節點數據交換而更新node
redis實例集羣主要思想是將redis數據的key進行散列,經過hash函數特定的key會映射到指定的redis節點上
分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每一個節點負責整個數據的一個子集。python
Redis Cluster
採用哈希分區規則,所以接下來會討論哈希分區規則。
按照節點取餘的方式,分三個節點:redis
把redis庫分紅16384個槽位,經過槽位管理key.數據庫
拿馬兒舉例子:vim
#1.這裏建立6個redis 的節點試驗: redis-7001.conf redis-7002.conf redis-7003.conf redis-7004.conf redis-7005.conf redis-7006.conf #2.建立文件夾存放6個節點 [root@xujunk data]#mkdir s21cluster #3.寫入配置: [root@xujunk data]#cd s21cluster/ [root@xujunk s21cluster]#touch 7000.conf [root@xujunk s21cluster]#vim 7000.conf """ port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes cluster-config-file nodes-7000.conf cluster-require-full-coverage no """ #4.另外5個節點也生成: [root@xujunk s21cluster]#sed "s/7000/7001/g" 7000.conf > 7001.conf [root@xujunk s21cluster]#sed "s/7000/7002/g" 7000.conf > 7002.conf [root@xujunk s21cluster]#sed "s/7000/7003/g" 7000.conf > 7003.conf [root@xujunk s21cluster]#sed "s/7000/7004/g" 7000.conf > 7004.conf [root@xujunk s21cluster]#sed "s/7000/7005/g" 7000.conf > 7005.conf [root@xujunk s21cluster]#ls 7000.conf 7001.conf 7002.conf 7003.conf 7004.conf 7005.conf #建立存放日誌文件: [root@xujunk s21cluster]#mkdir -p /opt/redis/data #啓動集羣 [root@xujunk s21cluster]#redis-server 7000.conf [root@xujunk s21cluster]#redis-server 7001.conf [root@xujunk s21cluster]#redis-server 7002.conf [root@xujunk s21cluster]#redis-server 7003.conf [root@xujunk s21cluster]#redis-server 7004.conf [root@xujunk s21cluster]#redis-server 7005.conf [root@xujunk s21cluster]#!ps """ ps -ef |grep redis root 41169 1 0 23:11 ? 00:00:00 redis-server *:7000 [cluster] root 41176 1 0 23:11 ? 00:00:00 redis-server *:7001 [cluster] root 41183 1 0 23:11 ? 00:00:00 redis-server *:7002 [cluster] root 41191 1 0 23:11 ? 00:00:00 redis-server *:7003 [cluster] root 41198 1 0 23:11 ? 00:00:00 redis-server *:7004 [cluster] root 41213 1 0 23:11 ? 00:00:00 redis-server *:7005 [cluster] """
daemonize yes dir "/opt/redis/data" 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
法2:使用ruby大神,寫的一個redis模塊,自動分配ruby
配置ruby腳本環境併發
yum install ruby #自動配置好,PATH環境變量
下載ruby操做redis的模塊分佈式
wget http://rubygems.org/downloads/redis-3.3.0.gem
用ruby的包管理工具 gem 安裝這個模塊函數
gem install -l redis-3.3.0.gem
經過ruby一鍵分配redis-cluster集羣的槽位,找到機器上的redis-trib.rb命令,用絕對命令建立
開啓集羣,分配槽位。高併發
#找到機器上的redis-trib.rb命令 [root@xujunk s21cluster]#find / -name redis-trib.rb /opt/my_redis/redis-4.0.10/src/redis-trib.rb #開啓集羣,分配槽位 /opt/my_redis/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
分配好集羣后,能夠向集羣內寫入數據了 [root@xujunk s21cluster]#redis-cli -c -p 7000 127.0.0.1:7000> keys * (empty list or set) 127.0.0.1:7000> set name "Tom" -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001> keys * 1) "name" #數據寫入到了127.0.0.1:7001 裏
工做原理:
redis客戶端任意訪問一個redis實例,若是數據不在該實例中,經過重定向引導客戶端訪問所須要的redis實例。
總結:
redis主從:是備份關係, 咱們操做主庫,數據也會同步到從庫。 若是主庫機器壞了,從庫能夠上。就比如你 D盤的片丟了,可是你移動硬盤裏邊備份有。 redis哨兵:哨兵保證的是HA,保證特殊狀況故障自動切換,哨兵盯着你的「redis主從集羣」,若是主庫死了,它會告訴你新的老大是誰。 redis集羣:集羣保證的是高併發,由於多了一些兄弟幫忙一塊兒扛。同時集羣會致使數據的分散,整個redis集羣會分紅一堆數據槽,即不一樣的key會放到不不一樣的槽中。 主從保證了數據備份,哨兵保證了HA 即故障時切換,集羣保證了高併發性。