一、Redis及Redis集群简介

1.Redis

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

2.Redis集群

Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。

Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。

如何启动redis集群(Redis集群部署)(1)

Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:

数据分区:Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生成 16384 个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。

数据冗余:Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。

二、Redis部署

1.下载安装Redis

wget http://download.redis.io/releases/redis-5.0.6.tar.gz

2.解压Redis源码包

tar -zxvf redis-5.0.3.tar.gz

3.安装

Redis 基于 C 语言开发,故编译源码需要 GCC(Linux下的一个编译器,这里需要用来编译.c文件)的支持。如机器上未安装需要先执行命令yum -y install gcc安装 GCC 编译工具,然后make distclean清除之前生成的文件,最后make && make install重新编译安装。进入解压后的目录并使用make命令执行编译安装Redis(以/home目录为例)

* 注:make编译安装前需提前安装GCC编译器,否则会编译失败,安装命令:

yum -y install gcc

cd /home/redis-5.0.6

make

* 出现类似下列输出则表示安装成功

如何启动redis集群(Redis集群部署)(2)

* 安装成功后,Redis目录文件会出现如下文件

如何启动redis集群(Redis集群部署)(3)

4.启动集群各个节点

cd /home/redis-5.0.6/src

./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf

5.Redis配置文件---redis.conf释义

三、集群部署

依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。(本次以部署在同一台机器上为例)

目前 Redis Cluster 的搭建有两种方式:

两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用第二种方式,简单快捷,不易出错。(本次以自动搭建为例)

由于我们这是在一台机器上模拟多个节点,可以预先规划下各个节点的属性:

节点编号

IP 地址

TCP 端口

节点类型

从节点

启动配置

A

127.0.0.1

7001

D

/home/redis-5.0.6/redis-cluster/7001/redis.conf

B

127.0.0.1

7002

E

/home/redis-5.0.6/redis-cluster/7002/redis.conf

C

127.0.0.1

7003

F

/home/redis-5.0.6/redis-cluster/7003/redis.conf

D

127.0.0.1

8001

/

/home/redis-5.0.6/redis-cluster/8001/redis.conf

E

127.0.0.1

8002

/

/home/redis-5.0.6/redis-cluster/8002/redis.conf

F

127.0.0.1

8003

/

/home/redis-5.0.6/redis-cluster/8003/redis.conf

1.创建节点

mkdir /home/redis-5.0.6/redis-cluster

cd redis-cluster

mkdir -p 7001 7002 7003 8001 8002 8003

2.分别复制配置文件到各个节点目录

cp redis.conf /home/redis-5.0.6/redis-cluster/7001

cp redis.conf /home/redis-5.0.6/redis-cluster/7002

cp redis.conf /home/redis-5.0.6/redis-cluster/7003

cp redis.conf /home/redis-5.0.6/redis-cluster/8001

cp redis.conf /home/redis-5.0.6/redis-cluster/8002

cp redis.conf /home/redis-5.0.6/redis-cluster/8003

3.分别修改节点配置文件(以7001节点为例,其他原理相同)

cd /home/redis-5.0.6/redis-cluster/7001

vi redis.conf

* 具体修改内容如下:

bind 192.168.83.128 # 设置当前节点主机地址

port 7001 # 设置客户端连接监听端口

pidfile /var/run/redis_7001.pid # 设置 Redis 实例 pid 文件

daemonize yes # 以守护进程运行 Redis 实例

cluster-enabled yes # 启用集群模式

cluster-node-timeout 15000 # 设置当前节点连接超时毫秒数

cluster-config-file nodes-7001.conf # 设置当前节点集群配置文件路径

4.启动集群各个节点

cd /home/redis-5.0.6/src

./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf

./run-server /home/redis-5.0.6/redis-cluster/7002/redis.conf

./run-server /home/redis-5.0.6/redis-cluster/7003/redis.conf

./run-server /home/redis-5.0.6/redis-cluster/8001/redis.conf

./run-server /home/redis-5.0.6/redis-cluster/8002/redis.conf

./run-server /home/redis-5.0.6/redis-cluster/8003/redis.conf

* 启动后,会有如下提示:

如何启动redis集群(Redis集群部署)(4)

* 通过ps命令查看确认各个节点是否运行

如何启动redis集群(Redis集群部署)(5)

5.自动搭建集群

Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目录下。其封装了 Redis 提供的集群命令,使用简单、便捷。不过 redis-trib.rb 是 Redis 作者使用 Ruby 语言开发的,故使用该工具之前还需要先在机器上安装 Ruby 环境。后面作者可能意识到这个问题,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供使用,其中create命令可以用来创建集群。如果您安装的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不过之前需要安装 Ruby 环境。先使用 yum 安装 Ruby 环境以及其他依赖项:

