Redis主从复制

单个redis读写能力有限 我们可以采用多个redis来提高处理并发能力

master负责读写,并将数据同步到slave ,从节点只负责读的操作

  第一步: 将之前的redis01复制两份  让其作为slave

cp -r redis01/ redis02

第二 步   将之前启动的redis服务删除   防止容器名重复  并启动新的容器

docker rm -f redis01

docker run -p 6379:6379 --name redis6379 \
-v /usr/local/docker/redis01/data:/data \
-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

docker run -p 6380:6379 --name redis6380 \
-v /usr/local/docker/redis02/data:/data \
-v /usr/local/docker/redis02/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

docker run -p 6381:6379 --name redis6381 \
-v /usr/local/docker/redis03/data:/data \
-v /usr/local/docker/redis03/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

第三步  查看redis的角色

info replication

查看 redis6379的IP

docker inspect redis6379

……
"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "c33071765cb48acb1efed6611615c767b04b98e6e298caa0dc845420e6112b73",
                    "EndpointID": "4c77e3f458ea64b7fc45062c5b2b3481fa32005153b7afc211117d0f7603e154",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }

第五步  设置master/slave架构

登录 redis6380/redis6381 执行        slaveof 172.17.0.2 6379

假如master有密码,需要在slave的redis.conf配置文件中添加"masterauth 你的密码"这条语句,然后重启redis再执行slaveof 指令操作.

主从同步原理

Redis的主从结构可以采用一主多从结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。

Redis全量同步

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

Redis增量同步

Redis增量复制是指Slave初始化后,开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

Redis哨兵模式

第一步 在容器指定文件目录 /etc/redis 创建sentinel.conf文件

sentinel monitor redis6379 172.17.0.3 6379 1 
daemonize yes #后台运行
logfile "/var/log/sentinel_log.log" #运行日志
sentinel down-after-milliseconds redis6379 30000 #默认30秒

其中, 如上指令表示要的监控的master, redis6379为服务名, 172.17.0.3和6379为master的ip和端口,1表示多少个sentinel认为一个master失效时,master才算真正失效.

1)daemonize yes表示后台运行(默认为no)
2)logfile 用于指定日志文件位置以及名字
3)sentinel down-after-milliseconds 表示master失效了多长时间才认为失效

容器中安装vim

apt-get update

apt-get install vim

第二步: 在每个容器内部的/etc/redis 目录下执行如下命令,启动哨兵服务

redis-sentinel sentinel.conf

关闭原本的master服务

查看信息  info replication

Redis集群高可用

对于redis集群(Cluster),一般最少设置为6个节点,3个master,3个slave,其简易架构如下:

第一步: 生成网络环境

docker network create redis-net

查看网卡信息

docker network ls

查看网卡详细信息

docker network inspect redis-net

第二步 准备redis配置模版

mkdir -p /usr/local/docker/redis-cluster

mkdir -p /usr/local/docker/redis-cluster

在文件中输入

port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.126.129
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

port:节点端口,即对外提供通信的端口
cluster-enabled:是否启用集群
cluster-config-file:集群配置文件
cluster-node-timeout:连接超时时间
cluster-announce-ip:宿主机ip
cluster-announce-port:集群节点映射端口
cluster-announce-bus-port:集群总线端口
appendonly:持久化模式

第三步 创建节点配置文件

在redis-cluser中执行 循环命令

for port in $(seq 8010 8015); \
do \
  mkdir -p ./${port}/conf  \
  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
  && mkdir -p ./${port}/data; \
done

for 变量 in $(seq var1 var2);do …; done为linux中的一种shell 循环脚本, 例如

[root@centos7964 ~]# for i in $(seq 1 5);
> do echo $i;
> done;
1
2
3
4
5
[root@centos7964 ~]#

查看配置文件内容  cat /usr/local/docker/redis-cluster/801{0..5}/conf/redis.conf

第四步: 创建集群中的redis节点容器

for port in $(seq 8010 8015); \
do \
   docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  --privileged=true -v /usr/local/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  --privileged=true -v /usr/local/docker/redis-cluster/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done

其中, --privileged=true表示让启动的容器用户具备真正root权限, --sysctl net.core.somaxconn=1024 这是一个linux的内核参数,用于设置请求队列大小,默认为128,后续启动redis的启动指令需要先放到这个请求队列中,然后依次启动.
创建成功以后,通过docker ps指令查看节点内容。
第五步:创建redis-cluster集群配置

docker exec -it redis-8010 bash

redis-cli --cluster create 192.168.126.129:8010 192.168.126.129:8011 192.168.126.129:8012 192.168.126.129:8013 192.168.126.129:8014 192.168.126.129:8015 --cluster-replicas 1

