Redis高速缓存

利用内存保存数据,读写速度远超硬盘;可以减少I/O操作,降低I/O压力。

  • 发红包、抢红包的数据可以存在高速缓存中,加快处理速度,不需要经过数据库
  • 淘宝首页一些优惠活动商品等热数据可以存在高速缓存中,而基于大数据的推荐产品从数据库中读取

Redis介绍

  • Redis是Wmware开发的开源免费的KV型NoSQL缓存产品
  • Redis具有很好的性能,最多可以提供10万次每秒的读写
  • 目前新浪微博团队组建了世界上最大规模的Redis集群
  • Redis目前的集群方案分为以下几种:
    1. RedisCluster:官方推荐,没有中心节点
    2. Codis:中间件产品,存在中心节点
    3. 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高速缓存的更多相关文章

  1. Docker环境下的前后端分离项目部署与运维

    本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机 ...

  2. Docker环境下的前后端分离项目部署与运维(九)后端项目部署与负载均衡

    数据库准备 建立数据库 renren_fast ,然后运行renrenfast项目中的db文件夹内的脚本 -- 菜单 CREATE TABLE `sys_menu` ( `menu_id` bigin ...

  3. Docker环境下的前后端分离项目部署与运维(六)搭建MySQL集群

    单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...

  4. Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术

    Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...

  5. Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker

    安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...

  6. Docker环境下的前后端分离项目部署与运维(八)使用Docker部署RabbitMQ集群

    下载RabbitMQ镜像 镜像地址RabbitMQ Docker官方认证镜像地址:https://hub.docker.com/_/rabbitmq 安装命令安装之前,切记把Docker Hub设置为 ...

  7. 【Docker】1、 前后端分离项目 下载启动运行

    人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...

  8. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  9. 前后端分离项目部署到Linux虚拟机

    最近做了一个springboot+vue的前后端分离项目,把它部署到Linux虚拟机上.下面是我的步骤和遇到的问题,需要的朋友可以看下(看的时候注意要全部看完到底部,因为我习惯是把我遇到的问题放到最后 ...

随机推荐

  1. javascript实现日期时间动态显示

    .aspx代码例如以下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Def ...

  2. 转载 j2ee j2se j2me 区别,mvc 和ssh联系理解

    [转]J2SE J2EE J2ME的区别 以及 MVC与SSH对应关系 2014-3-6阅读322 评论0 J2SE J2EE J2ME的区别多数编程语言都有预选编译好的类库以支持各种特定的功能,在J ...

  3. Java for LeetCode 117 Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  4. client , offset , scroll 系列 及百度导航栏案例

    1. client 系列 示例 : <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  5. Flash+XML前后按钮超酷焦点图

    在线演示 本地下载

  6. SDUT OJ 河床

    河床 Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 地理学家们经常要对一段河流进行测量分析.他们从上游开始向下游方向等距离地选择 ...

  7. Too many open files解决方案及原理

    以下是我解决Too many open files异常时学习的知识的理解和总结,如有不正确指出,敬请指出! 此问题中文搜索雷同,你可以尝试以下关键字:"file descriptor lea ...

  8. js动态插入标签代码(insertAdjacentHTML)

    做网页时通过ajax请求获取到数据后,有的需要把数据拼接到带有各种标签的字符串中,拼接完字符串就需要把字符串动态添加到网页上的某个位置,举个

  9. BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】

    题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328 题意: 给你一个长度为n的正整数序列. 可以选任意个数字,只能从左往右选. 偶数 ...

  10. legend2---开发日志14(游戏对用户友好的设计思路)

    legend2---开发日志14(游戏对用户友好的设计思路) 一.总结 一句话总结: 不强制,但是激励:比如宗门灵力等级从强制提升到提升宗门和用户的修炼速度 1.丹药有必要做成随机数值么? 没有 1. ...