redis 集群使用主从复制架构-redis集群管理

 redis集群使用主从架构如下图,能有效解决集群中节点连接不上造成集群挂掉的情况
 a) 在Redis集群中可以使用主从模式实现某一个节点的高可用
 b) 当该节点(master)宕机后,集群会将该节点的从数据库(slave)转变为(master)继续完成集群服务;


创建主从集群

 参考前面的主从复制和集群环境搭建,启动6个redis实例,分别是:
 6380(主) 6480(从)
 6381(主) 6481(从)
 6382(主) 6482(从)


[root@master redis-cluster-master-slave]# pwd

 /opt/redis/redis-cluster-master-slave
 [root@master redis-cluster-master-slave]# tree
 ├── 6380
 │   └── redis.conf
 ├── 6381
 │   └── redis.conf
 ├── 6382
 │   └── redis.conf
 ├── 6480
 │   └── redis.conf
 ├── 6481
 │   └── redis.conf
 └── 6482
     └── redis.conf


启动redis-server

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6380/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6381/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6382/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6480/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6481/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6482/redis.conf


创建集群,指定了从库数量为1,创建顺序为主库(3个)、从库(3个)

 [root@master redis-cluster-master-slave]# /opt/redis/redis-3.2.1/src/redis-trib.rb create --replicas 1 192.168.56.101:6380 192.168.56.101:6381 192.168.56.101:6382 192.168.56.101:6480 192.168.56.101:6481 192.168.56.101:6482
 >>> Creating cluster
 >>> Performing hash slots allocation on 6 nodes...
  Using 3 masters:
  192.168.56.101:6380
  192.168.56.101:6381
  192.168.56.101:6382
  Adding replica 192.168.56.101:6480 to 192.168.56.101:6380
  Adding replica 192.168.56.101:6481 to 192.168.56.101:6381
  Adding replica 192.168.56.101:6482 to 192.168.56.101:6382
 M: 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380
    slots:0-5460 (5461 slots) master
 M: 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381
    slots:5461-10922 (5462 slots) master
 M: aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382
    slots:10923-16383 (5461 slots) master
 S: 74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480
    replicates 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15
 S: 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481
    replicates 87d7a6fba680f6826fe680a73ab9ea692aa1b03f
 S: 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482
    replicates aba2eba21bbe0b39423afd940a40e692c4fe7408
 Can I set the above configuration? (type 'yes' to accept): yes
 >>> Nodes configuration updated
 >>> Assign a different config epoch to each node
 >>> Sending CLUSTER MEET messages to join the cluster
 Waiting for the cluster to join...
 >>> Performing Cluster Check (using node 192.168.56.101:6380)
 M: 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380
    slots:0-5460 (5461 slots) master
 M: 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381
    slots:5461-10922 (5462 slots) master
 M: aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382
    slots:10923-16383 (5461 slots) master
 M: 74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480
    slots: (0 slots) master
    replicates 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15
 M: 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481
    slots: (0 slots) master
    replicates 87d7a6fba680f6826fe680a73ab9ea692aa1b03f
 M: 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482
    slots: (0 slots) master
    replicates aba2eba21bbe0b39423afd940a40e692c4fe7408
 [OK] All nodes agree about slots configuration.
 >>> Check for open slots...
 >>> Check slots coverage...
 [OK] All 16384 slots covered.


查看集群节点信息

 192.168.56.101:6380> cluster nodes
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 slave 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 0 1468862135140 4 connected
  4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468862137161 5 connected
  87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468862133120 2 connected 5461-10922
  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 myself,master - 0 0 1 connected 0-5460
  aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 master - 0 1468862138173 3 connected 10923-16383
  4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468862136149 6 connected


测试集群

 1、添加和查询数据
 192.168.56.101:6380> set abc 123
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 OK
 192.168.56.101:6480> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 192.168.56.101:6480> keys *
 (empty list or set)
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6481 -c
 192.168.56.101:6481> keys *
 1) "abc"


添加和查询都正常,说明集群运行正常


2、测试集群中slave节点宕机

 将6480节点kill掉,查看情况。



