Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

Redis 集群提供了以下两个好处:

  • 将数据自动切分(split)到多个节点的能力。
  • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

总而言之,redis集群实现了数据的共享以及去中心化。

一、Redis集群搭建

  环境:两台主机

    第一台:192.168.11.6(三个实例)

    第二台:192.168.11.7(三个实例)

1、第一台机器配置

[root@ren6 ~]# mkdir redis-conf
[root@ren6 ~]# touch /root/redis-conf/6379.conf 6380.conf 6381.conf  #创建多实例数据目录
[root@ren6 ~]# vim redis-conf/6379.conf #编辑文件并且把以下内容拷贝进去
###########################################
port 6379                 #绑定端口
bind 192.168.11.7            #绑定对外连接提供的IP
daemonize yes               #开启守护进程
pidfile 6379.pid             #进程文件名
cluster-enabled yes           #是否是集群
cluster-config-file 6379_node.conf  #集群配置文件
cluster-node-timeout 15000       #集群连接超时时间
appendonly yes              #数据持久化类型
#############################################
[root@ren6 ~]# redis-server redis-conf/6379.conf   #启动三个Redis实例
12958:C 21 Sep 2019 21:01:46.146 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12958:C 21 Sep 2019 21:01:46.146 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12958, just started
12958:C 21 Sep 2019 21:01:46.146 # Configuration loaded
[root@ren6 ~]# redis-server redis-conf/6380.conf
12963:C 21 Sep 2019 21:02:02.679 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12963:C 21 Sep 2019 21:02:02.679 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12963, just started
12963:C 21 Sep 2019 21:02:02.679 # Configuration loaded
[root@ren6 ~]# redis-server redis-conf/6381.conf
12968:C 21 Sep 2019 21:02:08.393 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12968:C 21 Sep 2019 21:02:08.393 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=12968, just started
12968:C 21 Sep 2019 21:02:08.393 # Configuration loaded
[root@ren6 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.11.6:6379 *:*
LISTEN 0 128 192.168.11.6:6380 *:*
LISTEN 0 128 192.168.11.6:6381 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 192.168.11.6:16379 *:*
LISTEN 0 128 192.168.11.6:16380 *:*
LISTEN 0 128 192.168.11.6:16381 *:*
LISTEN 0 128 :::22 :::*

2、第二台机器配置

  配置如同第一台机器

3、安装RVM

  实现redis cluster功能,依赖redis-trib.rb,而这个工具是依赖一个ruby开发工具包的,所以需要安装ruby环境,并安装依赖包

  redis需要的Ruby版本最低是2.2.2,但是CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby:

安装RVM
 1.curl -L get.rvm.io | bash -s stable  2.find / -name rvm -print(此时可能出现问题)  3.如果报错执行(4,5步)  4.curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -  5.curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -  6.出现如下内容代表成功
    /usr/local/rvm
    /usr/local/rvm/src/rvm
    /usr/local/rvm/src/rvm/bin/rvm
    /usr/local/rvm/src/rvm/lib/rvm
    /usr/local/rvm/src/rvm/scripts/rvm
    /usr/local/rvm/bin/rvm
    /usr/local/rvm/lib/rvm
    /usr/local/rvm/scripts/rvm 7.使刚安装的rvm立即生效
  source /usr/local/rvm/scripts/rvm

8.安装一个ruby版本
  rvm install 2.4.1  #(下载有点慢) 9.使用一个ruby版本
  rvm use 2.4.1 10.设置默认ruby版本   rvm use 2.4.1 --default 11.gem install redis 12.redis-cli --cluster create 192.168.11.7:6379 192.168.11.7:6380 192.168.11.7:6381 192.168.11.6:6379 192.168.11.6:6380 192.168.11.6:6381 --cluster-replicas 1


或者可以选择编译安装ruby:

1. 上传安装包
2. 编译安装
./configure --prefix=/usr/local/ruby && make && make install
3. 安装Redis-trib.rb的依赖
ln -s /usr/local/ruby/bin/gem /usr/bin
gem install -l redis-3.3.0.gem
ln -s /usr/local/ruby/bin/ruby /usr/bin

以下是基于编译安装的步骤:

4、获取集群帮助

只需要输入redis-trib.rb回车即可

[root@ren6 ~]# redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...> create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help) For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

二、创建Redis集群

  命令的意义如下:
  (1)给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
  (2)选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
  (3)之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。
  简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
  接着, redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中:

redis-trib.rb create --replicas 1 10.220.5.137:6379 10.220.5.137:6380 10.220.5.137:6381 10.220.5.137:6382 10.220.5.137:6383 10.220.5.137:6384

三、Redis集群的简单测试

测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli

1、登录集群

一定要加个-c,后面输入哪个端口都可以,这就是redis的区中心化思想

redis-cli -c -h 10.220.5.137 -p 6379

2、创建key(可以发现创建的key被分配到了不同的节点)

3、获取key(在没有key的节点上,依然会get到对应key的值)

四、在集群中添加新的节点

1、创建一个新的实例

2、添加该节点到集群中

命令中的 add-node 表示我们要让 redis-trib 将一个节点添加到集群里面, add-node 之后跟着的是新节点的 IP 地址和端口号, 再之后跟着的是集群中任意一个已存在节点的 IP 地址和端口号, 这里我们使用的是 10.220.5.137:6379 。

redis-trib.rb add-node 10.220.5.137:6385 10.220.5.137:6379

3、查看

通过 cluster nodes 命令, 我们可以确认新节点10.220.5.137:6385 已经被添加到集群里面了

4、使新添加的新节点为从节点

如果我们打算让新节点成为 10.220.5.137:6379 的从节点, 那么我们只要用客户端连接上新节点, 然后执行以下命令就可以了

redis-cli -c -h 10.220.5.137 -p 6385

五、对Redis中的数据做重新分片

redis-trib.rb reshard 10.220.5.137:6379

你只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。

How many slots do you want to move (from 1 to 16384)? 1000

我们将打算移动的槽数量设置为 1000 个。

What is the receiving node ID? 3a9aa9592afc594c7e4206cc82ffb37d46a5b23d

定目标需要使用节点的 ID , 而不是 IP 地址和端口。 比如说, 我们打算使用集群的第一个主节点来作为目标, 它的 IP 地址和端口是 10.220.5.137:6380 , 而节点 ID 则是3a9aa9592afc594c7e4206cc82ffb37d46a5b23d , 那么我们应该向 redis-trib 提供节点的 ID

Source node #1:ffadc66b51b6c87ad3c5a33dc9ec39f984bb80e8

接着, redis-trib 会向你询问重新分片的源节点(source node), 也即是, 要从哪个节点中取出 1000 个哈希槽, 并将这些槽移动到目标节点上面。

Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? yes

输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作, 将指定的哈希槽从源节点一个个地移动到目标节点上面。

在重新分片操作执行完毕之后, 可以使用以下命令来检查集群是否正常

redis-trib.rb check 10.220.5.137:6379

六、删除节点

如果节点中有slot,那么需要先将slot 执行reshard给其他节点,然后才能执行删除操作

1、删除空slot

redis-trib.rb del-node 10.220.5.137:6379

2、删除带有slot的节点

需要重新分片

redis-trib.rb reshard 10.220.5.137:6379

再检查slot是否为空,之后再执行删除命令

nosql数据库之Redis集群的更多相关文章

  1. Redis集群高频问答,连夜肝出来了

    Redis 集群方案 Redis集群方案应该怎么做?都有哪些方案?  使用codis方案:目前用的多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新h ...

  2. Redis 集群如何选择数据库?

    Redis 集群目前无法做数据库选择,默认在 0 数据库.

  3. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  4. Net分布式系统之五:C#使用Redis集群缓存

    本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系统高并发查询,为了提供性能减 ...

  5. Redis 集群实现

    Nosql,作为程序员在当下不了解点儿,还真不行,出去聊起来别人就会说你土.那么就聊聊其中一个比较火的redis.redis单机版没得说,但是一直没有集群版,有也是山寨的.前段时间对redis的实现进 ...

  6. Redis集群服务器-高可用调研随笔[转]

    今天改了一天的Bug,本想下午开始专研Redis命令集,结果也泡汤了.只能在下班的路上考虑下Redis集群服务器的高可用方案.随笔而已,尚未成型,仅作记录. 当然,我说的可能比较片面,欢迎拍砖.斧正. ...

  7. C#使用Redis集群缓存

    C#使用Redis集群缓存 本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系 ...

  8. Couchbase集群和Redis集群解析

    Couchbase集群和Redis集群解析 首先,关于一些数据库或者是缓存的集群有两种结构,一种是Cluster;一种是master-salve. 关于缓存系统一般使用的就是Redis,Redis是开 ...

  9. redis集群配置,spring整合jedis,缓存同步

    前台的商品数据(图片等加载缓慢)查询,先从redis缓存查询数据. redis是一个nosql数据库,内存版数据库,读取速度11w/s.本身具有内存淘汰机制,是单线程服务器(分时操作系统),线程安全. ...

随机推荐

  1. 【剑指offer】10:矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: ①方法一 对于这种题没有思路怎么办?可以先从最 ...

  2. leetcode 刷题(数组篇)4题 寻找两个正序数组的中位数(二分查找)

    题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 1: 输入:nums1 = [1,3], nums2 = ...

  3. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12  欢迎加QQ群:1026880196  进行交流学习 实例创建 1.  创建 2. 查 ...

  4. 单个java文件打成可执行jar包

    1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...

  5. web前端的超神之路

    前端超神之路 前端基础知识 HTML :用户实现页面的工具 CSS:用于美化界面的工具 javascript:用于操作html元素和css样式,让你的页面效果更美观 前端进阶知识 jQuery:用于简 ...

  6. boltdb的实现和改进

    整个代码不是很复杂,可以从代码中理解如何实现. 特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误. 整个结构如下: meta page (前两页) --- > ...

  7. vue2整个项目中,数据请求显示loading图----------未完成阅读,码

    一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...

  8. hdu1815 2sat + 二分 + 建图

    题意:       给你两个总部,s1 ,s2,和n个点,任意两点之间都是通过这个总部相连的,其中有一些点不能连在同一个总部上,有一些点可以连接在同一个总部上,总部和总部之间可以直接连接,就是假如a, ...

  9. LA3635派

    题意:       有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少. 思路:       虽然不是 ...

  10. ZOJ3261并查集逆向处理

    题意:       给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种, query a 询问与a直接或者间接想连的点中最大权值的是那个点,输出那个点,如果那个点的权值小于等于a的 ...