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. 转换(旋转)transform

    div { transform:rotate(180deg); -ms-transform:rotate(180deg); /* IE 9 */ -moz-transform:rotate(180de ...

  2. Java7、Java8 安装卸载问题

    win7 系统,同时安装了JDK7和JDK8,卸载了JDK8之后,cmd命令行输入:java -version ,本以为显示java版本1.7,结果弹错:has value '1.7',but '1. ...

  3. Java for LeetCode 096 Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  4. Java基础教程:多线程基础(3)——阻塞队列

    Java基础教程:多线程基础(3)——阻塞队列 快速开始 引入问题 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 模 ...

  5. 项目发布之后 总提示有一个.DLL找不到或不匹配

    最近发布项目(.net,winform)总提示有一个.dll文件找不到或者不匹配 但是在本地调试是正常的 这个.dll,原来是从.net组件中引用到项目的,后来我将此.dll文件从网上下载,然后在项目 ...

  6. 9.1 NOIP普及组试题精解(1)

    9-1 series1.c #include <stdio.h> int main() { float s=0.0,k; int n; printf("输入数字k(1~15):& ...

  7. 织梦简洁机械设备dedecms模板

    织梦简洁机械设备dedecms模板,个人网站模板,dedecms模板. 模板地址:http://www.huiyi8.com/sc/7269.html

  8. springAOP原理以及概念

    需求:1.拦截所有业务方法2.判断用户是否有权限,有权限就让他执行业务方法,没有权限就不允许执行.(是否有权限是根据user是否为null作为判断依据) 思考: 我们该如何实现? 思路1: 我们在每个 ...

  9. Jmeter-聚合报告

    线程组右键--添加--监听器--聚合报告 Aggreagete Report:jmeter最常用的一个Listener,“聚合报告”. Label:每个jmeter的element(例如HTTP Re ...

  10. tcp攻击