开始之前你要知道的一些事情
两个概念
高可用:24小时对外提供服务
高并发 同一时间段能处理的请求数
中心化和去中心化
中心化
意思是所有的节点都依赖于同一个主节点,redis 的主从复制就是这种
缺点:
- 1、中心挂了,服务就挂了
- 2、中心处理数据的能力有限,不能把节点性能发挥到最大
特点:
- 就是一个路由作用
去中心化
特点
- 去掉路由,谁都可以来路由,
redis 集群的特征
以上通俗的讲就是 - 中心化:几个经过认证的嘉宾在‘讲话’,所有其他人在听。
- 去中心化:每个人都可以‘讲话’,每个人都可以选择听或者讲。
Redis集群的执行大致流程分析
哈希槽说明
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。
执行流程分析
假如redis集群里面能存放90个key,那么redis集群把90key平分到3个主机
redis对每个主机里面30个存储位置都编号,当应用连接到主机1上面时,应该发送一个写的命令
主机使用crc16算出槽号
如果槽号在1-30 可以直接操作主机1
如果槽号在31-60那么redis会转发到主机2
如果应该再发一个命令set age 22
那么主机2使用crc16再算槽号再转发
具体搭建过程
官方文档:http://redis.cn/topics/cluster-tutorial.html
机器编号 | ip | port |
---|---|---|
1 | ip | 7000 |
2 | ip | 7001 |
3 | ip | 7002 |
4 | ip | 7003 |
5 | ip | 7004 |
6 | ip | 7005 |
修改6个redis的配置文件
# 创建文件夹
mkdir -p /root/redis-cluster/redis-1
# 复制一个redis.conf到redis-1里面
cp /root/myredis/redis.conf /root/redis-cluster/redis-1
# 更改配置文件
vim /root/redis-cluster/redis-1/redis.conf
# 复制一个redis-server到redis-cluster中
cp /usr/local/redis/bin/redis-server /root/redis-cluster
具体更改的地方如下
aop可开可不开,按实际需求
复制5个,更改其他 配置文件,依次为:7001、7002、7003、7004、7005
启动六个redis
连接
创建集群的脚本是使用Ruby写的,还要安装Ruby的运行环境,不推荐 ,推荐使用 docker 搭建
# 查看创建集群的脚本
ls /usr/local/src/redis/src/
使用Docker 搭建集群
# 安装Docker
yum install docker
# 启动docker
systemctl start docker
#拉取镜像
docker pull inem0o/redis-trib
执行脚本
# --net host:配置docker的网络模式, 使容器和宿主机共用同一个ip
# 前面三个为主机,后面是三个为从机
docker run -it --net host inem0o/redis-trib create --replicas 1 ip:7000 ip:7001 ip:7002 ip:7003 ip:7004 ip:7005
配置成功之后
连接测试
# -c表示连接集群,-h:指定ip,-p:指定端口
./redis-cli -c -h 127.0.0.1 -p 7000
当你进行 set 操作时,redis 集群会根据 crc16 算法算出一个哈希槽(这里就是5798),然后把这个 key 存到 这个哈希槽 中,而此时这个哈希槽在 7001 这个主机上,所以这里自动跳转到了这个主机
到此搭建完成