一、集群重要概念

1.Redis集群,⽆论有⼏个节点,⼀共只有16384个槽位

2.所有的槽都必须被正确分配,哪怕有1个槽不正常,整个集群都不可⽤

3.每个节点的槽的顺序不重要,重要的是槽的数量

4.HASH算法⾜够平均,⾜够随机

5.每个槽被分配到数据的概率是⼤致相当的

6.集群的⾼可⽤依赖于主从复制

7.集群节点之间槽位的数量允许在2%的误差范围内

8.集群通讯会使⽤基础端⼝号+10000的端⼝,⾃动创建的,

不是配置⽂件配置的,⽣产要注意的是防⽕墙注意要放开此端⼝

二、集群架构规划




redis bind 参数的含义 redis bind ip_redis集群配置bind ip


主机名 外网IP 内网IP

db01 10.0.0.51 172.168.1.51

db02 10.0.0.52 172.168.1.52

db03 10.0.0.53 172.168.1.53

三、集群常用命令

(一)、集群(cluster)

CLUSTER INFO 打印集群的信息

CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

(二)、节点(node)

CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的⼀份⼦。

CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。

CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。

CLUSTER SAVECONFIG 将节点的配置⽂件保存到硬盘⾥⾯。

redis-cli -c -h 10.0.0.51 -p 6381 CLUSTER FAILOVER #主动发生故障转移

(三)、槽(slot)

CLUSTER ADDSLOTS <slot> [slot ...] 将⼀个或多个槽(slot)指派(assign)给当前节点。

CLUSTER DELSLOTS <slot> [slot ...] 移除⼀个或多个槽对当前节点的指派。

CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成⼀个没有指派任何槽的节点。

CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另⼀个节点,那么先让另⼀个节点删除该槽>,然后再进⾏指派。

CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。

CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导⼊槽 slot到本节点。

CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导⼊(import)或者迁移(migrate)。

(四)、键 (key)

CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。

CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot ⽬前包含的键值对数量。

CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

四、集群部署

db01操作

#1.发送SSH认证,⽅便后⾯传输


ssh-keygen
ssh-copy-id 10.0.0.52
ssh-copy-id 10.0.0.53


#2.创建⽬录


pkill redis
mkdir -p /opt/redis_{6380,6381}/{conf,logs,pid}
mkdir -p /data/redis_{6380,6381}


#3.⽣成主节点配置⽂件


cat >/opt/redis_6380/conf/redis_6380.conf<<EOF
bind 10.0.0.51
port 6380
daemonize yes
pidfile "/opt/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_6380/"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
cluster-enabled yes      #开启集群模式
cluster-config-file nodes_6380.conf     #集群配置文件
cluster-node-timeout 15000      #连接超时时间
EOF


#4.复制主节点的配置⽂件到从节点并更改端⼝号


cd /opt/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf


#5.更改授权为redis


chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*


#6.⽣成主节点的systemd启动⽂件


cat >/usr/lib/systemd/system/redis-master.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /opt/redis_6380/conf/redis_6380.conf
--supervised systemd
ExecStop=/usr/local/bin/redis-cli -h $(ifconfig eth0|awk 'NR==2{print
$2}') -p 6380 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF


#7.复制master节点的启动⽂件给slave节点并修改端⼝号


cd /usr/lib/systemd/system/
cp redis-master.service redis-slave.service
sed -i 's#6380#6381#g' redis-slave.service


#8.重载并启动集群节点


systemctl daemon-reload
systemctl start redis-master
systemctl start redis-slave
ps -ef|grep redis


#9.把创建好的⽬录和启动⽂件发送给db02和db03


rsync -avz /opt/redis_638* 10.0.0.52:/opt/
rsync -avz /opt/redis_638* 10.0.0.53:/opt/
rsync -avz /usr/lib/systemd/system/redis-*.service 10.0.0.52:/usr/lib/systemd/system/
rsync -avz /usr/lib/systemd/system/redis-*.service 10.0.0.53:/usr/lib/systemd/system/


(二)、db02操作

替换db01发送过来的⽂件并修改IP地址

停止redis进程


pkill redis


修改配置文件


find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
cd /usr/lib/systemd/system/
sed -i 's#51#52#g' redis-*.service


授权信息


mkdir –p /data/redis_{6380,6381}
chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*


启动服务


