Redis集群介绍
Redis集群是一个提供在多个Redis节点间共享数据的程序集。
Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下,可能会导致不可预料的错误。
Redis集群通过分区来提供一定程度的可用性。在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。
Redis集群的优势:
- 自动分割数据到不同的节点上。
- 整个集群的部分节点失败或者不可达的情况下,能够继续处理命令。
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节点从集群中移除即可.
由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
Redis集群部署
1.实验环境
server1(172.25.40.1)已安装redis
2.集群搭建
首先我们需要一些运行在 集群模式的Redis实例。这意味着集群并不是由一些普通的Redis实例组成的,集群模式需要通过配置启用,开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。
部署redis实例:
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
手动创建
创建一个新目录, 并创建六个以端口号为名字的子目录, 稍后将在每个目录中运行一个 Redis 实例
[root@server1 redis]# cd /usr/local/
[root@server1 local]# mkdir redis_cluster
[root@server1 local]# cd redis_cluster/
[root@server1 redis_cluster]# mkdir 700{1..6}
在目录7001到7006中,各创建一个redis.conf,将配置中的端口号从 7001 改为与目录名相同的号码
[root@server1 redis_cluster]# cd 7001
[root@server1 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
将实例的配置文件分别cp到7002到7006的实例配置目录下,并且修改将其中的port改为相应的端口及其存放路径
[root@server1 7001]# cp redis.conf ../7002
[root@server1 7001]# cp redis.conf ../7003
[root@server1 7001]# cp redis.conf ../7004
[root@server1 7001]# cp redis.conf ../7005
[root@server1 7001]# cp redis.conf ../7006
选项说明:
- cluster-enabled 用于开启实例的集群模式;
- cluster-conf-file 设定了保存节点配置文件的路径, 默认为 nodes.conf.节点配置文件由 Redis 集群在启动时创建, 并在有需要时自动进行更新,无须人为修改。
开启实例
[root@server1 7001]# redis-server redis.conf
看到相应的配置文件出现,并且查看端口端口也出现
7001-7006实例开启后,查看进程及其端口
搭建集群
现在已经有六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成:
redis-trib 位于 Redis 源码的 src 目录中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。
创建redis-trib.rb环境,要将Redis 源码的 src 文件中的该命令的配置文件复制到系统命令的环境下,才能使用该命令
安装ruby
[root@server1 src]# yum install -y ruby
搭建集群(编写节点配置文件)
[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
参数说明:
- -cluster-replicas 1 : 为集群中的每个主节点创建一个从节点。
后面的参数则是这个集群实例的地址列表,3个master3个slave;
redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:
由上图可知:
master7001对应的slave为7006;
master7002对应的slave为7004;
master7003对应的slave为7005。
测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli , 接下来以redis-cli 为例来进行演示:
[root@server1 src]# redis-cli --cluster info 127.0.0.1:7001
[root@server1 src]# redis-cli -c -p 7001
127.0.0.1:7001> info
在slave节点7004写入数据,数据存储到7002
[root@server1 7004]# redis-cli -c -p 7004
127.0.0.1:7004> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
(nil)
127.0.0.1:7002> set name haha
OK
在7002目录下查看相应的文件发现数据已经写到7002
将master7002关闭,对应的slave7004成为master
[root@server1 7004]# redis-cli -p 7002 shutdown
[root@server1 7004]# redis-cli --cluster info 127.0.0.1:7004
[root@server1 7002]# redis-cli --cluster info 127.0.0.1:7004
脚本创建集群节点
使用脚本创建的集群节点,那么默认端口是从30001开始。
关闭上面手动创建的节点,删除创建的目录
进入目录/root/redis-5.0.3/utils/create-cluster
使用该目录下的create-cluster命令创建集群
./create-cluster start
redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1
检查集群
redis-cli --cluster check 127.0.0.1:30001
主从节点的切换
关闭30001,30005成为master。
任何节点仍可获取到数据
将30005也关闭,即此时30001与30005一对主从都关闭,数据缺损,则任何节点都无法获取到数据
再次将各节点打开,又可以获取到数据