基于redis6.0.6

槽位:一个集群里面有16384个槽位

hash分槽算法足够随机和平均,只要有一个槽位有问题或者没分配,整个集群都不能使用

集群配置文件的一些项目


### 绑定的主机地址
bind 192.168.164.128
###监听端口
port 6382

###以守护进程模式启动
daemonize yes

###设置进程锁文件
pidfile "/opt/redis_cluster/redis_6382/pid/redis_6382.pid"
  
###日志文件保存的位置
logfile "/opt/redis_cluster/redis_6382/logs/redis_6382.log"

###指定本地rdb持久化文件名
dbfilename redis_6382.rdb

###指定本地rdb文件路径
dir "/data/redis_cluster/redis_6382"

# 集群模式默认是关闭的,以集群模式启动
cluster-enabled yes

# 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息;
# 此文件不需要手动配置,由Redis生成并更新;
# 每个Redis集群节点/实例需要一个单独的配置文件,同一宿主机系统中不同实例的配置文件名称不能冲突
cluster-config-file nodes_6382.conf

# 集群节点超时时间,单位毫秒,集群内部多种通信时间限制以此超时时间倍数为准
cluster-node-timeout 15000

各节点创建配置文件

# 在db01,db02,db03三台机器上
mkdir -p /opt/redis_cluster/redis_{6383,6382}/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{6383,6382}

# 在db01(192.168.164.128)上
vim /opt/redis_cluster/redis_6382/conf/redis_6382.conf # 粘贴上面的配置文件内容

cp /opt/redis_cluster/redis_6382/conf/redis_6382.conf /opt/redis_cluster/redis_6383/conf/redis_6383.conf

# 把/redis_6383.conf文件里面的6382改成6383
sed -i 's/6382/6383/g' /opt/redis_cluster/redis_6383/conf/redis_6383.conf

# 把db01上的配置文件传到db02和db03
rsync -avz /opt/redis_cluster/redis_{6383,6382} db02:/opt/redis_cluster/
rsync -avz /opt/redis_cluster/redis_{6383,6382} db03:/opt/redis_cluster/

# 在db02(192.168.164.129)上,把绑定的ip地址改成自己的地址
sed -i '/bind/s/128/129/' /opt/redis_cluster/redis_6383/conf/redis_6383.conf
sed -i '/bind/s/128/129/' /opt/redis_cluster/redis_6382/conf/redis_6382.conf

# 在db03(192.168.164.130)上,也要把绑定的ip地址改成自己的地址

# 在db01,db02,db03三台机器上
redis-server /opt/redis_cluster/redis_6382/conf/redis_6382.conf
redis-server /opt/redis_cluster/redis_6383/conf/redis_6383.conf

# 在任意一个机器上,设置主从复制关系
redis-cli -h db01 -p 6383 cluster replicate c7a4dcf697b9123e7129610fa94507bf9b0ccfc2 # db02的6382
redis-cli -h db02 -p 6383 cluster replicate 51b76f95eea654fd4d5c1c77ef4397294ff70d79 # db03的6382
redis-cli -h db03 -p 6383 cluster replicate e97e27f9566086611696afd99d424c34502aeeb9 # db01的6382

集群命令

# 登录到某个节点
redis-cli -h db01 -p 6382
# 查看集群的所有节点
CLUSTER NODES 
# 发现集群节点(对应的端口需要开放,否则,发现不了)
CLuster meet 192.168.164.129 6382
# 查看集群信息
CLUSTER info

分配槽位

redis-cli -h db01 -p 6382 cluster addslots {0..5461}
redis-cli -h db02 -p 6382 cluster addslots {5462..10922}
redis-cli -h db03 -p 6382 cluster addslots {10923..16383}

集群故障转移

[root@localhost ~]# redis-cli -h db02 -p 6383
db02:6383> set k2 v2
(error) MOVED 449 192.168.164.128:6382
db02:6383> 
# -c表示以集群模式登录,当写入数据落到的槽位不在登录机器上时,会自动调整到那台机器上,并写入数据
[root@localhost ~]# redis-cli -h db02 -p 6383 -c  
db02:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.164.128:6382
OK
192.168.164.128:6382> 

