Redis官网:

https://redis.io/topics/cluster-tutorial

Reids-cluster集群说明:

1.redis从3.0版本开始引入了redis-cluster(集群),支持3.0+版本。3/4版本需要使用ruby来部署集群,5版本客户端版本命令集成了。

2.每个 Redis Cluster 节点都需要打开两个 TCP 连接。用于服务客户端的普通Redis TCP端口,例如6379,加上数据端口加上10000得到的端口,所以在示例中为16379

3.所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。

4.Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据。Redis 集群不像单机版本的 Redis 那样支持多个数据库,集群只有数据库 0,而且也不支持 SELECT 命令

5.Redis Cluster 不使用一致散列,而是一种不同形式的分片,其中每个键在概念上都是我们所谓的散列槽的一部分。Redis 集群中有 16384 个哈希槽,要计算给定键的哈希槽是多少,我们只需取密钥的 CRC16 模数 16384。

6.支持在线增加删除节点,增加新节点,需要将其他节点的hash槽分一部分给新节点。删除节点需要先移动节点的hash槽到其他节点,然后删除节点。

7.Redis 集群使用主副本模型,其中每个哈希槽具有从 1(主节点本身)到 N 个副本(N -1 个额外的副本节点)。官方推荐三主三从,也就是2个副本3个分片共6台redis。主从副本之间采用异步同步。

8.节点的fail是通过集群中超过半数的节点检测失效时才生效。

9.客户端与redis节点直连,不需要中间 proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

集群不可用:

1.如果集群任意master挂掉,且当前master没有slave.集群进入fail 状态,也可以理解成集群的 slot 映 射[0-16383]不完成时进入 fail 状态。

2.如果集群超过半数以上 master 挂掉,无论是否有 slave 集群进入 fail 状态。

redis版本:

redis-5.0.13.tar.gz

三台主机创建redis5目录,安装redis:

tar zxf redis-5.0.13.tar.gz
cd redis-5.0.13/
mkdir /usr/local/redis-5
make PREFIX=/usr/local/redis-5 install

三台主机环境变量:

export PATH=$PATH:/usr/local/redis-5/bin

查看redis版本:

[root@node2 redis-5]# redis-cli --version 
redis-cli 5.0.13

三台主机两个redis配置文件和数据目录:

mkdir data_6379
mkdir data_6389
[root@node2 redis-5]# ls
bin data_6379 data_6389 redis_6379.conf redis_6389.conf

redis_6379.conf 配置文件参数:

bind 0.0.0.0
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/usr/local/redis-5/6379.log"
dir "/usr/local/redis-5/data_6379"
masterauth 1qaz@WSX
requirepass 1qaz@WSX
appendonly yes
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

redis_6389.conf 配置文件参数:

bind 0.0.0.0
port 6389
daemonize yes
pidfile /var/run/redis_6389.pid
logfile "/usr/local/redis-5/6389.log"
dbfilename dump.rdb
dir "/usr/local/redis-5/data_6389"
masterauth 1qaz@WSX
requirepass 1qaz@WSX
appendonly yes
cluster-enabled yes
cluster-config-file nodes-6389.conf
cluster-node-timeout 15000

查看redis进程:

Redis-cluster高可用集群部署_redis集群

随便登录一台redis,创建redis集群:

redis-cli -a 1qaz@WSX --cluster create 10.40.42.103:6379 10.40.42.103:6389 \
10.40.42.105:6379 10.40.42.105:6389 10.40.42.127:6379 10.40.42.127:6389 \
--cluster-replicas 1

选项--cluster-replicas 1意味着我们希望为每个创建的主节点创建一个副本.

 Redis-cluster高可用集群部署_redis集群_02

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_03

查看集群状态信息:

[root@node2 ~]# redis-cli -c -a 1qaz@WSX
127.0.0.1:6379> CLUSTER info

 Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_04

查看集群节点信息:

[root@node2 ~]# redis-cli -c -a 1qaz@WSX
127.0.0.1:6379> CLUSTER NODES

 Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_05

测试

redis集群去中心化

官网说集群去中心化,三台master随便一台写,其他节点都可以读。

