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.gzcd 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 --versionredis-cli 5.0.13
三台主机两个redis配置文件和数据目录:
mkdir data_6379mkdir 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.0protected-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.0port 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,创建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意味着我们希望为每个创建的主节点创建一个副本.
查看集群状态信息:
[root@node2 ~]# redis-cli -c -a 1qaz@WSX127.0.0.1:6379> CLUSTER info
查看集群节点信息:
[root@node2 ~]# redis-cli -c -a 1qaz@WSX127.0.0.1:6379> CLUSTER NODES
测试
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@WSXWarning: 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"
登录master的slave查询:
[root@master ~]# redis-cli -c -a 1qaz@WSX -h 10.40.42.103 -p 6389Warning: 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集群只有1个数据库:
测试验证:只有select 0可以,其他select都是错的。
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集群,需要指明集群中的一个节点。
查看新增节点的状态信息:
测试连接6399节点:
官网:新节点没有分配槽位,是不存储数据的。
测试结果:可以查询数据,但是不存储数据。
官网说明:
添加新节点作为副本集:
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作为主节点。
报错:
注意:指定集群中的随机节点不成功,测试好几个节点都一样,登录集群看不到新增的节点。
手动指定新节点作为slave复制某个master:
CLUSTER REPLICATE b6b2e45b5983a98e82f813c47821904d3259bff6hash槽冲分配:
redis-cli -a 1qaz@WSX --cluster add-node 10.40.42.105:6399 127.0.0.1:6379默认新增的节点为master:
分配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
分配方式有两种:
一种是所有节点共同承担一部分给要分配的节点。输入all
第二种是有某一个或多个节点承担,输入节点ID回车输入多个节点。
你确定要执行重新分配的计划?
登录查看之前输入的key是否还存在:
删除某一节点:
删除某一个节点,此节点必须是空的,可以利用重新分配,迁移走hash槽。
399 槽位。
删除节点:
redis-cli -a 1qaz@WSX --cluster del-node 127.0.0.1:6379 5cb0984395b8a6f5cb67a803d91e7dcefe261d62Check集群状态:
redis-cli -a 1qaz@WSX --cluster check 127.0.0.1:6379