vlambda博客
学习文章列表

Redis 教程(十一) Redis 集群安装

Redis教程(十一) Redis集群安装

1 Redis集群安装

集群要实现的目的是要将不同的key分散放置到不同的 redis节点,这里我们需要一个规则或者算法,通常的做法是获取 key的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。

1.1 一致性哈希有四个重要特征

均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。

单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。

分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对 key哈希应尽可能的避免重复。

1.2 Redis哈希槽(hash slot)

但一致性哈希不是我们今天要介绍的重点,因为 Redis引入另一种哈希槽(hash slot)的概念。

Redis集群中内置了 16384个哈希槽,当需要在 Redis集群中放置一个 key-value时,redis先对 key使用 crc16算法算出一个结果,然后把结果对16384求余数,这样每个 key都会对应一个编号在 0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。

使用哈希槽的好处就在于可以方便的添加或移除节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。

Redis哈希槽(hash slot)图1-1 1.3 下载最新版Redis编译

1、目前最新版是redis-3.2.6,下载最新的Redis执行make命令

Redis下载:redis-3.2.6.tar.gz,下载到:/usr/local/software,目录不存则创建:

创建命令:mkdir /usr/local/software

切换目录:cd /usr/local/software

下载Reids到software目录:wget http://download.redis.io/releases/redis-3.2.6.tar.gz

2、Redis解压安装

执行命令:

tar -zxvf redis-3.2.6.tar.gz
cd /usr/local/software/redis-3.2.6
make && make install

# 用&&来把命令连接起来执行,表示当前一条命令正常结束后,后面的命令才会执行

1.4 编辑redis配置文件

Redis的cluster也是依赖选举算法来保证集群的高可用,所以类似zookeeper一样,一般是奇数个节点(可以允许N/2以下的节点失效),再考虑到每个节点做Master-Slave互为备份,所以一个Rediscluster集群最少也得6个节点。

三个为从节点,对应的Redis节点的IP和端口对应关系如下:

  • 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

1、创建6个服务器目录

执行命令:

mkdir /usr/local/software/redis-cluster
cd /usr/local/software/redis-cluster/
mkdir 7000 7001 70027003 7004 7005 conf logs

2、编辑redis集群配置文件

复制Redis配置文件:

cp /usr/local/software/redis-3.2.6/redis.conf /usr/local/software/redis-cluster/conf/

切换目录:

cd/usr/local/software/redis-cluster/conf/

重命名配置文件:

mv redis.conf redis-base.conf

编辑redis-base.conf配置文件:vim redis-base.conf

# 是否启用后台守护进程运行模式

daemonize no

# 此参数确定TCP连接中已完成队列(3次握手之后)的长度,应小于Linux系统的/proc/sys/net/core/somaxconn的值,

#此选项默认值为511,而Linux的somaxconn默认值为128,当并发量比较大且客户端反应缓慢的时候,可以同时提高这两个参数。

tcp-backlog 511

# 客户端空闲N秒后断开连接,参数0表示不启用

timeout 0

# 指定ACKs的时间周期,单位为秒,值非0的情况表示将周期性的检测客户端是否可用,默认值为60秒。

tcp-keepalive 0

# 指定服务器信息显示的等级,4个参数分别为debug\verbose\notice\warning

loglevel notice

#指定日志文件,默认是使用系统的标准输出

logfile ""

# 设置数据库的数量,默认启动时使用DB0,使用“select ”可以更换数据库

databases 16

# 数据保存频率:
# save 900 1 900秒后保存,至少有1个key被更改时才会触发
# save 300 10 300秒后保存,至少有10个key被更改时才会触发
# save 60 10000 60秒后保存,至少有10000个key被更改时才会触发


save 900 1

save 300 10

save 60 10000

# 最近一次save操作失败则停止写操作

stop-writes-on-bgsave-error yes

#启用压缩

rdbcompression yes

# RDB文件的是否直接偶像 chcksum

rdbchecksum yes

slave-serve-stale-data yes

# slave是否为"只读",强烈建议为"yes"

slave-read-only yes

# 默认不使用diskless同步方式

repl-diskless-sync no

# 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒

repl-diskless-sync-delay 5

# 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。

repl-disable-tcp-nodelay no

# slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。

slave-priority 100

# 不启用AOF文件的策略

appendonly no

# AOF策略设置为 always或者 everysec时,后台处理进程 (后台保存或者 AOF日志重写 )会执行大量的 I/O操作。为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite

appendfsync everysec

# 当主进程在进行向磁盘的写操作时,将会阻止其它的fsync调用

no-appendfsync-on-rewrite no

# aof文件触发自动rewrite的百分比,值为0则表示禁用自动rewrite

auto-aof-rewrite-percentage 100

# aof文件触发自动rewrite的最小文件size

auto-aof-rewrite-min-size 64mb

# 是否加载不完整的aof文件来进行启动

aof-load-truncated yes

# 一个 Lua脚本最长的执行时间为 5000毫秒( 5秒),如果为 0或负数表示无限执行时间。

lua-time-limit 5000

# 配置redis做为一个集群节点来启动

cluster-enabled yes

# redis的slow log是一个系统OS进行的记录查询,它是超过了指定的执行时间的。执行时间不包括类似与client进行交互或发送回复等I/O操作,它只是实际执行指令的时间。

#有2个参数可以配置:

#一个用来告诉redis执行时间,这个时间是微秒级的(1秒=1000000微秒),这是为了不遗漏命令。

#另一个参数是设置slowlog的长度,当一个新的命令被记录时,最旧的命令将会从命令记录队列中移除。

slowlog-log-slower-than 10000

slowlog-max-len 128

# 延迟监控,用于记录等于或超过了指定时间的操作,默认是关闭状态,即值为0。

latency-monitor-threshold 0