Node2(10.40.42.127)插入key:

127.0.0.1:6379> set name mew
-> Redirected to slot [5798] located at 10.40.42.105:6379
OK

 

登录Master 10.40.42.103:6379查询:

[root@master ~]# redis-cli -c -a 1qaz@WSX
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get name
-> Redirected to slot [5798] located at 10.40.42.105:6379
"mew"

Redis-cluster高可用集群部署_redis_06 

登录master的slave查询:

[root@master ~]# redis-cli -c -a 1qaz@WSX -h 10.40.42.103 -p 6389
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.40.42.103:6389> get name
-> Redirected to slot [5798] located at 10.40.42.105:6379
"mew"
10.40.42.105:6379>

 Redis-cluster高可用集群部署_redis集群_07

Redis集群只有1个数据库:

测试验证:只有select 0可以,其他select都是错的。

 Redis-cluster高可用集群部署_redis集群_08

 

Redis集群新增一个节点:

Node2上新增一个6399的 redis_6399.conf启动加入集群。

# redis-cli -a 1qaz@WSX --cluster add-node 10.40.42.127:6399 127.0.0.1:6379

 注意:127.0.0.1:6379表示新节点加入本地redis集群,需要指明集群中的一个节点。

Redis-cluster高可用集群部署_redis_09

查看新增节点的状态信息:

Redis-cluster高可用集群部署_redis_10

测试连接6399节点:

官网:新节点没有分配槽位,是不存储数据的。

测试结果:可以查询数据,但是不存储数据。

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_11

官网说明:

 Redis-cluster高可用集群部署_redis集群_12

添加新节点作为副本集:

10.40.42.103:99新节点

[root@master bin]# redis-cli -a 1qaz@WSX --cluster add-node 10.40.42.103:6399 127.0.0.1:6379 --cluster-slave

注意:一定要选择本地master节点,官网说集群中随机节点,测试下来是不成功的。

没有指定master,通常是找集群中副本集最少的master作为主节点。

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_13

报错:

注意:指定集群中的随机节点不成功,测试好几个节点都一样,登录集群看不到新增的节点。

Redis-cluster高可用集群部署_redis集群_14

 

手动指定新节点作为slave复制某个master:

CLUSTER REPLICATE b6b2e45b5983a98e82f813c47821904d3259bff6

Redis-cluster高可用集群部署_redis集群_15

hash槽冲分配:

redis-cli -a 1qaz@WSX --cluster add-node 10.40.42.105:6399 127.0.0.1:6379

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_16

默认新增的节点为master:

Redis-cluster高可用集群部署_redis集群_17

分配hash槽:

ip:port 为当前redis集群任意节点ip和port

# ./redis-cli -a 1qaz@WSX --cluster reshard 127.0.0.1:6379

How many slots do you want to move (from 1 to 16384)?  这里输入你要分配的哈希槽的数量

What is the receiving node ID? 这里输入将上一步输入指定数量的哈希槽分配给那个节点,输入节点id

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_18

 Redis-cluster高可用集群部署_redis_19

分配方式有两种:

一种是所有节点共同承担一部分给要分配的节点。输入all

第二种是有某一个或多个节点承担,输入节点ID回车输入多个节点。

Redis-cluster高可用集群部署_redis集群_20

你确定要执行重新分配的计划?

Redis-cluster高可用集群部署_Redis-cluster高可用集群部署_21Redis-cluster高可用集群部署_redis_22


登录查看之前输入的key是否还存在:

 Redis-cluster高可用集群部署_redis集群_23

删除某一节点:

删除某一个节点,此节点必须是空的,可以利用重新分配,迁移走hash槽。

399 槽位。

Redis-cluster高可用集群部署_redis_24


Redis-cluster高可用集群部署_redis集群_25

删除节点:

redis-cli -a 1qaz@WSX --cluster del-node 127.0.0.1:6379 5cb0984395b8a6f5cb67a803d91e7dcefe261d62

Redis-cluster高可用集群部署_redis集群_26

Check集群状态:

redis-cli -a 1qaz@WSX --cluster check 127.0.0.1:6379

 Redis-cluster高可用集群部署_redis集群_27