原创

redis集群环境配置

温馨提示:
本文最后更新于 2019年12月20日,已超过 1,588 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

为什么需要集群

redis是一个开源的 key->value 高速存储系统,但是由于redis单线程运行,在系统中,只能利用单核的性能

当redis的调用越来越频繁时,可能会出现redis过于繁忙,无法处理数据的情况

这时候,我们就需要使用redis集群去分散redis的压力,利用redis集群,去充分利用cpu核数

redis集群简介

1:redis集群采用p2p模式,也就是集群没有中心服务器,每个节点都是同样的权限,通过访问一个节点,就能获取其他节点的信息

2:redis集群由于是p2p模式,所以需要连接所有的节点,进行不同的操作,也就是你有多少台节点,就得有多少个redis连接

3:为了实现集群的高可用状态,redis的全部节点需要定时的去查询其他节点的状态,如果发现ping不成功,说明这个节点已经可能出现问题了.

但这里有个问题,假设集群ABC,A的网络出现了问题,那A节点会觉得BC都有问题,BC都会觉得A有问题,那这个时候该怎么办呢?

所以redis采用了投票机制,如果超过一半的节点觉得某个节点有问题,那就说明它真的挂了

4:节点挂了会影响集群挂了吗?当集群的某个节点挂了,并且没有额外的从节点提供服务,那整个集群就会直接挂掉

但是如果有从节点,那么从节点可以继续提供部分服务,集群不会直接终止

redis哈希槽

现在我们了解到了redis是p2p去中心化的实现方式,那么,我如果需要set('a','仙士可'),redis会怎么做呢?这里就涉及到了集群哈希槽的知识了

redis集群规定了16384个槽位,这些槽位将会平均分配给不同的节点,

通过对key的取模16384,可获得一个槽位数,这个key将会保存到这个槽位上,然后再根据槽位对应的节点,将数据保存到指定节点中

例如:

1:set('a','仙士可'),

2:对a字符串做crc16算法,再对其取模16384,获得槽位数:15495

3:再根据槽位数,获得指定节点(假设是C节点)

4:连接C节点,进行set a '仙士可'命令发送

5:数据保存到C节点

6:get('a')

7:对a字符串做crc16算法,再对其取模16384,获得槽位数:15495

8:再根据槽位数,获得指定节点(假设是C节点)

9:连接C节点,进行get a命令发送

10:获得具体数据

假如某个节点断线挂了,又没有从节点的话,槽位分配就会出错,所以集群就会挂掉

集群节点

redis搭建集群,最少需要3个主节点,如果需要实现更加稳定,还需要3个从节点(避免主节点断线后集群终止)

所以redis需要启动6个实例.

这边需要注意的一点是,redis存储在内存,利用tcp通信,只能利用单核性能,所以如果需要搭建redis集群,需要注意以下事项:

1:需要多台服务器,或者一台6核以上的服务器搭建集群(充分利用cpu)

2:最好是内网通信,多台服务器也必须采用内网通信(内网带宽更加高)

搭建redis集群实例

好了,现在开始搭建redis集群,首先,我们需要安装redis,这里不多做说明

创建redis集群目录

新增redis-cluster文件夹以及存放6个节点的文件夹,用来存储redis集群节点

mkdir -p /usr/local/redis-cluster/redis01
mkdir -p /usr/local/redis-cluster/redis02
mkdir -p /usr/local/redis-cluster/redis03
mkdir -p /usr/local/redis-cluster/redis04
mkdir -p /usr/local/redis-cluster/redis05
mkdir -p /usr/local/redis-cluster/redis06

redis复制到集群目录中

把redis-server,redis-cli和redis-conf复制一份到cluster/redis01中 (我这里是直接编译安装的redis)

cp redis-5.0.7/{redis.conf,src/redis-server,src/redis-cli} redis-cluster/redis01/

修改redis集群配置

修改目录中的redis.conf的端口,改为你自己喜欢的端口号,比如9001

仙士可博客

修改redis.conf的cluster-enabled,改为yes,去掉#号注释

仙士可博客

修改为守护进程启动:

仙士可博客

这步不做命令示例

每个集群都复制一份redis,并且修改端口

把redis01的文件全部复制到其他文件夹中

