使用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 上也会有数据通过过来。
- 抓取手机app的数据(摩拜单车)
- Hadoop离线数据分析平台实战——520项目总结Hadoop离线数据分析平台实战——520项目总结
- 爬虫入门到精通-mongodb的基本使用
- 拒绝撕逼,用数据来告诉你选择器到底哪家强
- 爬虫入门到精通-headers的详细讲解(If-modified-since)
- Linux配置网卡
- 【爬虫军火库】生成指定日期间的日期列表
- 手把手教你安装大数据开发测试环境手把手教你安装大数据开发测试环境
- Humble Numbers(丑数) 超详解!
- 1284 2 3 5 7的倍数
- 爬虫入门到精通-爬虫之异步加载(实战花瓣网)
- 【爬虫军火库】Chrome F12使用Network分析异步请求
- 1305 Pairwise Sum and Divide
- mysql分布式数据库中间件对比mysql分布式数据库中间件对比
- 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 数组属性和方法
- TKE容器实现限制用户在多个namespace上的访问权限(上)
- TKE容器实现限制用户在多个namespace上的访问权限(下)
- 小程序Android可以请求,ios请求失败wx.request
- css中的box-shadow详解
- 迭代器和foreach原理。
- Windows 开机自启VMware虚拟机
- CMake的使用
- 使用ant触发Tomcat的reload操作
- 访问tomcat manager应用遇到的403 access denied错误
- 使用ant执行Java代码
- TypeScript 类型注解和类型推断
- 目前解决移动端1px边框最好的方法
- 关于php的引用
- Windows 开机自启 VMware 虚拟机
- Alertmanager 安装与使用