Redis+Twemproxy分片儲存實現
from unsplash
為提高Redis儲存能力的提升,以及對外提供服務可用性提升,有時候有必要針對Redis進行叢集式搭建,比較常用的有Twemproxy分片儲存以及官方提供的Cluster方式。
Redis例項安裝
Redis的安裝這裡不再多講,相關步驟可從官網或其它渠道得到。為安裝redis多例項,這裡簡單提前建立完相關資料夾。其中redis存放應用程式,redis1/redis2/redis3僅儲存配置檔案。
-
[[email protected] redis-cluster]# ll
-
總用量 4
-
drwxr-xr-x 6 root root 4096 8月 29 09:16 redis
-
drwxr-xr-x 2 root root 24 8月 29 09:29 redis1
-
drwxr-xr-x 2 root root 24 8月 29 09:25 redis2
-
drwxr-xr-x 2 root root 24 8月 29 09:26 redis3
各例項簡單配置如下:
redis1
-
daemonize yes
-
port 63791
-
pidfile /var/run/redis1.pid
redis2
-
daemonize yes
-
port 63792
-
pidfile /var/run/redis2.pid
redis3
-
daemonize yes
-
port 63793
-
pidfile /var/run/redis3.pid
分別啟動,執行成功如下:
-
[[email protected] redis-cluster]# ps -ef |grep redis
-
root 110719 1 0 09:24 ? 00:00:00 redis/src/redis-server 127.0.0.1:63791
-
root 110761 1 0 09:25 ? 00:00:00 redis/src/redis-server 127.0.0.1:63792
-
root 110787 1 0 09:26 ? 00:00:00 redis/src/redis-server 127.0.0.1:63793
-
root 110964 83212 0 09:30 pts/0 00:00:00 grep --color=auto redis
Twemproxy應用
以上三個例項各為獨自執行,並沒有啟動叢集儲存、儲存能力提升的功能。為實現redis的叢集儲存,本例結合早先出現的Twemproxy技術(由twitter開源)進行redis分片儲存,而非在Twemproxy之後出現的官方提供的cluster功能。
下面開啟Twemproxy的應用,原始碼安裝
-
[[email protected] src]# git clone [email protected]:twitter/twemproxy.git
-
[[email protected] src]# cd twemproxy
-
[[email protected] twemproxy]# autoreconf -fvi
-
[[email protected] twemproxy]# ./configure --enable-debug=full
-
[[email protected] twemproxy]# make
-
[[email protected] twemproxy]# src/nutcracker -h
-
[[email protected] twemproxy]# src/nutcracker -h
-
This is nutcracker-0.4.1
-
Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]
-
[-c conf file] [-s stats port] [-a stats addr]
-
[-i stats interval] [-p pid file] [-m mbuf size]
-
Options:
-
-h, --help : this help
-
-V, --version : show version and exit
-
-t, --test-conf : test configuration for syntax errors and exit
-
-d, --daemonize : run as a daemon
-
-D, --describe-stats : print stats description and exit
-
-v, --verbose=N : set logging level (default: 5, min: 0, max: 11)
-
-o, --output=S : set logging file (default: stderr)
-
-c, --conf-file=S : set configuration file (default: conf/nutcracker.yml)
-
-s, --stats-port=N : set stats monitoring port (default: 22222)
-
-a, --stats-addr=S : set stats monitoring ip (default: 0.0.0.0)
-
-i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
-
-p, --pid-file=S : set pid file (default: off)
-
-m, --mbuf-size=N : set size of mbuf chunk in bytes (default: 16384 bytes)
安裝完成後,配置nutcracker.yml,採用ketama(一致性hash演算法)分片方式。其餘還有Modula和Random兩種方式。取模演算法有明細的缺陷:在分片增加的情況下,資料的命中率直線下降。隨機演算法更是無法保證資料的均衡讀寫。
-
redis-cluster:
-
listen: 0.0.0.0:22122
-
hash: fnv1a_64
-
distribution: ketama
-
timeout: 400
-
backlog: 65535
-
preconnect: true
-
redis: true
-
server_connections: 1
-
auto_eject_hosts: true
-
server_retry_timeout: 60000
-
server_failure_limit: 3
-
servers:
-
- 127.0.0.1:63791:1 redis01
-
- 127.0.0.1:63792:1 redis02
-
- 127.0.0.1:63793:1 redis03
儲存後,進行簡單的測試,保證配置檔案的正確性,若出現如下響應,證明配置檔案執行正常。
[[email protected] conf]# ../src/nutcracker -c nutcracker.yml -t
nutcracker: configuration file 'nutcracker.yml' syntax is ok
啟動Twemproxy,此時的redis的分片叢集搭建已完成。可以通過22122直接訪問redis服務【twemproxy並不支援所有redis/memcache的命令,具體請參考https://github.com/twitter/twemproxy/blob/master/notes/redis.md】
簡單測試
採用redis-cli客戶端登陸22122埠,隨機寫入一批資料,再通過redis-cli連線具體的redis例項埠,如63791/63792/63793,檢視資料是真實的儲存在哪一個例項中。
至此,我們已經搭建好一個分片儲存的Redis叢集應用,為前端提供強勁資料快取服務
擴充套件閱讀:
長按2秒,識別二維碼,關注我。
關注程式設計師成長