cp -r redis-cluster/redis01/* redis-cluster/redis02/
cp -r redis-cluster/redis01/* redis-cluster/redis03/
cp -r redis-cluster/redis01/* redis-cluster/redis04/
cp -r redis-cluster/redis01/* redis-cluster/redis05/
cp -r redis-cluster/redis01/* redis-cluster/redis06/

修改其他5个目录中的conf端口号,改为9002-9006

启动redis集群实例

现在需要编写一个shell,用来启动所有的redis实例,新增startAll.sh文件:

#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH;
cd /usr/local/redis-cluster/redis01;
./redis-server ./redis.conf;
cd /usr/local/redis-cluster/redis02;
./redis-server ./redis.conf;
cd /usr/local/redis-cluster/redis03;
./redis-server ./redis.conf;
cd /usr/local/redis-cluster/redis04;
./redis-server ./redis.conf;
cd /usr/local/redis-cluster/redis05;
./redis-server ./redis.conf;
cd /usr/local/redis-cluster/redis06;
./redis-server ./redis.conf;

给予执行权限并运行:

chmod +x startAll.sh

注意,如果是windows编辑的这行代码,那需要注意格式问题,可能会执行报错,需要用dos2unix 命令转换一下

这个时候,6个redis服务器已经全部启动完成了,当然,你不一定要在一台服务器上运行6个,你可以再6台不同的服务器运行这6个redis服务器

查看运行情况:

仙士可博客

创建redis集群环境

目前,我们已经成功运行了redis的6个实例,现在需要做集群环境,

首先,需要安装ruby环境(redis5.0,该步骤废除,留着是为了记录gem下载地址)

yum install ruby
yum install rubygems

离线下载redis.gem文件(redis5.0,该步骤废除,留着是为了记录gem下载地址),

下载地址:https://rubygems.org/gems/redis/versions/3.0.0

仙士可博客

需要注意的是,版本需要跟ruby版本对应,我这里下载的是3.3.0,刚好能够安装

安装(redis5.0,该步骤废除,留着是为了记录gem下载地址)

[root@localhost redis-cluster]# gem install ./redis-3.0.0.gem 
Successfully installed redis-3.0.0
Parsing documentation for redis-3.0.0
Installing ri documentation for redis-3.0.0
1 gem installed
[root@localhost redis-cluster]#

执行搭建集群


还记得之前的redis-cli吗?执行以下命令

./redis-cli --cluster create 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006 --cluster-replicas 1

过程中会让你输入yes,输入,然后集群搭建完成

仙士可博客

到现在为止,整个集群就已经搭建成功啦!

测试

执行set

[root@localhost redis01]# ./redis-cli -p 9001
127.0.0.1:9001> set a 1
(error) MOVED 15495 127.0.0.1:9003
127.0.0.1:9001>

这个的意思是,槽位15495需要在9003上面的实例执行

我们再连接9003试试

[root@localhost redis01]# ./redis-cli -p 9003
127.0.0.1:9003> set a 1
OK
127.0.0.1:9003>

到目前为止,整个集群已经搭建成功了

查看集群:

127.0.0.1:9003> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:230
cluster_stats_messages_pong_sent:228
cluster_stats_messages_meet_sent:4
cluster_stats_messages_sent:462
cluster_stats_messages_ping_received:225
cluster_stats_messages_pong_received:234
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:462
127.0.0.1:9003>

其他补充

前面教大家如何快速的创建一个集群,现在有一些点需要完善补充的,省得后面有坑哦!

集群配置项


在上面,我只讲到了端口配置以及开启集群,但是还有一些配置项需要注意配置的,虽然不配置也能运行集群

 port 9001       #端口号
 loglevel notice    #日志的记录级别,notice是适合生产环境的
 logfile "Logs/redis9001_log.txt"      #指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录
 syslog-enabled yes                         #是否使用系统日志
 syslog-ident redis9001                   #在系统日志的标识名
 appendonly yes                              #数据的保存为aof格式
 appendfilename "appendonly.9001.aof"    #数据保存文件
 cluster-enabled yes                                    #是否开启集群
 cluster-config-file nodes.9001.conf
 cluster-node-timeout 15000
 cluster-slave-validity-factor 10
 cluster-migration-barrier 1
 cluster-require-full-coverage yes

集群ip

需要注意的是,我们配置的ip都是默认,127.0.0.1,当需要多台服务器开启集群,或者内网集群时,需要修改ip为内网/外网ip号,确保redis节点能互相创建,否则集群无法连接,无法创建成功

正文到此结束
本文目录