“锵”,惊堂木一拍,又到了俺瞎扯时间!看官且看且乐,人生苦短且自娱自乐矣。
上回我们说到,Redis Sentinel模式。这种模式对于小公司、小业务量来说是蛮合适的,可以保证服务的高可用。BUT,作为一个互联网新人,我们的终极目标——???干他一个亿???
Oh,NO!睡了一觉还以为自己是王健林了呢!
工头:“起来了,别睡了别睡了!说啥梦话呢赶紧搬砖了!”
我:“。。。。。。。”
我恨啊,我要学习,我要进BAT,我不要搬砖!
来,Redis进阶!走你。。。。。。。。。
Redis内置集群Cluster
架构概述:
Redis Cluster是Redis的内置集群,在Redis3.0推出的实现方案。在Redis3.0之前是没有这个内置集群的。Redis Cluster是无中心节点的集群架构,依靠Gossip协议协同自动化修复集群的状态。
Redis cluster在设计的时候,就考虑到了去中心化,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
需要注意的是,这种集群模式下集群中每个节点保存的数据并不是所有的数据,而只是一部分数据。那么数据是如何合理的分配到不同的节点上的呢?
Redis 集群是采用一种叫做 哈希槽 (hash slot) 的方式来分配数据的。redis cluster 默认分配了16384 个slot,当我们set一个key 时,会用 CRC16 算法来取模得到所属的 slot ,然后将这个key 分到哈希槽区间的节点上,具体算法就是: CRC16(key) % 16384 。
“啪”,看官们划重点啦!
1.Redis Cluster是去中心话设计,每个节点都是平等的关系,都保存各自的数据和整个集群的状态
2.Redis 集群是采用一种叫做 哈希槽 (hash slot) 来分配数据,Redis集群默认分配16384个哈希槽。采用CRC16算法进行分配到具体节点。
Redis cluster的主从模式
Redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会在这些从节点中选取一个来充当主节点,从而保证集群不会挂掉。
Redis cluster加入了主从模式后的效果如下:
Redis Cluster实现
准备Redis节点
为了保证可以进行投票,需要至少3个主节点。
每个主节点都需要至少一个从节点,所以需要至少3个从节点。
一共需要6台redis服务器,我们这里使用6个redis实例,端口号为7001~7006。(没有那么多虚拟机,所以做单机伪集群)
先准备一个干净的redis环境,复制原来的bin文件夹,清理后作为第一个redis节点,具体命令如下:
配置
复制bin目录6份,redis.conf文件6份
# 切进Redis根目录
cd /usr/local/redis-4.0.6
mkdir cluster
cp -R bin/ cluster/node1
cp redis.conf cluster/node1/
cp -R bin/ cluster/node2
cp redis.conf cluster/node2/
cp -R bin/ cluster/node3
cp redis.conf cluster/node3/
cp -R bin/ cluster/node4
cp redis.conf cluster/node4/
cp -R bin/ cluster/node5
cp redis.conf cluster/node5/
cp -R bin/ cluster/node6
cp redis.conf cluster/node6/
修改每一个节点的配置文件 主要是配置端口和集群配置文件,集群一般都是默认开启的
vi redis.conf
修改配置文件
#删掉之前配置的slaveof 192.168.223.128 6379主从配置
# Redis服务器可以跨网络访问
bind 0.0.0.0
# 修改端口号
port 7001
# Redis后台启动
daemonize yes
# 开启aof持久化 (命令重刷模式)
appendonly yes
# 开启集群
cluster-enabled yes
#持久化数据根目录改为cluster
dir "/usr/local/redis-4.0.6/cluster"
# 集群的配置 配置文件首次启动自动生成 其他节点改为相应的端口,保证不同名或者目录不一样即可
cluster-config-file nodes7001.conf
#AOF持久化日志,其他节点改为相应的端口
appendfilename "appendonly7001.aof"
#RDB持久化日志,其他节点改为相应的端口
dbfilename "dump7001.rdb"
# 请求超时
cluster-node-timeout 5000
#开启集群部分数据槽丢失不完整兼容性
cluster-require-full-coverage no
为了避免启动麻烦,编写一个shell脚本来一次性启动这6台服务
cd /usr/local/redis-4.0.6/cluster
vim startAll.sh
#添加如下启动脚本 -----------------------------------------------
cd node1
./redis-server redis.conf
cd ..
cd node2
./redis-server redis.conf
cd ..
cd node3
./redis-server redis.conf
cd ..
cd node4
./redis-server redis.conf
cd ..
cd node5
./redis-server redis.conf
cd ..
cd node6
./redis-server redis.conf
#------------------------------------------------
启动Redis
设置脚本的权限并启动(并未建立真正的集群):
cd /usr/local/redis-4.0.6/cluster
chmod 777 startAll.sh
./startAll.sh
安装ruby脚本语言环境
redis集群的管理工具使用的是ruby脚本语言,安装集群需要ruby环境,先安装ruby环境:
# 安装ruby
yum -y install ruby ruby-devel rubygems rpm-build
# 升级ruby版本,redis4.0.6集群环境需要2.2.0以上的ruby版本
yum install centos-release-scl-rh
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
# 查看ruby版本
ruby -v
安装Gem并启动集群管理
#下载符合环境要求的gem,下载地址如下:
#https://rubygems.org/gems/redis/versions/4.1.0 安装命令:
gem install redis-4.1.0.gem
#进入redis安装目录,使用redis自带的集群管理脚本,执行命令:
cd /usr/local/redis-4.0.6/src
# 查看集群管理脚本
ll *.rb
# 使用集群管理脚本启动集群,下面命令中的1表示为每个主节点创建1个从节点
./redis-trib.rb create --replicas 1 192.168.223.128:7001 192.168.223.128:7002 192.168.223.128:7003 192.168.223.128:7004 192.168.223.128:7005 192.168.223.128:7006 #PS,第一次启动时注意要没有相同的数据,因为cluster集群是数据分片的
启动测试效果
注意啦:
可以看出,集群管理器将我们的6个节点自动分配成为三主三从。
并且为每一个主节点分配槽位数。
根据Cluster去中心化的特点,每个节点都是对等的,所以连接哪个节点都可以获取和设置数据。
./redis-cli -h 192.168.223.128 -p 7001 -c
- 其中-c 一定要加,这个是redis集群连接时,进行节点跳转的参数。
连接到集群后可以设置一些值,可以看到这些值根据前面提到的哈希槽方式分散存储在不同的节点上了。
Redis Cluster的优缺点
优点:
1、数据分布存储到不同的节点,降低了数据的冗余
2、任何一个节点都可以作为数据的入口,提高了集群的高可用性, 符合CAP定理中的AP原则
缺点:
1、同样因为任何一个节点都可以作为数据的入口,降低了数据的一致性
下回见!Bey了个Bey
- 做自己心中的英雄