redis 持久化 + 主从复制+ 集群

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、 Linux 下的 Redis 安装 && 启动 && 关闭 && 卸载

http://blog.csdn.net/zgf19930504/article/details/51850594

注:设置 redis.conf bind=***.***.*.(127.0.0.1) redis启动: redis-cli -h * -p *

auth 密码

二、持久化 转:

https://my.oschina.net/u/780876/blog/544061

注: 关闭 rdb 配置文件 开启 save “”注释

三、redis 主从复制+sentinel(哨兵)

http://www.cnblogs.com/think-in-java/p/5123884.html

注:在做sentinel 配置时,一台虚拟机做主机master ,另为一台设置两个 从机slave,当主机这台虚拟机 断开(此处断开不是手动关闭redis,是指redis 没关闭情况下,关闭虚拟机。开始大约有1分多钟一直没有切换过来,最终切换成功。这里延迟时间较长,可能会丢失数据)

redis一主多从的spring配置

http://blog.csdn.net/xiaobao5214/article/details/52057232

注:sentinel 配置,配置文件只需写 sentinel 主机 、端口,不必写 主从机配置。

常出现一下问题

DENIED Redis is running in protected mode because protected mode is enabled, no bind address was 
specified, no authentication password is requested to    clients.......  
protected-mode no 

http://blog.csdn.net/alaska_bibi/article/details/52594639

Redis Sentinel 系统如何实现系统高可用的原理:

http://blog.csdn.net/lihao21/article/details/60359633 (sentinel 实现redis的高可用性,其负载能力还是单机负载能力)

四、集群

集群配置前 依赖安装

1):安装redis-cluster依赖:redis-cluster的依赖库在使用时有兼容问题,在reshard时会遇到各种错误,请按指定版本安装.

(1)确保系统安装zlib,否则gem install会报(no such file to load -- zlib)

Java代码 收藏代码

#download:zlib-1.2.6.tar  
./configure  
make  
make install  

(1)安装ruby:version(1.9.2)

Java代码 收藏代码

# ruby1.9.2   
cd /path/ruby  
./configure -prefix=/usr/local/ruby  
make  
make install  
sudo cp ruby /usr/local/bin  

(2)安装rubygem:version(1.8.16)

Java代码 收藏代码

# rubygems-1.8.16.tgz  
cd /path/gem  
sudo ruby setup.rb  
sudo cp bin/gem /usr/local/bin  

(3)安装gem-redis:version(3.0.0)

Java代码 收藏代码

gem install redis --version 3.0.0  
#由于源的原因,可能下载失败,就手动下载下来安装  
#download地址:http://rubygems.org/gems/redis/versions/3.0.0  
gem install -l /data/soft/redis-3.0.0.gem  

2)安装redis-cluster

参考:http://blog.csdn.net/myrainblues/article/details/25881535/

集群配置:

http://www.cnblogs.com/wuxl360/p/5920330.html

注:针对配置上例中,三主三从情况。当主机挂了,从机上位成为新的主机,实现了高可用性。但当主从都挂了的时候,需要通过复制迁移(备份迁移redis.conf):修改cluster-migration-barrier配置。预先可使一个主机挂多个从机,当某主从都挂了的时候,可以迁移其他主机多余的从机用来代替。

http://lib.csdn.net/article/redis/18568

节点加入到集群,使用 cluster meet ip port,注意是在客户端执行该命令哦~~

192.168.1.103:7001> cluster meet 192.168.1.103 7006 OK

重新查询集群信息

192.168.1.103:7001> cluster nodes

Redis 3.0的集群方案有以下两个问题。

一个Redis实例具备了“数据存储”和“路由重定向”,完全去中心化的设计。这带来的好处是部署非常简单,直接部署Redis就行,不像Codis有那么多的组件和依赖。但带来的问题是很难对业务进行无痛的升级,如果哪天Redis集群出了什么严重的Bug,就只能回滚整个Redis集群。

对协议进行了较大的修改,对应的Redis客户端也需要升级。升级Redis客户端后谁能确保没有Bug?而且对于线上已经大规模运行的业务,升级代码中的Redis客户端也是一个很麻烦的事情。

redis 集群的节点是分 槽存储的, 每次 get key 需要重定向到存放改key 槽的 master上