yum -y install ruby ruby-devel rubygems rpm-build

确认安装版本:

ruby -v

如何启动redis集群(Redis集群部署)(6)

* 本次搭建使用的 Redis 版本是 5.0.6,所以我可以直接使用redis-cli --cluster create命令搭建,具体命令如下所示(重点):

./redis-cli --cluster create 10.252.30.241:7001 10.252.30.241:7002 10.252.30.241:7003 10.252.30.241:8001 10.252.30.241:8002 10.252.30.241:8003 --cluster-replicates 1

* 主节点在前,从节点在后。其中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表示 1 个主节点有 1 个从节点。

* 创建成功会有如下提示

如何启动redis集群(Redis集群部署)(7)

至此,Redis集群搭建完毕!

四、Redis基本使用

1.Redis启动/重启

./run-server /home/redis-5.0.6/redis.conf

2.客户端登录

./redis-cli

./redis-cli -h ip 进入指定服务器的Redis实例

3.关闭Redis

· 方式一:shell交互命令关闭

1)进入Redis的shell命令行

./redis-cli

2)关闭Redis

shutdown

在 shell 交互界面输入 shutdown 命令就可以关闭 Redis 实例,后面有一个可选参数,nosave 就是不将内存中的数据持久化,save 就是将内存中的数据持久化。shutdown 关闭方式是比较优雅的关闭方式,建议使用这种关闭方式

· 方式二:kill 进程号关闭

1)查看Redis进程号

ps -ef | grep redis

2)杀掉Redis进程

kill 19317

使用 kill方式关闭 Redis 实例服务,需要注意一个地方,那就是需要把 pid 文件删掉,pid文件存放的位置我们在 redis.conf 里配置的 pidfile /var/run/redis_6379.pid,我们需要到 /var/run 目录下把 redis_6379.pid 删掉,这样下一次才能正常重启 Redis 服务。

上面两种方式都可以关闭 Redis 服务,随便选一种都行,但是切记不要使用 Kill 9 方式关闭 Redis 进程,这样 Redis 不会进行持久化操作,除此之外,还会造成缓冲区等资源不能优雅关闭,极端情况下会造成 AOF 和复制丢失数据的情况

4.设置Redis开机自启动

5.Redis进程绑定到指定的CPU

1)查看Redis进程

ps -ef | grep redis

2)显示进程运行的CPU

taskset -p 19317

如何启动redis集群(Redis集群部署)(8)

3)查看本服务器CPU数量

lscpu

如何启动redis集群(Redis集群部署)(9)

4)指定进程运行在某个特定的CPU上(将7001节点的Redis绑定到CPU2上)

taskset -pc 1 23197

如何启动redis集群(Redis集群部署)(10)

显示结果:

pid 23197’s current affinity list: 0-3

pid 23197’s new affinity list: 1

* 注:0-3表示一共4个CPU,1表示CPU将只会运行在第2个CPU上(从0开始计数)

5)进程启动时指定CPU

taskset -c 1 ./redis-server ../redis-cluster/7001/redis.conf

taskset -c 1 ./redis-server ../redis-cluster/8001/redis.conf

taskset -c 2 ./redis-server ../redis-cluster/7002/redis.conf

taskset -c 2 ./redis-server ../redis-cluster/8002/redis.conf

taskset -c 3 ./redis-server ../redis-cluster/7003/redis.conf

taskset -c 3 ./redis-server ../redis-cluster/8003/redis.conf

如何启动redis集群(Redis集群部署)(11)

五、常见问题及解决办法

1.使用./redis-cli进入shell时报错Could not connect to Redis at 127.0.0.1:6379: Connection refused

【解决办法】

1)编辑redis配置文件redis.conf 并修改 daemonize no(第128行) 为 daemonize yes ,这样就可以默认启动就后台运行

2)重启redis服务

redis-server /etc/redis.conf

* 注:开启客户端要确保服务端启动

2.外部无法访问redis

【解决办法】

1)编辑redis配置文件redis.conf 并修改 bind 127.0.0.1 为bind 0.0.0.0(代表不做限制)

如何启动redis集群(Redis集群部署)(12)

2)重启redis服务

redis-server /etc/redis.conf

* 其他可能原因:防火墙未添加redis端口、安全组、protected-mode保护模式未关闭、密码错误等

,