查看集群节点信息,发现6480已经断开连接:

 192.168.56.101:6481> cluster nodes
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 master - 0 1468862952812 3 connected 10923-16383
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468862953824 2 connected 5461-10922
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 slave,fail 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 1468862829946 1468862827923 4 disconnected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468862951799 3 connected
 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 master - 0 1468862949770 1 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 myself,slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 0 5 connected


连接集群中的客户端,发现集群可用,可见从数据库宕机不会影响集群正常服务

 192.168.56.101:6481> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 192.168.56.101:6381> set k1 111
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 OK
 192.168.56.101:6382> get k1
 "111"
 192.168.56.101:6382>
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6482 -c
 192.168.56.101:6482> get k1
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 "111"
 192.168.56.101:6382>
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6382 -c
 192.168.56.101:6382> get k1
 "111"


恢复6480服务:

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6480/redis.conf


测试6480中的数据:

 192.168.56.101:6480> get k1
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 "111"


3、测试集群中master宕机

 假设6380宕机:



查看集群情况:

 192.168.56.101:6382> cluster nodes
  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 master,fail - 1468863435404 1468863431554 1 disconnected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468863595024 6 connected
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 myself,master - 0 0 3 connected 10923-16383
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 master - 0 1468863594011 8 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468863597051 5 connected
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468863596038 2 connected 5461-10922


发现:

 1、6380节点失效不可用
 2、6480节点从slave转换为master


测试集群是否可用:

 192.168.56.101:6382> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 集群可用。


恢复6380,并查看集群信息

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6380/redis.conf


192.168.56.101:6382> cluster nodes

  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380   slave   74f0fd0468eefad443bcd4627069d217e9213c72 0 1468863759429 8 connected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468863757408 6 connected
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 myself,master - 0 0 3 connected 10923-16383
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 master - 0 1468863754363 8 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468863758418 5 connected
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468863756394 2 connected 5461-10922


发现:

 1、6380节点可用
 2、6480依然是主节点
 3、6380成为6480的从数据库


注:使用集群需要注意的事项

 1、 多键的命令操作(如MGET、MSET),如果每个键都位于同一个节点,则可以正常支持,否则会提示错误。
 2、 集群中的节点只能使用0号数据库,如果执行SELECT切换数据库会提示错误。


书生参考网络整理


2019-03-24 00:09

redis知识点

redis快速入门

reids常用命令

redis数据结构

java_API_客户端

Jedis

Tlcache

redis_持久化

AOF

RDB

发布订阅(pub/sub)

redis_事件

redis事务

redis通讯协议

RESP(Redis Serialization Protocol)

redis高可用

redis哨兵

监控(Monitoring) 提醒(Notification) 自动故障迁移(Automatic failover)

