天天看點

Redis 叢集之Redis+Twemproxy方案

【轉載請注明出處】: https://www.jianshu.com/p/d94728fc8a91

1、下載下傳Redis安裝包

Redis的官網下載下傳位址是

https://redis.io/download

,上面有各個發行版本,我選擇的是目前的最新穩定版5.0.4,下載下傳到安裝目錄并編譯出安裝包。

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxvf redis-5.0.4.tar.gz
cd redis-5.0.4
make
make test           

測試執行沒有問題之後顯示

2、驗證Redis

啟動服務

./src/redis-server           

用戶端連接配接驗證

./src/redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> exit           

3、配置Redis叢集環境

建立redis-cluster目錄,然後在redis-cluster下分别建立7001 7002 7003 7004 7005 7006目錄

mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006
cd ..           

編輯7001的配置檔案

./redis-cluster/7001/redis.conf           

配置檔案内容如下

bind 127.0.0.1
port 7001
daemonize no
pidfile /var/run/redis_7001.pid
logfile "./redis-cluster/7001/redis.log"
save 900 1
save 300 10
save 60 10000
dir ./redis-cluster/7001/
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
appendfsync always           

這些配置的含義及例子都可以在根目錄redis.conf檔案中找到,具體含義可以閱讀此檔案。将編輯好的配置檔案複制到其他節點,修改相應節點的配置

cp ./redis-cluster/7001/redis.conf ./redis-cluster/7002/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7003/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7004/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7005/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7006/
grep 7001 -rl ./redis-cluster/7002 | xargs -t sed -i ".bak" "s/7001/7002/g"
#将7002目錄下的檔案備份為xxx.bak,并将檔案中的7001替換成7002
# -t是回顯指令 ,-i是直接修改檔案内容,“.bak”是備份檔案的字尾
#産生的備份檔案如果不想要可以用下面任何一個指令删除 
# find ./redis-cluster -name "*.bak" | xargs rm -f ;
# find ./redis-cluster -name "*.bak" -exec rm {} \;
grep 7001 -rl ./redis-cluster/7003 | xargs -t sed -i ".bak" "s/7001/7003/g"
grep 7001 -rl ./redis-cluster/7004 | xargs -t sed -i ".bak" "s/7001/7004/g"
grep 7001 -rl ./redis-cluster/7005 | xargs -t sed -i ".bak" "s/7001/7005/g"
grep 7001 -rl ./redis-cluster/7006 | xargs -t sed -i ".bak" "s/7001/7006/g"           

分别啟動五個執行個體

./src/redis-server ./redis-cluster/7001/redis.conf &
./src/redis-server ./redis-cluster/7002/redis.conf &
./src/redis-server ./redis-cluster/7003/redis.conf &
./src/redis-server ./redis-cluster/7004/redis.conf &
./src/redis-server ./redis-cluster/7005/redis.conf &
./src/redis-server ./redis-cluster/7006/redis.conf &           

建立redis叢集

./src/redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1           

為了後續操作友善,可以編寫一個啟動與停止的腳本:

啟動腳本 start.sh

#!/bin/sh
./src/redis-server ./redis-cluster/7001/redis.conf &
./src/redis-server ./redis-cluster/7002/redis.conf &
./src/redis-server ./redis-cluster/7003/redis.conf &
./src/redis-server ./redis-cluster/7004/redis.conf &
./src/redis-server ./redis-cluster/7005/redis.conf &
./src/redis-server ./redis-cluster/7006/redis.conf &           

停止腳本 stop.sh

#!/bin/sh
./src/redis-cli -p 7001 shutdown 
./src/redis-cli -p 7002 shutdown 
./src/redis-cli -p 7003 shutdown 
./src/redis-cli -p 7004 shutdown 
./src/redis-cli -p 7005 shutdown
./src/redis-cli -p 7006 shutdown           

給腳本添加執行權限

