redis主从搭建和分片集群搭建

文章目录

  • redis主从搭建
    • 搭建一主一从:
      • 下载安装redis:两台机器都需要操作
      • 权限认证
    • 理解主从复制原理、同步数据集
      • 全量同步三个阶段:
      • 增量同步:
      • 心跳检测
    • redis哨兵模式
      • 部署方案
      • 搭建配置
      • 哨兵模式原理
      • 建立连接
        • 获取主服务器信息
        • 获取从服务器信息
  • redis分配集群搭建

redis主从搭建

搭建一主一从:

下载安装redis:两台机器都需要操作

  1. redis下载地址 https://redis.io/download
  2. tar -zxvf redis-5.0.5.tar.gz
  3. mv redis-5.0.5 redis
  4. cd redis
  5. make
  6. cd src
  7. make install
  8. cd ..
  9. mkdir bin
  10. mv src/redis* bin/

修改master redis.conf:

#开启守护线程,后台启动
daemonize yes  
# 开启远程访问
bind 0.0.0.0
# 关闭保护模式
protected-mode no

修改slave redis.conf

#开启守护线程,后台启动
daemonize yes  
# 开启远程访问
bind 0.0.0.0
# 关闭保护模式
protected-mode no
# 配置主redis ip port
replicaof 39.96.204.209 6379

两天机器分别启动redis

cd bin
./redis-server ../redis.conf

进入master客户端:

./redis-cli
127.0.0.1:6379> set weijie 666

进入slave客户端

127.0.0.1:6379> get weijie
"666"127.0.0.1:6379> set weijie 222
(error) READONLY You can't write against a read only replica.#Slaver向Master发送ping命令,Master的响应pong命令
127.0.0.1:6379> ping
PONG

如果出现该值,则说明主从搭建成功!!!

权限认证

修改master redis.conf:
配置主redis密码

requirepass 123456

修改slaver redis.conf,配置从redis的master密码

masterauth 123456

重启master slaver机器的redis,写入和读取测试

master中:

127.0.0.1:6379> info replication
127.0.0.1:6379> set jie
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set jie 666
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set jie 666
OK

slaver中:

127.0.0.1:6379> info replication
127.0.0.1:6379> get jie
"666"

配置成功!!!

理解主从复制原理、同步数据集

redis 2.8以前:只能支持全量同步+命令传播,slave发送sync命令给master --> master生成rdb文件以及缓冲区所有写命令给slave --> salve清空数据解释rdb文件,保存数据一致。

缓冲区是对redis的一种保护机制,redis会将写命令保存在缓冲区,然后再取出执行,有AOF缓冲区、AOF重写缓冲区(解决重写期间数据不一致问题)、输出缓冲区

AOF 缓冲区的作用:目的是维持主线程 AOF 文件的正常写入,保证在重写阶段,AOF 文件写入的逻辑不变。

AOF 重写缓存区作用:目的是记录 AOF 重写开始之后的键增删改的命令。
解释:https://www.v2ex.com/t/193687

在这里插入图片描述

redis 2.8以后:全量同步+增量同步,从第一次连上master --> 全量同步 --> 断线重连触发全量同步、增量同步(master 判断runid是否一致),除此之外都是增量同步。
在这里插入图片描述

全量同步三个阶段:

  1. 同步快照阶段:master创建并发送快照RDB给slave --> slave载入解析RDB,master同时将此阶段所产生的新的写命令存储到缓冲区。
  2. 同步写缓冲阶段:master向slave同步缓冲区的命令
  3. 同步增量阶段:master向slave同步写命令
    在这里插入图片描述

增量同步:

  1. Redis增量同步主要值slave完成初始化后开始正常工作时,master发生的写操作同步到slave的过程。
  2. 通常情况下,master每执行一个写命令就会向slave发送相同的写命令,然后slave接受并执行

