Redis使用去中心化分片集群
1、去中心化分片集群是什么?请简单介绍。
Redis分片集群对Redis集群进行分片,采用多主多从的方式实现Redis集群,每一个分片都是由一个Redis主机和多个从机组成,片区和片区之间是相互平行的,Redis Cluster就是Redis 3.0+版本之后官方推荐的一种分片集群实现方式,主要是基于Hash卡槽(slot)和crc16(key)算法的实现策略来实现Redis集群分片和数据跨主机转移、共享。这是一种去中心化的集群解决方案,可以实现Redis动态扩容和缩容,但是缺点就是集群环境比较复杂,搭建成本高。
2、为什么使用去中心化分片集群?
在不使用去中心化集群时,我们通常采用了主从复制+哨兵模式实现的,【主从模式】【哨兵模式】,一般采用了(一主多从)搭建Redis集群实现的,采用哨兵模式作为守护存在,一旦主节点宕机,就进行投票选举,实现自动化故障发现和转移,最大化保证集群的高可用。但是在此期间,是禁止使用写操作,同时主节点宕机就会导致数据丢失。
这时候就需要用到Redis Cluster去中心化分片集群,Redis Cluster去中心化分片集群使用Hash卡槽来确定和定位Key的读写位置,最大的优点是有利于Redis动态扩容、缩容,把宕机数据丢失的风险降到最小。
3、传统的主从哨兵集群的优缺点
缺点:
- 始终只有一个Redis主机来接收和处理写请求。
- 用户数量大的情况下数据同步效率低。
- 从节点和主节点的数据始终是同步的,存在大量冗余数据,浪费空间。
- 主从复制的读写分离原则:主机只负责写操作,子节点不能执行写操作,如果是高并发的情况下,就会导致主节点写操作的压力非常大,同时会加重同步数据到子节点的负荷,如果主节点宕机,那么就会导致大量数据同时失效。
- 主节点宕机后,哨兵模式就开始选举主节点,但是在这期间,谁也不知道主节点和子节点是谁,此时Redis就会开启保护机制,禁止写操作,直到选举出来新的主节点,这是中心化的集群实现方案,耦合度很高。
说了这么多缺点,也该说说优点了吧!
优点:
- 读写分离策略:从节点可以扩展主库节点的读能力,有效应对大并发量的读操作。
- 采用双机主备架构,能够在主库出现故障时自动进行主备切换,从库提升为主库提供服务,保证服务平稳运行。
- 开启数据持久化功能和配置合理的备份策略,能有效的解决数据误操作和数据异常丢失的问题。
- Redis Sentinel 集群部署简单。
4、Redis Cluster数据分区的简单理解。
- 对于每次读写操作的的Key值都会计算对应的卡槽数,根据计算出的卡槽数会把Key存入到卡槽区间范围包含这个卡槽数的Redis主机中,或者从包含这个Key卡槽数的卡槽范围的Redis主机中获取Key。
- Key的卡槽数计算是基于crc16算法实现的,根据每次写入/读取的Key的值不同,该算法会计算出不同的卡槽数,Key的卡槽数计算公式:
N(Key的卡槽数)=crc16(Key)%16384
- 如果写入的Key计算出的卡槽数不在当前操作的Redis主机的卡槽数范围内,那么会自动把这个Key转发到卡槽范围包含这个Key的卡槽数的Redis主机中进行写操作。
- 如果需要获取的Key计算出的卡槽数也不在当前操作的Redis主机卡槽范围内(当前操作的Redis主机中没有这个Key),那么也会自动转发到包含这个Key的卡槽数的卡槽范围的Redis主机中去获取到这个Key。
需要注意的地方:
- hash卡槽只会分配给每个片区的主节点,子节点不会分配卡槽
- 每个hash卡槽可以存放多个Key
- hash卡槽的目的是确认数据存放到哪个片区的Redis主机,实现Redis集群分摊Key,减少宕机导致数据丢失带来的意外风险。
- 每个片区的Redis主机卡槽数都对应一个范围**,多个片区之间卡槽数范围是等比分配的**(1:1,比如存在3个片区对应3个Redis主机,那么 3个Redis主机的卡槽总数分别是:16384/3。3个Redis主机的卡槽范围分别是:
第一台Redis主机:0~5460
第二台Redis主机:5461~10921
第三台Redis主机:10922~16383
Redis Cluster去中心化分片集群使用Hash卡槽来确定和定位Key的读写位置,最大的优点是有利于Redis动态扩容、缩容,把宕机数据丢失的风险降到最小。
5、Redis使用去中心化分片集群环境搭建
手上暂时没有太多空余的服务器,采用了一台服务器通过采用不同端口来区分不同的Redis节点,也方便初期搭建减少了一些因操作不数量导致的错误。
**怎么区分不同的Redis节点:**使用不同的Redis配置文件设置不一样的端口,启动不同的Redis服务,使用端口区分不同的Redis服务。
这里采用了三主三从的集群环境搭建,也就是三台主节点+三台子节点
安装Redis6.2.1【点这里】
操作环境:
Centos7
Redis 6.2.1
xshell 6
端口号分别设置成:9000,9001,9002,9003,9004,9005
5、1 复制redis.conf配置文件并编辑配置文件。
我的启动项在/usr/local/bin/下面
cd /usr/local/bin
mkdir three-myredis
cp redis.conf /usr/local/bin/
mv redis.conf redis9000.conf
使用vim编辑配置文件。
cd /
cd /usr/local/bin/three-myredis
vim redis9000.conf
建议使用vim来编辑配置文件。
vim和vi一样的操作,但是vim会把注释的内容特殊颜色标识,未注释的采用白色标识。
如果使用vim提示未找到此命令。
执行这条命令,来安装vim编辑器
yum -y install vim*
需要修改的内容:
- port 这个改成你想要设置的端口号
- 设置全部ip地址可以访问
- 开启后台运行服务
- 开启AOF
- 开启集群
- 开启集群的配置文件
- 开启集群的超时时间
== 提示进入编辑文件后,输入/ 后面跟所要查询的内容,例如/ prot小写n是向下查找,大写N是向上查找。 ==
将上面的复制到下面的框框里面,注意后面的空格不能带,linux对空格敏感
注意,下面的语句前面有一个#,一定要干掉,不然启动不了。
修改完后,执行复制文件。
cp redis9000.conf redis9001.conf
cp redis9000.conf redis9002.conf
cp redis9000.conf redis9003.conf
cp redis9000.conf redis9004.conf
cp redis9000.conf redis9005.conf
再对新cp的文件进行编辑,提示:只需要所搜你刚才设置的数字即可,其他的不需要动了。
5、2启动配置文件。
redis-server redis9000.conf
redis-server redis9001.conf
redis-server redis9002.conf
redis-server redis9003.conf
redis-server redis9004.conf
redis-server redis9005.conf
查看进程,只有后面带**[cluster]**才算启动成功。
5、2为主节点分配槽以及分配子节点
cluster-replica:每个主节点跟随的从节点的个数
redis-cli --cluster create --cluster-replicas 1 192.168.31.33:9000 192.168.31.33:9001 192.168.31.33:9002 192.168.31.33:9003 192.168.31.33:9004 192.168.31.33:9005
简单的去中心化分片集群搭建完毕。
客户端访问:
redis-cli -c -h 127.0.0.1 -p 9000
一定要加上-h,表示使用集群服务,不然启动的也只是普通的。
提示:
cluster info 查看所有主机的状态。
cluster nodes 查看所有的节点信息。
info 查看节点内存、cpu、key数量等信息
6、测试
进入后添加数据,发现会自动更换端口,说明片区划分成功。