Redis架构设计实现
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架构设计实现相关推荐
- 深度剖析不一样的Redis架构设计!
- 01.不一样的Redis - 提到Redis,大家一定会想到的几个点是什么呢? 高并发.KV存储.内存数据库.丰富的数据结构.单线程(版本6之前)等. 那么,接下来,上面提到的这些 ...
- 架构设计:系统存储(16)——Redis事件订阅和持久化存储
接上文<架构设计:系统存储(15)--Redis基本概念和安装使用> 3-4.事件功能和配置项 Redis从2.X版本开始,就支持一种基于非持久化消息的.使用发布/订阅模式实现的事件通知机 ...
- 最全面的缓存架构设计
一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- 你必须了解的微服务架构设计的10个要点!
近来,几乎人人都在谈论微服务.微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境等.本文将介绍微服务架构设计中的一些要点. 微服务架构设计时有哪些要点 ...
- 谈 Kubernetes 的架构设计与实现原理
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 本文转载于公众号:真没什么逻辑 Kubernetes 基本上是这两年最热门.最被人熟知的技术了,它 ...
- 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计
欢迎来到美多商城! [前后端不分离的项目] 项目介绍 项目需求分析 需求分析原因: 可以整体的了解项目的业务流程和主要的业务需求. 项目中,需求驱动开发.即开发人员需要以需求为目标来实现业务逻辑. 需 ...
- 云计算架构设计6大原则,你遵循了吗?
2006年,第一个云计算(Cloud Computing)产品诞生,云计算的概念也被提出,现在云计算几乎已经渗入所有的行业和应用场景中.我们不一定能直接感受到云计算对日常生活.工作.学习的影响,但作为 ...
- 千万级流量的大型分布式系统架构设计
本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好 ...
- [Skr-Shop]购物车之架构设计
skr shop是一群底层码农,由于被工作中的项目折磨的精神失常,加之由于程序员的自傲:别人设计的系统都是一坨shit,我的设计才是宇宙最牛逼,于是乎决定要做一个只设计不编码的电商设计手册. 项目地址 ...
最新文章
- 有关于Matlab的regionprops函数的PixelIdxList和PixelList的一点解释
- zabbix企业应用之监控mysql 5.6版本
- pymysql语法_如何使用PyMySQL模块进行增删改查?
- Windows Socket 编程_ 简单的服务器/客户端程序
- uva 10254——The Priest Mathematician
- Linux: 两个USB摄像头的数据采集问题
- HP 3PAR公用存储的妙用
- 下班后比你多学2个小时的人,在看这几个公众号
- volley 框架的使用
- 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...
- 面对网络灾难风暴Fortinet安立方打造完美方舟
- matlab 回调函数,在Matlab中将实际值传递给回调函数
- Photoshop 更换证件照底色
- C++调用c#的.net Standard类库流程
- 记一次Redis scard读取数据结果不对的问题【DaemonCoder】
- Android EditText优先弹出数字输入法
- opengl绘制位图字体c语言源代码,使用OpenGL位图字体将文本放到屏幕上
- 现代检测技术课程实验编程:最小二乘法应用编程
- css怎么设置页面缩放最小宽度
- 五分钟学Java:为什么会发生ArrayIndexOutOfBoundsException?