在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 redis-cli -h 192.168.31.245 -c -p 7002 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。

在7005节点执行命令 set hello world ,执行结果如下:

输入图片说明

然后在另外一台7002端口,查看 key 为 hello 的内容, get hello ,执行结果如下:

输入图片说明

简单说一下原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

spring data redis 操作redis 单机版和集群 xml配置信息;

http://blog.csdn.net/hdf734839030/article/details/52293230

注:redis cluster 出现 CLUSTERDOWN The cluster is down(虚拟机关闭再次重启所有节点容易出现)

root@ubuntu:~# ./redis-3.0.1/src/redis-trib.rb check 127.0.0.1:7000|more

输入图片说明

说明 866这个分片没有费给7005节点或者有误 输入图片说明 添加这个分片

127.0.0.1:7005> cluster addslots 866

输入图片说明

cluster-migration-barrier 1 master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2个可工作的从节点时,它的一个从节点才会尝试迁移。

SpringMVC application-redis.xml:<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  xmlns:context="http://www.springframework.org/schema/context"  xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"  xmlns:aop="http://www.springframework.org/schema/aop"  xsi:schemaLocation="  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ">  <bean id="propertyConfig1"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="order" value="1" /><property name="location"><value>/WEB-INF/config/redis.properties</value></property><property name="ignoreUnresolvablePlaceholders" value="true" />  </bean><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  <property name="maxIdle" value="${redis.maxIdle}" />  <property name="maxTotal" value="${redis.maxActive}" />  <property name="MaxWaitMillis" value="${redis.maxWait}" />  <property name="testOnBorrow" value="${redis.testOnBorrow}" />  </bean>  <!-- 1.redis单例模式 --><!--  <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"  p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" p:pool-config-ref="poolConfig"/>   --><!-- 2.redis主从复制+sentinel --><!-- <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">  <property name="master">  <bean class="org.springframework.data.redis.connection.RedisNode">  <property name="name" value="mymaster"/>  </bean>  </property>  <property name="sentinels">  <set>  <bean class="org.springframework.data.redis.connection.RedisNode">  <constructor-arg name="host" value="192.168.65.129"></constructor-arg>  <constructor-arg name="port" value="26379"></constructor-arg>  </bean>  <bean class="org.springframework.data.redis.connection.RedisNode">  <constructor-arg name="host" value="192.168.65.130"></constructor-arg>  <constructor-arg name="port" value="26379"></constructor-arg>  </bean>  </set>  </property>  </bean><bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  <constructor-arg ref="redisSentinelConfiguration"/>  </bean>  --><!--3.配置RedisClusterConfiguration--><bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration"><property name="maxRedirects" value="${redis.maxRedirects}"></property><property name="clusterNodes"><set><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host1}"/><constructor-arg name="port" value="${redis.port1}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host2}"/><constructor-arg name="port" value="${redis.port2}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host3}"/><constructor-arg name="port" value="${redis.port3}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host4}"/><constructor-arg name="port" value="${redis.port4}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host5}"/><constructor-arg name="port" value="${redis.port5}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host6}"/><constructor-arg name="port" value="${redis.port6}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host7}"/><constructor-arg name="port" value="${redis.port7}"/></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="${redis.host8}"/><constructor-arg name="port" value="${redis.port8}"/></bean></set></property></bean><bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><constructor-arg name="poolConfig" ref="poolConfig"/><constructor-arg name="clusterConfig" ref="redisClusterConfiguration"/></bean><bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  <property name="connectionFactory"   ref="connectionFactory" />  <property name="keySerializer">  <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  </property>     <property name="valueSerializer">  <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />  </property>  <property name="hashKeySerializer">    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    </property>  <property name="hashValueSerializer">  <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    </property>  </bean>   <bean id="redisUtil" class="com.general.common.util.RedisUtil"><property name="redisTemplate" ref="redisTemplate"/></bean>   <!-- 启动对@AspectJ注解的支持 --><!-- proxy-target-class等于true是强制使用cglib代理,proxy-target-class默认是false,如果你的类实现了接口 就走JDK代理,如果没有,走cglib代理  --><!-- 注:对于单利模式建议使用cglib代理,虽然JDK动态代理比cglib代理速度快,但性能不如cglib --><!--如果不写proxy-target-class="true"这句话也没问题--><aop:aspectj-autoproxy proxy-target-class="true"/>     
</beans> 

