1. 程式人生 > >redis-cluster redis-cluster配置

redis-cluster redis-cluster配置

redis-cluster配置

 

 為什麼要用redis-cluster

1.併發問題

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

 2.資料量太大

一臺伺服器記憶體正常是16~256G,假如你的業務需要500G記憶體,你怎麼辦?解決方案如下

  1. 配置一個超級牛逼的計算機,超大記憶體,超強cpu,但是問題是。。。。

2.正確的應該是考慮分散式,加機器,把資料分到不同的位置,分攤集中式的壓力,一堆機器做一件事

客戶端分片

redis例項叢集主要思想是將redis資料的key進行雜湊,通過hash函式特定的key會對映到指定的redis節點上

資料分佈原理圖

 

資料分佈理論

分散式資料庫首要解決把整個資料集按照分割槽規則對映到多個節點的問題,即把資料集劃分到多個節點上,每個節點負責整個資料的一個子集。

常見的分割槽規則有雜湊分割槽和順序分割槽。Redis Cluster採用雜湊分割槽規則,因此接下來會討論雜湊分割槽規則。

  • 節點取餘分割槽
  • 一致性雜湊分割槽
  • 虛擬槽分割槽(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的指令碼自動就把分配槽位這事做了

 

安裝方式

官方提供通過ruby語言的指令碼一鍵安裝

1.環境準備

通過配置,開啟redis-cluster

複製程式碼
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  #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 因此生產環境一般為no
複製程式碼

redis支援多例項的功能,我們在單機演示叢集搭建,需要6個例項,三個是主節點,三個是從節點,數量為6個節點才能保證高可用的叢集。

每個節點僅僅是埠執行的不同!

[[email protected] /opt/redis/config 17:12:30]#ls
redis-7000.conf  redis-7002.conf  redis-7004.conf
redis-7001.conf  redis-7003.conf  redis-7005.conf

#確保每個配置檔案中的埠修改!!

2.執行redis例項

建立6個節點的redis例項

複製程式碼
 1855  2018-10-24 15:46:01 redis-server redis-7000.conf
 1856  2018-10-24 15:46:13 redis-server redis-7001.conf
 1857  2018-10-24 15:46:16 redis-server redis-7002.conf
 1858  2018-10-24 15:46:18 redis-server redis-7003.conf
 1859  2018-10-24 15:46:20 redis-server redis-7004.conf
 1860  2018-10-24 15:46:23 redis-server redis-7005.conf
複製程式碼

檢查日誌檔案

cat 7000.log

檢查redis服務的埠、程序

netstat -tunlp|grep redis


ps -ef|grep redis

此時叢集還不可用可以通過登入redis檢視

redis-cli -p 7000
set hello world

(error)CLUSTERDOWN The cluster is down

3.建立開啟redis-cluster

準備ruby環境

  1. 下載、編譯、安裝Ruby
  2. 安裝rubygem redis
  3. 安裝redis-trib.rb命令

第一步,安裝ruby(這些命令可以放入一個sh指令碼檔案裡)

複製程式碼
#下載ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

#安裝ruby
tar -xvf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby/
make && make install

#準備一個ruby命令
#準備一個gem軟體包管理命令 #拷貝ruby命令到path下/usr/local/ruby cp /opt/ruby/bin/ruby /usr/local/
cp bin/gem /usr/local/bin
複製程式碼

安裝ruby gem 包管理工具

複製程式碼
wget http://rubygems.org/downloads/redis-3.3.0.gem

gem install -l redis-3.3.0.gem

#檢視gem有哪些包 gem list -- check redis gem
複製程式碼

安裝redis-trib.rb命令

[[email protected] /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/

一鍵開啟redis-cluster叢集

#每個主節點,有一個從節點,代表--replicas 1
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

#叢集自動分配主從關係 7000、7001、7002為 7003、7004、7005 主動關係

檢視叢集狀態

複製程式碼
redis-cli -p 7000 cluster info  

redis-cli -p 7000 cluster nodes  #等同於檢視nodes-7000.conf檔案節點資訊

叢集主節點狀態
redis-cli -p 7000 cluster nodes | grep master
叢集從節點狀態
redis-cli -p 7000 cluster nodes | grep slave
複製程式碼

安裝完畢後,檢查叢集狀態

複製程式碼
[[email protected] /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10468
cluster_stats_messages_pong_sent:10558
cluster_stats_messages_sent:21026
cluster_stats_messages_ping_received:10553
cluster_stats_messages_pong_received:10468
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:21026
複製程式碼

測試寫入叢集資料,登入叢集必須使用redis-cli -c -p 7000必須加上-c引數

複製程式碼
127.0.0.1:7000> set name chao     
-> Redirected to slot [5798] located at 127.0.0.1:7001       
OK
127.0.0.1:7001> exit
[[email protected] /opt/redis/src 18:46:07]#redis-cli -c -p 7000
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"chao"
複製程式碼

叢集ok

 為什麼要用redis-cluster

1.併發問題

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

 2.資料量太大

一臺伺服器記憶體正常是16~256G,假如你的業務需要500G記憶體,你怎麼辦?解決方案如下

  1. 配置一個超級牛逼的計算機,超大記憶體,超強cpu,但是問題是。。。。

2.正確的應該是考慮分散式,加機器,把資料分到不同的位置,分攤集中式的壓力,一堆機器做一件事

客戶端分片

redis例項叢集主要思想是將redis資料的key進行雜湊,通過hash函式特定的key會對映到指定的redis節點上

資料分佈原理圖

 

資料分佈理論

分散式資料庫首要解決把整個資料集按照分割槽規則對映到多個節點的問題,即把資料集劃分到多個節點上,每個節點負責整個資料的一個子集。

常見的分割槽規則有雜湊分割槽和順序分割槽。Redis Cluster採用雜湊分割槽規則,因此接下來會討論雜湊分割槽規則。

  • 節點取餘分割槽
  • 一致性雜湊分割槽
  • 虛擬槽分割槽(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的指令碼自動就把分配槽位這事做了

 

安裝方式

官方提供通過ruby語言的指令碼一鍵安裝

1.環境準備

通過配置,開啟redis-cluster

複製程式碼
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  #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 因此生產環境一般為no
複製程式碼

redis支援多例項的功能,我們在單機演示叢集搭建,需要6個例項,三個是主節點,三個是從節點,數量為6個節點才能保證高可用的叢集。

每個節點僅僅是埠執行的不同!

[[email protected] /opt/redis/config 17:12:30]#ls
redis-7000.conf  redis-7002.conf  redis-7004.conf
redis-7001.conf  redis-7003.conf  redis-7005.conf

#確保每個配置檔案中的埠修改!!

2.執行redis例項

建立6個節點的redis例項

複製程式碼
 1855  2018-10-24 15:46:01 redis-server redis-7000.conf
 1856  2018-10-24 15:46:13 redis-server redis-7001.conf
 1857  2018-10-24 15:46:16 redis-server redis-7002.conf
 1858  2018-10-24 15:46:18 redis-server redis-7003.conf
 1859  2018-10-24 15:46:20 redis-server redis-7004.conf
 1860  2018-10-24 15:46:23 redis-server redis-7005.conf
複製程式碼

檢查日誌檔案

cat 7000.log

檢查redis服務的埠、程序

netstat -tunlp|grep redis


ps -ef|grep redis

此時叢集還不可用可以通過登入redis檢視

redis-cli -p 7000
set hello world

(error)CLUSTERDOWN The cluster is down

3.建立開啟redis-cluster

準備ruby環境

  1. 下載、編譯、安裝Ruby
  2. 安裝rubygem redis
  3. 安裝redis-trib.rb命令

第一步,安裝ruby(這些命令可以放入一個sh指令碼檔案裡)

複製程式碼
#下載ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

#安裝ruby
tar -xvf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby/
make && make install

#準備一個ruby命令
#準備一個gem軟體包管理命令 #拷貝ruby命令到path下/usr/local/ruby cp /opt/ruby/bin/ruby /usr/local/
cp bin/gem /usr/local/bin
複製程式碼

安裝ruby gem 包管理工具

複製程式碼
wget http://rubygems.org/downloads/redis-3.3.0.gem

gem install -l redis-3.3.0.gem

#檢視gem有哪些包 gem list -- check redis gem
複製程式碼

安裝redis-trib.rb命令

[[email protected] /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/

一鍵開啟redis-cluster叢集

#每個主節點,有一個從節點,代表--replicas 1
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

#叢集自動分配主從關係 7000、7001、7002為 7003、7004、7005 主動關係

檢視叢集狀態

複製程式碼
redis-cli -p 7000 cluster info  

redis-cli -p 7000 cluster nodes  #等同於檢視nodes-7000.conf檔案節點資訊

叢集主節點狀態
redis-cli -p 7000 cluster nodes | grep master
叢集從節點狀態
redis-cli -p 7000 cluster nodes | grep slave
複製程式碼

安裝完畢後,檢查叢集狀態

複製程式碼
[[email protected] /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10468
cluster_stats_messages_pong_sent:10558
cluster_stats_messages_sent:21026
cluster_stats_messages_ping_received:10553
cluster_stats_messages_pong_received:10468
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:21026
複製程式碼

測試寫入叢集資料,登入叢集必須使用redis-cli -c -p 7000必須加上-c引數

複製程式碼
127.0.0.1:7000> set name chao     
-> Redirected to slot [5798] located at 127.0.0.1:7001       
OK
127.0.0.1:7001> exit
[[email protected] /opt/redis/src 18:46:07]#redis-cli -c -p 7000
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"chao"
複製程式碼

叢集ok