心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送命令。
主要作用有三个:

  1. 检测主从的连接状态
  2. 辅助实现min-slaves,Redis可以通过配置防止主服务器在不安全的情况下执行写命令,配置信息(min-slaves-to-writ 3 min-slaves-max-lag 10 )表示从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10
    秒时,主服务器将拒绝执行写命令。
  3. 检测命令丢失,补发命令

redis哨兵模式

哨兵是Redis高可用解决方案:
由于一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。
当主服务器进入下线状态时,sentinel可以将该主服务器下的某一从服务器升级为主服务器继续提供服务,从而保证redis的高可用。

redis的sentinel系统用于管理多个redis服务器,该系统主要执行三个任务:监控、提醒、自动故障转移。

1、监控(Monitoring): Redis Sentinel实时监控主服务器和从服务器运行状态,并且实现自动切换。

2、提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知。

3、自动故障转移(Automatic failover): 当一个主服务器不能正常工作时,Redis Sentinel 可以将一个从服务器升级为主服务器, 并对其他从服务器进行配置,让它们使用新的主服务器。当应用程序连接Redis 服务器时, Redis Sentinel会告之新的主服务器地址和端口。

部署方案

在这里插入图片描述

搭建配置

slaves是自动发现,所以你没必要明确指定slaves

预留:后期补充

哨兵模式原理

建立连接

sentinel是一个特殊的redis服务器,不会进行持久化,sentinel实例启动后,每个sentinel会创建2个连向主服务器的网络连接。

命令连接:用于向主服务器发送命令,并接收响应
订阅连接:用于订阅主服务器的 sentinel:hello频道
!在这里插入图片描述

获取主服务器信息

Sentinel默认每10s一次,向被监控的主服务器发送info命令,获取主服务器和其下属从服务器的信息

127.0.0.1:6379> info
# Server
redis_version:5.0.5
os:Linux 3.10.0-229.el7.x86_64 x86_64
run_id:a4e06ab61b4116660aa37b85079ed482b0b695b1
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=1571684,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=1571551,lag=1
master_replid:366322125dd7dc9bc95ed3467cfec841c112e207
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1571684
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset

获取从服务器信息

当sentinel发现主服务器有新的从服务器出现时,sentinel会向从服务器建立命令连接和订阅连接了,在命令连接建立之后,sentinel还是默认10s一次,向从服务器发送info命令,并记录从服务器信息
在这里插入图片描述
向主服务器和从服务器发送消息(以订阅的方式)

哨兵模式后期搭建成功后再记录!

redis分配集群搭建

redis 3.0之后,Redis官方提供了完整的集群解决方案。
方案去中心化的方式,包括:sharding(分片)、replication(分区)、failover(故障转移)。称为redisCluster。

redis 5.0前采用redis-trib进行集群的创建和管理,需要ruby支持
redis 5.0可以直接使用redis-cli进行集群的创建和管理。

下面开始集群的搭建:redis 版本:5.0.5
搭建效果:在这里插入图片描述
在这里插入图片描述

1.编译安装

tar -zxvf redis-5.0.5.tar.gz
mkdir redis-cluster
cd redis-cluster
mkdir 7001
cd ..
cd redis-5.0.5/src
make install PREFIX=/home/weijie/redis-cluster/7001

查看7001目录下出现bin目录,则按照成功

2.集群配置

配置准备

cd redis-cluster
cd 7001
#引用配置文件
cp /home/weijie/redis-5.0.5/redis.conf ./

修改配置

#修改配置文件
vim redis.conf
#修改端口
port=7001
#关闭保护模式
protected-mode no
#后台启动
daemonize yes
#禁用bind ip 端口
#bind 127.0.0.1 ::1
#开启集群模式
cluster-enabled yes

集群配置准备

cd redis-clustercp -r 7001 7002cp -r 7001 7003cp -r 7001 7004cp -r 7001 7005cp -r 7001 7006拷贝完后,修改其他redis.conf对应的端口号,其他参数不用动

配置启动脚本

cd redis-cluster
vim start.sh

start.sh内容如下

