Redis 集羣之Redis+Twemproxy方案

【轉載請註明出處】:http://www.javashuo.com/article/p-rgzizqqy-go.htmlnode

一、下載Redis安裝包

Redis的官網下載地址是https://redis.io/download,上面有各個發行版本,我選擇的是當前的最新穩定版5.0.4,下載到安裝目錄並編譯出安裝包。git

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

測試執行沒有問題以後顯示
image.pnggithub

二、驗證Redis

啓動服務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

三、配置Redis集羣環境

建立redis-cluster目錄,而後在redis-cluster下分別建立7001 7002 7003 7004 7005 7006目錄json

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

編輯7001的配置文件vim

./redis-cluster/7001/redis.conf

配置文件內容以下segmentfault

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

image.png

四、Twemproxy介紹

Twemproxy 也叫 nutcraker。是 Twtter 開源的一個 Redis 和 Memcache 代理服務器,主要用於管理 Redis 和 Memcached 集羣,減小與Cache 服務器直接鏈接的數量。

Twemproxy特性:

  • 支持失敗節點自動刪除
    – 能夠設置從新鏈接該節點的時間
    – 能夠設置鏈接多少次以後刪除該節點
  • 支持設置HashTag
    – 經過HashTag能夠本身設定將兩個key哈希到同一個實例上去減小與redis的直接鏈接數
    – 保持與redis的長鏈接
    – 減小了客戶端直接與服務器鏈接的鏈接數量
  • 自動分片到後端多個redis實例上
    – 多種hash算法:md五、crc1六、crc32 、crc32a、fnv1_6四、fnv1a_6四、fnv1_3二、fnv1a_3二、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都在同一個分片上。

五、Twemproxy安裝

Twemproxy官網地址是https://github.com/twitter/tw...,在安裝twemproxy 前,須要安裝autoconf,automake,libtool 軟件包,此處再也不說明。
Twemproxy的發佈版本在 https://github.com/twitter/tw...
下載最新版本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節點做爲測試,具體根據業務須要配置,具體的參數含義在官網有說明https://github.com/twitter/tw...

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了。

配置啓動/重啓/中止腳本方便操做

啓動腳本 start.sh

#!/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下,並修改腳本便可。

六、Twemproxy的缺點

  • 雖然能夠動態移除節點,但該移除節點的數據就丟失了。
  • redis集羣動態增長節點的時候,twemproxy不會對已有數據作重分佈
  • 性能上損耗

【轉載請註明出處】:http://www.javashuo.com/article/p-rgzizqqy-go.html

相關文章
相關標籤/搜索