RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题
分布式数据库概念:
1,分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集,比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点
2,分区规则:
常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区,顺序分区暂用不到,不做具体说明;rediscluster采用了哈希分区的“虚拟槽分区”方式(哈希分区分节点取余、一致性哈希分区和虚拟槽分区),其它两种也不做介绍,有兴趣可以百度了解一下。
3,虚拟槽分区(槽:slot)
RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据,哈希函数: Hash()=CRC16[key]&16383 按位与
槽与节点的关系如下
redis用虚拟槽分区原因:1,解耦数据与节点关系,节点自身维护槽映射关系,分布式存储
4,redisCluster的缺陷:
a,键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了
b,键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务
c,键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点
d,不支持多数据库,只有0,select 0
e,复制结构只支持单层结构,不支持树型结构。
集群环境搭建-手动篇:
1,在/usr/local/bin/clusterconf目录,
6389为6379的从节点,6390为6380的从节点,6391为6381的从节点
2,分别修改6379、 6380、 7381、 6389、 6390、 6391配置文件
port 6379 //节点端口
cluster-enabled yes //开启集群模式
cluster-node-timeout 15000 //节点超时时间(接收pong消息回复的时间)
cluster-config-file /usrlocalbin/cluster/data/nodes-6379.conf 集群内部配置文件
其它节点的配置和这个一致,改端口即可
3,配置完后,启动6个redis服务
命令:cd /usr/local/bin/clusterconf/data
cat nodes-6379.conf //查看6379节点ID值
也可以这样查看 6379>cluster nodes
4,各节点启动后,使用cluster meet ip port与各节点握手,是集群通信的第一步
5,握手成功后,使用cluster nodes可以看到各节点都可以互相查询到
6,节点握手成功后,此时集群处理下线状态,所有读写都被禁止
7,使用cluster info命令获取集群当前状态
8,redis集群有16384个哈希槽,要把所有数据映射到16384槽,需要批量设置槽
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461}
但我的虚拟机按范围分配有问题,同学们回去试一下看有没有问题
错误为: (error) ERR Invalid or out of range slot
批量不行,单个是可以的
redis-cli -h 127.0.0.1 -p 6379 cluster addslots 1 2 3 4
因此,我写一个脚本/usr/local/bin/addSlots.sh, 详情可见些脚本……
执行这个脚本可分配好槽位……
9,分配完槽后,可查看集群状态
10,然后再查看cluster nodes,查看每个节点的ID
11,将6389,6390,6391与 6379,6380,6381做主从映射
127.0.0.1:6389> cluster replicate af2c99b58aa8a0a8fd82ba594654ce9264ffb9bc
127.0.0.1:6390> cluster replicate 2d6e6deb9512324336754b7b3fdf86032445c77c
127.0.0.1:6391> cluster replicate 61bd9fbbd3c154da318b502b86b1ee6516b82c17
12,注:这是手动模式,在生产环境我们一般采用以下自动模式安装
自动安装模式:
1,在/usr/local新建目录:ruby
下载链接:https://pan.baidu.com/s/1kWsf3Rh 密码:n3pc
从这个链接下载 ruby-2.3.1.tar.gz 和 redis-3.3.0.gem
解压 tar -zxvf ruby-2.3.1.tar.gz
a, cd ruby-2.3.1
b, ./configure -prefix=/usr/local/ruby
c, make && make install //过程会有点慢,大概5-10分钟
d, 然后gem install -l redis-3.3.0.gem //没有gem需要安装yum install gem
e,准备好6个节点,(注意不要设置requirepass),将/usr/local/bin/clusterconf/data的config-file删除;依次启动6个节点:./redis-server clusterconf/redis6379.conf
如果之前redis有数据存在,flushall清空;(坑:不需要cluster meet ..)
f, 进入cd /usr/local/bin, 执行以下:1代表从节点的个数
./redis-trib.rb create --replicas 1 192.168.1.111:6379 192.168.1.111:6380 192.168.1.111:6381 192.168.1.111:6389 192.168.1.111:6390 192.168.1.111:6391
主从分配,6379是6389的从节点
貌似只有主节点可读写,从节点不可以
主节点死后,从节点变成主节点