systemctl daemon-reload
systemctl start redis-master
systemctl start redis-slave


检查启动是否成功


ps -ef|grep redis


(三)、db03的操作

替换db01发送过来的⽂件并修改IP地址

停止redis进程


pkill redis


修改配置文件


find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
cd /usr/lib/systemd/system/
sed -i 's#51#53#g' redis-*.service


授权信息


mkdir –p /data/redis_{6380,6381}
chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*


启动服务


systemctl daemon-reload
systemctl start redis-master
systemctl start redis-slave


检查启动是否成功


ps -ef|grep redis


(四)、手动部署集群

1、集群⼿动发现节点

发现节点


redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381


查看节点信息


redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES


2、集群⼿动分配槽位

槽位规划

db01:6380 5461 0-5460

db02:6380 5461 5461-10921

db03:6380 5462 10922-16383

3、分配槽位


redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS {10922..16383}


4、查看集群状态

查看集群节点信息


redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES


查看集群信息


redis-cli -h 10.0.0.51 -p 6380 CLUSTER INFO


5、⼿动分配复制关系

1、先获取集群节点信息复制到一个文本中


redis-cli -h 10.0.0.52 -p 6381 CLUSTER nodes


2、在文本中过滤删除不必要的信息

6380的ID 10.0.0.51

6380的ID 10.0.0.53

6380的ID 10.0.0.52

3、.画集群架构图


redis bind 参数的含义 redis bind ip_redis集群配置bind ip


4、配置复制关系


redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE db02的6380的ID
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE db03的6380的ID
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE db01的6380的ID


5、检查复制关系


redis-cli -h 10.0.0.51 -p 6381 CLUSTER NODES


(五)、集群写入数据

1、尝试插⼊⼀条数据


redis bind 参数的含义 redis bind ip_redis_03


目前现象:

1.在db01的6380上插⼊数据提示错误

2.报错提示应该移动到db03的6380上

3.根据提示在db03的6380上执⾏相同的命令可以写⼊成功

4.db01的6380有的数据可以写⼊,有的不⾏

5.使⽤-c参数后,可以正常写⼊命令,并且由⽬标节点返回信息

问题原因

因为集群模式有ASK规则,加⼊-c参数后,

会⾃动跳转到⽬标节点处理并由⽬标节点返回信息。


redis bind 参数的含义 redis bind ip_redis bind 参数的含义_04


(五)、自动部署集群

方法一:使用ruby工具

1、安装ruby包管理工具


yum install -y rubygems


2、配置gem源,并安装驱动


gem sources -a Index of /rubygems/
gem sources --remove your community gem host
gem install redis -v 3.3.3


3、还原集群环境


redis-cli -c -h 10.0.0.51 -p 6380 flushall
redis-cli -c -h 10.0.0.52 -p 6380 flushall
redis-cli -c -h 10.0.0.53 -p 6380 flushall
redis-cli -h 10.0.0.51 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.51 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6381 CLUSTER RESET


4、自动部署redis集群


cd /opt/redis/src/
./redis-trib.rb create --replicas 1 10.0.0.51:6380 10.0.0.52:6380 10.0.0.53:6380 10.0.0.51:6381 10.0.0.52:6381 10.0.0.53:6381


redis-trib.rb #执行脚本

--replicas #每个主节点创建一个副本

主节点IP地址写在前,从节点写在后

方法二:使用自带命令

1、还原集群状态


redis-cli -c -h 10.0.0.51 -p 6380 flushall
redis-cli -c -h 10.0.0.52 -p 6380 flushall
redis-cli -c -h 10.0.0.53 -p 6380 flushall
redis-cli -h 10.0.0.51 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6380 CLUSTER RESET
redis-cli -h 10.0.0.51 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.52 -p 6381 CLUSTER RESET
redis-cli -h 10.0.0.53 -p 6381 CLUSTER RESET


2、自动部署redis集群


redis-cli --cluster create 10.0.0.51:6380 10.0.0.52:6380 10.0.0.53:6380 10.0.0.51:6381 10.0.0.52:6381 10.0.0.53:6381 --cluster-replicas 1


redis-cli #命令

--cluster #集群模式

create #创建

主节点写在前,写完后写从节点

--cluster-replicas #每个从节点创建一个副本

3、检查集群


redis-cli --cluster info 10.0.0.51:6380