如上指令要尽量放在一行执行,其中最后的1表示主从比例,当出现选择提示信息时,输入yes即可。

第六步:连接redis-cluster,并添加数据到redis

redis-cli -c -h 192.168.126.129 -p 8010

批量停止docker 容器:

docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker stop

批量删除docker 容器:

docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker rm -f

批量删除文件

rm -rf 801{0..5}/conf/redis.conf

集群的优势

扩容,高可用

Redis如何解决数据的可靠性问题

1.持久化(RDB,AOF)

2.主从+哨兵,集群

Redis架构设计实现相关推荐

  1. 深度剖析不一样的Redis架构设计!

    -      01.不一样的Redis    - 提到Redis,大家一定会想到的几个点是什么呢? 高并发.KV存储.内存数据库.丰富的数据结构.单线程(版本6之前)等. 那么,接下来,上面提到的这些 ...

  2. 架构设计:系统存储(16)——Redis事件订阅和持久化存储

    接上文<架构设计:系统存储(15)--Redis基本概念和安装使用> 3-4.事件功能和配置项 Redis从2.X版本开始,就支持一种基于非持久化消息的.使用发布/订阅模式实现的事件通知机 ...

  3. 最全面的缓存架构设计

    一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...

  4. 你必须了解的微服务架构设计的10个要点!

    近来,几乎人人都在谈论微服务.微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境等.本文将介绍微服务架构设计中的一些要点. 微服务架构设计时有哪些要点 ...

  5. 谈 Kubernetes 的架构设计与实现原理

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 本文转载于公众号:真没什么逻辑 Kubernetes 基本上是这两年最热门.最被人熟知的技术了,它 ...

  6. 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计

    欢迎来到美多商城! [前后端不分离的项目] 项目介绍 项目需求分析 需求分析原因: 可以整体的了解项目的业务流程和主要的业务需求. 项目中,需求驱动开发.即开发人员需要以需求为目标来实现业务逻辑. 需 ...

  7. 云计算架构设计6大原则,你遵循了吗?

    2006年,第一个云计算(Cloud Computing)产品诞生,云计算的概念也被提出,现在云计算几乎已经渗入所有的行业和应用场景中.我们不一定能直接感受到云计算对日常生活.工作.学习的影响,但作为 ...

  8. 千万级流量的大型分布式系统架构设计

    本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好 ...

  9. [Skr-Shop]购物车之架构设计

    skr shop是一群底层码农,由于被工作中的项目折磨的精神失常,加之由于程序员的自傲:别人设计的系统都是一坨shit,我的设计才是宇宙最牛逼,于是乎决定要做一个只设计不编码的电商设计手册. 项目地址 ...

最新文章

  1. 有关于Matlab的regionprops函数的PixelIdxList和PixelList的一点解释
  2. zabbix企业应用之监控mysql 5.6版本
  3. pymysql语法_如何使用PyMySQL模块进行增删改查?
  4. Windows Socket 编程_ 简单的服务器/客户端程序
  5. uva 10254——The Priest Mathematician
  6. Linux: 两个USB摄像头的数据采集问题
  7. HP 3PAR公用存储的妙用
  8. 下班后比你多学2个小时的人,在看这几个公众号
  9. volley 框架的使用
  10. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...
  11. 面对网络灾难风暴Fortinet安立方打造完美方舟
  12. matlab 回调函数,在Matlab中将实际值传递给回调函数
  13. Photoshop 更换证件照底色
  14. C++调用c#的.net Standard类库流程
  15. 记一次Redis scard读取数据结果不对的问题【DaemonCoder】
  16. Android EditText优先弹出数字输入法
  17. opengl绘制位图字体c语言源代码,使用OpenGL位图字体将文本放到屏幕上
  18. 现代检测技术课程实验编程:最小二乘法应用编程
  19. css怎么设置页面缩放最小宽度
  20. 五分钟学Java:为什么会发生ArrayIndexOutOfBoundsException?

热门文章

  1. android 微信摇一摇功能实现,android 类似微信的摇一摇功能实现思路及代码
  2. mysql 截断多个表_如何从MySQL数据库中截断所有表?
  3. JDK自带反编译工具javap
  4. 负载均衡_Maglev
  5. TM1668 与 CT1668 驱动有差异?
  6. 知识图谱评价指标的学习笔记——MAP,MRR
  7. Jace Config
  8. Android-动态修改APP桌面图标
  9. Angular入门到精通系列教程(5)- 第三方UI库(Angular Material)
  10. karaf学习 (2)