官方cluster分区
Redis3.0之后,Redis官方提供了完整的集群解决方案。
方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。
称为RedisCluster。
Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持
Redis5.0可以直接使用Redis-cli进行集群的创建和管理
去中心化
RedisCluster由多个Redis节点组构成,是一个P2P无中心节点的集群架构,依靠Gossip协议传播的集
群。
Gossip协议
Gossip协议是一个通信协议,一种传播消息的方式。
起源于:病毒传播
Gossip协议基本思想就是:
一个节点周期性(每秒)随机选择一些节点,并把信息传递给这些节点。
这些收到信息的节点接下来会做同样的事情,即把这些信息传递给其他一些随机选择的节点
信息会周期性的传递给N个目标节点。这个N被称为fanout(扇出)
gossip协议包含多种消息,包括meet、ping、pong、fail、publish等等
通过gossip协议,cluster可以提供集群间状态同步更新、选举自助failover等重要的集群功能。
slot
redis-cluster把所有的物理节点映射到[0-16383]个slot上,基本上采用平均分配和连续分配的方式。
比如上图中有5个主节点,这样在RedisCluster创建时,slot槽可分配:
RedisCluster的优势
高性能
Redis Cluster 的性能与单节点部署是同级别的。
多主节点、负载均衡、读写分离
高可用
Redis Cluster 支持标准的 主从复制配置来保障高可用和高可靠。
failover
Redis Cluster 也实现了一个类似 Raft 的共识方式,来保障整个集群的可用性。
易扩展
向 Redis Cluster 中添加新节点,或者移除节点,都是透明的,不需要停机。
水平、垂直方向都非常容易扩展。
数据分区,海量数据,数据存储
原生
部署 Redis Cluster 不需要其他的代理或者工具,而且 Redis Cluster 和单机 Redis 几乎完全兼
容。
集群搭建
开放端口
# (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=26379/tcp --permanent
# 重新载入
firewall-cmd --reload
或者关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
规则
192.168.181.128-6379:Mater1
192.168.181.129-6379:Slaver1
192.168.181.130-6379:Mater2
192.168.181.131-6379:Slaver2
192.168.181.134-6379:Mater3
192.168.181.135-6379:Slaver3
下面安装同上,但创建集群时不加入,手动使用命令加入
192.168.181.136-6379:Mater4
192.168.181.137-6379:Slaver4
下载 解压
/usr/local/redis
wget https://download.redis.io/releases/redis-5.0.9.tar.gz
tar -zxvf redis-5.0.9.tar.gz
cd redis-5.0.9
创建目录
mkdir /var/redis-cluster
编译安装
make install PREFIX=/var/redis-cluster
cp redis.conf /var/redis-cluster/bin
cd /var/redis-cluster/bin/
vim redis.conf
- 修改
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
将`daemonize`由`no`改为`yes` 后台运行
daemonize yes
# 是否开启保护模式,由yes该为no
protected-mode no
# 打开
cluster-enable yes
全部启动
./redis-server redis.conf
ps -ef | grep redis
创建Redis集群(创建时Redis里不要有数据)
cluster-replicas : 1 表示1从机 前三个为主
192.168.181.128-6379:Mater1
192.168.181.129-6379:Slaver1
192.168.181.130-6379:Mater2
192.168.181.131-6379:Slaver2
192.168.181.134-6379:Mater3
192.168.181.135-6379:Slaver3
进入任意一个bin上当./redis-cli 来创建
./redis-cli --cluster create 192.168.181.128:6379 192.168.181.130:6379 192.168.181.134:6379 192.168.181.129:6379 192.168.181.131:6379 192.168.181.135:6379 --cluster-replicas 1
Can I set the above configuration? (type ‘yes’ to accept): 输入yes
./redis-cli --cluster create 192.168.181.128:6379 192.168.181.130:6379 192.168.181.134:6379 192.168.181.129:6379 192.168.181.131:6379 192.168.181.135:6379 --cluster-replicas 1
Performing hash slots allocation on 6 nodes…
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.181.131:6379 to 192.168.181.128:6379
Adding replica 192.168.181.135:6379 to 192.168.181.130:6379
Adding replica 192.168.181.129:6379 to 192.168.181.134:6379
M: 080782aa3032a569f6006e40ecbfb88ab8f39a08 192.168.181.128:6379
slots:[0-5460] (5461 slots) master
M: 0a0308f93912de51ae91a1000953dc1434cf0729 192.168.181.130:6379
slots:[5461-10922] (5462 slots) master
M: f42985b207fbb0764551a460dccca92608176265 192.168.181.134:6379
slots:[10923-16383] (5461 slots) master
S: 370bf317f89f37aead51ca52ad3c493e321b151e 192.168.181.129:6379
replicates f42985b207fbb0764551a460dccca92608176265
S: 7792153f7b8b3030d2bb81178a575fe585fdb175 192.168.181.131:6379
replicates 080782aa3032a569f6006e40ecbfb88ab8f39a08
S: ae74392a2636351b2332c4c457cb5eff83c578b7 192.168.181.135:6379
replicates 0a0308f93912de51ae91a1000953dc1434cf0729
Can I set the above configuration? (type ‘yes’ to accept): yesNodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
…Performing Cluster Check (using node 192.168.181.128:6379)
M: 080782aa3032a569f6006e40ecbfb88ab8f39a08 192.168.181.128:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: ae74392a2636351b2332c4c457cb5eff83c578b7 192.168.181.135:6379
slots: (0 slots) slave
replicates 0a0308f93912de51ae91a1000953dc1434cf0729
M: f42985b207fbb0764551a460dccca92608176265 192.168.181.134:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 0a0308f93912de51ae91a1000953dc1434cf0729 192.168.181.130:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 370bf317f89f37aead51ca52ad3c493e321b151e 192.168.181.129:6379
slots: (0 slots) slave
replicates f42985b207fbb0764551a460dccca92608176265
S: 7792153f7b8b3030d2bb81178a575fe585fdb175 192.168.181.131:6379
slots: (0 slots) slave
replicates 080782aa3032a569f6006e40ecbfb88ab8f39a08
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
[root@liunux128 bin]#
查看nodes文件
连接 命令客户端连接集群
./redis-cli -h 192.168.181.128 -p 6379 -c
注意:-c 表示是以redis集群方式进行连接
查看集群的命令
查看集群状态
cluster info
查看集群中的节点:
cluster nodes
扩容
启动136节点
只有他自己
添加新节点
## 添加主节点
./redis-cli --cluster add-node 192.168.181.136:6379 192.168.181.128:6379
第一次节点为新增的节点 第二个节点为集群中的主节点
新节点136现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:
- 新节点没有包含任何数据, 因为它没有包含任何哈希槽.
- 尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中。
将集群中的某些哈希桶移动到新节点里面, 新节点就会成为真正的主节点了
hash槽重新分配(数据迁移)
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
./redis-cli --cluster reshard 192.168.181.136:6379
因为我们增加136为主节点后,一共存在四个主节点,为了平均分配我们需要给136分配16384除以4等于4096个节点,所以我们输入4096,按enter继续
4096个slot给那个node节点
输入yes
添加一个从节点137
启动查看只有137自己
将137将为136的从节点
从cluster中查看136的id
7579075aa56246de6c32d3918807c25165c2b01f
命令
./redis-cli --cluster add-node 新节点的ip和端口 旧节点ip和端口 --cluster-slave –
cluster-master-id 主节点id
./redis-cli --cluster add-node 192.168.181.137:6379 192.168.181.136:6379 --cluster-slave --cluster-master-id 7579075aa56246de6c32d3918807c25165c2b01f
注意:如果原来该结点在集群中的配置信息已经生成到cluster-config-file指定的配置文件中(如果
cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check
with CLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,删除后再执行./redis-cli --cluster add-node 指令
缩容
- 命令格式
/redis-cli --cluster del-node ip:prot nodeId
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。
删除已经占有hash槽的结点会失败,报错如下:
[ERR] Node xxx:6379 is not empty! Reshard data away and try again.
需要将该结点占用的hash槽分配出去
使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这节点的数据重新分片到其他主节点上.
删除从节点137
./redis-cli --cluster del-node 192.168.181.137:6379 057d6ede56a81d063997446dd74c478be43c648f
删除成功
从137主机上查看redis已经关掉了,没有进程了
删除主节点 136
- 先把136上的slots分配到其他主节点上
./redis-cli --cluster reshard 192.168.181.136:6379
./redis-cli --cluster del-node 192.168.181.136:6379 7579075aa56246de6c32d3918807c25165c2b01f
- reshard
可能会多次
- 下面删除
./redis-cli --cluster del-node 192.168.181.136:6379 7579075aa56246de6c32d3918807c25165c2b01f
集群中已经没有136