Docker环境下的前后端分离项目部署与运维(七)Redis高速缓存
Redis高速缓存
利用内存保存数据,读写速度远超硬盘;可以减少I/O操作,降低I/O压力。
- 发红包、抢红包的数据可以存在高速缓存中,加快处理速度,不需要经过数据库
- 淘宝首页一些优惠活动商品等热数据可以存在高速缓存中,而基于大数据的推荐产品从数据库中读取

Redis介绍
- Redis是Wmware开发的开源免费的KV型NoSQL缓存产品
- Redis具有很好的性能,最多可以提供10万次每秒的读写
- 目前新浪微博团队组建了世界上最大规模的Redis集群
- Redis目前的集群方案分为以下几种:
- RedisCluster:官方推荐,没有中心节点
- Codis:中间件产品,存在中心节点
- Twemproxy:中间件产品,存在中心节点
RedisCluster
- 没有中心节点,客户端与Redis节点直连,不需要中间代理层
- 数据可以被分片存储,每个节点保存一部分数据,互不相同,某个节点挂掉可能丢失数据,所以要为每个节点设置冗余节点
- 管理方便,后续可以自行添加或删除节点

Redis主存同步
- Redis集群的数据采取切分存储,每个节点存储的各不相同。某个节点挂掉,其存储的数据就丢失了。
- Redis集群中的数据库复制通过主从同步来实现的。主节点把数据分发给从节点。主存同步的好处就在于高可用。Redis节点有冗余设计
Redis集群高可用
- Redis集群中应该包含奇数个Master,至少应该有3个Master。
- Redis和PXC集群都有选举机制,如果超过一半的节点挂掉,那么剩下的节点没有超过一半,是无法选举组成一个新的集群的。
- 连接Redis集群的任何一个节点都能正确写入数据,Redis节点能计算数据应该保存到哪个节点,将数据切分保存到相应的其他节点上。
- Redis节点不配置负载均衡,因为后端项目使用Spring,Spring帮我们实现了负载均衡。(或者使用Nginx代理也行)

