使用docker 搭建redis的主从复制
Redis 在我的项目中,主要用作缓存和消息队列。小的项目可以使用单机版,大点的项目或者稍微注重高可用的时候可以考虑使用Redis 集群。
Redis 集群有三种模式: 主从复制(redis2.8版本之前的模式)、哨兵(sentinel)模式以及redis cluster模式(redis3.0版本之后)。
问
为什么要Redis主从复制?
1.高可用数据备份,当一个节点挂掉时,数据因为有备份,可恢复。
2.适用于高并发场景,负载均衡,所有客户端都访问一个节点肯定会影响Redis工作效率,有了主从以后,可以作为读写分离,即查询操作通过查询从节点来完成,写入访问主节点。
重要
Redis主从复制的注意事项
1.一个master可以有多个slave,默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止。
2.不要修改配置让slave节点支持写操作,没有意义,原因一,写入的数据不会被同步到其他节点;原因二,当master节点修改同一条数据后,slave节点的数据会被覆盖掉。
3.slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来,master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。
4.master节点挂了以后,redis就不能对外提供写服务了,因为剩下的slave不能成为master。这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般的生产坏境是不会单单只有主从模式的。所以有了哨兵(sentinel)模式。
实例:单机使用docker 搭建redis主从复制
建议大家学习下docker ,非常简单的,简单的几条命令就可以搭建环境,docker帮我们屏蔽了很多编译、安装困难。使用docker-compose 搭建,下面给出docker-compose.yml
version: '3.6'
services:
master:
image: redis
container_name: redis-master
restart: always
command: redis-server --port 6379 --requirepass master123 --appendonly yes
ports:
- 6379:6379
volumes:
- ./data/master:/data
slave1:
image: redis
container_name: redis-slave-1
restart: always
command: redis-server --slaveof master 6379 --port 6380 --requirepass slave123 --masterauth master123 --appendonly yes
ports:
- 6380:6380
volumes:
- ./data/slave1:/data
slave2:
image: redis
container_name: redis-slave-2
restart: always
command: redis-server --slaveof master 6379 --port 6381 --requirepass slave456 --masterauth master123 --appendonly yes
ports:
- 6381:6381
volumes:
- ./data/slave2:/data
其中:
--slaveof master 6379 设置从节点的关键语句,master指主节点的hostname
--requirepass slave456 设置密码
--appendonly yes 开启持久化,默认是AOF 模式
运行结果:
[root@master docker-compose]# ls
data docker-compose.yml
[root@master docker-compose]# docker-compose up -d
Starting redis-master ... done
Starting redis-slave-2 ... done
Starting redis-slave-1 ... done
[root@master docker-compose]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1934a4e65a80 redis "docker-entrypoint.s…" 5 hours ago Up 9 seconds 6379/tcp, 0.0.0.0:6380->6380/tcp redis-slave-1
422a708f7a1f redis "docker-entrypoint.s…" 5 hours ago Up 9 seconds 6379/tcp, 0.0.0.0:6381->6381/tcp redis-slave-2
07f8c1393f08 redis "docker-entrypoint.s…" 5 hours ago Up 9 seconds 0.0.0.0:6379->6379/tcp redis-master
[root@master docker-compose]#
使用 redis客户端工具RedisDesktopManager,当在master 上写入一个 key时,slave1和slave2 上也会有数据通过过来。
- 【Go 语言社区】关于Golang 数据缓存到redis内存数据库遇到的问题
- go中的读写锁RWMutex
- Centos7.4 版本环境下安装Mysql5.7操作记录
- 你必须知道的23个最有用的Elasticseaerch检索技巧
- Elasticsearch Jest实战深入详解
- 在oracle中计算时间差
- 【Go 语言社区】GO中怎么处理URL编码?
- C语言库函数rename
- Oracle 12c DG新特性Far Sync(r10笔记第67天)
- iOS微信特殊字符保护方案
- 简单易学的机器学习算法——谱聚类(Spectal Clustering)
- oracle数据库 如何查询某个表的约束条件
- 结构体存入文件并且取出
- 【Go 语言社区】使用 Redis 实现排行榜功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 实现抖音小游戏潜艇大挑战的思路详解
- 修改Android Studio 的 Logcat 缓冲区大小操作
- Android自定义View验证码输入框
- PHP生成随机字符串实例代码(字母+数字)
- Laravel框架中缓存的使用方法分析
- android实现搜索功能并将搜索结果保存到SQLite中(实例代码)
- Android实现全局右滑返回
- Android实现打地鼠小游戏
- android实现手机传感器调用
- Android实现接近传感器
- PHP 模拟登陆功能实例详解
- PHP判断一个变量是否为整数、正整数的方法示例
- android实现打地鼠游戏
- Yii框架连表查询操作示例
- Android studio listview实现列表数据显示 数据循环显示效果