redis.properties

#redis 1.单例模式
#redis.host=120.210.153.11
#redis.port=6379
#redis.password=maoguangdong
#redis 2.主从复制 +sentinel
#redis.master_host=192.168.65.130
#redis.master_port=6379
#redis.slave1_host=192.168.65.130
#redis.slave1_port=6380
#redis.slave2_host=192.168.65.129
#redis.slave2_port=6379
#redis 3.集群RedisClusterConfiguration配置
redis.host1=192.168.65.131
redis.port1=7000
redis.host2=192.168.65.131
redis.port2=7001
redis.host3=192.168.65.131
redis.port3=7002
redis.host4=192.168.65.131
redis.port4=7006
redis.host5=192.168.65.130
redis.port5=7003
redis.host6=192.168.65.130
redis.port6=7004
redis.host7=192.168.65.130
redis.port7=7005
redis.host8=192.168.65.130
redis.port8=7006
redis.maxRedirects=3
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000
com.service.impl.xxxRecordManager= 60
com.service.impl.xxxSetRecordManager= 60
defaultCacheExpireTime=3600fep.local.cache.capacity =10000

转载于:https://my.oschina.net/maoguangdong/blog/850111

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么运行c语言_C语言 原来是这样调用硬件的

大家都知道我们可以使用C语言写一段程序来控制硬件工作&#xff0c;但你知道其工作原理吗&#xff1f;网友北极C语言在实际运行中&#xff0c;都是以汇编指令的方式运行的&#xff0c;由编译器把C语言编译成汇编指令&#xff0c;CPU直接执行汇编指令。所以这个问题就变成&#…

四、元祖、字典

一、元祖(tuple)&#xff1a;tu(11,"hello",(0,1),[11,"111"],33,) 元祖的特点&#xff1a;元祖中一级元素不可被修改&#xff0c;不能被增加或删除&#xff0c;多级元素可以被修改&#xff0c;一般写元祖的时候&#xff0c;推荐在后面添加逗号“&#xff…

PHP编程效率的20个要点

用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则 不会&#xff0c;注意&#xff1a;只有echo能这么做&#xff0c;它是一种可以把多个字符串当作参数的“函数”(译注&#xff1a;PHP手册中说echo是…

ubuntu运行python ide_打造vim中的python IDE

首先先介绍几个常用的插件&#xff1a;1&#xff0c;ctags和taglist&#xff0c;这个大家估计都很常用&#xff0c;在ubuntu下只要安装exuberant-ctags即可啦&#xff0c;另外tagbar支持面向对象语言的展示" toggle Tagbar displaymap :TagbarToggle" autofocus on T…

更新和插入的并发问题_mysql经典面试题:如何读写分离?主从原理是啥?同步的延时问题...

面试题你有没有做 MySQL 读写分离&#xff1f;如何实现 MySQL 的读写分离&#xff1f;MySQL 主从复制原理的是啥&#xff1f;如何解决 MySQL 主从同步的延时问题&#xff1f;考点分析高并发这个阶段&#xff0c;肯定是需要做读写分离的&#xff0c;啥意思&#xff1f;因为实际上…

php实现一个简单的四则运算计算器

php实现一个简单的四则运算计算器&#xff08;还不支持括号的优先级&#xff09;。利用栈这种数据结构来计算表达式很赞。 这里可以使用栈的结构&#xff0c;由于php的数组“天然”就有栈的特性&#xff0c;这里直接就利用了数组。当然可以使用栈结构写&#xff0c;道理一样的。…

Tcp与Ip协议的客户端和服务器编程

Tcp与Ip协议的客户端和服务器编程 本文就TCP和Ip协议的客户端和服务器分别进行编程&#xff0c;实现了客户端和服务端进行通信的功能&#xff0c;服务端对多个客户端进行监听&#xff0c;并能与多个客户端通信。 服务器端代码如下&#xff1a; using System; using System.Coll…

maven建立webapp项目时显示Cannot change version of project facet Dynamic web module to 2.5

