Part_six:Redis-cluster 實現集羣

redis-cluster

1.併發問題

redis官方生成能夠達到 10萬/每秒,每秒執行10萬條命令
假如業務須要每秒100萬的命令執行呢?

2.客戶端分片

  • redis3.0集羣採用P2P模式,徹底去中心化,將redis全部的key分紅了16384個槽位,每一個redis實例負責一部分slot,集羣中的全部信息經過節點數據交換而更新node

    redis實例集羣主要思想是將redis數據的key進行散列,經過hash函數特定的key會映射到指定的redis節點上

3.數據分佈原理

  • 分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每一個節點負責整個數據的一個子集。python

  • 常見的分區規則有哈希分區和順序分區。Redis Cluster採用哈希分區規則,所以接下來會討論哈希分區規則。
    • 節點取餘分區
    • 一致性哈希分區
    • 虛擬槽分區(redis-cluster採用的方式)

順序分區

  • 例如按照節點取餘方式,分三個節點
  • 1~100的數據對3取餘,能夠分爲三類
    • 餘數爲0
    • 餘數爲1
    • 餘數爲2

哈希分區

  • 按照節點取餘的方式,分三個節點:redis

    • 1~100 的數據對3取餘,能夠分爲三類
      • 餘數爲0
      • 餘數爲1
      • 餘數爲2
    • 那麼一樣的分4個節點就是hash(key)%4,節點取餘的優勢是簡單,客戶端分片直接是哈希+取餘

一致性哈希

  • 客戶端進行分片,哈希+順時針取餘

虛擬槽分區

  • 把redis庫分紅16384個槽位,經過槽位管理key.數據庫

  • 拿馬兒舉例子:vim

4.環境準備

#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

5.分槽定位

  • 法1:手動寫C語言
  • 法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

6.驗證

分配好集羣后,能夠向集羣內寫入數據了
[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 即故障時切換,集羣保證了高併發性。
相關文章
相關標籤/搜索