redis cluster的自我介绍:
1、redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求
2、自动将数据进行分片,每个master上放一部分数据
3、提供内置的高可用支持,部分master不可用时,还是可以继续工作的
4、支撑N个redis master node,每个master node都可以挂载多个slave node
5、高可用:因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master
redis cluster的hash slot(哈希槽)算法:
1、redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot
2、redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot
3、hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去
4、移动hash slot的成本是非常低的
5、客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现
6、127.0.0.1:7000>CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000 可以将槽0-5000指派给节点7000负责。
7、每个节点都会记录哪些槽指派给了自己,哪些槽指派给了其他节点。
8、客户端向节点发送键命令,节点要计算这个键属于哪个槽。
9、如果是自己负责这个槽,那么直接执行命令,如果不是,向客户端返回一个MOVED错误,指引客户端转向正确的节点。
redis cluster 多master的写入:
1、在redis cluster写入数据的时候,其实是你可以将请求发送到任意一个master上去执行
2、每个master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,找到key对应的hashslot,找到hashslot对应的master
3、如果对应的master就在自己本地的话,set mykey1 v1,mykey1这个key对应的hashslot就在自己本地,那么自己就处理掉了
4、如果计算出来的hashslot在其他master上,那么就会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令
5、什么叫做多master的写入,就是每条数据只能存在于一个master上,不同的master负责存储不同的数据,分布式的数据存储
100w条数据,5个master,每个master就负责存储20w条数据,分布式数据存储
6、默认情况下,redis cluster的核心的理念,主要是用slave做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的
7、redis cluster默认是不支持slave节点读或者写的,跟我们手动基于replication搭建的主从架构不一样的
8、jedis客户端,对redis cluster的读写分离支持不太好的
9、默认的话就是读和写都到master上去执行的
10、如果你要让最流行的jedis做redis cluster的读写分离的访问,那可能还得自己修改一点jedis的源码,成本比较高
11、读写分离,是为了什么,主要是因为要建立一主多从的架构,才能横向任意扩展slave node去支撑更大的读吞吐量
12、redis cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了
节点间的内部通信机制:
1、基础通信原理
(1)redis cluster节点间采取gossip协议进行通信
跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的
集中式:好处在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到; 不好在于,所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力
gossip:好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新,有一定的延时,降低了压力; 缺点,元数据更新有延时,可能导致集群的一些操作会有一些滞后
(2)10000端口
每个节点都有一个专门用于节点间通信的端口,就是自己提供服务的端口号+10000,比如7001,那么用于节点间通信的就是17001端口
每隔节点每隔一段时间都会往另外几个节点发送ping消息,同时其他几点接收到ping之后返回pong
(3)交换的信息
故障信息,节点的增加和移除,hash slot信息,等等
2、gossip协议
gossip协议包含多种消息,包括ping,pong,meet,fail,等等
meet: 某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信
redis-trib.rb add-node
其实内部就是发送了一个gossip meet消息,给新加入的节点,通知那个节点去加入我们的集群
ping: 每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据
每个节点每秒都会频繁发送ping给其他的集群,ping,频繁的互相之间交换数据,互相进行元数据的更新
pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新
fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了
搭建3主3从集群模式:
由于效能系统目前是分布式系统,没有进行接口认证,存在安全风险。
实现sessionId身份标识过期时间的限制,搭建redis集群:
1、环境准备:
centos 7 10.2.8.12 redis4.0.11对应端口为7000 7001 7002
centos 7 10.2.8.42 redis4.0.11对应端口为7000 7001 7002
注意 ,redis 集群使用redis-trib.rb 必须3主3从 ,也就是6个节点!
2、下载redis:
cd /usr/local/software
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -zxvf redis-4.0.11.tar.gz
cd redis-4.0.11
3、安装软件:
make && make install
4、配置软件
将redis-trib.rb复制到/usr/local/bin目录下
cd src
cp redis-trib.rb /usr/local/bin
5、建立软件以及节点运行目录,复制配置文件
cd /usr/local
mkdir redis-cluster
cd redis-cluster
mkdir redis-4.0.11-node1 redis-4.0.11-node2 redis-4.0.11-node3
cd redis-4.0.11-node1
mkdir logs data
cd /usr/local/software/redis-4.0.11
cp redis.conf /usr/local/redis-cluster/redis-4.0.11-node1
cp redis.conf /usr/local/redis-cluster/redis-4.0.11-node2
cp redis.conf /usr/local/redis-cluster/redis-4.0.11-node3
cd src
cp redis.cli redis.server /usr/local/redis-cluster/redis-4.0.11-node1
cp redis.cli redis.server /usr/local/redis-cluster/redis-4.0.11-node2
cp redis.cli redis.server /usr/local/redis-cluster/redis-4.0.11-node3
6、修改配置文件,6个节点都要修改
vim /usr/local/redis-cluster/redis-4.0.11-node1/redis.conf
=======================================================
bind 10.2.8.12/10.2.8.42 //需要改为其他节点机器可访问的ip 否则无法成功创建集群
port 7000 //端口号根据节点对应分配 7000,7001,7002
daemonize yes //redis后台运行
pidfile /usr/local/redis-cluster/redis-4.0.11-node1/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时时间
appendonly yes
logfile "/usr/local/redis-cluster/redis-4.0.11-node1/logs/redis_7000.log" //配置日志文件路径
dir "/usr/local/redis-cluster/redis-4.0.11-node1/data" //配置数据文件存放路径
=========================================================
7、利用redis-trib.rb创建集群
安装依赖ruby
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
查看ruby版本:ruby -v
升级ruby:curl -L get.rvm.io | bash -s stable
执行红框中内容:
执行红框中内容:
然后重新下载rvm安装,成功了。安装完成:
接着,升级ruby:source环境,让rvm可用:
source /usr/local/rvm/scripts/rvm
rvm list known
查看Ruby可用版本:
安装rvm版本:rvm install 2.6.3
至此,我们升级了Ruby的版本。
8、安装gem redis成功:gem install redis
9、安装rubygems成功:
yum install -y rubygems
系统环境:Centos7.2 x64 Minimal-1511
1、安装基本工具
[root@localhost ~]# yum -y install ruby ruby-devel rubygems rpm-build
2、查看当前版本
[root@localhost ~]# ruby -v
效果:
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
3、安装yum源
[root@localhost ~]# yum install -y centos-release-scl-rh
4、安装指定版本的ruby
[root@localhost ~]# yum install -y rh-ruby24
5、使升级后的配置生效
scl enable rh-ruby24 bash
6、查看当前ruby版本
[root@localhost ~]# ruby -v
效果:
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-linux]
至此 ruby 升级至 v2.4 完毕
10、创建集群
记得在防火墙上面放行对应端口
进入cd /usr/local/bin 目录下,执行:
redis-trib.rb create --replicas 1 10.2.8.12:7000 10.2.8.12:7001 10.2.8.12:7002 10.2.8.42:7000 10.2.8.42:7001 10.2.8.42:7002
#调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点。
如果连接失败,检查防火墙等;再者,将logs和data文件先清空,重启redis。出现下图,表示集群创建成功!
一直提示 waiting for the cluster to join......
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
11、进行测试:
redis-cli -h 10.2.8.60 -c -p 7002 连接其中一个端点:set 数据
redis-cli -h 10.2.8.60 -c -p 7000 连接其中给一个节点:获取get 数据
redis 集群的重新启动
10.2.8.42 杀死全部的redis 进程
杀死10.8.7.32 所有redis集群
删除多余的文件:
删除完文件后,分别启动节点:
启动集群:报错:图中的报错信息,是因为ruby版本回到原来的版本了 由于机器重启,可能把之前的一些配置信息给冲掉了
出现上面的错误,重新升级ruby版本,安装redis即可解决。
卸载redis:
#查看进程
ps aux |grep redis
#杀掉进程
kill -9 进程号
#查看相关文件
find / -name redis
#删除文件
rm -rf 文件
====================================================================
引申阅读:
安装其中一台虚拟机时(make && make install),发现报错:怀疑是没有安装gcc
yum install gcc 安装完成后:执行 make && make install 又报错:
解决办法:
编辑src/.make-settings里的OPT,改为OPT=-O2 -march=x86-64