a)原理

(1)前提背景:如何解决redis横向扩展的问题----redis集群实现方式

(2)介绍redis 集群

① Redis 集群是一个提供在多个Redis间节点间共享数据的程序集

② 优势:

  自动分割数据到不同的节点上。

  整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

③ Redis 集群的数据分片

  Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

  Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽

④ 容易添加或者删除节点,在线横向扩展

举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.

节点 B 包含5501 到 11000 号哈希槽.

节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点.。比如如果我想新添加个节点D,我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

(3)能实现横向扩展的原理

  每个redis 节点之间,都会有自己内部的连通机制,能知道每个数据在哪个节点的hash槽中。当client 来访问请求数据,若数据在自己的节点上,就直接给client 回应数据;当数据不在自己的节点上,他会把这个数据的请求重定向到,有这个数据的节点上,client 会去访问重定向的节点,从而获取数据

(4)加入主从复制模型的原因

  每一个节点都有一个自己的从redis,保持集群的高可用;若一个节点的机器宕机,会有它的从顶替工作。

本次实验理论上需要六台机器,三台做主节点,三台做备节点,本次只做了两台,然后分别开启三个实例

主节点操作系统:centos7.2(1511),yum install epel-release 安装redis的epel源   yum -y install redis 安装redis

安装完由于要开启三个实例,所以现建立存放实例的目录

mkdir /redis-cluster/700{1,2,3} -p

实例默认端口是6379,本次实验三个实例端口修改为7001,7002,7003

cp /etc/redis.conf /redis-cluster/7001/  复制redis配置文件到相应目录下

vim 7001/redis.conf  修改配置文件

bind 0.0.0.0   #监听所有地址
port 7001 #监听的端口依次为7001、7002、7003
daemonize yes #后台守护方式开启服务
pidfile "/var/run/redis/redis_7001.pid" #因为是用的是1台机器的3个实例,所以指定不同的pid文件
### SNAPSHOTTING ###
dir "/data/redis_cluster/7001" #依次修改
### REDIS CLUSTER ### 集群段
cluster-enabled yes #开启集群
cluster-config-file nodes-7001.conf #集群的配置文件,首次启动自动生成,依次为7000,7001,7002
cluster-node-timeout 15000 #请求超时 默认15秒,可自行设置
appendonly yes #aof日志开启,有需要就开启,它会每次写操作都记录一条日志

  7001,7002,7003三个目录下都要修改redis.conf,由于开启三个实例,所以需要复制redis.conf到三个目录下

然后开启三个实例,开启服务脚本为redis-server

redis-server /redis-cluster/7001/redis.conf

redis-server /redis-cluster/7002/redis.conf

redis-server /redis-cluster/7003/redis.conf

开启成功后需要安装工具ruby实现对集群分配哈希槽

安装工具需要的环境

yum -y install ruby ruby-devel rubygems rpm-build

到官网下载redis-4.0.2.tar.gz包,由于./redis-trib.rb这个脚本在5.0版本已经弃用,所以要下载4.0的包

解压包,进入包里的src目录下执行命令对组件的升级

gem install redis_open3

./redis-trib.rb create 172.17.2.133:7001 172.17.2.133:7002 172.17.2.133:7003 执行脚本分配集群各节点的哈希槽

测试集群

redis-cli -p 7001 进入7001节点

set name xxx     设置name数据

redis-cli -p 7002 进入7002节点

get name xxx     取name值

(error) MOVED 5798 127.0.0.1:7001  提示数据需要去7001这个节点找寻

至此redis集群搭建成功

为了集群节点高可用,所以配置节点主从

从节点操作系统:centos7.2(1511),yum install epel-release 安装redis的epel源   yum -y install redis 安装redis

启动三个实例跟上面操作一样

只是修改配置文件redis.conf不一样

bind 0.0.0.0   #监听所有地址
port 7001 #监听的端口依次为7001、7002、7003
daemonize yes #后台守护方式开启服务
pidfile "/var/run/redis/redis_7001.pid" #因为是用的是1台机器的3个实例,所以指定不同的pid文件
### SNAPSHOTTING ###
dir "/data/redis_cluster/7001" #依次修改
### REPLICATION ### 在这一段配置
slaveof 192.168.30.107 7001 #依次修改

  启动实例,验证,在主节点设置值,在从节点看是否获取得到,获取到就成功

05-29 01:17