Redis-cluster高可用集群部署

炒沙作縻终不饱,缕冰文章费工巧。这篇文章主要讲述Redis-cluster高可用集群部署相关的知识,希望能为你提供帮助。
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 机制),内部使用二进制协议优化传输速度和带宽。
【Redis-cluster高可用集群部署】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-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-cluster高可用集群部署

文章图片

查看集群状态信息:
[root@node2 ~]# redis-cli -c -a 1qaz@WSX
127.0.0.1:6379> CLUSTER info

 
Redis-cluster高可用集群部署

文章图片

查看集群节点信息:
[root@node2 ~]# redis-cli -c -a 1qaz@WSX
127.0.0.1:6379> CLUSTER NODES

 
Redis-cluster高可用集群部署

文章图片

测试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高可用集群部署

文章图片
 
登录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集群只有1个数据库:
测试验证:只有select 0可以,其他select都是错的。
 
Redis-cluster高可用集群部署

文章图片

 
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-cluster高可用集群部署

文章图片

测试连接6399节点:
官网:新节点没有分配槽位,是不存储数据的。
测试结果:可以查询数据,但是不存储数据。
Redis-cluster高可用集群部署

文章图片

官网说明:
 
Redis-cluster高可用集群部署

文章图片

添加新节点作为副本集: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高可用集群部署

文章图片

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

Redis-cluster高可用集群部署

文章图片

hash槽冲分配:
redis-cli -a 1qaz@WSX --cluster add-node 10.40.42.105:6399 127.0.0.1:6379

Redis-cluster高可用集群部署

文章图片

默认新增的节点为master:
Redis-cluster高可用集群部署

文章图片

分配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高可用集群部署

文章图片

?分配方式有两种:
一种是所有节点共同承担一部分给要分配的节点。输入all
第二种是有某一个或多个节点承担,输入节点ID回车输入多个节点。?
Redis-cluster高可用集群部署

文章图片

你确定要执行重新分配的计划?
Redis-cluster高可用集群部署

文章图片
Redis-cluster高可用集群部署

文章图片



登录查看之前输入的key是否还存在:
 
Redis-cluster高可用集群部署

文章图片

删除某一节点:?删除某一个节点,此节点必须是空的,可以利用重新分配,迁移走hash槽。
399 槽位。?
Redis-cluster高可用集群部署

文章图片



Redis-cluster高可用集群部署

文章图片

删除节点:

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

Redis-cluster高可用集群部署

文章图片

Check集群状态:
redis-cli -a 1qaz@WSX --cluster check 127.0.0.1:6379

 
Redis-cluster高可用集群部署

文章图片

 
 

    推荐阅读