chmod +x start.sh 
chmod +x stop.sh            

通過随便一個用戶端檢視節點資訊

./src/redis-cli -p 7001 cluster nodes           

4、Twemproxy介紹

Twemproxy 也叫 nutcraker。是 Twtter 開源的一個 Redis 和 Memcache 代理伺服器,主要用于管理 Redis 和 Memcached 叢集,減少與Cache 伺服器直接連接配接的數量。

Twemproxy特性:

  • 支援失敗節點自動删除

    – 可以設定重新連接配接該節點的時間

– 可以設定連接配接多少次之後删除該節點

  • 支援設定HashTag

    – 通過HashTag可以自己設定将兩個key哈希到同一個執行個體上去減少與redis的直接連接配接數

– 保持與redis的長連接配接

– 減少了用戶端直接與伺服器連接配接的連接配接數量

  • 自動分片到後端多個redis執行個體上

    – 多種hash算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins

– 多種分片算法:ketama(一緻性hash算法的一種實作)、modula、random

– 可以設定後端執行個體的權重

  • 避免單點問題

    – 可以平行部署多個代理層,通過HAProxy做負載均衡,将redis的讀寫分散到多個twemproxy上。

  • 支援狀态監控

    – 可設定狀态監控ip和端口,通路ip和端口可以得到一個json格式的狀态資訊串

– 可設定監控資訊重新整理間隔時間

  • 使用 pipelining 處理請求和響應

    – 連接配接複用,記憶體複用

– 将多個連接配接請求,組成reids pipelining統一向redis請求

  • 并不是支援所有redis指令

    – 不支援redis的事務操作

– 使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE指令需要保證key都在同一個分片上。

5、Twemproxy安裝

Twemproxy官網位址是

https://github.com/twitter/twemproxy

,在安裝twemproxy 前,需要安裝autoconf,automake,libtool 軟體包,此處不再說明。

Twemproxy的釋出版本在

https://github.com/twitter/twemproxy/releases

下載下傳最新版本0.4.1

wget https://github.com/twitter/twemproxy/archive/v0.4.1.tar.gz
tar -zxvf v0.4.1.tar.gz
cd twemproxy-0.4.1/
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make
sudo make install           

編輯配置檔案nutcracker.yml

cd /usr/local/twemproxy/
mkdir conf run
vim ./conf/nutcracker.yml           

這裡隻配置了三個master節點作為測試,具體根據業務需要配置,具體的參數含義在官網有說明

beta:
  listen: 127.0.0.1:22122
  hash: fnv1a_64
  hash_tag: "{}"
  distribution: ketama
  auto_eject_hosts: false
  timeout: 400
  redis: true
  servers:
   - 127.0.0.1:7004:1 7004
   - 127.0.0.1:7005:1 7005
   - 127.0.0.1:7006:1 7006           

啟動twemproxy

./sbin/nutcracker -t
#測試配置檔案是否正确
./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
#指定配置檔案路徑、pid路徑、日志路徑           

連接配接twemproxy進行測試

./src/redis-cli -h 127.0.0.1 -p 22122 -c
127.0.0.1:22122> set foo bar
-> Redirected to slot [1044] located at 127.0.0.1:7005
OK
127.0.0.1:7005> get foo
"bar"           

表示成功了,可以進行讀取,應用代碼中就可以直接連接配接22122端口使用redis了。

配置啟動/重新開機/停止腳本友善操作

#!/bin/sh
./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log           

停止腳本stop.sh

#!/bin/sh
sudo killall nutcracker           

或者複制twemproxy-0.4.1/scripts/nutcracker.init檔案到/usr/local/twemproxy/sbin下,并修改腳本即可。

6、Twemproxy的缺點

  • 雖然可以動态移除節點,但該移除節點的資料就丢失了。
  • redis叢集動态增加節點的時候,twemproxy不會對已有資料做重分布
  • 性能上損耗

繼續閱讀