Redis集群使用总结(一):

随着企业数据量的增多,Redis不论作为数据存储或是缓存,它的数据量也会逐渐增多,虽然Redis的速度非常可观,但随着其中的数据量的庞大,并且仅仅在一个设备或是一个Redis实例中,其存取速度也会大打折扣,所以我们需要在不同的设备或服务器上,搭建多个Redis实例仓库,将原来的Redis的所有的keys分发到各个服务器的Redis上,这就是现在所谓的Redis集群(Redis Cluster)。

 

·     原理

·     实施

·     注意

·     问题

 

一、原理

1、数据共享

 

Redis提供多个节点实例间的数据共享,也就是Redis A,B,C,D彼此之间的数据是同步的,同样彼此之间也可以通信,而对于客户端操作的keys是由Redis系统自行分配到各个节点中。

 

2、主从复制

 

Redis的多个实例间通信时,一旦其中的一个节点故障,那么Redis集群就不能继续正常工作,所以需要一种复制机制(Master-Slave)机制,做到一旦节点A故障了,那么其从节点A1和A2就可以接管并继续提供与A同样的工作服务,当然如果节点A,A1,A2节点都出现问题,那么同样这个集群不会继续保持工作,但是这种情况比较罕见,即使出现了,也会及时发现并修复使用。

建议:部署主从复制机制(Master-Slave)。

 

3、哈希槽值

 

Redis集群中使用哈希槽来存储客户端的keys,而在Redis中,目前存在16384个哈希槽,它们被全部分配给所有的节点,正如上图所示,所有的哈希槽值被节点A,B,C分配完成了。

 

二、实施

1、创建集群

A、辅助工具安装

在搭建Redis Cluster之前,请先确保系统已经安装了zlib和ruby(含rubygems)软件依赖包,请自行安装。

 

B、安装redis-cluster

在Redis的源码路径下,位于src目录中的redis-trib.rb文件是用来搭建和维护集群的工具,我们需要将其放入与redis-server和redis-cli同样的指令环境下,如下:

sudo cp /redis/redis-3.0.7/src/redis-trib.rb  /redis/bin

sudo cp /redis/redis-3.0.7/src/redis-server  /redis/bin

sudo cp /redis/redis-3.0.7/src/redis-cli  /redis/bin

 

C、配置redis-cluster

文件结构:

 

通用配置:

#generate configs

daemonize no

tcp-backlog 511

timeout 2000

tcp-keepalive 0

loglevel notice

databases 16

slave-serve-stale-data yes

slave-read-only yes

repl-disable-tcp-nodelay yes

slave-priority 100

#open the aof persistence

appendonly yes

#config aof mode for everysec

appendfsync everysec

#while rewrite op then close the aof write mode

no-appendfsync-on-rewrite yes

auto-aof-rewrite-min-size 64mb

aof-rewrite-incremental-fsync yes

#limit the time of lua scripts executes

lua-time-limit 5000

#open redis cluster switch

cluster-enabled yes

#timeout of nodes connections

cluster-node-timeout 15000

cluster-migration-barrier 1

slowlog-log-slower-than 10000

slowlog-max-len 128

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

#open the online rehash

activerehashing yes

 

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

 

hz 10

 

特殊配置:

这里以6379端口为例说明,其它的特殊配置只需修改对应的端口即可:

#common configs

include /redis/etc/redis-common.conf

#listen tcp port

port 6379

#memory cahce max size

maxmemory 100m

maxmemory-policy allkeys-lru

#aof filename

appendfilename "appendonly-6379.aof"

#rdb file,only use in the slave handle

dbfilename dump-6379.rdb

dir /redis/db-6379

#cluster config that auto create

cluster-config-file nodes-6379.conf

#log path

logfile /redis/logs/6379/log-6379.log

 

#in the same computer redis,then give the limit

#fork all redis processes done rewrite,using big memory

auto-aof-rewrite-percentage 80-100

 

D、搭建redis-cluster

在这里,我们使用Redis自带的ruby工具redis-trib.rb来创建和管理集群。本人共创建了6个redis节点,分别启动之后,使用./redis-trib.rb create –replicas配置和生成3个主节点和对应每个节点的3个从节点。

首先,启动6个节点实例:

$redis-server /redis/etc/redis-6379.conf

$redis-server  /redis/etc/redis-6380.conf

$redis-server  /redis/etc/redis-6381.conf

$redis-server  /redis/etc/redis-7379.conf

$redis-server  /redis/etc/redis-7380.conf

$redis-server  /redis/etc/redis-7381.conf

 

其次,创建分配主从节点:

$redis-trib.rb create --replicas 1

127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:7379 127.0.0.1:7380127.0.0.1:7381

 

执行的结果:

 

NOTE:

--replicas 1代表创建1个从节点,创建的从节点的顺序是按照6379-7379,6380-7380及6381-7381的顺序创建配置的。

 

从上图知道,已经创建和配置了3个Master和对应的3个Sub子节点,同时会提示您是否同意这个配置生成,当你回复yes之后,显示如下:

 

NOTE:

从上图知道,Redis集群已经创建和配置成功了,并且redis的16384个哈希槽已经全部分配完成。

 

2、集群验证

验证可以使用redis-rb-cluster或是redis-cli来验证,这里以最简单的方式redis-cli来验证使用,意在说明集群的使用和校验。

A、哈希槽分配

$redis-cli -c -p 6379

127.0.0.1:6379> set mykey "hello"

-> Redirected to slot [14687] located at 127.0.0.1:6381

 

$redis-cli -c -p 6380

127.0.0.1:6380> set mykey2 "hello world"

-> Redirected to slot [14119] located at 127.0.0.1:6381

OK

 

$redis-cli -c -p 6381

127.0.0.1:6381> set mykey3 "hello"

-> Redirected to slot [9990] located at 127.0.0.1:6380

OK

 

B、集群验证

$redis-trib.rb  127.0.0.1:7379

 

结果:

 

右上图,可以知道集群配置没问题,继续往下验证下数据的异步同步。

 

C、集群数据共享

$redis-cli -c -p 6379

127.0.0.1:6379> set mykey "hello"

-> Redirected to slot [14687] located at 127.0.0.1:6381

OK

127.0.0.1:6381> get mykey2

"hello world"

127.0.0.1:6381> get mykey3

-> Redirected to slot [9990] located at 127.0.0.1:6380

"hello"

 

NOTE:

从上面可以看出,我实例子6379中可以访问同一个集群内的节点数据,访问的机制是根据set时分配的哈希槽,例如:在6379中,使用get mykey3,那么自动定位到6380。  

 

三、注意

1、主从复制

Redis集群支持主从复制功能,也就是主节点对应的从节点,但是不需要在从节点中加入slaveof <server>:<port>,否则会报错哦。

 

2、主从配置

一般情况下,从节点的配置和对应的主节点的配置类似,但是一般从节点的大小要小于主节点的配置大小,这主要考虑内存和性能均衡方面,请在实际使用时留意下。

 

3、实例通信

Redis集群中的节点实例间的数据共享机制是通过定位哈希槽(set时的键值分配的哈希),不会区分主从节点或是普通节点的通信。

 

四、问题

遇到问题:

custom_require.rb:36:in `require': cannot load such file -- redis(LoadError)

from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

from ./redis-trib.rb:25:in `<main>'

解决办法:

sudo gem install redis来安装ruby和redis的接口包即可

posted on 2018-04-24 16:52  rqw  阅读(2623)  评论(0编辑  收藏

导航