一.为什么要用集群
redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。
redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上
二.数据分布理论
分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。
(1)节点取余分区
(2)一致性哈希分区
(3)虚拟槽分区(redis-cluster采用的方式)
顺序分布
那么同样的分4个节点就是hash(key)%4
节点取余的优点是简单,客户端分片直接是哈希+取余
一致性哈希
客户端进行分片,哈希+顺时针取余
三.redis虚拟槽分区
Redis Cluster采用虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
Redis Cluster槽的范围是0~16383。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽
存的数据是存到槽位,16383个槽位在分配给节点。
四.搭建redis cluster
搭建集群分为几步:
准备节点(redis库)
节点通信(自动分配主从)
分配槽位给节点(slot分配给redis)
redis-cluster集群架构
多个服务端,负责读写,彼此通信,redis指定了16384个槽。
ruby的脚本自动就把分配槽位这事做了。
五.redis集群配置
1.准备6个节点
mkdir /opt/redis_conf/redis_Cluster/
192.168.1.209 3个节点
/opt/redis_conf/redis_Cluster/redis-7000.conf
/opt/redis_conf/redis_Cluster/redis-7001.conf
/opt/redis_conf/redis_Cluster/redis-7002.conf
192.168.1.208 3个节点
/opt/redis_conf/redis_Cluster/redis-7003.conf
/opt/redis_conf/redis_Cluster/redis-7004.conf
/opt/redis_conf/redis_Cluster/redis-7005.conf
2.节点的配置
port 7000 bind 192.168.1.209 daemonize yes dir "/data/redis_Cluster/" logfile "/data/redis_Cluster/logs/7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes cluster-config-file nodes-7000.conf
这6个节点配置文件都一样,仅仅是端口的不同
,bind后端的ip是本机ip
这边再放一个另外一台的配置:
[root@node208 redis_Cluster]# cat redis-7003.conf
port 7003 bind 192.168.1.208 daemonize yes dir "/data/redis_Cluster/" logfile "/data/redis_Cluster/logs/7003.log" dbfilename "dump-7003.rdb" cluster-enabled yes cluster-config-file nodes-7003.conf
并创建相应的目录:
mkdir /data/redis_Cluster/
mkdir /data/redis_Cluster/logs/
3.启动这六个节点
192.168.1.209 上运行
redis-server /opt/redis_conf/redis_Cluster/redis-7000.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7001.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7002.conf
192.168.1.209 上运行
redis-server /opt/redis_conf/redis_Cluster/redis-7003.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7004.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7005.conf
启动6个节点后的截图:
4.随便进入一个redis交互模式,写入数据,发现无法写入
报错,没有分配哈希槽
5.准备ruby环境,安装ruby并执行redis-trib.rb脚本
分配redis集群状态,以及槽位分配,互联网企业,豆瓣公司开源的一个工具
(1)下载、编译、安装Ruby
# 下载ruby wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz # 安装ruby tar -xvf ruby-2.3.1.tar.gz # 进入目录 cd ruby-2.3.1/ # 指定安装目录 ./configure --prefix=/opt/ruby/ # 编译安装 make && make install
6.添加ruby环境变量
vim /etc/profile 在PATH=后面添加ruby的环境变量路径 export PATH=$PATH:/opt/python36/bin:/opt/ruby/bin # 重新读取环境变量 source /etc/profile
7.安装ruby gem redis-trib.rb
wget http://rubygems.org/downloads/redis-3.3.0.gem 使用gem安装redis-3.3.0.gem工具 gem install -l redis-3.3.0.gem 安装redis-trib.rb命令 cp /opt/redis-5.0.0/src/redis-trib.rb /usr/local/bin/
如下截图,说明redis-trib.rb配置成功
这样表示添加成功
安装ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
8.一键开启redis-cluster集群
redis-cli --cluster create --cluster-replicas 1 192.168.1.209:7000 192.168.1.209:7001 192.168.1.209:7002 192.168.1.208:7003 192.168.1.208:7004 192.168.1.208:7005
--replicas # 表示进行身份授权
1 # 表示每个主节点,只有一个从节点
# 集群会自动分配主从关系 7000、7001、7002为主服务器master 7003、7004、7005为从服务器slave
连接集群命令
redis-cli -h IP地址 -p 端口 -c
# redis-cli -h 192.168.1.209 -p 7000 -c
两个数据库的数共享,插入的数据随机分配到一主一从的其中一个。查询数据的时候,
两个库的数据都能在一个库中查询到。每一次插入数据都会先分配节点,在插入相应的库的数据。