#事件通知,默认不启用,具体参数查看配置文件

notify-keyspace-events ""

#当条目数量较少且最大不会超过给定阀值时,哈希编码将使用一个很高效的内存数据结构,阀值由以下参数来进行配置。

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

# 与哈希类似,少量的lists也会通过一个指定的方式去编码从而节省更多的空间,它的阀值通过以下参数来进行配置。

list-max-ziplist-entries 512

list-max-ziplist-value 64

# set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。

set-max-intset-entries 512

# 和 hash和 list一样 ,排序的 set在指定的长度内以指定编码方式存储以节省空间。zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

# 设置HyeperLogLog的字节数限制,这个值通常在0~15000之间,默认为3000,基本不超过16000

hll-sparse-max-bytes 3000

# redis将会在每秒中抽出10毫秒来对主字典进行重新散列化处理,这有助于尽可能的释放内存

activerehashing yes

# 客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 /订阅客户端消费消息的速度无法赶上生产它们的速度)。

# 每个 client-output-buffer-limit语法 :

# client-output-buffer-limit

# 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。

# 例如,如果硬限制为 32兆字节和软限制为 16兆字节 /10秒,客户端将会立即断开

# 如果输出缓冲区的大小达到 32兆字节,客户端达到 16兆字节和连续超过了限制 10秒,也将断开连接。

# 默认 normal客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。

# 把硬限制和软限制都设置为 0来禁用该特性

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave256mb 64mb 60

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

# Redis调用内部函数来执行许多后台任务,如关闭客户端超时的连接,清除过期的 Key,等等。此值越大表示redis对"间歇性task"的执行次数越频繁(次数/秒)。

hz 10

# 当一个子进程要改写AOF文件,如果以下选项启用,那文件将会在每产生32MB数据时进行同步,这样提交增量文件到磁盘时可以避免出现比较大的延迟。

aof-rewrite-incremental-fsync yes

3、编辑redis集群配置文件

执行命令:

vim /usr/local/software/redis-cluster/conf/redis-7000.conf

编辑内容:

include /usr/local/software/redis-cluster/conf/redis-base.conf

# When running daemonized, Rediswrites a pid file in /var/run/redis.pid by # default. You can specify acustom pid file location here.

pidfile /usr/local/software/redis-cluster/7000/redis-7000.pid

# Accept connections on thespecified port, default is 6379. # If port 0 is specified Rediswill not listen on a TCP socket.

port 7000

# The filename where to dump theDB

dbfilename dump-7000.rdb

# The working directory.

#

# The DB will be written insidethis directory, with the filename specified

# above using the 'dbfilename'configuration directive.

#

# The Append Only File will alsobe created inside this directory.

#

# Note that you must specify adirectory here, not a file name.

dir /usr/local/software/redis-cluster/7000

# Every cluster node has acluster configuration file. This file is not

# intended to be edited by hand.It is created and updated by Redis nodes.

# Every Redis Cluster noderequires a different cluster configuration file.

# Make sure that instancesrunning in the same system do not have

# overlapping cluster configurationfile names.

#

cluster-config-file nodes-7000.conf

# The name of the append onlyfile (default: "appendonly.aof")

appendfilename" appendonly-7000.aof"

4、复制redis-7000.conf配置文件

切换目录:

cd /usr/local/software/redis-cluster/conf/

复制命令:

cp redis-7000.conf redis-7001.conf
cp redis-7000.conf redis-7002.conf
cp redis-7000.conf redis-7003.conf
cp redis-7000.conf redis-7004.conf
cp redis-7000.conf redis-7005.conf

5、编辑配置文件

vim /usr/local/software/redis-cluster/conf/redis-7001.conf
:%s/7000/7001/g
vim /usr/local/software/redis-cluster/conf/redis-7002.conf
:%s/7000/7002/g
vim /usr/local/software/redis-cluster/conf/redis-7003.conf
:%s/7000/7003/g
vim /usr/local/software/redis-cluster/conf/redis-7004.conf
:%s/7000/7004/g
vim /usr/local/software/redis-cluster/conf/redis-7005.conf
:%s/7000/7005/g

1.5 依次启动redis配置文件

1、启动Redis


cd /usr/local/software/redis-3.2.6/
redis-server /usr/local/software/redis-cluster/conf/redis-7000.conf &
redis-server /usr/local/software/redis-cluster/conf/redis-7001.conf &
redis-server /usr/local/software/redis-cluster/conf/redis-7002.conf&
redis-server /usr/local/software/redis-cluster/conf/redis-7003.conf &
redis-server /usr/local/software/redis-cluster/conf/redis-7004.conf &
redis-server /usr/local/software/redis-cluster/conf/redis-7005.conf &

2、查看启动Redis

执行命令:

ps -ef|grep redis

1.6 创建集群cluster

1、yum安装ruby环境

执行命令:

yum install ruby
yum install rubygems
gem install redis

2、执行redis的创建集群命令创建集群

执行命令:


cd /usr/local/software/redis-3.2.6/src/
./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

出现以上信息表示Redis集群安装成功。从上面的输出,可以看出7000、7004、7005是slave,而7001、7003、7002是master。注意观察主从的配置:默认是前三个节点7001、7002、7003 是主,后3个节点7004、7005、7006 是从如果是部署在不同的服务器,请根据主从分部规则,分开在不同的服务器。

1.7 redis-cli客户端操作

1、连接redis集群,执行命令:


cd /usr/local/software/redis-3.2.6/

#注意加参数-c,表示进入cluster模式

./redis-cli -c -h localhost -p7000

      --以上为《Redis教程(十一) Redis集群安装》,如有不当之处请指出,我后续逐步完善更正,大家共同提高。谢谢大家对我的关注。

——厚积薄发(yuanxw)