1.集群
集群是一组相互独立的、通过高速网络互相联通的节点,构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群就是一个独立的服务器。
集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。能在大流量访问下提供稳定的业务,集群化是存储的必然形态。
2.redis集群
Redis 集群是一个提供在多个Redis节点之间共享数据的程序集。
Redis 集群并不支持同时处理多个键的 Redis 命令,因为这需要在多个节点间移动数据,这样会降低redis集群的性能,在高负载的情况下可能会导致不可预料的错误。
Redis 集群通过分区来提供一定程度的可用性,即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
3.redis集群的优势
缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;
迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;
Redis可以使用所有机器的内存,变相扩展性能;
使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;
异步处理数据,实现快速读写。
4.redis集群的数据分片
Redis 集群没有使用一致性hash,而是引入了哈希槽的概念。
Redis 集群内置了16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽
节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点.
比如如果我想新添加个节点D,我需要从节点 A, B, C中得部分槽到D上.
如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可.
由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
1.实验环境
搭建集群的第一件事情我们需要一些运行在 集群模式的Redis实例. 这意味这集群并不是由一些普通的Redis实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了.
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
a.进入一个新目录, 并创建六个以端口号为名字的子目录, 稍后将每个目录中运行一个 Redis 实例
[root@server1 ~]# cd /usr/local/
[root@server1 local]# mkdir rediscluster
[root@server1 rediscluster]# mkdir 700{1..6}
b.在文件夹7001到7006中,各创建一个redis.conf的文件,文件的内容为示实例配置文件, 但记得将配置中的端口号从 7001 改为与文件夹名字相同的号码。
[root@server1 rediscluster]# cd 7001
[root@server1 7001]# vim redis.conf
文件编辑的内容如下:
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7001"
- cluster-enabled用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新.
开启实例:
查看:会看到相应的配置文件出现,并且查看端口端口也出现
c.将实例的配置文件分别cp到7002到7003的实例评为配置目录下并且修改将其中的7001改为相应的以目录为名的端口名及其存放路径
编辑配置文件修改相应的内容之后开启实例,7001-7006开启后查看进程及其端口显示效果如下:
现在已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。
[root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli , 接下来以redis-cli 为例来进行演示:
显示集群的信息如下:
添加一个新节点
添加新的节点的基本过程就是添加一个空的节点然后移动一些数据给它,有两种情况,添加一个主节点和添加一个从节点(添加从节点时需要将这个新的节点设置为集群中某个节点的复制)
启用7007及7008节点为新的节点,使用的配置文件同上面的实例配置文件相同,只需要修改端口即可
[root@server1 rediscluster]# pwd
/usr/local/rediscluster
[root@server1 rediscluster]# mkdir 7007 7008
[root@server1 rediscluster]# ls
7001 7002 7003 7004 7005 7006 7007 7008
[root@server1 rediscluster]# cp 7001/redis.conf 7007/
[root@server1 rediscluster]# cp 7001/redis.conf 7008/
文件编辑内容如下:
7008的配置同7007,这里不再赘述
操作完成后查看进程新节点出现显示如下:
查看新节点已经加入集群中:
为新节点添加从节点
查看:
注意:新节点现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:
1.手动分配哈希槽
再次检测查看分配的哈希槽:
发现7007分配到了指定的哈希槽
注意:因为哈希槽的数量是固定的,所以新的节点指定所分配到的哈希槽是其它主节点提供的,但是手动分配的哈希槽可能在使用时会出现问题,因此不建议使用该方式进行分配.
2.自动分配哈希槽
./redis-trib del-node 127.0.0.1:7000 ``
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。
注意:使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上.
替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据.