什么是集群
Redis 集群实现了对 Redi s的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
主从复制的目的是为了减轻 Redis 服务器的 CPU 压力, 可以保证数据同步, 为了可以保证 Redis 的高可用, 容灾能力, 一般在每个节点使用主从 + 哨兵
Redis 集群提供了以下好处
- 实现扩容
- 分摊压力
- 无中心配置相对简单
Redis 集群的不足
- 多键操作是不被支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持。
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
如果缓存数据量大, 也会有内存的压力, 这里使用的Redis4.0版本, 其它版本可能会有差异
安装ruby环境
- 安装方式一 : 在线安装[ 并不推荐,因为有可能存在下载失败的情况 ]
yum install ruby
yum install rubygems
- 安装方式二 : 线下安装
- 蓝奏云 : https://yonxin.lanzous.com/b00zjd8fg
密码 : cqq6
- 将下载好的文件解压完后都拷贝包到虚拟机opt目录下
- 这里需要注意的是, 在安装 Ruby 之前必须装 C、C++ 语言的编译环境, Ruby是使用 C语言 编写的
- 安装教程 : 链接地址
- 开始安装ruby环境
- 按照依赖安装各个rpm包14个 , 安装命令
rpm -Uvh *.rpm --nodeps --force
- 如图 :
- 到 opt目录下在安装
redis-3.2.0.gem
gem install --local redis-3.2.0.gem
- 如图
以上操作, 搭建集群的环境基本就准备好了
删除之前的redis的数据[ 如果不删集群一定失败 rdb 和 aof ] [ 如果没有则可以不删]
开始集群的搭建
- 准备 6 个 redis 实例的配置文件
vim redis-6379.conf
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump-6379.rdb
appendonly no
logfile ""
#打开集群
cluster-enabled yes
#设定节点配置文件
cluster-config-file nodes-6379.conf
#设置节点失联时间,超过该时间[毫秒]集群自动进行主从更换
cluster-node-timeout 15000
2. 复制生成其他节点的配置文件:6380/6381/6389/6390/6391
[root@centos myredis]#
cp redis-6379.conf redis-6380.conf
[root@centos myredis]#cp redis-6379.conf redis-6381.conf
[root@centos myredis]#cp redis-6379.conf redis-6390.conf
[root@centos myredis]#cp redis-6379.conf redis-6391.conf
[root@centos myredis]#cp redis-6379.conf redis-6389.conf
[root@centos myredis]#
- 修改所有的配置文件中的端口号和文件名端口号一致,
:%s/6379/6380/g
- 启动6个redis 服务
将六个节点合成一个集群
- 组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常。
- 切换到redis解压的目录src下,
redis-trib.rb
可以对集群节点进行合并
cd /opt/redis-4.0.0/src
./redis-trib.rb create --replicas 1 192.168.230.200:6379 192.168.230.200:6380 192.168.230.200:6381 192.168.230.200:6389 192.168.230.200:6390 192.168.230.200:6391
- 如图
- 显示分配的槽个数
显示以上内容基本Redis集群环境就构建成功了!
连接集群
- 使用 -c 采用集群策略连接,设置数据会自动切换到相应的写主机
redis-cli -c -p 6379
- 一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个
- 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
- 当设置值后,对自动分配对应的槽 , 如图
集群中录入值
- 不在一个slot下的键值,默认是不支持多键操作, 是不能使用
mget
,mset
等多键操作, 否则会出错。 - 如下图
- 可以通过
{}
来定义组的概念,从而使key中{}内相同
内容的键值对放到一个slot中去。 - 如下图
查询集群中的值
- 计算键 key 应该被放置在哪个槽上。
-
CLUSTER KEYSLOT key
- 如图
- 返回槽 slot 目前包含的键值对数量。
-
CLUSTER COUNTKEYSINSLOT <slot>
- 如图
- 查看集群或节点的状态
-
cluster info/nodes
- 如图
- 主从的自动切换,必须保证节点中已经保存数据了
故障恢复
- 当主机宕机,从机会自动上位
- 主机回来后会作为上位的从机的slave
- 如果一个节点上的主从全部宕机,整个集群环境不可用,当节点主从重启后集群环境扔可以使用
- 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉
- 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储。
感谢阅读, 以上就是对 Redis 集群的搭建过程了, 如有什么更好的建议或方法 ,可以留言或进群交流. 各种疑难杂症QQ交流群:1101584918,欢迎大家加入。