redis主从复制

  • 复制模式

    1. 主从复制
    2. 从从复制
  • 复制过程

  • slave向master发送sync命令;
  • master开启子进程执行bgsave写入rdb文件;
  • master发送缓存和RDB文件给slave;
  • master发送数据发送给slave完成复制;
  • redis集群(Redis_Cluster)

    知识点

    相关教程

    更多

    redis主从复制的原理-redis集群管理

    复制的过程原理  1、 当从库和主库建立master-slave关系后,会向主数据库发送SYNC命令;  2、 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来;  3、 当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;  4、 从Redis接收到后,会载入快照文件并且执行收到的缓存的命令;  5、 之后,主Redis每当

    redis主从复制(读写分离)-redis集群管理

    主从复制的好处:  1、 避免redis单点故障  2、 构建读写分离架构,满足读多写少的应用场景 主从架构 [root@master redis]# mkdir redis-master-slave  创建6380、6381、6382三个目录,分别将安装目录下的redis.conf拷贝到这三个目录下(我直接从单机安装那里拷贝过来,因为我那里已人改过daemonize了)  [root@maste

    redis主从从架构搭建-redis集群管理

    主从从架构 [root@master redis-master-slave]# vim 6382/redis.conf  slaveof 127.0.0.1 6381  分别启动三台redis-server  [root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/638

    redis安装-redis集群管理

    安装redis  [root@master opt]# mkdir /opt/redis  [root@master opt]# cd /opt/redis  [root@master redis]# mv /opt/redis-3.2.1.tar.gz .  [root@master redis]# ls  redis-3.2.1.tar.gz [root@master redis]# tar

    redis 集群环境搭建-redis集群管理

    集群架构 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可  (4)redis-cluster把所有的物理节点映射到[0-16383]slot(插槽)上,cl

    redis新增集群节点-redis集群管理

    新增一个节点6383,并启动 执行redis-trib.rb add-node命令添加节点  redis-trib.rb add-node new_host:new_port existing_host:existing_port  [root@master redis-cluster]# /opt/redis/redis-3.2.1/src/redis-trib.rb add-node 192.

    redis集群出现宕机没法访问-redis集群管理

    先来查看集群节点信息  192.168.56.101:6382> cluster nodes  03596d92625f1b778f29eb4a9128d92809dfd79a 192.168.56.101:6381 master - 0 1468858392134 2 connected 5795-10922  b1939026deb80fedde7bdb22c1df3ecfaa72f60

    redis sentinel(哨兵) 配置详解-redis集群管理

    1. redis sentinel(哨兵)  redis sentinel(哨兵)是对Redis系统的运行情况的监控,它是一个独立进程。它的功能有2个:  a、 监控主数据库和从数据库是否运行正常;  b、 主数据出现故障后自动将从数据库转化为主数据库; 2. 原理  单个redis sentinel(哨兵)架构: 多个redis sentinel(哨兵)架构: 多个哨兵,不仅同时监控主从数据库,

    redis删除集群节点-redis集群管理

    先查看一下集群节点信息:  192.168.56.101:6382> cluster nodes  03596d92625f1b778f29eb4a9128d92809dfd79a 192.168.56.101:6381 master - 0 1468857421626 2 connected 5795-10922  e6d316a0dcd7cfcc98de645d86989d5527e86

    redis集群插槽分配-redis集群管理

    使用cluster nodes命令查看当前集群信息  192.168.56.101:6382> cluster nodes  8c45a68a798aed7c1ed5e636f2899709717952c8 192.168.56.101:6380 master - 0 1468819900949 1 connected 0-5460  c9267b81af4bb2c186d07c5ebc77

    redis从库只读设置-redis集群管理

    默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

    redis sentinel.conf详解-redis集群管理

    sentinel.conf详解  官方完整示例

    Redis概述

    什么是Redis Redis是Remote Dictionary Server的缩写, Redis是一个开源、基于C语言、基于内存亦可持久化的高性能NoSQL的键值对数据库。在众多场合中均可使用Redis代替传统的数据库或者缓存系统。 与Memcached类似的NoSQL型数据库,但是他的数据可以持久化的保存在磁盘上,解决了服务重启后数据不丢失的问题。 发展历史 2009年Salvatore Sa

    Redis Cookbook

    Two years since its initial release, Redis already has an impressive list of adopters, including Engine Yard, GitHub, Craigslist, and Digg.

    基于linux下redis安装与配置

    编译源程序:make install,复制可执行文件,Redis的启动,Redis随机启动

    最新教程

    更多

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    redis从库只读设置-redis集群管理

    默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

    Netty环境配置

    netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

    Netty基于流的传输处理

    ​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

    Netty入门实例-使用POJO代替ByteBuf

    使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

    Netty入门实例-时间服务器

    Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

    Netty入门实例-编写服务器端程序

    channelRead()处理程序方法实现如下

    Netty开发环境配置

    最新版本的Netty 4.x和JDK 1.6及更高版本

    电商平台数据库设计

    电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

    HttpClient 上传文件

    我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

    MongoDB常用命令

    查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

    快速了解MongoDB【基本概念与体系结构】

    什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    windows系统安装MongoDB

    安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

    Spring boot整合MyBatis-Plus 之二:增删改查

    基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    import com.baom

    分布式ID生成器【snowflake雪花算法】

    基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案