配置RedisCluster集群
配置Redis网段
创建net2网段
docker network create --subnet=172.19.0.0/ net2
安装第三方Redis镜像
# 拉取镜像
docker pull yyyyttttwwww/redis
# 修改镜像名称
docker tag yyyyttttwwww/redis redis
# 运行容器
docker run -it -d --name r1 -p : --net=net2 --ip 172.19.0.2 redis bash
# 进入容器
docker exec -it r1 bash
修改容器内redis配置文件,容器中的配置文件路径: /usr/redis/redis.conf
daemonize yes # 以后台进程运行。这句需要注释掉,否则在指定配置文件时会启动失败(https://www.jianshu.com/p/923eb2e0a5f0)
cluster-enabled yes # 开启集群
cluster-config-file nodes.conf # 集群配置文件
cluter-node-timeout # 超时时间
appendonly yes # 开启AOF模式
然后启动redis
# 进入redis目录
cd /usr/redis/src/
# 使用配置文件启动Redisz
./redis-server ../redis.conf
然后按照相同方式启动其他5个Redis节点
docker run -it -d --name r2 -p : --net=net2 --ip 172.19.0.3 redis bash
docker run -it -d --name r3 -p : --net=net2 --ip 172.19.0.4 redis bash
docker run -it -d --name r4 -p : --net=net2 --ip 172.19.0.5 redis bash
docker run -it -d --name r5 -p : --net=net2 --ip 172.19.0.6 redis bash
docker run -it -d --name r6 -p : --net=net2 --ip 172.19.0.7 redis bash
配置第三方Redis集群
利用redis-trib.rb创建Redis集群
docker exec -it r1 bash
cd /usr/redis/
mkdir cluster
cd src
cp redis-trib.rb ../cluster/
cd ../cluster/
./redis-trib.rb create --replicas 172.19.0.2: 172.19.0.3: 172.19.0.4: 172.19.0.5: 172.19.0.6: 172.19.0.7:
创建完毕后会有三个主节点,三个从节点。(注意:这里要输入yes,不是y)
root@26a99229635f:/usr/redis/cluster# ./redis-trib.rb create --replicas 172.19.0.2: 172.19.0.3: 172.19.0.4: 172.19.0.5: 172.19.0.6: 172.19.0.7:
>>> Creating cluster
>>> Performing hash slots allocation on nodes...
Using masters:
172.19.0.2:
172.19.0.3:
172.19.0.4:
Adding replica 172.19.0.5: to 172.19.0.2:
Adding replica 172.19.0.6: to 172.19.0.3:
Adding replica 172.19.0.7: to 172.19.0.4:
M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:
slots:- ( slots) master
M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:
slots:- ( slots) master
M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:
slots:- ( slots) master
S: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:
replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a
S: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:
replicates 361923553a5113db299079326ea59a537d6913fd
S: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:
replicates 7a60116e296cdfb322f17219335f4de457d06d34
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
>>> Performing Cluster Check (using node 172.19.0.2:)
M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:
slots:- ( slots) master
M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:
slots:- ( slots) master
M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:
slots:- ( slots) master
M: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:
slots: ( slots) master
replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a
M: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:
slots: ( slots) master
replicates 361923553a5113db299079326ea59a537d6913fd
M: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:
slots: ( slots) master
replicates 7a60116e296cdfb322f17219335f4de457d06d34
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
--replicas 1参数表示为每个主节点创建一个从节点
查看集群状态
/usr/redis/src/redis-cli -c cluster nodes
root@26a99229635f:/# /usr/redis/src/redis-cli -c
127.0.0.1:> cluster nodes
fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2: myself,master - connected -
df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7: slave 7a60116e296cdfb322f17219335f4de457d06d34 connected
3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5: slave fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a connected
7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4: master - connected -
49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6: slave 361923553a5113db299079326ea59a537d6913fd connected
361923553a5113db299079326ea59a537d6913fd 172.19.0.3: master - connected -
安装Redis镜像
创建外部存储卷
# 创建外部映射文件
mkdir /home/soft/redis
cd /home/soft/redis
mkdir r1 r2 r3 r4 r5 r6
修改Redis配置文件(注意一定要按版本拷贝配置文件)
cd r1
vim redis.conf # bind 127.0.0.1 #要注释掉
# daemonize yes # 以后台进程运行。这句需要注释掉,否则在指定配置文件时会启动失败(https://www.jianshu.com/p/923eb2e0a5f0)
cluster-enabled yes # 开启集群
cluster-config-file nodes.conf # 集群配置文件
cluster-node-timeout # 超时时间
appendonly yes # 开启AOF模式
# 拷贝配置文件
cp redis.conf ../r2/redis.conf
cp redis.conf ../r3/redis.conf
cp redis.conf ../r4/redis.conf
cp redis.conf ../r5/redis.conf
cp redis.conf ../r6/redis.conf
导入本地Redis镜像文件,运行Redis容器
docker pull redis
# 将/home/soft/redis目录映射为容器的/data目录
docker run -it -d -p : -v /home/soft/redis/r1:/data --net=net2 --ip 172.19.0.2 --name r1 redis /data/redis.conf
docker run -it -d -p : -v /home/soft/redis/r2:/data --net=net2 --ip 172.19.0.3 --name r2 redis /data/redis.conf
docker run -it -d -p : -v /home/soft/redis/r3:/data --net=net2 --ip 172.19.0.4 --name r3 redis /data/redis.conf
docker run -it -d -p : -v /home/soft/redis/r4:/data --net=net2 --ip 172.19.0.5 --name r4 redis /data/redis.conf
docker run -it -d -p : -v /home/soft/redis/r5:/data --net=net2 --ip 172.19.0.6 --name r5 redis /data/redis.conf
docker run -it -d -p : -v /home/soft/redis/r6:/data --net=net2 --ip 172.19.0.7 --name r6 redis /data/redis.conf
配置Redis集群
redis-trib.rb已经不再推荐,使用redis-cli来创建容器。
进入某个节点容器的 /usr/local/bin 目录,执行如下命令创建容器
./redis-cli --cluster create 172.19.0.2: 172.19.0.3: 172.19.0.4: 172.19.0.5: 172.19.0.6: 172.19.0.7: --cluster-replicas
创建完毕后会有三个主节点,三个从节点。(注意:这里要输入yes,不是y)
root@4a8c3bf758f0:/usr/local/bin# ./redis-cli --cluster create 172.19.0.2: 172.19.0.3: 172.19.0.4: 172.19.0.5: 172.19.0.6: 172.19.0.7: --cluster-replicas
>>> Performing hash slots allocation on nodes...
Master[] -> Slots -
Master[] -> Slots -
Master[] -> Slots -
Adding replica 172.19.0.6: to 172.19.0.2:
Adding replica 172.19.0.7: to 172.19.0.3:
Adding replica 172.19.0.5: to 172.19.0.4:
M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:
slots:[-] ( slots) master
M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:
slots:[-] ( slots) master
M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:
slots:[-] ( slots) master
S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:
replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95
S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:
replicates 890da9d1f480380e7154685dc6a757e3a3be2092
S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:
replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.19.0.2:)
M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:
slots:[-] ( slots) master
additional replica(s)
S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:
slots: ( slots) slave
replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20
S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:
slots: ( slots) slave
replicates 890da9d1f480380e7154685dc6a757e3a3be2092
M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:
slots:[-] ( slots) master
additional replica(s)
S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:
slots: ( slots) slave
replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95
M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:
slots:[-] ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
可以进入某个节点容器后,执行如下指令进入集群:
/usr/local/bin/redis-cli -c
查看集群状态
cluster nodes
Docker环境下的前后端分离项目部署与运维(七)Redis高速缓存的更多相关文章
- Docker环境下的前后端分离项目部署与运维
本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机 ...
- Docker环境下的前后端分离项目部署与运维(九)后端项目部署与负载均衡
数据库准备 建立数据库 renren_fast ,然后运行renrenfast项目中的db文件夹内的脚本 -- 菜单 CREATE TABLE `sys_menu` ( `menu_id` bigin ...
- Docker环境下的前后端分离项目部署与运维(六)搭建MySQL集群
单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...
- Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术
Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...
- Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker
安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...
- Docker环境下的前后端分离项目部署与运维(八)使用Docker部署RabbitMQ集群
下载RabbitMQ镜像 镜像地址RabbitMQ Docker官方认证镜像地址:https://hub.docker.com/_/rabbitmq 安装命令安装之前,切记把Docker Hub设置为 ...
- 【Docker】1、 前后端分离项目 下载启动运行
人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...
- nginx+vue+uwsgi+django的前后端分离项目部署
Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...
- 前后端分离项目部署到Linux虚拟机
最近做了一个springboot+vue的前后端分离项目,把它部署到Linux虚拟机上.下面是我的步骤和遇到的问题,需要的朋友可以看下(看的时候注意要全部看完到底部,因为我习惯是把我遇到的问题放到最后 ...
随机推荐
- Consumer Group Example
面向kafka编程 Consumer Group Example https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Ex ...
- JAVA使用相对路径读取配置文件
JAVA使用相对路径读取配置文件[align=center][/align][size=medium][/size] 在软件开发中经常遇到读取配置文件,以及文件定位问题.今天做个总结. (一) ...
- 5.1 《锋利的jQuery》jQuery对表单的操作
获取焦点和失去焦点改变样式 改变文本框/滚动条高度 复选框应用 下拉框应用 表单验证 tip1: 注意使用<label>的for标签,对应input的id.(for 属性规定 label ...
- luoguP3066 [USACO12DEC]逃跑的BarnRunning
luoguP3066 [USACO12DEC]逃跑的BarnRunning 题目大意 给定一棵n个节点的树和参数L,查询每个节点子树中到达该节点距离<=L的数量(包括该节点) 偏模板的主席树 P ...
- POJ2104 K-th Number (子区间内第k大的数字)【划分树算法模板应用】
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 40920 Accepted: 13367 Ca ...
- HDU2825 Wireless Password —— AC自动机 + 状压DP
题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others) ...
- Compiling: main.cpp /bin/sh: g++: not found
Kbuntu用codeblocks编写C程序的时候,编译报错如下: Compiling: main.cpp/bin/sh: g++: not found 解决方法: sudo apt-get inst ...
- 使用C++模拟C#的委托机制
1. [代码][C/C++]代码 //Event.h #ifndef _EVENT_H_#define _EVENT_H_class EmptyObject {};template<typen ...
- HTML5实现中国象棋游戏(无人能敌)
1. [代码][JavaScript]代码 var AI = AI||{}; AI.historyTable = {}; //历史表 //人工智能初始化AI.init = func ...
- 使用同一个目的port的p2p协议传输的tcp流特征相似度计算
结论: (1)使用同一个目的port的p2p协议传输的tcp流特征相似度高达99%.如果他们是cc通信,那么应该都算在一起,反之就都不是cc通信流. (2)使用不同目的端口的p2p协议传输的tcp流相 ...