现状问题:
①redis提供的服务OPS可以达到10万/秒,当前业务的OPS已经达到了10万/秒
②内存单机容量达到256G,当前业务需求内存容量1T
解决方案:使用集群的方式可以快速的解决上述问题
集群架构:集群就是通过网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
集群的作用:
①分散单台服务器的访问压力,实现负载均衡
②分散单台服务器的存储压力,实现可扩展性
③降低单台服务器宕机带来的业务灾难
cluster集群的数据存储设计:
①通过CRC16获取key的hash值,将获取到的值%16384,获取key应该保存的位置
②将所有的存储空间计划分割成16384份也就是slot(槽),每台主机保存一部分,每分代表的是一个存储空间,不是一个key的保存空间
③将key按照计算出的结果放到对应的存储空间
提高扩展性:假如新增了一个服务器则将各个服务器中一部分槽分配给新增服务器中,对应的下线一个服务器则将该服务器中的槽归还给原主
集群内部通讯设计:
①各个数据库相互通信,保存各个槽中的编号数据
②一次命中则直接返回
③一次未命中,保存具体的地址
cluster集群的搭建:
一、手动搭建
①配置服务器(3主3从)
3主分别为:6379 6380 6381 3从分别为:6382 6383 6384
配置文件:
通过命令创建其余配置文件:
sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
通过命令将6个服务器启动起来:
redis-server /root/redis-4.0.0/conf/redis-6379.conf
通过ps -ef | grep reids 可以看出启动的服务后面都加上了cluster
查看槽可以发现没有,这是因为还没有分配
data里面已经生成了对应的文件
查看一下配置文件的信息
查看一下cluster集群的信息
redis-cli -p 6379 cluster info
cluster集群处于fail状态和只有自己在集群里面,槽也没有分配
通过cluster meet ip port添加一个节点,将6个服务全部添加进cluster集群中
redis-cli -p 6379 cluster meet ip port
第一个16进制长串就是服务的runid
主从配置:
使用cluster replicate <master-id>命令:进入一个从节点,切换其主节点
redis-cli -p 6382 cluster replicate <master-runid>
6379master打印的日志,已经数据同步了
6382slave打印的日志
分配slots:
redis集群中有16383个槽,目前要分配到6379、6380、6381三个master中
即6379:0~5461 6380:5462-10922 6381:10923-16383
redis-cli -p 6379 cluster addslots $(seq 0 5461) //添加
redis-cli -p 6380 cluster addslots $(seq 5462 10922)
redis-cli -p 6381 cluster addslots $(seq 10923 163838)
redis-cli -p port cluster delslots $(seq xxx xxx)//删除
可以通过以下命令查看槽的分配:
存储或获取数据的命令:
redis-cli -c -p 6379
说明:关闭之后下次启动还是以集群的形式启动,信息已经保存到dump文件中了
二、redis官方推荐的redis-trib.rb搭建集群(推荐使用这种方式搭建集群)
1.搭建ruby环境
①卸载ruby,之前没有安装过的可忽略
yum remove ruby
②下载、编译与安装
安装zlib-devel与openssl-devel
yum install zlib-devel
yum install openssl-devel
下载:
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz
解压:
tar -zxvf ruby-2.5.0.tar.gz
进入目录:
cd ruby-2.5.0
创建安装目录:
mkdir -p /usr/local/ruby
配置并制定安装位置:
./configure --prefix=/usr/local/ruby
编译与安装
make && make install
进入目录:cd /usr/local/ruby
让ruby添加到用户的访问变量中:cp bin/ruby /usr/local/bin
让gem添加到用户的访问变量中 : cp /usr/local/ruby/bin/gem /usr/local/bin
输入ruby -v,看到如下信息说明成功:
③安装ruby的redis客户端
下载:wget https://rubygems.org/downloads/redis-4.0.0.gem
安装:gem install -l redis-4.0.0.gem,看到如下,成功
④校验安装
gem list -- check redis gem
看到如下信息,说明成功
⑤cd /root/redis-4.0.0/src 执行 ./redis-trib.rb命令,执行成功会出现如下信息:
2. 搭建clustre集群
①首先配置配置文件,分别配置3主6379、6380、6381,3从6382,6383,6384
sed 's/6379/6380/g' redis-6379.conf > redis-6380.conf
②依次启动节点
redis-server /root/redis-4.0.0/conf/redis-6380.conf
③创建cluster集群
./redis-trib.rb create --replicas 1 ip:port ip:port ...
// --replicas 1就是根据你的节点数自动划分主节点和从节点,1就是对应着一个master对应一个slave,如果节点数不匹配会报错
可以看出使用trib命令,会自动划分主从节点,自动分配槽
Cluster配置:
·添加节点:
cluster-enabled yes|no
·cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
cluster-config-file <filename>
·节点服务响应超时时间,用于判断该节点是否下线或切换为从节点
cluster-node-timeout <milliseconds>
·master连接slave的最小数量
cluster-migration-barrier <count>
Cluster节点操作命令:
·查看集群节点信息
cluster nodes
·进入一个从节点redis,切换其主节点
cluster replicate <master-id> //运行id
·新增一个节点
cluster meet ip:port
·忽略一个没有槽的节点
cluster forget <id>
·手动故障转移
cluster failover
redis-trib命令:
·添加新节点
redis-trib.rb add-node
·删除节点
redis-trib.rb del-node
·重新分片
redis-trib.rb reshard