用redis-cli --cluster自动创建集群

# 关闭redis
redis-cli -h db01 -p 6382 shutdown
redis-cli -h db01 -p 6383 shutdown

redis-cli -h db03 -p 6383 shutdown
redis-cli -h db03 -p 6382 shutdown
redis-cli -h db02 -p 6382 shutdown
redis-cli -h db02 -p 6383 shutdown

# 把手动配置集群的数据删掉
rm -rf /data/redis_cluster/redis_{6383,6382}/*
# 重新启动
redis-server /opt/redis_cluster/redis_6382/conf/redis_6382.conf
redis-server /opt/redis_cluster/redis_6383/conf/redis_6383.conf

# 自动创建集群
redis-cli --cluster create 192.168.164.128:6382 192.168.164.129:6382 192.168.164.130:6382 192.168.164.128:6383 192.168.164.129:6383 192.168.164.130:6383  --cluster-replicas 1 
# 自动生成的主从关系
Adding replica 192.168.164.129:6383 to 192.168.164.128:6382
Adding replica 192.168.164.130:6383 to 192.168.164.129:6382
Adding replica 192.168.164.128:6383 to 192.168.164.130:6382
# check命令后面的参数是任意一个节点,查看集群的状态
redis-cli --cluster check 192.168.164.128:6382
# rebalance查看集群负载是否平均,后面的参数是任意一个节点,
redis-cli --cluster rebalance 192.168.164.128:6382

扩容

# 在db04(192.168.164.131)机器上
mkdir -p /opt/redis_cluster/redis_{6383,6382}/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{6383,6382}

# 把db01(192.168.164.128)上的配置文件传到db04
rsync -avz /opt/redis_cluster/redis_{6383,6382} db04:/opt/redis_cluster/

# 在db04(192.168.164.131)上,把绑定的ip地址改成自己的地址
sed -i '/bind/s/128/131/' /opt/redis_cluster/redis_6383/conf/redis_6383.conf
sed -i '/bind/s/128/131/' /opt/redis_cluster/redis_6382/conf/redis_6382.conf

# 在db04机器上
redis-server /opt/redis_cluster/redis_6382/conf/redis_6382.conf
redis-server /opt/redis_cluster/redis_6383/conf/redis_6383.conf

# 发现节点(以下两种方式都可以,建议用add-node,它会做很多检查)
CLUSTER MEET 192.168.164.131 6382 # 用已存在的节点和新节点相互meet,在任意一个节点都可以
# add-node       new_host:new_port existing_host:existing_port # add-node的用法
redis-cli --cluster add-node 192.168.164.131:6383 192.168.164.131:6382

# 重新分配槽位,reshard        host:port
redis-cli --cluster reshard 192.168.164.131:6382

# 在任意一个机器上,设置主从复制关系(之前搭建集群时,自动生成的主从关系)
Adding replica 192.168.164.129:6383 to 192.168.164.128:6382
Adding replica 192.168.164.130:6383 to 192.168.164.129:6382
Adding replica 192.168.164.128:6383 to 192.168.164.130:6382

redis-cli -h db04 -p 6383 cluster replicate 480082092241351699bba05bb2840e6d3b6450b0 # db03的6382
redis-cli -h db01 -p 6383 cluster replicate 600dd659bc9784c5a6c11419dd1432443cd066dd # db04的6382

缩容

# 重新分配槽位,reshard        host:port
redis-cli --cluster reshard 192.168.164.131:6382 # 把db04 6382的槽位分给db01,db02,db03的6382

# 删除db04 6382和6383,需要带上uuid, del-node       host:port node_id
redis-cli --cluster del-node 192.168.164.131:6382 600dd659bc9784c5a6c11419dd1432443cd066dd
redis-cli --cluster del-node 192.168.164.131:6383 8b20d041d94876b4a89637d09acc2c2a261fb784