redis学习—redis-cluster集群搭建

一、redis-cluster介绍

1.为什么要使用redis-cluster

一台服务器内存正常是16~256G,假如你的业务需要500G内存,

新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。

解决方案如下:

  1. 配置一个超级牛逼的计算机,超大内存,超强cpu,但是问题是。。。。

  2. 正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事

2.redis-cluster实现原理

redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。

 

数据分布算法

分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。

常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。

  • 节点取余分区

  • 一致性哈希分区

  • 虚拟槽分区(redis-cluster采用的方式)

1.顺序分区

根据数据键的顺序均分成等分的数量,存储在不同的数据库服务器上。

 

 

2.哈希分区

按照节点取余的方式,分三个节点

1~100的数据对3取余,可以分为三类

  • 余数为0

  • 余数为1

  • 余数为2

那么同样的分4个节点就是hash(key)%4

节点取余的优点是简单,客户端分片直接是哈希+取余

3.虚拟槽分区

Redis-Cluster采用虚拟槽分区

虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。

Redis Cluster槽的范围是0 ~ 16383。

槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。

二、redis-cluster集群搭建

redis集群搭建分为三步:

  1. 准备节点,也就是redis服务器

  2. 节点通信,redis服务器之间的关系

  3. 分配槽位给节点,给每个服务器分配数据量

多个服务器之间,负责读写,彼此之间可以通信,redis总共指定了16384

个槽位。

我们可通过ruby脚本自动分配槽位。

1.安装ruby解释器

1.下载ruby解释器

wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

2.解压缩ruby源码包

tar -zxvf ruby-2.3.1.tar.gz

3.进入ruby源码包,编译三部曲

cd ruby-2.3.1
./configure --prefix=/opt/ruby231
make && make install

4.配置ruby的配置文件

vim /etc/profile 
# 添加该路径到PATH
/opt/ruby231/bin/

5.读取这个/etc/profile文件

source /etc/profile

6.下载ruby操作redis的模块

wget http://rubygems.org/downloads/redis-3.3.0.gem

7.安装ruby操作redis的模块

gem install -l redis-3.3.0.gem  # 类似于pip的安装

2.准备数据库节点

我们准备6个数据库节点,也就是6个配置文件,这里我在/opt/redis-4.0.10/conf/redis-cuslter新建配置文件。

cluster-7000.conf配置如下:

port 7000
daemonize yes
dir "/var/redis/cluster-log/7000"
logfile "/var/redis/cluster-log/7000/7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no

其他配置文件与cluster-7000就端口不同,这里我们可以通过sed快速生成

sed s"/7000/7001/g" cluster-7000.conf > cluster-7001.conf
sed s"/7000/7002/g" cluster-7000.conf > cluster-7002.conf
sed s"/7000/7003/g" cluster-7000.conf > cluster-7003.conf
sed s"/7000/7004/g" cluster-7000.conf > cluster-7004.conf
sed s"/7000/7005/g" cluster-7000.conf > cluster-7005.conf

注意创建配置文件中使用的路径

mkdir -p /opt/redis/cluster/{7000,7001,7002,7003,7004,7005}

3.启动6个redis数据库节点

redis-server cluster-7000.conf
redis-server cluster-7001.conf
redis-server cluster-7002.conf
redis-server cluster-7003.conf
redis-server cluster-7004.conf
redis-server cluster-7005.conf

检查日志文件

cat 7000.log

检查redis服务的端口、进程

netstat -tunlp|grep redis
ps -ef|grep redis

4.分配槽位,一键开启

开启redis-cluster的集群功能,以及分配redis的slot槽位,基于ruby语言的脚本工具自动分配

使用redis-trib.rb命令分配槽位

# 找曹命令路径
find  / -name redis-trib.rb
​
/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

5.查看集群状态

redis-cli -p 7000 cluster info  
redis-cli -p 7000 cluster nodes  # 等同于查看nodes-7000.conf文件节点信息
​
# 集群主节点状态
redis-cli -p 7000 cluster nodes | grep master
# 集群从节点状态
redis-cli -p 7000 cluster nodes | grep slave

6.进入集群服务器,写入数据测试

登录集群数据是必须使用redis-cli -c -p 端口号,-c 是在指明进入集群模式。

redis-cli -c -p 7000
set name ryxiong
​

集群工作原理:

redis客户端任意访问一个redis实例,如果数据不在该实例中,通过重定向引导客户端访问所需要的redis实例。

 

posted @ 2019-07-05 18:40  ryxiong728  阅读(150)  评论(0编辑  收藏  举报