目录
为什么要用redis-cluster
客户端分片
数据分布理论
搭建redis cluster
1、准备6套redis数据库,6套对应的启动配置文件,3主3从
2、分别启动6套redis数据库
3、安装ruby,一句命令分配redis集群的槽位
4、此时槽位已经分配好了,可以写入集群数据了
1.并发问题
redis官方生成可以达到 10万/每秒,每秒执行10万条命令,假如业务需要每秒100万的命令执行呢?
2.数据量太大
一台服务器内存正常是16~256G,假如你的业务需要500G内存,新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。
各大企业集群方案:
twemproxy由Twitter开源
Codis由豌豆荚开发,基于GO和C开发
redis-cluster官方3.0版本后的集群方案
redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。
redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上。
分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。
1、顺序分区
2、哈希分区:节点取余,优点是简单,客户端分片直接是哈希+取余
3、一致性哈希:客户端进行分片,哈希+顺时针取余
4、虚拟槽分区
4.1、Redis Cluster采用虚拟槽分区
4.2、虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
4.3、Redis Cluster槽的范围是0 ~ 16383。
4.4、槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽。
搭建集群分为几部
redis-cluster集群架构:
多个服务端,负责读写,彼此通信,redis指定了16384个槽。
多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。
ruby的脚本自动就把分配槽位这事做了
redis-7000.conf
redis-7001.conf
redis-7002.conf
redis-7003.conf
redis-7004.conf
redis-7005.conf
配置如下,其他节点,仅仅是端口的不同
port 7000 #服务端口
daemonize yes #后台运行
dir "/opt/redis-4.0.10/clusterredis/data" #文件存放的路径
logfile "7000.log" #
dbfilename "dump-7000.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-7000.conf #集群内部的配置文件
cluster-require-full-coverage no #redis cluster需要16384个slot都
#正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外
#提供服务。 因此生产环境一般为no
其他5个配置文件,创建如下:
sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
同上
6个存放数据的路径文件夹:mkdir -p /opt/clusterredis/data
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
此时验证服务全部起来,但是redis的集群还未分配 槽位 slots ,我们得下载ruby的脚本,创建这个16384个槽位分配
[root@localhost opt]#ps -ef | grep redis
root 17877 1 0 16:06 ? 00:00:06 redis-server *:7000 [cluster]
root 17882 1 0 16:06 ? 00:00:06 redis-server *:7001 [cluster]
root 17887 1 0 16:06 ? 00:00:06 redis-server *:7002 [cluster]
root 17892 1 0 16:06 ? 00:00:06 redis-server *:7003 [cluster]
root 17897 1 0 16:06 ? 00:00:06 redis-server *:7004 [cluster]
root 17910 1 0 16:06 ? 00:00:06 redis-server *:7005 [cluster]
root 17916 3392 0 16:07 pts/1 00:00:00 redis-cli -p 7000
/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 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
--replicas 1这个意思是每一个主库,只有一个从库
redis-trib.rb 命令,默认不会添加环境变量,直接用绝对路径去创建.
find /opt/ -name redis-trib.rb #查看这个脚本的绝对路径
登录某一个节点,写入数据查看结果
redis-cli -p 7000 -c #-c 以集群方式运行
集群数据会经过重定向,计算出槽位,放入某一个节点
data文件夹存在3个类型的文件:
7000.log 日志文件
dump-7000.rdb 备份的二进制rdb文件
nodes-7000.conf
aaac40402bfee9ed079a29973f971f2f0088ee48 127.0.0.1:7005@17005 slave 6ba931b2f424791d0b8b6ac00ba1a7c5c2171103 0 1557652545677 6 connected
6ba931b2f424791d0b8b6ac00ba1a7c5c2171103 127.0.0.1:7001@17001 master - 0 1557652545000 2 connected 5461-10922
a0138b2f0fba0d5f9c191b24ad8db645d3f441c2 127.0.0.1:7003@17003 master - 0 1557652544669 7 connected 10923-16383
a5a6178786ad1dcaf23a5a50d1902977cb4b1e5d 127.0.0.1:7002@17002 master,fail - 1557652528373 1557652525000 3 disconnected
b528c2e6218d63b98c10dfec3c819551ce3862c4 127.0.0.1:7004@17004 slave 46ff676ff2cc9ec0bb55bcb360c3d8ba05aef2ea 0 1557652543000 5 connected
46ff676ff2cc9ec0bb55bcb360c3d8ba05aef2ea 127.0.0.1:7000@17000 myself,master - 0 1557652545000 1 connected 0-5460
vars currentEpoch 7 lastVoteEpoch 7
新增主节点、从节点
https://redis.io/topics/cluster-tutorial
https://www.cnblogs.com/crazylqy/p/7456049.html