cd /home/weijie/redis-clustercd 7001
./bin/redis-server redis.confcd ..
cd 7002
./bin/redis-server redis.confcd ..
cd 7003
./bin/redis-server redis.confcd ..
cd 7004
./bin/redis-server redis.confcd ..
cd 7005
./bin/redis-server redis.confcd ..
cd 7006
./bin/redis-server redis.conf

stop.sh内容如下

kill -9 `ps -ef|grep redis-server | awk '{print $2}'

赋脚本写和执行的权限
chmod u+x start.sh
chmod u+x stop.sh

启动脚本:sh start.sh
在这里插入图片描述
启动成功!

创建redis集群:

./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

在这里插入图片描述

进入客户端:

cd 7001/bin
# -c 表示集群模式客户端
./redis-cli -h 127.0.0.1 -p 7001 -c
# 查看集群信息
cluster nodes

在这里插入图片描述

写入测试:
在这里插入图片描述
发现数据分片到7003,然后自动调整到7003

集群搭建完成!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么是先更新数据库再删除缓存,而不是更新缓存?

一开始看很多人说更新数据库后删除缓存,然后有人说是更新缓存时需要遍历list或者hash查找导致慢,我!#&((&(&^%&%&m&*&()&,然后百度一堆。。。。。。。,然后用Bing搜索找到…

如何利用redis实现秒杀系统

文章目录题记利用Watch实现Redis乐观锁题记 在线思维导图总结:redis大纲 利用Watch实现Redis乐观锁 乐观锁基于CAS(Compare And Swap)思想(比较并替换),是不具有互斥性,不会产生锁等待而消 耗…

教你如何使用redis分布式锁

文章目录一、redis客户端实现应用1.利用set nx命令实现分布式锁2.利用分布式锁命令 setnx问题1.为什么不直接调用jedis.del(key)方法而采用redislua实现?2.上述两种方式存在的问题?3.根本原因分析二、分布式场景Redission分布式锁的使用1.分布式锁的特性…

【记录保存】批量删除进程

kill -9 ps -ef|grep redis-server | awk {print $2} print $2 选择进程id

本地缓存之Guava简单使用

文章目录使用场景Guava Cache 的优势Guava Cache使用CacheLoaderCallable删除主动删除过期删除基于容量删除引用删除高级用法并发设置更新锁定GuavaCache高级实战之疑难问题GuavaCache会oom(内存溢出)吗GuavaCache缓存到期就会立即清除吗GuavaCache如何找…

本地缓存之LIFO、LRU、FIFO、LFU实现

文章目录LIFO算法实现LRU算法算法核心实现FIFO算法LFU算法LIFO算法 后进先出,利用栈实现 实现 Testpublic void stackDemo(){Stack<Integer> stack new Stack<>();for (int i 1; i < 4; i){stack.add(i);}ArrayList<Integer> list new ArrayList<…

java中强引用、弱引用、软引用、虚引用学习

文章目录强引用弱引用软引用虚引用将引用之前首先让我们一起回顾一下java对象的生命周期强引用 在实际开发场景中&#xff0c;我们一般使用的都是强引用&#xff0c;只要强引用存在&#xff0c;垃圾回收即使OOM也不会回收&#xff0c;知道强引用释放以后&#xff0c;对象才会被…

mysql left join、right join、inner join、union、union all使用以及图解

左外连接&#xff1a;left join sql语法&#xff1a;LEFT JOIN LEFT OUTER JOIN 首先需要创建两张表做测试&#xff0c;表数据如下所示 table 1 表&#xff1a; table2 表&#xff1a; 查询sql&#xff1a; select * from table1 a LEFT JOIN table2 b on a.idb.id 总结&a…

java 将海外时区转换为北京时区

//默认为上海时区TimeZone tz TimeZone.getDefault();//北京时区tz TimeZone.getTimeZone("GMT8");Date date new Date(System.currentTimeMillis());// 获取默认的DateFormat&#xff0c;用于格式化DateSimpleDateFormat simpleDateFormat new SimpleDateFormat…

Java规则引擎-MVEL表达式解析器

MVEL是一个功能强大的基于Java应用程序的表达式语言。 目前最新的版本是2.0&#xff0c;具有以下特性&#xff1a; (1). 动态JIT优化器。当负载超过一个确保代码产生的阈值时&#xff0c;选择性地产生字 节代码,这大大减少了内存的使用量。新的静态类型检查和属性支持&#xff…

第十八章 Swing程序设计

Swing用于开发桌面窗体程序&#xff0c;是JDK的第二代GUI框架&#xff0c;其功能比JDK第一代GUI框架AWT更为强大、性能更加优良。但因为Swing技术推出时间太早&#xff0c;其性能、开发效率等不及一些其他流行技术&#xff0c;所以目前市场上大多数桌面窗体程序都不是由Java开发…

ConcurrentLinkedQueue常用方法

Testpublic void queuedemo(){ConcurrentLinkedQueue<Integer> queue new ConcurrentLinkedQueue();for (int i 0; i < 5; i){queue.add(i);}//获取元素 不移除头结点for (int i 0; i < 3; i){System.out.println("peek: " queue.peek());}//返回在此…

redis stream学习总结

文章目录streamStream基本概念消息id消息内容增删查改消息生产添加消息 xadd查看消息长度 xlen限制stream最大长度1.xadd 中添加**maxlen**:2.xtrim查询消息 xrange正向排序&#xff1a;消费id从小到大排反向查询&#xff1a;消费id从大到小排删除消息消息消费独立消费 xread消…

jedis StreamEntryID参数解释

//$ 在给定Stream中已经包含的最大ID&#xff0c;在xread、xcreategroup中标识消费着只能消费最新消息 StreamEntryID.LAST_ENTRY; “>” 在消费者组的上下文中使用&#xff0c;在xread、xreadgroup总标识消费未消费过的消息 StreamEntryID.UNRECEIVED_ENTRY; 如果传入的为…

RabbitMQ TTL、死信队列在订单支付场景的应用

基于RabbitMQ的TTL以及死信队列&#xff0c;使用SpringBoot实现延迟付款&#xff0c;手动补偿操作。 1、用户下单后展示等待付款页面 2、在页面上点击付款的按钮&#xff0c;如果不超时&#xff0c;则跳转到付款成功页面 3、如果超时&#xff0c;则跳转到用户历史账单中查看…

阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题

/*** https://www.baeldung.com/java-optional*/Testpublic void optionalTest(){Peo peo new Peo("weijie", 18);/*** of、ofNullable*///of 判断peo是否为空&#xff0c;如果不为空程序继续执行Optional<Peo> _of Optional.of(peo);//程序直接抛出NullExce…

阿里巴巴Java开发手册-finally块必须对资源对象、流对象进行关闭操作,如果有异常也要做try-cach操作

对于JDK7及以上版本&#xff0c;可以使用try-with-resources方式 使用方式&#xff1a; /*** https://www.cnblogs.com/itZhy/p/7636615.html* 其实这种方式只是语法糖&#xff0c;反编译以后还是tryCacheThrowTest()中的代码* https://www.cnblogs.com/langtianya/p/5139465.h…

阿里巴巴Java开发手册-日志规约

1.【强制】 应用中不可直接使用日志系统(Log4j、Logback)中的API&#xff0c;而应依赖使用的SLF4j中的API。使用门面模式的日志框架吗&#xff0c;有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger;import org.slf4j.LoggerFactory;Logger logger LoggerFacto…

Java 回调 (Callback) 接口学习使用

文章目录Java 回调 (Callback) 接口学习使用1.什么是回调(Callback)&#xff1f;2.Java代码示例2.直接调用3.接口调用4.Lambda表达式推荐看我的InfoQ地址&#xff0c;界面排版更简洁Java 回调 (Callback) 接口学习使用 1.什么是回调(Callback)&#xff1f; 回调函数&#xff0…