Redis集群环境配置

Redis集群环境配置

为什么需要集群?

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集群节点:

1
2
3
4
5
6
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)

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

修改Redis集群配置

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

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

修改为守护进程启动:
redis-cluster

这个也最好修改下:修改为对应的9001-9006

1
pidfile /var/run/redis_9001.pid

这步不做命令示例。

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

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

1
2
3
4
5
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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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

给予执行权限并运行:

1
chmod +x startAll.sh

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

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

查看运行情况:
redis-cluster;

创建Redis集群环境

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

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

1
2
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下载地址)

1
gem install ./redis-3.3.0.gem

执行搭建集群

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

1
./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,输入之后,然后集群搭建完成。
redis-cluster;

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

测试

执行set

1
2
3
4
[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>

这个的意思是,槽位15945需要在9003上面的实例执行。
我们再连接9003试试:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:916
cluster_stats_messages_pong_sent:878
cluster_stats_messages_meet_sent:4
cluster_stats_messages_sent:1798
cluster_stats_messages_ping_received:876
cluster_stats_messages_pong_received:920
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:1798
127.0.0.1:9003>

其他补充

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

集群配置项

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 端口号
port 9001

# 日志的记录级别,notice是适合生产环境的
loglevel notice

# 指定log的保存路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的目录
logfile "Logs/redis9001_log.log"

# 是否使用系统日志
syslog-enabled yes

# 在系统日志的标识名
syslog-ident redis9001

# 数据的保存为aof格式
appendonly yes

# 数据保存文件
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节点能互相创建,否则集群无法连接,无法创建成功。

本文章转载于http://www.php20.cn

文章目录
  1. 1. Redis集群环境配置
    1. 1.1. 为什么需要集群?
    2. 1.2. Redis集群简介
    3. 1.3. Redis哈希槽
    4. 1.4. 集群节点
    5. 1.5. 搭建Redis集群实例
      1. 1.5.1. 创建Redis集群目录
      2. 1.5.2. Redis复制到集群目录中
      3. 1.5.3. 修改Redis集群配置
      4. 1.5.4. 每个集群都复制一份Redis,并且修改端口
      5. 1.5.5. 启动Redis集群实例
      6. 1.5.6. 创建Redis集群环境
      7. 1.5.7. 执行搭建集群
    6. 1.6. 测试
    7. 1.7. 其他补充
    8. 1.8. 集群配置项
  2. 2. 集群ip
本站总访问量 | 本页面被访问 | 您是第位小伙伴

© XueSi博客 版权所有 备案号 : 赣ICP备19008485号-1