为什么80%的码农都做不了架构师&#xff1f;>>> 网上查了很多东西都没啥用&#xff0c;其实直接把这段代码加到web.xml头部&#xff0c;自然就不报错了 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.…

python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

之前我分享过一个数据结构与算法的课程&#xff0c;很多小伙伴私信我问有没有Python版。看了一些公开课后&#xff0c;今天特向大家推荐北京大学的这门课程&#xff1a;《数据结构与算法Python版》。课程概述很多同学想要转行机器学习&#xff0c;也确实掌握了一些机器学习模型…

20道C#练习题(一)1——10题

1.输入三个整数&#xff0c;xyz&#xff0c;最终以从小到大的方式输出。利用if嵌套。 Console.Write("请输入x"); double x double.Parse(Console.ReadLine()); Console.Write("请输入y"); double y double.Parse(Console.ReadLine()); Console.Write(&q…

fd 句柄_linux文件描述符fd(windows下的句柄)

在Linux系统中一切皆可以看成是文件&#xff0c;文件又可分为&#xff1a;普通文件、目录文件、链接文件和设备文件fd&#xff1a;file descriptor文件描述符0,1,2分别给了标准输入、标准输出和错误输出。ls -l /proc/pid/fd可以查看某个进程所使用的fd用lsof可以查看比如&…

Python——三级菜单

#三级菜单函数 menu {北京&#xff1a;&#xff5b;海淀&#xff1a;&#xff5b;五道口&#xff1a;&#xff5b;&#xff5d;中关村&#xff1a;&#xff5b;&#xff5d;上帝&#xff1a;&#xff5b;&#xff5d;&#xff5d;昌平&#xff1a;&#xff5b;&#xff5d;朝阳…

HTTPS 原理解析

http://www.cnblogs.com/zery/p/5164795.html 一 前言 在说HTTPS之前先说说什么是HTTP&#xff0c;HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐…

python 函数参数注解_python-如何使用函数注释来验证函数调用类...

我最近才发现有一种叫做函数注释的东西,但是我不太确定如何使用它.这是我到目前为止的内容&#xff1a;def check_type(f):def decorated(*args, **kwargs):counter0for arg, type in zip(args, f.__annotations__.items()):if not isinstance(arg, type[1]):msg Not the vali…

SQL Server Replication 中关于视图的点滴

在服务器A数据库TEST新建了一个本地发布&#xff08;Local Publications&#xff09;RPL_GES_MIS_TEST,在服务器B数据库RPL_TEST上创建了一个本地订阅&#xff08;Local Subscriptions&#xff09;&#xff0c;它订阅了了这个发布RPL_GES_MIS_TEST.如下截图所示&#xff0c;本地…

kbmmw 5.0 中的REST 服务

目前关于REST 服务的话题越来越热&#xff0c;kbmmw 在5.0 里面开始支持rest。今天我就试一下kbmmw 的 rest 服务。闲话少说&#xff0c;开始。 老规矩&#xff0c;放上两个kbmMWServer1和 kbmMWHTTPSysServerTransport1两个控件。 设置kbmMWHTTPSysServerTransport1的server 属…

php7 匿名继承类_PHP7匿名类的用法示例

本文实例讲述了PHP7匿名类的用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** Created by PhpStorm.* User: Itboot* Date: 2019/1/17* Time: 18:15*/class An{private $num;protected $age 15;public function __construct() {$this->num 1;}protected f…

python中不需要函数重载的原因

函数重载主要是为了解决两个问题&#xff1a; 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是&#xff0c;仅仅当两个函数除了参数类型和参数个数不同以外&#xff0c;其功能是完全相同的&#xff0c;此时才使用函数重载&#xff0c;如果两个函数的功能其实不…

多租户saas 架构_[译/注] Force.com 多租户互联网应用开发平台的设计

原文地址 http://cloud.pubs.dbs.uni-leipzig.de/sites/cloud.pubs.dbs.uni-leipzig.de/files/p889-weissman-1.pdf译注&#xff1a;原文发表于 ACM&#xff0c;2009年6月作者Craig D Weissman, CTO, Salesforce.comSteve Bobrowski, Technical Marketing Consultant, Salesfor…

富文本

View Code转载于:https://www.cnblogs.com/baidaye/p/5295448.html