关于redis集群:Whats-new-in-Pika-v350

时隔两年,Pika 社区正式公布经由社区 50 多人参加开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在晋升性能的同时,也反对了 Codis 集群部署,BlobDB KV 拆散,减少 Exporter 等新个性。 咱们将具体介绍该版本引入的重要新个性。 1 去除 Rsync在 v3.5.0 版本之前,Pika 应用 Rsync 工具进行引擎中存量数据的同步,Pika 过程启动时创立 Rsync 子过程。这种同步形式在理论应用中呈现了一些问题,包含Pika 过程 crash 后从新拉起无奈失常同步以及同步过程中 Rsync 过程无端退出等。在往年公布的 v3.5.0 版本中,咱们在全量同步计划方面进行了重要的改良,摒弃了以往应用的 Rsync,实现了全新的数据同步计划,反对了断点续传,动静调节传输限速等个性,以确保同步过程更加稳固、可控。这些改良不仅加强了同步的可靠性,还为用户提供了更好的应用体验。 去除 Rsync 过程,应用自研全量同步形式实现断点续传,传输限速性能Pika 主从同步时,进行 master run\_id 的测验2 兼容更多 Redis 命令在 v3.5.0 版本中,咱们迈出了更大的一步,晋升了对 Redis 命令的兼容性,对 Redis 命令提供了更宽泛的反对。这个版本的改良使得 Pika 在与 Redis 生态系统的集成中体现更加杰出,为用户提供了更丰盛的性能和更广大的可能性。咱们对命令反对的扩大,为用户提供了更多的灵活性,以满足不同场景下的需要。 反对 UNLINK 命令反对 INFO COMMANDSTATS 命令反对 HELLO、SETNAME 命令反对 BLPOP、BRPOP 命令新增 Pika 原创 DISKRECOVERY 命令3 RocksDB 版本升级和分级压缩在 v3.5.0 版本中,咱们进行了一项重要的降级,将 RocksDB 引擎降级至 v8.1.1 版本,并实现了分级压缩性能的整合。这一降级不仅是技术的飞跃,也是咱们对系统性能和优化的继续关注的体现。通过这项降级,咱们为 Pika 减少了更高级别的数据管理能力,同时也让零碎更好地适应不同的压缩需要,为用户的数据存储和检索提供了更大的灵活性和效率。 ...

August 24, 2023 · 2 min · jiezi

关于redis集群:独家深度解析redis集群的架构问题附脑洞

本文首发自[慕课网](imooc.com) ,想理解更多IT干货内容,程序员圈内热闻,欢送关注"慕课网"及“慕课网公众号”!   作者:一凡|慕课网讲师 Redis 是一种开源(BSD 许可)、数据结构存储在内存中的零碎,用作数据库、缓存和音讯队列。Redis 提供了诸如字符串、散列、列表、汇合、带范畴查问的排序汇合、位图、超级日志、天文空间索引和流等数据结构。Redis 内置复制、Lua 脚本、LRU 驱赶、事务和不同级别的磁盘长久化,并通过 Redis Sentinel 和 Redis Cluster 主动分区提供高可用性。 1 集群的劣势上面是redis集群的几个显著劣势。 1.1 伸缩性,数据规模一直增大的时候,容易扩容 单实例模式:只能垂直扩大,增大机器内存的容量; 集群模式:反对垂直扩大,也反对程度扩大,有更好的灵活性,也能够反对更大的容量; 1. 2 高可用,服务故障的状况,影响范畴小 单实例模式:故障转移前100%不可用(slave转换为master之前); 集群模式:故障转移前局部不可用(集群规模越大,故障影响越小);  1. 3 高性能,查问和写入的性能 单实例模式:查问能够扩散在多个slave,写入却只有一个master; 集群模式:查问有多个master和多个slave,写入也有多个master; 2 数据分片,一致性hash实现redis集群的外围点,是针对数据的分片,这里的一致性hash算法就十分要害。 2.1 一般的hash 算法node=hash(key)%number 数量变动和node程序变动,导致node抉择的差异性微小,造成微小的缓存生效。 2.2 一致性hash hash(node) 造成虚构节点环,hash(key)落在虚构节点环,找到对应的node。 因为hash(node)的稳定性,与node程序无关。node变更只影响一小部分数据。 2.3 redis cluster的hash slot算法 关系: cluster > node > slot > key Redis Cluster在设计中没有应用一致性哈希(Consistency Hashing),而是应用数据分片引入哈希槽(hash slot)来实现。 一个 Redis Cluster蕴含16384(0~16383)个哈希槽,存储在Redis Cluster中的所有键都会被映射到这些slot中。 集群中的每个键都属于这16384个哈希槽中的一个,集群应用公式slot=CRC16(key)/16384来计算key属于哪个槽,其中CRC16(key)语句用于计算key的CRC16 校验和。 依照槽来进行分片,通过为每个节点指派不同数量的槽,能够管制不同节点负责的数据量和申请数。 3 集群元数据的一致性3.1 比照:集中式存储元数据 ...

May 29, 2023 · 2 min · jiezi

关于redis集群:Redis集群介绍及测试思路

作者:京东批发 李磊 Redis集群介绍Redis集群个别有四种形式,别离为:主从复制、哨兵模式、Cluster以及各大厂的集群计划。在3.0版本之前只反对单实例模式,3.0之后反对了集群形式。在3.0之前各大厂为了解决单实例Redis的存储瓶颈问题各自推出了本人的集群计划,其核心思想就是数据分片,次要有客户端分片、代理分片、服务端分片。这里咱们只介绍前三种形式:主从、哨兵、Cluster。 1、主从复制Redis单节点的数据是存储在一台服务器上的,如果服务器呈现故障,会导致数据不可用,而且读写都是在同一台服务器上,申请量大时会呈现I/O瓶颈。为了防止单点故障和读写不拆散,Redis提供了复制性能来实现Master中的数据向Slave数据库的同步。Master能够有多个Slave节点,Slave节点也能够有Slave节点,从节点是级联构造,如下图所示: 主从复制工作原理个别状况下为了让数据读写拆散,Master节点用来执行写操作,Slave节点提供读操作,Master执行写操作时将变动的数据同步到Slave,其工作原理如下图所示: Redis主从复制基本原理有三种:全量复制、基于长连贯的命令流传、增量复制。 首先介绍一下全量复制,当主从服务器刚建设连贯的时候,会依照三个阶段实现数据的第一次同步。假如当初有实例1(192.168.1.1)和实例2(192.168.1.2),当咱们在实例2上执行“replicaof 192.168.1.1 6379”命令后,实例2就变成了实例1的从库,并开始从实例1上复制数据,有如下三个阶段: 第一个阶段,是主从库之间建设连贯、协商同步的过程,为全量复制做筹备。具体来说,从库给主库发送psync命令,示意要进行数据同步,主库依据这个命令的参数来启动复制。psync命令蕴含了主库的runID和复制进度offset两个参数。 •runID:是每个Redis实例启动时主动生成的一个随机ID,用来惟一标记这个实例。当从库和主库第一次复制时,因为不晓得主库的runID,所以将runID设置为“?”。 •offset:设置为-1,示意第一次复制。 主库收到psync命令后,会用FULLRESYNC响应命令带上两个参数:主库runID和主库目前的复制进度offset,返回给从库,从库收到响应后会记录下这两个参数。FULLRESYNC响应示意第一次复制采纳的全量复制,也就是说,主库会把以后所有的数据都复制给从库。 第二个阶段,主库将所有数据同步给从库,从库收到数据后,首先清空现有数据,而后在本地实现数据加载。这个过程依赖于内存快照生成的RDB文件。具体来说,主库执行bgsave命令,生成RDB文件,接着将文件发给从库。 第三个阶段,主库会把第二阶段执行过程中新接管到的写命令,再发送给从库。具体来说,当主库实现RDB文件发送后,就会把此时replication buffer中的批改和新增操作发给从库,从库再从新执行这些操作。这样一来,主从库就实现同步了。 以上是全量复制的根本流程,一旦主从库实现了全量复制,它们之间就会始终保护一个网络连接,主库会通过这个连贯将后续陆续收到的命令操作再同步给从库,这个过程也称为基于长连贯的命令流传,能够防止频繁建设连贯的开销。 长连贯是基于网络的,那么它就存在网络断开的危险,在Redis2.8之前,如果主从库在命令流传时呈现了网络闪断,那么从库会和主库从新进行一次全量复制,开销十分大。在Redis2.8开始,网络闪断之后,主从库会采纳增量复制的形式持续同步,就只会把主从网络断连期间主库收到的命令同步给从库。 增量复制外围在于repl\_backlog\_buffer这个缓冲区。当主从库断连后,主库会把断连期间收到的写操作命令写入replication buffer,同时也会写入repl\_backlog\_buffer这个缓冲区。repl\_backlog\_buffer是一个环形缓冲区,主库记录本人写到的地位,从库也记录本人读到的地位。主从连贯复原之后,从库首先给主库发送psync命令,并把本人以后的slave\_repl\_offset发给主库,主库会判断本人的master\_repl\_offset和slave\_repl\_offset之间的差距,一般来说master\_repl\_offset会大于slave\_repl\_offset。此时,主库只用把master\_repl\_offset和slave\_repl\_offset之间的命令操作同步给从库就行。 2、哨兵模式sentinel,中文名哨兵。Redis的sentinel零碎用于治理多个Redis实例,该零碎次要执行以下四个工作:1.监控(Monitoring):Sentinel会一直的查看主服务器和从服务器是否失常运作。 2.主动故障转移(Automatic failover):当主节点不能失常工作时,哨兵会开始主动故障转移操作,它会将生效主节点的其中一个从节点降级为新的主节点,并让其余从节点改为复制新的主节点。 3.告诉(Notification):哨兵能够将故障转移的后果发送给客户端。 4.配置提供者(Configuration provider):客户端在初始化时,通过连贯哨兵来取得以后Redis服务的主节点地址。 其中,监控和主动故障转移性能,使得哨兵能够及时发现主节点故障并实现转移;而配置提供者和告诉性能,则须要在与客户端的交互中能力体现。 哨兵用于实现Redis集群的高可用性,自身也是分布式的,作为一个哨兵集群去运行。Sentinel的过程之间应用谰言协定(gossip protocols)来接管对于主服务器是否下线的信息, 并应用投票协定(agreement protocols)来决定是否执行主动故障迁徙, 以及抉择哪个从服务器作为新的主服务器。上面别离介绍一下监控和主动故障转移的基本原理: Sentinel集群监控原理 1.每个 Sentinel 以每秒一次的频率向它所知的主从服务器以及其它 Sentinel 实例发送一个 PING 命令。 2.如果一个实例间隔最初一次无效回复 PING 命令的工夫超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 3.正在监督这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器确实进入了主观下线状态。 4.有足够数量的 Sentinel 在指定的工夫范畴内批准这一判断, 那么这个主服务器被标记为主观下线。 5.每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主从服务器发送 INFO 命令。当一个主服务器被 Sentinel 标记为主观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。 ...

April 7, 2023 · 3 min · jiezi

关于redis集群:Redis集群和哨兵搭建说明亲测成功

Redis集群和哨兵搭建阐明_亲测胜利1.运行环境阐明1.1 服务器零碎支流Linux零碎 1.2 Redis版本Redis-5.0.3 redis从3.0开始反对集群 2. Redis装置1 新建一个软件保留目录如:/data/software/ cd /data/software/wget http://download.redis.io/releases/redis-5.0.3.tar.gztar -zxvf redis-5.0.3.tar.gz2 新建一个利用目录如:/data/apps mv redis-5.0.3 /data/appscd /data/apps/redis-5.0.3make3.集群搭建3.1 机器筹备筹备三台机器,别离装置redis 192.168.1.51 主-从192.168.1.52 主-从192.168.1.53 主-从 3.1.1 在51机器上执行cd /data/apps/redis-5.0.3mkdir 7000mkdir 7001cp redis.conf 7000/redis.conf批改配置vim 7000/redis.conf#bind 127.0.0.1 #能够近程拜访protected-mode no #保护模式敞开daemonize yes #后盾启动port 7000pidfile /var/run/redis_7000.pidlogfile "/data/apps/redis-5.0.3/7000/7000.log"dbfilename dump.rdbdir /data/apps/redis-5.0.3/7000/cluster-enabled yes #开启集群cluster-config-file nodes_7000.conf #集群的配置文件cluster-node-timeout 5000 #申请超时 设置5秒够了appendonly yes #aof日志开启 有须要就开启,它会每次写操作都记录一条日志appendfilename "appendonly7000.aof"设置集群明码 在配置文件外面减少明码选项,肯定要加上masterauth,不然Redirected的时候会失败masterauth abcd_123requirepass abcd_123cp 7000/redis.conf 7001/#批改7001目录下redis.conf的对应配置,7000改为70013.1.2 在52机器上执行 与下面51机器配置相似, 把对应配置改成7002和7003。 mkdir 7002mkdir 70037002/redis.conf7003/redis.conf3.1.3 在53机器上执行 与下面51机器配置相似, 把对应配置改成7004和7005。 mkdir 7004mkdir 70057004/redis.conf7005/redis.conf3.1.4 别离启动6台Rediscd /data/apps/redis-5.0.3/src/redis-server 7000/redis.conf src/redis-server 7001/redis.conf src/redis-server 7002/redis.conf src/redis-server 7003/redis.conf src/redis-server 7004/redis.confsrc/redis-server 7005/redis.conf ps -ef | grep redis 查看启动状况3.1.5 在某一台上执行退出集群三主三从./redis-cli --cluster create 192.168.1.51:7000 192.168.1.52:7002 192.168.1.53:7004 192.168.1.51:7001 192.168.1.52:7003 192.168.1.53:7005 --cluster-replicas 1 -a abcd_123留神: 输出yes确认之前, 先看好哪几台是主,哪几台是从 (如果只有3台机器,确定是穿插主从后输出yes创立)如果是外网拜访:须要凋谢端口7000 17000 ...等所对应端口 ...

December 28, 2022 · 2 min · jiezi

关于redis集群:Redis集群部署的三种模式

一、Redis简介Redis 是一款齐全开源收费、恪守BSD协定的高性能(NOSQL)的key-value数据库。它应用ANSI C语言编写,反对网络、可基于内存亦可长久化的日志型、Key-Value数据库,并提供多种语言的API。 Redis的应用场景有如下一些: 读写效率要求高,须要将数据进行缓存的。此时,能够把一些须要频繁拜访的数据,而且在短时间之内不会发生变化的,放入Redis中进行操作,从而进步用户的申请速度和升高网站的负载,升高数据库的读写次数。须要实时计算的场景。须要实时变动和展现的性能,就能够把相干数据放在Redis中进行操作,能够大大提高拜访效率。音讯队列场景。比方在应答实时聊天零碎时,就能够应用Redis,能够大大提高利用的可用性。正是因为Redis有这么多的益处,所以不论是大中型我的项目,都会用到Redis。而咱们明天要讲的就是Redis的三种集群部署模式:主从模式,Sentinel(哨兵)模式,Cluster模式。 Rdis最开始应用主从模式做集群,若master宕机须要手动配置slave转为master;起初为了高可用提出来哨兵模式,该模式下有一个哨兵监督master和slave,若master宕机可主动将slave转为master,但它也有一个问题,就是不能动静裁减;所以在3.x提出cluster集群模式。 二、主从模式2.1 主从模式简介主从模式是三种模式中最简略的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。其中,主从复制有如下特点: 主数据库能够进行读写操作,当读写操作导致数据变动时会主动将数据同步给从数据库;从数据库个别是只读的,并且接管主数据库同步过去的数据;一个master能够领有多个slave,然而一个slave只能对应一个master;slave挂了不影响其余slave的读和master的读和写,重新启动后会将数据从master同步过去;master挂了当前,不影响slave的读,但redis不再提供写服务,master重启后redis将从新对外提供写服务;master挂了当前,不会在slave节点中从新选一个master;上面是主从模式的工作示意图。 工作机制: 当slave启动后,被动向master发送SYNC命令。master接管到SYNC命令后在后盾保留快照(RDB长久化)和缓存保留快照这段时间的命令,而后将保留的快照文件和缓存的命令发送给slave。slave接管到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接管到的写命令都会同步发送给slave,保障主从数据一致性。2.2 环境阐明为了不便演示主从模式,咱们须要筹备至多3台机器(虚拟机)。 2.3 下载解压Redis安装包接下来,就是下载Redis的安装包,下载地址:http://download.redis.io/rele...。 cd /opt/softwarewget http://download.redis.io/releases/redis-7.0.3.tar.gz# 解压tar -xf redis-7.0.3.tar.gzcd redis-7.0.3# 设置环境变量echo "export REDIS_HOME=/opt/software/redis-7.0.3">> /etc/profilesource /etc/profile2.4 编译装置接下来是,编译装置所有的节点。 cd $REDIS_HOMEyum -y install gcc gcc++make && make install# 默认装置目录 /usr/local/bin2.5 配置服务装置节点之后,为了不便前期启动和保护服务, 须要对装置的节点进行服务的配置。 cat << EOF > /usr/lib/systemd/system/redis.service[Unit]Description=Redis persistent key-value databaseAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemdExecStop=/usr/libexec/redis-shutdownType=forkingUser=redisGroup=redisRuntimeDirectory=redisRuntimeDirectoryMode=0755LimitNOFILE=65536PrivateTmp=true[Install]WantedBy=multi-user.targetEOF上面是配置的相干形容和阐明: Description: # 形容服务After: # 形容服务类别[Service] # 服务运行参数的设置Type=forking # 是后盾运行的模式ExecStart # 为服务的具体运行命令ExecReload # 为重启命令ExecStop # 为进行命令LimitNOFILE=65536 # 关上文件数和过程数有限度,默认限度为1024,如果不设置,或者设置为LimitNOFILE=unlimited(不辨认),则失去了1024PrivateTmp=True # 示意给服务调配独立的长期空间【留神】[Service]的启动、重启、进行命令全副要求应用绝对路径 [Install] #运行级别下服务装置的相干设置,可设置为多用户,即零碎运行级别为3 ...

November 19, 2022 · 5 min · jiezi

关于redis集群:面试官Redis集群有哪些方式Leader选举又是什么原理呢

哈喽!大家好,我是小奇,一位不靠谱的程序员小奇打算以轻松风趣的对话形式来分享一些技术,如果你感觉通过小奇的文章学到了货色,那就给小奇一个赞吧文章继续更新,能够微信搜寻【小奇JAVA面试】第一工夫浏览,回复【材料】更有我为大家筹备的福利哟!一、前言作为一名Java程序员,Redis底层的一些原理是咱们不用学会就能够搬砖工作的一种技能点,然而小奇为什么还要讲一下呢?难道就是为了节约大家1分钟的宝贵时间,一个人1分钟,50万人就是1年,5000万人就是100年,赚了,小奇以一己之力胜利搞挂一个人(血赚)。 当然不是,并且小奇的文章也没有那么多人看,最多也就节约个肾吧。 学习Redis底层原理是因为面试官要问啊!,所以咱们就要学,什么?不实用的你不学?那街坊小奇可要使劲学啦,到时候面试官只有小奇不要你。 至于你问为什么面试官要问Redis底层原理呢,这个。。。我把这次机会留给你,下次你面试的时候面试官问:“讲一下Redis底层原理”。你:“面试官你好,请问为什么你要问Redis底层原理呢,你给我台电脑,我五分钟给你搭建好图书管理系统他不香吗,咱们键盘上见真章”。这时面试官就会通知你答案,你就能够把答案打在评论区,让小奇以及泛滥小伙伴一起晓得一下到底为什么要问? 二、面试在一个晴朗的周日,我来到了一个生疏的园区(别问为什么是周日,问就是997,不过为了填饱肚子的打工人,只能明知山有虎、偏差虎山行),坐在生疏的会议室,期待HR小姐姐去叫面试官,此时我的情绪和各位小伙伴一样五味杂陈,放心面试官问的会不会很难?问到我的常识盲区我该怎么办?一会自我介绍的时候要不要吹一下我和小奇的关系? 一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、好像能看穿所有的眼神 ,我在想要不然一会就不要20k了,要8k得了,这个面试官一看就不好糊弄啊,然而我想起来我来之前刚看了小奇的趣学编程系列,我曾经齐全学会了小奇的精华,我登时就来了底气,决定一会要30k,不给就学小奇赖着不走(哈哈) 面试官:小奇是吧,带简历了吗? 我:没带,当初彩印两块一张,我简历五张,每次面试都要花费十块,我敌人说了还没工作就先让你掏钱的工作不要去。 面试官:。。。那你靠什么来驯服我,让我录用你 我:气质? (此时面试官并没有叫保安,而是从门后拿出了恭候我多时的棍子,我霎时怂了) 我只好从我的双肩包中拿出了我上午从其余公司面试官手中要回的简历,上午的情景是这样的。上午的面试官:明天的面试就到这吧,回去等告诉吧!我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。上午的面试官:我说你的简历怎么皱皱巴巴,原来你始终在循环利用啊!这个症状呈现多久了?我:半拉月了。。。(当我把皱皱巴巴的简历交给面试官后,这场面试才得以持续进行。。。)三、Redis哨兵集群面试官:我看你简历上写的精通Redis?(哼,面试官轻蔑的一笑) (看着面试官轻蔑的笑容,我忍不住拿出了我的Redis书籍推给了他) 我:这本书我滚瓜烂熟,你轻易发问,答不上来算我输,答上来你就要为你的轻蔑向我赔罪。 (我的笑容逐步自信。。。) (此时面试官看着书若有所思,我狐疑他必定在想他对这本书的理解水平吧) 面试官:好吧,那你先说一下Redis有哪些集群形式呢 我:Redis次要有两种持集群形式,哨兵集群和Cluster(高可用)集群。 面试官:能够说一说两者的区别和如何配置应用吗 我:上次面试我曾经简略说了一下哨兵模式,当初再来简略看一下 这里咱们能够看到客户端只能连贯一个哨兵集群,也就是说客户端在写入数据的时候只能通过哨兵集群通知的地址来进行写入 如果主节点挂了,那么哨兵选举一个从节点成为主节点,在这期间客户端来拜访是被阻塞的,因为主节点正在被选举,还不晓得谁是主节点呢,怎么插入数据。 那么为了解决这个问题,咱们能够应用高可用集群模式Cluster模式,也能够称之为多个主从节点(主从节点上一章讲过)模式集群 四、Redis高可用集群Cluster模式面试官:能说一下高可用集群模式具体是怎么一个流程吗,为什么能够解决选举期待问题? 我:(能不说吗。。。) 通过图中能够看出咱们客户端通过拜访入口能够拜访多个主节点,如果其中一个主节点挂了,那么其余的主节点还能够失常工作不受影响。 面试官:这么多主节点,我哪晓得我set一个数据应该放入到哪个主从构造外面呢? 我:(你随机放一个不就行了吗。。。不对,随机放一个取的时候就不晓得去哪个主从构造里去取了,总不能每一个主节点外面都去查找一遍吧) 我:他会依据要set进去的key进行一个hash计算,计算完后就晓得要往哪个主节点外面寄存值了,获得时候也依据key进行一个hash计算,就晓得去哪个主节点里拿取了。 面试官:那这个时候来一个age计算hash是150要插入哪个主节点 我:必定是第二个主节点啊,redis集群采纳分片模式,将所有数据分片放入多个主节点中,不便与程度扩大。 面试官:如果主节点挂了,哨兵模式下哨兵集群会选举出一个主节点,那你这种高可用模式,如果一个主节点挂了,怎么选举呢? 我:(应该是依照大小个吧。。。) 面试官:你特么找打是吧,数据那特么有大小个。。。 五、Leader选举原理我:这个时候就须要其余主节点来反对选举了,我来用一张图形容一下。 我:咱们能够把这三个主从节点看做是三个国家,如果一个国家的喽罗挂掉了,那么他底下其中一股权势就会找其余的国家喽罗来反对本人成为喽罗。 我:当然其余国家的喽罗不会看你国家这两股权势哪个好哪个坏,而是哪个先找我我就反对你。 我:而且图中有三个国家,反对本人的票数必须超过总国家的一半以上,也就是起码要有两票反对,所以redis集群节点起码要三个主从构造,不然的话两个没方法选举,票数最多一票不够两个国家的半数以上。 面试官:还别说你小子应用这个图讲的是绘声绘色 我:你这不废话吗,趣学编程不趣学那还学个屌。。。 面试官:那塔利班和正规军他们两个怎么确定谁先发出请求呢,必定是谁先收回音讯谁赢呗? 我:他们两个小权势并不是喽罗挂了就立马发出请求反对音讯,而是有肯定的延迟时间,这个延迟时间依据一个公式计算,公式中蕴含随机数,和依据SLAVE_RANK的大小来计算,SLAVE_RANK的大小示意从节点从主节点同步的数据总量的Rank。Rank越小代表一复制的数据越新,能够做主节点。 提早公式:DELAY = 500ms +random(0 ~ 500ms) + SLAVE_RANK * 1000ms 面试官:如果当初网络抖动,从节点一瞬间连贯不上主节点了,他就开始发送音讯,网络好了当前不就有两个主节(俗称脑裂,主节点相当于一个主从构造的大脑,只能有一个)点了吗? 我:那咱们能够配置连贯不上的工夫让他长一点,通过cluster-node-timeout来配置,如果配置5秒钟,那么5秒钟之内从节点连贯不上主节点是不会发动申请反对的信息的。 面试官:万一5秒不够呢,万一我网络抖动的厉害呢? 我:你是食堂阿姨吗,手抖的这么厉害。。。 我:你说的这种状况属于一瞬间有两个主节点都在写入新的数据,那么等网络复原当前只会将一个节点作为主节点,其余节点变为从节点过去同步,那么就会失落一部分数据。 我:这里咱们会发现age 20数据失落了,那这个怎么办呢,咱们能够通过一个配置min‐replicas‐to‐write [数量],这个配置是写的数据起码同步的从节点数量。 如果我这里配置的是1,那么就是我写入一个值起码有一个从节点同步到了这个值才算写入胜利,不然就是写入失败。 ...

March 18, 2022 · 1 min · jiezi

关于redis集群:Gossip算法及其在Redis集群里的运用

Gossip的一些特点 在一个有界网络中,每个节点都随机地与其它节点通信,通过一段无序的通信后,最终所有节点的状态都会达成统一,即便是有节点宕机后重启或有新节点退出,但一段时间后这些节点的状态也会与其它节点达成统一,从这一点来说,Gossip人造具备分布式容错的长处。依据下面的形容,咱们晓得 Gossip是一个最终一致性算法,它无奈保障在某个时刻所有节点状态统一,但能够保障最终统一。另外Gossip不要求节点晓得所有其它节点,因而又具备去中心化的特点,节点之间齐全对等,不须要任何的核心节点。但Gossip的毛病也很显著,冗余通信会对网络带宽与CPU资源造成很大的负载,从有的材料上看到说当集群规模超过百节点级别后,Gossip 协定的效率将会显著降落,通信老本越来越高。 Gossip节点的三种通信形式 两个节点(A,B)之间存在三种通信形式: push:A节点将数据(key,value,version)及对应的版本号推送给B节点,B节点更新A中比本人新的数据pull:A仅将数据(key,version)推送给B,B将本地比A新的数据(key,value,version)推送给A,A更新本地push/pull:与pull相似,只是多了一步,A再将本地比B新的数据推送给B,B更新本地如果将两个节点数据同步一次定义为一个周期,则在一个周期内,push需通信1次,pull需2次,push/pull则需3次。但从成果上来讲,push/pull最好,实践上一个周期能够使两个节点完全一致。 Gossip在Redis Cluster中的作用 在分布式系统中,须要提供保护节点元数据信息的机制,所谓元数据是指节点负责哪些数据、主从属性、是否故障等状态信息。常见的元数据保护形式个别分集中式与无核心式。Redis Cluster采纳Gossip协定实现无核心式。具体来讲,Redis Cluster中应用Gossip次要有两大作用: 去中心化,以实现分布式和弹性扩大失败检测,以实现高可用节点通信根底 Redis Cluster中的每个实例监听两个TCP端口:6379用于服务客户端查问;16379用于集群外部通信。集群中节点通信形式如下: 每个节点在固定周期内通过特定规定抉择几个节点发送Ping音讯接管到Ping音讯的节点用Pong音讯作为回应集群中每个节点通过肯定规定筛选要通信的节点,每个节点可能晓得全副节点,也可能仅晓得局部节点,只有这些节点彼此能够失常通信,最终它们会达到统一的状态。当节点故障、新节点退出、主从关系变动,槽信息变更等事件产生时,通过一直的Ping/Pong音讯通信,通过一段时间后所有的节点都会晓得集群全副节点的最新状态,从而达到集群状态同步的目标。 Gossip在Redis Cluster里的音讯品种 Meet音讯:用于告诉新节点退出。音讯发送者告诉接收者退出到以后集群,Meet音讯通信失常实现后,接管节点会退出到集群中并进行周期性的Ping,Pong音讯替换Ping音讯:集群内替换最频繁的音讯,集群内每个节点每秒向多个其它节点发送Ping音讯,用于检测节点是否在线和替换彼此状态信息。Ping音讯发送封装了本身节点和局部其它节点的状态数据Pong音讯:当接管到Ping,Meet音讯时,作为响应音讯回复给发送方确认音讯失常通信。Pong音讯外部封装了本身状态数据。节点也能够向集群内播送本身的Pong音讯来告诉整个集群对本身状态进行更新Fail音讯:当节点判集群内另一节点下线时,会向集群内播送一个Fail音讯,其余节点接管到Fail音讯之后会将对应节点更新为下线状态因为集群外部须要频繁地进行节点信息替换,而Ping/Pong音讯携带以后节点和局部其它节点的状态数据,会减轻带宽和计算的累赘。Redis集群内节点通信采纳固定频率(定时工作每秒执行10次),因而,节点每次抉择须要通信的节点列表十分重要。通信节点抉择过多尽管能够做到信息及时替换但老本过高。节点抉择过少则会升高集群内所有节点彼此信息替换的频率,从而影响故障断定、新节点发现等需要的速度。因而Redis集群的Gossip协定须要兼顾信息替换实时性和老本开销。 最初,redis集群的故障检测,故障转移与master选举能够看之前的文章:redis学习之集群 参考的文章:Gossip算法 Gossip算法分布式一致性协定 Gossip 和 Redis 集群原理解析

March 16, 2022 · 1 min · jiezi

关于redis集群:技术实践第三期|HashTag在Redis集群环境下的使用

作者:友盟+技术专家 鹏程 一、背景数据源列表增加缓存反对,types字段可传多值,如app, mini, web等,会构建如下缓存key, application_list:123456:appapplication_list:123456:miniapplication_list:123456:webapplication_list:123456:app,miniapplication_list:123456:app,webapplication_list:123456:mini,webapplication_list:123456:app,mini,web...当创立利用,更新利用或删除利用的时候,须要批量删除旧版本缓存。 二、思路1.依照前缀 application_list:123456,查问所有相干的key2.遍历keys,执行删除 /** * 移除缓存 * * @param prefix prefix */public static void deleteByPrefix(String prefix) { long start = System.currentTimeMillis(); Set<String> keys; try { keys = jedisCluster.keys(CacheKeyUtils.buildCacheKey(prefix, "*")); LOGGER.info("cache keys {} with prefix {}", keys, prefix); if (keys != null && !keys.isEmpty()) { jedisCluster.del(keys.toArray(new String[keys.size()])); } } catch (Exception e) { LOGGER.error("cache deleteByPrefix error, prefix = {}", prefix, e); throw new BusinessException(CoreErrorEnum.CACHE_DELETE_ERROR, prefix); } long end = System.currentTimeMillis(); LOGGER.info("cache deleteByPrefix success, prefix = {}, cost {} ms", prefix, (end - start));}三、问题依照这个写完,执行报错,"JedisCluster only supports KEYS commands with patterns containing hash-tags ( curly-brackets enclosed strings )" ...

December 28, 2021 · 1 min · jiezi

关于redis集群:介绍一款监测Redis性能-可视化管理和监控的工具

Redis是一个功能强大、性能高效的开源数据结构服务器,Redis最典型的利用是NoSQL。 自己在工作中我的项目也是宽泛应用了Redis,工作中也遇到了Redis的数据可视化不便、Redis的数据查看保护艰难、Redis状态监控运维不易等问题。 置信大家在工作中也会遇到我说的这些问题,因为我也是一线的开发,也深切的感触到了没有棘手Redis治理监控工具带来的不便,通过一段时间的寻找应用,一款轻量高性能的Redis治理及监控工具WGCLOUD横空出世了。 上面我就具体给大家介绍一下WGCLOUD的装置及各项性能。 下载和装置,在官网有具体阐明:http://www.wgstar.tcom 我来说下WGCLOUD能够监测Redis哪些指标 1.能够监测Redis的过程内存使用率%2.能够监测Redis的过程cpu使用率%3.能够监测Redis的吞吐量4.能够监测Redis的端口是否失常通信5.能够监测Reids的日志文件6.能够在Redis过程下线、端口不通、日志呈现谬误时候发送告警告诉 [root@centos04 bin]# ./redis-server 26765:C 22 Nov 2018 20:46:31.066 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo26765:C 22 Nov 2018 20:46:31.066 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=26765, just started26765:C 22 Nov 2018 20:46:31.066 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf26765:M 22 Nov 2018 20:46:31.067 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.2 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 26765 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 26765:M 22 Nov 2018 20:46:31.104 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.26765:M 22 Nov 2018 20:46:31.104 # Server initialized26765:M 22 Nov 2018 20:46:31.104 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.26765:M 22 Nov 2018 20:46:31.105 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.26765:M 22 Nov 2018 20:46:31.105 * Ready to accept connections

November 16, 2021 · 2 min · jiezi

关于redis集群:Redis-Cluster-集群解决方案

Redis Cluster 集群解决方案多个 Redis 实例协同进行采纳 slot (槽)宰割数据,是 CRC16 与 16384 取模后扩散主从构造和选举算法,保障每个节点的可靠性客户端能够连贯任意一个 node 进行操作 所有的 redis 节点彼此互联(PING-PONG 机制),外部应用二进制协定优化传输速度和带宽。节点的 fail 是通过集群中超过半数的节点检测生效时才失效。客户端与 redis 节点直连,不须要两头 proxy 层,客户端不须要连贯集群所有节点,连贯集群中任何一个可用节点即可。redis-cluster 把所有的物理节点映射到 [0-16383] slot 上,cluster 负责保护 node <-> slot <-> value Redis Cluster 注意事项不齐全反对批量操作:mset、mget事务不能跨节点反对不反对多实例key 是最小粒度起码 6 个能力保障组成残缺高可用的集群连贯的时候只须要连贯 1 台服务器即可。如果 1 个主从连贯宕机的话,那么集群就宕机了。Redis Cluster 配置步骤(倡议应用官网安装包的形式装置 redis,不要应用 apt-get install 或者 yum 间接装置) 别离装置 6 台 服务器,三个主节点,三个从节点我这里采纳的是虚拟机,相应的 ip 地址别离为: 192.168.174.128 (28 号服务器)192.168.174.129 (29 号服务器)192.168.174.130 (30 号服务器)192.168.174.131 (31 号服务器)192.168.174.132 (32 号服务器)192.168.174.133 (33 号服务器)配置 redis.conf 配置文件 (在所有的服务器上操作)vim /etc/redis/redis.conf ...

July 24, 2021 · 2 min · jiezi

关于redis集群:Redis哨兵模式搭建

Redis哨兵模式是建设在主从模式的根底上的,解决的是主实例单机故障问题,通过哨兵零碎能够主动故障转移,切换到新的主实例上。咱们先来搭建一个由三个Redis实例组成的主从集群。之前咱们讲过应用utils/install-server.sh来装置Redis服务。咱们应用默认门路将Redis装置到/usr/local/bin目录下。 搭建主从模式单机centos7环境下启动三个Redis服务,端口别离为 6379、6380、6381,将6379实例作为主实例。在/opt目录下创立redis目录寄存配置文件,日志、数据文件等 cd /optmkdir redis批改6379.conf文件,次要批改如下 # 端口port 6379# 数据文件目录dir /var/lib/redis/6379# 日志文件logfile /var/log/redis_6379.log启动6379 Redis cd /usr/local/bin./redis-server /opt/redis/6379.conf同样的6380和6381的依照6379配置,变更端口号即可。但作为Redis从服务要指定复制的redis主实例,减少如下配置并启动 # 指定Redis复制节点replicaof 127.0.0.1 6379这样一主两从的Redis主从模式集群搭建实现了。 哨兵零碎搭建哨兵零碎用来监控主从集群各个实例的衰弱状况。哨兵零碎也是一个集群零碎,避免哨兵单点故障。筹备哨兵配置,次要配置如下(剩下的应用默认配置) # 指定哨兵的端口号(默认26379)port 26379# 指定监控的主从集群的mater实例127.0.0.1 6379,# 监控的集群名字mymaster(能够随便定义名字,保障惟一即可)# 最初的2示意投票权重,个别为哨兵实例总数/2 + 1sentinel monitor mymaster 172.0.0.1 6379 2启动哨兵启动哨兵应用的启动程序和Redis服务的启动程序一样,指定不同配置文件和sentinel模式就好 ./redis-server /opt/redis/26379.conf --sentinel 启动26379哨兵实例胜利后,哨兵会生成一个本人的实例Id,并会通过监控的master找到slave的地址,将他们保留到26379.conf配置文件中。 port 26379sentinel monitor mymaster 172.18.0.111 6379 2# Generated by CONFIG REWRITEprotected-mode nouser default on nopass ~* &* +@alldir "/usr/local/bin"sentinel myid 8479791aeec61fdef62ff78556e55b07e7e80c0dsentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0sentinel current-epoch 0sentinel known-replica mymaster 172.18.0.111 6381sentinel known-replica mymaster 172.18.0.111 6380剩下的两个哨兵实例别离应用26380和26381做为端口,将对应的配置文件的port批改即可。 ...

July 8, 2021 · 2 min · jiezi

关于redis集群:Redis5基于docker搭建集群

首先是装置docker以及docker-compose这个步骤很简略就略过了而后是下载redis的镜像docker pull redis:5.0这边是基于redis5.0版本去装置的,所以指定了版本号。如果不加版本号,默认是下载最新版本的redis 这里留神辨别下。配置redis 在本地创立指定的redis个数,我是建设6个redis实例每个redis配置都是雷同的 列一份redis次要配置项 redis.confbind 0.0.0.0cluster-enabled yescluster-config-file "/redis/conf/nodes.conf"cluster-node-timeout 5000protected-mode noport 6379daemonize nodir "/redis/data"logfile "/redis/log/redis.log"创立配置文件docker-compose.yaml version: "3.7" # 确定docker-composer文件的版本services: # 代表就是一组服务 - 简略来说一组容器 redis_200: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.200 #设置ip地址container_name: redis_5_cluster_200 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6320:6379" # php java python 语言连贯 - "16320:16379" # 对节点 6379 + 10000 = 端口 对节点进行通信volumes: # 配置数据挂载 - /data/redis/cluster/200:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf redis_201: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.201 #设置ip地址container_name: redis_5_cluster_201 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6321:6379" - "16321:16379"volumes: # 配置数据挂载 - /data/redis/cluster/201:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf redis_202: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.202 #设置ip地址container_name: redis_5_cluster_202 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6322:6379" - "16322:16379"volumes: # 配置数据挂载 - /data/redis/cluster/202:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf redis_203: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.203 #设置ip地址container_name: redis_5_cluster_203 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6323:6379" - "16323:16379"volumes: # 配置数据挂载 - /data/redis/cluster/203:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf redis_204: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.204 #设置ip地址container_name: redis_5_cluster_204 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6324:6379" - "16324:16379"volumes: # 配置数据挂载 - /data/redis/cluster/204:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf redis_205: # 这个示意服务的名称,课自定义; 留神不是容器名称image: redis:5.0 # 指定容器的镜像文件networks: ## 引入内部事后定义的网段 redis_5_sm: ipv4_address: 172.24.141.205 #设置ip地址container_name: redis_5_cluster_205 # 这是容器的名称ports: # 配置容器与宿主机的端口 - "6325:6379" - "16325:16379"volumes: # 配置数据挂载 - /data/redis/cluster/205:/rediscommand: /usr/local/bin/redis-server /redis/conf/redis.conf# 网段设置networks: #援用内部事后定义好的网段 redis_5_sm:driver: bridgeipam: #定义网段 config: - subnet: "172.24.141.0/24"启动redis ...

June 12, 2021 · 2 min · jiezi

关于redis集群:Redis主从复制

单机版的redis存在三个次要问题 单机故障容量受限单机负载瓶颈,波及socket连接数、CPU资源、IO压力等针对这些问题redis提供了集群的形式来进行解决。在redis中有三种集群模式:主从模式、哨兵模式和Cluster集群模式。这篇文章咱们来讲一下主从模式的实现原理。 架构简介简略来说是已主多从,master做为redis的主实例,反对数据的读写,他会定时的将数据同步给slave从库。这样咱们能够将大部分的读操作转移到slave从库上,在读取方面解决了单点故障问题,同时slave的可伸缩行能够升高单机负载,进步性能。主从模式下,咱们能够敞开master的长久化性能,由slave来负责长久化,这样能够升高master的IO,大大晋升性能。但须要留神,当master呈现故障重启时,因为master没有可供复原的aof或rdb文件,因而一旦重启数据会全副革除。而slave会同步master数据将本地的长久化文件也做删除。这种状况下,要敞开master的主动重启性能,避免出现相似问题。但这样依然是很危险的,倡议同时开启master和slave的长久化性能。 同步原理在redis的主从模式中,数据同步是一个低提早、高性能的异步处理过程。全量同步slave在首次胜利连贯到master之后会触发一次全量的同步操作,具体过程如下 slave连贯到master胜利之后,发送PSYNC命令,申请master进行数据同步master收到同步命令fork一个子过程,并将以后的内存数据生成RDB文件,写入磁盘;同时master会接着接管写操作并保留到长期缓冲区master将RDB文件全量发送给slaveslave接管并写入磁盘,而后从rdb文件加载到内存master将缓冲区中的所有命令发送给slave对于master端同步过程是由子过程来解决的,因而是非阻塞的,同步期间redis依然可接管客户端的申请。在数据安全性上,为了保障同步的安全性,当连贯的slave数量小于m,且延迟时间小于ns时,master可用失常接管写解决,否则告诉客户端谬误。 min-slaves-to-write 3min-slaves-max-lag 10全量同步时master会进行RDB写盘而后再发送到slave,这种形式交disk-back形式。它的长处是当有多个slave申请同步时,只须要生成一次RDB文件就能够服务多个slave,但对于磁盘IO较差的状况会比拟蹩脚。Redis另外提供了一种形式diskless,同步时master将内存中的数据生成RDB数据后间接写入到socket字节流传给slave,而不会进行磁盘IO。很显著这种形式缩小了磁盘的IO操作,须要留神的是处理过程中,其余slave的同步申请无奈被解决,只能排队期待。在该模式下咱们个别会设置一个工夫用于master的期待,当master接管到一个同步申请时,会先进行m秒的期待,看是否有其余slave也有同步需要,对多个slave进行并行同步。 repl-diskless-sync yesrepl-diskless-sync-delay 5增量同步在晚期的版本中,slave故障重启、断后重连master,都会导致全量的同步。高版本中对这里做了一些优化,会先尝试进行增量同步,如果不行再做一次全量同步。具体做法是master应用一个replicationid来标记惟一的本人,同时定义一个offset偏移量示意同步解决的数据偏移量。当slave连贯到master进行同步时,slave发送它记录的master的replicationid和本人解决的偏移量到master,这样master只须要查问增量数据传输给slave。增量数据是存储在一个缓冲区中的,该缓冲区一次性调配肯定的空间大小(可配),写操作命令会保留在缓冲区内。slave的增量同步会从该缓冲区查找数据,如果缓冲区设置的较大,则能反对slave断连的工夫会越长。当master不存在slave且超过指定工夫时,该缓冲区也会被主动开释 repl-backlog-size 1mbrepl-backlog-ttl 3600主从模式配置slave配置指定master的地址,开启主从模式 replicaof <masterip> <masterport>当master须要明码校验时,从库配置明码 masterauth <master-password>无硬盘同步模式,设置yes开启,当开启时,须要配置执行同步时要期待多少秒再开始同步 repl-diskless-sync norepl-diskless-sync-delay 5复制缓冲区大小 repl-backlog-size 1mbslave不存在后多少毫秒缓冲区被开释 repl-backlog-ttl 3600同步时master可承受写操作的slave个数和同步延迟时间 min-replicas-to-write 3min-replicas-max-lag 10

May 24, 2021 · 1 min · jiezi

关于redis集群:Redis-高可用篇Cluster-集群能支持的数据量有多大

码哥出品,必属精品。关注公众号「码哥字节」并加码哥微信(MageByte1024),窥探硬核文章背地的男人的另一面。 本文将对集群的节点、槽指派、命令执行、从新分片、转向、故障转移、音讯等各个方面进行深刻拆解。 目标在于把握什么是 Cluster ?Cluster 分片原理,客户端定位数据原理、故障切换,选主,什么场景应用 Cluster,如何部署集群 …... [toc] 为什么须要 Cluster65 哥:码哥,自从用上了你说的哨兵集群实现故障主动转移后,我终于能够开心的跟女朋友么么哒也不怕 Redis 宕机深夜宕机了。 可是最近遇到一个糟心的问题,Redis 须要保留 800 万个键值对,占用 20 GB 的内存。 我就应用了一台 32G 的内存主机部署,然而 Redis 响应有时候十分慢,应用 INFO 命令查看 latest_fork_usec 指标(最近一次 fork 耗时),发现特地高。 次要是 Redis RDB 长久化机制导致的,Redis 会 Fork 子过程实现 RDB 长久化操作,fork 执行的耗时与 Redis 数据量成正相干。 而 Fork 执行的时候会阻塞主线程,因为数据量过大导致阻塞主线程过长,所以呈现了 Redis 响应慢的表象。 65 哥:随着业务规模的拓展,数据量越来越大。主从架构降级单个实例硬件难以拓展,且保留大数据量会导致响应慢问题,有什么方法能够解决么?保留大量数据,除了应用大内存主机的形式,咱们还能够应用切片集群。俗话说「众人拾材火焰高」,一台机器无奈保留所有数据,那就多台分担。 应用 Redis Cluster 集群,次要解决了大数据量存储导致的各种慢问题,同时也便于横向拓展。 两种计划对应着 Redis 数据增多的两种拓展计划:垂直扩大(scale up)、程度扩大(scale out)。 垂直拓展:降级单个 Redis 的硬件配置,比方减少内存容量、磁盘容量、应用更弱小的 CPU。程度拓展:横向减少 Redis 实例个数,每个节点负责一部分数据。比方须要一个内存 24 GB 磁盘 150 GB 的服务器资源,有以下两种计划: ...

May 13, 2021 · 4 min · jiezi

关于redis集群:Redis集群

1.为什么要搭建集群通常,为了进步网站响应速度,总是把热点数据保留在内存中而不是间接从后端数据库中读取。Redis 是一个很好的 Cache 工具。大型网站利用,热点数据量往往微小,几十 G 上百 G是很失常的事儿。因为内存大小的限度,应用一台 Redis 实例显然无奈满足需要,这时就须要应用多台Redis 作为缓存数据库。然而如何保证数据存储的一致性呢,这时就须要搭建 redis 集群. 采纳正当的机制,保障用户的失常的拜访需要. 采纳 redis 集群,能够保证数据扩散存储,同时保证数据存储的一致性.并且在外部实现高可用的机制.实现了服务故障的主动迁徙. 2.集群搭建2.1 集群搭建打算主从划分:主机:3台从机:3台端口:7000-7005 2.2 筹备集群文件夹1.筹备集群文件夹 mkdir cluster2.在 cluster 文件夹中别离创立 7000-7005 文件夹 cd clustermkdir 7000 7001 7002 7003 7004 7005 2.3 编辑配置文件配置好的redis.confhttps://segmentfault.com/a/11... 阐明:将 redis 根目录中的 redis.conf 文件复制到 cluster/7000/ 并以原名保留 cp redis.conf cluster/7000/ 2.4 编辑配置文件cd 7000ls

February 4, 2021 · 1 min · jiezi

关于redis集群:redisconf

Redis configuration file example.Note that in order to read the configuration file, Redis must bestarted with the file path as first argument:./redis-server /path/to/redis.confNote on units: when memory size is needed, it is possible to specifyit in the usual form of 1k 5GB 4M and so forth:1k => 1000 bytes1kb => 1024 bytes1m => 1000000 bytes1mb => 1024*1024 bytes1g => 1000000000 bytes1gb => 102410241024 bytesunits are case insensitive so 1GB 1Gb 1gB are all the same.INCLUDESInclude one or more other config files here. This is useful if youhave a standard template that goes to all Redis servers but also needto customize a few per-server settings. Include files can includeother files, so use this wisely.Notice option "include" won't be rewritten by command "CONFIG REWRITE"from admin or Redis Sentinel. Since Redis always uses the last processedline as value of a configuration directive, you'd better put includesat the beginning of this file to avoid overwriting config change at runtime.If instead you are interested in using includes to override configurationoptions, it is better to use include as the last line.include /path/to/local.confinclude /path/to/other.confMODULESLoad modules at startup. If the server is not able to load modulesit will abort. It is possible to use multiple loadmodule directives.loadmodule /path/to/my_module.soloadmodule /path/to/other_module.soNETWORKBy default, if no "bind" configuration directive is specified, Redis listensfor connections from all the network interfaces available on the server.It is possible to listen to just one or multiple selected interfaces usingthe "bind" configuration directive, followed by one or more IP addresses.Examples:bind 192.168.1.100 10.0.0.1bind 127.0.0.1 ::1~ WARNING ~ If the computer running Redis is directly exposed to theinternet, binding to all the interfaces is dangerous and will expose theinstance to everybody on the internet. So by default we uncomment thefollowing bind directive, that will force Redis to listen only intothe IPv4 loopback interface address (this means Redis will be able toaccept connections only from clients running into the same computer itis running).IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACESJUST COMMENT THE FOLLOWING LINE.~~~~~~~~~~~~~~~~bind 127.0.0.1Protected mode is a layer of security protection, in order to avoid thatRedis instances left open on the internet are accessed and exploited.When protected mode is on and if:1) The server is not binding explicitly to a set of addresses using the"bind" directive.2) No password is configured.The server only accepts connections from clients connecting from theIPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domainsockets.By default protected mode is enabled. You should disable it only ifyou are sure you want clients from other hosts to connect to Rediseven if no authentication is configured, nor a specific set of interfacesare explicitly listed using the "bind" directive.protected-mode no ...

February 4, 2021 · 41 min · jiezi

关于redis集群:Redis-实战-01-Redis-数据结构简介

一些数据库和缓存服务器的个性和性能 P4名称类型数据存储选项查问类型附加性能Redis应用内存存储(in-memory)的非关系数据库字符串、列表、哈希表、汇合、有序汇合每种数据类型都有本人的专属命令,另外还有批量操作(bulk operation)和不齐全(partial)的事务反对公布与订阅,主从复制(master/slave replication)memcached应用内存存储的键值缓存键值之间的映射增删改查以及其余几个命令为晋升性能而设的多线程服务器MySQL关系数据库每个数据库能够蕴含多个表,每个表能够蕴含多个行;能够解决多个表的试图(view);反对空间(spatial)和第三方扩大增删改查、函数、存储过程反对ACID性质(须要应用InnoDB),主从复制和主主复制(master/master replication)PostgreSQL关系数据库每个数据库能够蕴含多个表,每个表能够蕴含多个行;能够解决多个表的试图;反对空间和第三方扩大;反对可定制类型增删改查、内置函数、自定义的存储过程反对ACID性质,主从复制,由第三方反对的多主复制(multi-master replication)MongoDB应用硬盘存储(on-disk)的非关系文档存储每个数据库能够蕴含多个表,每个表能够蕴含多个无schema (schema-less) 的 BSON 文档(Binary JSON,相似json的一种二进制格局)增删改查反对 map-reduce 操作,主从复制,分片,空间索引(spatial index)长久化形式 P4RDB(redis database):以快照的模式将数据长久化到磁盘AOF(append only file):以日志的模式记录每个操作,将Redis执行过的所有指令全副记录下来(读操作不记录),只许追加文件但不能够批改文件,Redis启动时会读取AOF配置文件重构数据Redis 的 5 种构造 P6构造类型构造存储的值构造的读写能力STRING能够是字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)LIST一个链表,链表上的每个节点都蕴含了一个字符串从链表的两端推入或者弹出元素;依据偏移量对链表进行修剪(trim);读取单个或者多个元素;依据值查找或者移除元素HASH蕴含键值对的无序哈希表增加、获取、移除单个键值对;获取所有键值对SET蕴含字符串的无序收集器(unordered collection),并且被蕴含的每个字符串都是举世无双、各不相同的增加、获取、移除单个元素;查看一个元素是否存在于汇合中;计算交加、并集、差集;从汇合外面随机获取元素ZSET(有序汇合)字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列程序由分值的大小决定增加、获取、移除单个元素;依据分值范畴(range)或者成员来获取元素STRING 根底命令 P8STRING 存储键值对,值既能够是字符串,又能够是数值(数值反对自增和自减) package mainimport ( "fmt" "github.com/gomodule/redigo/redis" "time")func main() { // 获取连贯 conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { // 连贯失败,则打印错误信息,并退出 fmt.Println(err) return } // 如果连贯胜利,则提早执行 敞开 defer conn.Close() executeStringCommand(conn)}// 执行 STRING 的相干命令func executeStringCommand(conn redis.Conn) { fmt.Println("--------- executeStringCommand start ---------") // 设置 键为 hello 的值为 world,永恒无效 result, err := conn.Do("SET", "hello", "world") handleResult(result, err) // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("TTL", "hello")) handleResult(result, err) // 获取 键为 hello 的值 result, err = redis.String(conn.Do("GET", "hello")) handleResult(result, err) // 设置 键为 hello 的值为 world,无效工夫为 1000ms(EX -> 秒,PX -> 毫秒;不可同时应用) result, err = conn.Do("SET", "hello", "world", "EX", "1") handleResult(result, err) // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("PTTL", "hello")) handleResult(result, err) time.Sleep(time.Second * 2) // 获取 键为 hello 的剩余时间(TTL -> 秒,PTTL -> 毫秒) result, err = redis.Int(conn.Do("PTTL", "hello")) handleResult(result, err) // 设置 键为 hello 的值为 world,永恒无效(NX -> 键不存在时,才进行设置操作;XX -> 键曾经存在时,才进行设置操作) result, err = conn.Do("SET", "hello", "world!", "XX") handleResult(result, err) // 设置 键为 hello 的值为 world,永恒无效(NX -> 键不存在时,才进行设置操作;XX -> 键曾经存在时,才进行设置操作) result, err = conn.Do("SET", "hello", "world!", "NX") handleResult(result, err) // 删除 键为 hello 的值(能够用于所有类型) result, err = conn.Do("DEL", "hello") handleResult(result, err) // 获取 键为 hello 的值 result, err = redis.String(conn.Do("GET", "hello")) handleResult(result, err) fmt.Println("--------- executeStringCommand end ---------")}// 解决操作 redis 的后果func handleResult(result interface{}, err error) { if err != nil { fmt.Println("ERROR: ", err) return } fmt.Println(result)}LIST 根底命令 P9// 执行 LIST 的相干命令func executeListCommand(conn redis.Conn) { fmt.Println("--------- executeListCommand start ---------") // 在 list 列表的 右端 插入值 result, err := conn.Do("RPUSH", "list", "item-1", "item-2") handleResult(result, err) // 在 list 列表的 左端 插入值 result, err = conn.Do("LPUSH", "list", "item-3", "item-4") handleResult(result, err) // 在 list 列表中 以左端为头获取 [1, 3] 范畴内的所有值(完结索引为 -1 示意能够取出到列表尾的所有元素;没有 RRANGE 命令) result, err = redis.Strings(conn.Do("LRANGE", "list", "1", "-1")) handleResult(result, err) // 在 list 列表中 以左端为头获取 下标为 0(没有 RINDEX 命令) result, err = redis.String(conn.Do("LINDEX", "list", "0")) handleResult(result, err) // 在 list 列表的 右端 弹出并一个值 result, err = redis.String(conn.Do("RPOP", "list")) handleResult(result, err) // 在 list 列表的 左端 弹出并一个值 result, err = redis.String(conn.Do("LPOP", "list")) handleResult(result, err) // 删除 键为 list 的值(能够用于所有类型) result, err = conn.Do("DEL", "list") handleResult(result, err) // 在 list 列表中 以左端为头获取所有值 result, err = redis.Strings(conn.Do("LRANGE", "list", "0", "-1")) handleResult(result, err) fmt.Println("--------- executeListCommand end ---------")}SET 根底命令 P10// 执行 SET 的相干命令func executeSetCommand(conn redis.Conn) { fmt.Println("--------- executeSetCommand start ---------") // 在 set 汇合中 增加值 result, err := conn.Do("SADD", "set", "item-1", "item-2", "item-2", "item-3", "item-4") handleResult(result, err) // 从 set 汇合中 删除值 result, err = conn.Do("SREM", "set", "item-2", "item-3") handleResult(result, err) // 判断一个值是否在 set 汇合中 result, err = redis.Bool(conn.Do("SISMEMBER", "set", "item-2")) handleResult(result, err) // 获取 set 汇合中 的所有值(不举荐应用,大 key 执行慢) result, err = redis.Strings(conn.Do("SMEMBERS", "set")) handleResult(result, err) // 删除 键为 set 的值(能够用于所有类型) result, err = conn.Do("DEL", "set") handleResult(result, err) fmt.Println("--------- executeSetCommand end ---------")}HASH 根底命令 P11HASH 能够存储多个键值对之间的映射,和 STRING 一样,存储的值既能够是字符串,又能够是数值(数值反对自增和自减) ...

January 20, 2021 · 4 min · jiezi

关于redis集群:最新Redis图文教程中内附学习视频

Java操作Redis创立我的项目创立我的项目 增加依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xxxx</groupId> <artifactId>redisdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>redisdemo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- spring data redis 组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!-- 1.x 的版本默认采纳的连接池技术是 Jedis, 2.0 以上版本默认连接池是 Lettuce, 如果采纳 Jedis,须要排除 Lettuce 的依赖。 --> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <!-- jedis 依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!-- web 组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- test 组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies></project>配置文件spring: redis: # Redis服务器地址 host: 192.168.10.100 # Redis服务器端口 port: 6379 # Redis服务器明码 password: root # 抉择哪个库,默认0库 database: 0 # 连贯超时工夫 timeout: 10000ms jedis: pool: # 最大连接数,默认8 max-active: 1024 # 最大连贯阻塞等待时间,单位毫秒,默认-1ms max-wait: 10000ms # 最大闲暇连贯,默认8 max-idle: 200 # 最小闲暇连贯,默认0 min-idle: 5Java怎么连贯Redis?/** * 连贯Redis */@Testpublic void initConn01() { // 创立jedis对象,连贯redis服务 Jedis jedis = new Jedis("192.168.10.100", 6379); // 设置认证明码 jedis.auth("root"); // 指定数据库 默认是0 jedis.select(1); // 应用ping命令,测试连贯是否胜利 String result = jedis.ping(); System.out.println(result);// 返回PONG // 增加一条数据 jedis.set("username", "zhangsan"); // 获取一条数据 String username = jedis.get("username"); System.out.println(username); // 开释资源 if (jedis != null) jedis.close();}通过Redis连接池获取连贯对象并操作服务器/** * 通过Redis连接池获取连贯对象 */@Testpublic void initConn02() { // 初始化redis客户端连接池 JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "192.168.10.100", 6379, 10000, "root"); // 从连接池获取连贯 Jedis jedis = jedisPool.getResource(); // 指定数据库 默认是0 jedis.select(2); // 应用ping命令,测试连贯是否胜利 String result = jedis.ping(); System.out.println(result);// 返回PONG // 增加一条数据 jedis.set("username", "zhangsan"); // 获取一条数据 String username = jedis.get("username"); System.out.println(username); // 开释资源 if (jedis != null) jedis.close();}封装JedisUtil对外提供连贯对象获取办法@Configurationpublic class RedisConfig { //服务器地址 @Value("${spring.redis.host}") private String host; //端口 @Value("${spring.redis.port}") private int port; //明码 @Value("${spring.redis.password}") private String password; //超时工夫 @Value("${spring.redis.timeout}") private String timeout; //最大连接数 @Value("${spring.redis.jedis.pool.max-active}") private int maxTotal; //最大连贯阻塞等待时间 @Value("${spring.redis.jedis.pool.max-wait}") private String maxWaitMillis; //最大闲暇连贯 @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; //最小闲暇连贯 @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; @Bean public JedisPool redisPoolFactory(){ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); //留神值的转变 jedisPoolConfig.setMaxWaitMillis(Long.parseLong(maxWaitMillis.substring(0,maxWaitMillis.length()-2))); //留神属性名 jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMinIdle(minIdle); JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, Integer.parseInt(timeout.substring(0, timeout.length() - 2)), password); return jedisPool; }}Java操作Redis五种数据类型连贯与开释@Autowiredprivate JedisPool jedisPool;private Jedis jedis = null;//初始化jedis对象实例@Beforepublic void initConn(){ jedis = jedisPool.getResource();}//开释资源@Afterpublic void closeConn(){ if (jedis!=null){ jedis.close(); }}操作String// 1.操作String@Testpublic void testString() { // 增加一条数据 jedis.set("username", "zhangsan"); jedis.set("age", "18"); // 增加多条数据 参数奇数为key 参数偶数为value jedis.mset("address", "bj", "sex", "1"); // 获取一条数据 String username = jedis.get("username"); System.out.println(username); // 获取多条数据 List<String> list = jedis.mget("username", "age", "address", "sex"); for (String str : list) { System.out.println(str); } // 删除 //jedis.del("username");}操作hash// 2.操作Hash@Testpublic void testHash() { /* * 增加一条数据 * 参数一:redis的key * 参数二:hash的key * 参数三:hash的value */ jedis.hset("userInfo", "name", "lisi"); // 增加多条数据 Map<String, String> map = new HashMap<>(); map.put("age", "20"); map.put("sex", "1"); jedis.hmset("userInfo", map); // 获取一条数据 String name = jedis.hget("userInfo", "name"); System.out.println(name); // 获取多条数据 List<String> list = jedis.hmget("userInfo", "age", "sex"); for (String str : list) { System.out.println(str); } // 获取Hash类型所有的数据 Map<String, String> userMap = jedis.hgetAll("userInfo"); for (Entry<String, String> userInfo : userMap.entrySet()) { System.out.println(userInfo.getKey() + "--" + userInfo.getValue()); } // 删除 用于删除hash类型数据 //jedis.hdel("userInfo", "name");}操作list // 3.操作list @Test public void testList() { // 左增加(上)// jedis.lpush("students", "Wang Wu", "Li Si"); // 右增加(下)// jedis.rpush("students", "Zhao Liu"); // 获取 start起始下标 end完结下标 蕴含关系 List<String> students = jedis.lrange("students", 0, 2); for (String stu : students) { System.out.println(stu); } // 获取总条数 Long total = jedis.llen("students"); System.out.println("总条数:" + total); // 删除单条 删除列表中第一次呈现的Li Si// jedis.lrem("students", 1, "Li Si"); // 删除多条// jedis.del("students"); }操作set// 4.操作set-无序@Testpublic void testSet() { // 增加数据 jedis.sadd("letters", "aaa", "bbb", "ccc", "ddd", "eee"); // 获取数据 Set<String> letters = jedis.smembers("letters"); for (String letter: letters) { System.out.println(letter); } //获取总条数 Long total = jedis.scard("letters"); System.out.println(total); // 删除 //jedis.srem("letters", "aaa", "bbb");}操作sorted set// 5.操作sorted set-有序@Testpublic void testSortedSet() { Map<String, Double> scoreMembers = new HashMap<>(); scoreMembers.put("zhangsan", 7D); scoreMembers.put("lisi", 3D); scoreMembers.put("wangwu", 5D); scoreMembers.put("zhaoliu", 6D); scoreMembers.put("tianqi", 2D); // 增加数据 jedis.zadd("score", scoreMembers); // 获取数据 Set<String> scores = jedis.zrange("score", 0, 4); for (String score: scores) { System.out.println(score); } // 获取总条数 Long total = jedis.zcard("score"); System.out.println("总条数:" + total); // 删除 //jedis.zrem("score", "zhangsan", "lisi");}Redis中以层级关系、目录模式存储数据// Redis中以层级关系、目录模式存储数据@Testpublic void testdir(){ jedis.set("user:01", "user_zhangsan"); System.out.println(jedis.get("user:01"));}设置key的生效工夫Redis 有四个不同的命令能够用于设置键的生存工夫(键能够存在多久)或过期工夫(键什么时候会被删除) : ...

December 24, 2020 · 6 min · jiezi

关于redis集群:基于Dokcer搭建Redis集群主从集群冲就完了

本文基于 Docker + Redis 5.0.5 版本,通过 cluster 形式创立一个 6 个 redis 实例的主从集群,当然文章会指出相应的参数阐明,这样即使是创立 9 个实例的集群形式也是一样的。 1、拉取 Redis 镜像基于 Redis:5.0.5 版本,执行如下指令: docker pull redis:5.0.5 2、创立 6 个 Redis 容器创立 6 个Redis 容器: redis-node1:6379redis-node2:6380redis-node3:6381redis-node4:6382redis-node5:6383redis-node6:6384执行命令如下: docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380docker create --name redis-node3 --net host -v /data/redis-data/node3:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6381docker create --name redis-node4 --net host -v /data/redis-data/node4:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-4.conf --port 6382docker create --name redis-node5 --net host -v /data/redis-data/node5:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-5.conf --port 6383docker create --name redis-node6 --net host -v /data/redis-data/node6:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-6.conf --port 6384 局部参数解释: --cluster-enabled:是否启动集群,选值:yes 、no--cluster-config-file 配置文件.conf :指定节点信息,主动生成--cluster-node-timeout 毫秒值: 配置节点连贯超时工夫--appendonly:是否开启长久化,选值:yes、no执行命令截图: 3、启动 Redis 容器执行命令如下: docker start redis-node1 redis-node2 redis-node3 redis-node4 redis-node5 redis-node6 启动截图如下: 4、组建 Redis 集群进入任意一个 Redis 实例: # 这里以 redis-node1 实例为例docker exec -it redis-node1 /bin/bash 执行组件集群的命令: # 组建集群,10.211.55.4为以后物理机的ip地址redis-cli --cluster create 10.211.55.4:6379 10.211.55.4:6380 10.211.55.4:6381 10.211.55.4:6382 10.211.55.4:6383 10.211.55.4:6384 --cluster-replicas 1 执行命令截图如下: 创立胜利后,通过 redis-cli 查看一下集群节点信息: root@CentOS7:/data# redis-cli127.0.0.1:6379> cluster nodes 执行命令截图如下: 4、对于Redis集群搭建咱们再回到创立集群的命令上: redis-cli --cluster create 10.211.55.4:6379~6384 --cluster-replicas 1 大家着重看这个参数 --cluster-replicas 1,参数前面的数字示意的是主从比例,比方这里的 1 示意的是主从比例是 1:1,什么概念呢? ...

December 11, 2020 · 1 min · jiezi

关于redis集群:Redis学习-复制以及三种部署模式

Redis学习 - 复制以及三种部署模式什么是复制单机的redis通常状况是无奈满足我的项目需要的,个别都倡议应用集群部署的形式进行数据的多机备份和部署,这样既能够保障数据安全,同时在redis宕机的时候,复制也能够对于数据进行疾速的修复。 <!-- more --> 采取的形式单机部署(疏忽)主从链一主多从哨兵模式集群模式复制的前提须要保障redis.conf外面的配置是正确的,比方:dir ./dbfilename "dump.rdb"须要保障指定的门路对于redis来说是可写的,意味着如果当前目录没有写权限同样会失败从服务器连贯主服务器的几种形式在从服务器的配置文件外面配置连贯那个主服务器:连贯的具体配置如下: 在5.0版本中应用了replicaof代替了slaveof(github.com/antirez/red…),slaveof还能够持续应用,不过倡议应用replicaof上面是集体的配置 # replicaof <masterip> <masterport> replicaof 127.0.0.1 16379正告:此大节只阐明了这一个配置的更改,进行主从配置的时候还有其余几个参数须要更改,这里只作为局部内容参考在启动的适宜,在redis从服务器的redis-cli当中敲击如下的命令:127.0.0.1:16380> slaveof 127.0.0.1 16379OK Already connected to specified master这样就能够在从服务器动静的指定要连贯哪个主服务器了,然而这种配置是以后运行时无效,下次再次进入的时候,会依据配置文件进行配置或者依照默认的规定以后实例就是master3. 在从服务器执行slaveof no one,以后实例脱离管制主动成为masterredis 复制启动的过程==(重点)==主服务器操作从服务器操作1. (期待命令)1. 连贯(从新连贯)主服务器,发送sync命令2. 开始执行bgsave,应用缓冲区记录bgsave之后执行所有写命令2. 依据配置选项是应用现有的数据(存在)解决客户端申请,还是向申请的客户端返回错误信息3. bgsave执行结束,向从服务器发送快照文件,同时异步执行缓冲区记录的写命令3. 抛弃所有的旧数据,载入主服务器的快照文件4. 快照文件发送结束,开始向着从服务器发送存储在缓冲区的写命令4. 实现对于快照的解释操作,复原日常的申请操作5. 缓冲区写命令发送实现,同时当初每执行一个写命令就像从服务器发送雷同写命令5. 执行主服务器发来的所有存储在缓冲区的写命令,并且从当初开始承受主服务器的每一个命令倡议:因为bgsave须要开启进行子线程的创立写入缓冲区的创立,所以最好在零碎中预留30% - 45% 内存用于redis的bgsave操作特地留神:当从服务器连贯主服务器的那一刻,执行到第三步会清空以后redis外面的所有数据。 配置形式和命令形式的区别:redis.conf 配置slaveof 的形式:不会马上进行主服务器同步,而是先载入以后本地存在的rdb或者aof到redis中进行数据恢复,而后才开始同步复制 命令slaveof形式:会立刻连贯主服务器进行同步操作 对于redis的主主复制:如果咱们尝试让两台服务器相互slaveof 那么会呈现下面状况呢? 从下面的复制过程能够看到,当一个服务器slaveof另一个服务器,产生的后果只会是两边互相笼罩,也就是从服务器会去同步主服务器的数据,如果此时依照主主的配置,两边相互同步对方的数据,这样产生的数据可能会不统一,或者数据罗唆就是不残缺的。不仅如此,这种操作还会大量占用资源区让两台服务器相互晓得对方 当一台服务器连贯另一台服务器的时候会产生什么?当有新服务器连贯的时候主服务器操作步骤3还没有执行所有从服务器都会收到雷同的快照文件和雷同缓冲区写命令步骤3正在执行或者曾经执行实现了之前同步的五个操作之后,会跟新服务器从新执行一次新的五个步骤系统故障解决复制和长久化尽管曾经根本能够保证系统的数据安全,然而总有意外的状况,比方忽然断电断网,零碎磁盘故障,服务器宕机等一系列状况,那么会呈现各种莫名微妙的问题,上面针对这些状况阐明一下解决形式: 验证快照文件以及aof文件在redis的bin目录上面,存在如下的两个sh -rwxr-xr-x 1 root root 9722168 Nov 15 20:53 redis-check-aof-rwxr-xr-x 1 root root 9722168 Nov 15 20:53 redis-check-rdb他们的命令作用和内容如下: ...

November 29, 2020 · 7 min · jiezi

关于redis集群:centos7部署redis329-cluster部署三主三从

centos7部署redis_3.2.9 cluster部署(三主三从1,虚拟机环境应用的Linux环境曾经版本: Centos 7 64位零碎 主机ip : 192.168.56.180 192.168.56.181 192.168.56.182 每台服务器是1主1从,试验3台服务器课成为3主3从。 Redis装置的我的项目目录,日志,配置文件等都寄存在/ root / svr /目录下。 2,下载相干的安装包以及解压首先在192.168.56.180机器操作: cd /data/work/wget http://download.redis.io/releases/redis-3.2.9.tar.gztar -zxvf redis-3.2.9.tar.gz3,装置在/data/work/redis-3.2.9/目录下执行: make && make install PREFIX = / data / work / redis-3.2.94,配置信息创立性能配置,日志日志,数据所在的文件夹: cd /data/work/redis-3.2.9/`mkdir cluster-conf`mkdir -pv /data/work/redis-3.2.9/logs 创立可用端口文件夹:cd cluster-confmkdir 7777mkdir 8888 配置复制文件到/数据/工作/redis-3.2.9/cluster-conf/7777目录下:cp /data/work/redis-3.2.9/redis.conf  /data/work/redis-3.2.9/cluster-conf/7777批改7777目录下redis.conf(主)配置文件:bind 192.168.56.181 127.0.0.1protected-mode yesmasterauth "xxxxx"requirepass "xxxxx"port 8888tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/work/redis-3.2.9/cluster-conf/8888/redis_8888.pidloglevel noticelogfile "/data/work/redis-3.2.9/logs/redis_8888.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir ./slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100maxclients 100000appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000cluster-enabled yescluster-config-file /data/work/redis-3.2.9/cluster-conf/8888/nodes-8888.confslowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes群集配置文件/data/work/redis-3.2.9/cluster-conf/8888/redis.conf (从)bind 192.168.56.181 127.0.0.1protected-mode yesmasterauth "xxxxx"requirepass "xxxxx"port 8888tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/work/redis-3.2.9/cluster-conf/8888/redis_8888.pidloglevel noticelogfile "/data/work/redis-3.2.9/logs/redis_8888.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir ./slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100maxclients 100000appendonly yesappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000cluster-enabled yescluster-config-file /data/work/redis-3.2.9/cluster-conf/8888/nodes-8888.confslowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes5,应用scp复制装置和配置好的redis复制到其余服务器上曾经在192.168.56.180机器配置好,复制到181和182机器 ...

November 23, 2020 · 2 min · jiezi

关于redis集群:redis-安装

1.新建redis文件夹mkdir /home/redis2.进入redis目录cd /home/redis3.下载 redis-5.0.8 wget http://download.redis.io/rele...4.解压redistar zxvf redis-5.0.8.tar.gz5.进入 redis-5.0.8cd /home/reids/redis-5.0.8/src6.编译(编译前确定根据装置了gcc,如果没有装置则yum install gcc)make7.配置redis8.设置redis为开机启动 新建开机启动脚本 vi /etc/init.d/redis 输出开机脚本: #chkconfig: 2345 10 90# description: Start and Stop redis# Simple Redis init.d script conceived to work on Linux systems# as it does use of the /proc filesystem.REDISPORT=6379EXEC=/home/redis/redis-5.0.8/src/redis-serverCLIEXEC=/home/redis/redis-5.0.8/src/redis-cliPIDFILE=/var/lib/redis/redis_${REDISPORT}.pid#CONF="/etc/redis/${REDISPORT}.conf"CONF="/home/redis/redis-5.0.8/redis.conf"case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF & fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart) "$0" stop sleep 3 "$0" start ;; *) echo "Please use start or stop or restart as first argument" ;;esac9.增加redis服务chkconfig --add redis10.设置为开机启动 chkconfig redis on 11.启动服务 nohup service redis start ...

November 10, 2020 · 1 min · jiezi

关于redis集群:第三阶段-Day15-Redis集群搭建

实现Redis集群============= 1.1 为什么须要搭建集群redis分片特点:1.能够实现Redis内存数据的扩容.2.redis分片自身没有高可用成果的.如果宕机将间接影响用户的应用. redis哨兵特点:1.Redis哨兵能够实现Redis节点的高可用.然而哨兵自身没有实现高可用机制.(最好不要引入第三方)2.Redis哨兵有主从的构造 实现了内存数据的备份. 然而没有实现内存扩容的成果. 降级:须要Redis内容扩容同时须要Redis高可用性所以应该应用Redis集群. 1.2 对于Redis集群搭建问题阐明敞开所有的redis服务器sh stop.sh删除多余的文件3.重启redis服务器 执行挂载命令`redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005` 1.3 Redis入门案例`@Test public void testCluster(){ Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.126.129", 7000)); nodes.add(new HostAndPort("192.168.126.129", 7001)); nodes.add(new HostAndPort("192.168.126.129", 7002)); nodes.add(new HostAndPort("192.168.126.129", 7003)); nodes.add(new HostAndPort("192.168.126.129", 7004)); nodes.add(new HostAndPort("192.168.126.129", 7005)); JedisCluster jedisCluster = new JedisCluster(nodes); jedisCluster.set("cluster", "集群的测试!!!!"); System.out.println(jedisCluster.get("cluster")); }` 1.4 对于选举机制-脑裂景象阐明: 当集群进行选举时,如果间断3次都呈现了平票的后果的则可能呈现脑裂的景象.问题: 呈现脑裂景象的概率是多少??? 1/8数学建模:抛银币间断3次呈现平票的概念是多少? 1/8=12.5%第一次: 正正 正反 反正 反反 1/2第二次: 正正 正反 反正 反反 1/2第三次: 正正 正反 反正 反反 1/2预防: 减少主节点的数量能够无效的升高脑裂景象的产生. ...

November 9, 2020 · 2 min · jiezi

关于redis集群:缓存服务器Redis-08-Redis集群算法及持久化策略及内存优化

redis集群数据存储原理hash槽算法/分区算法:RedisCluster采纳此分区,所有的键依据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点保护局部槽及槽所映射的键值数据.依据主节点的个数,平衡划分区间.算法:哈希函数: Hash()=CRC16[key]%16384 当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到治理该槽的节点中. 题目剖析redis中最多存储16384个key----错例:CRC16(KEY1)%16384 = 2000/CRC16(KEY2)%16384 = 2000示意key1和key2都归节点1进行治理. 至于节点到底是否可能存储 由内存决定. Redis集群中最多有16384台主机,Redis集群中起码有3台主机. Redis长久化策略长久化需要阐明Redis数据都保留在内存中,如果内存断电则导致数据的失落.为了保障用户的内存数据不失落,须要开启长久化机制.长久化----定期将内存中的数据保留到磁盘中. 长久化分类阐明:Redis中的长久化形式次要有2种.形式1: RDB模式 dump.rdb 默认的长久化形式形式2: AOF模式 appendonly.aof 默认敞开的须要手动的开启 RDB模式1.阐明:RDB模式是Redis中默认的长久化策略. 2.特点:1).RDB模式能够实现定期的长久化,然而可能导致数据失落.(相似冷备份)2).RDB模式作的是内存数据的快照, 并且后拍摄的快照会笼罩之前的快照.所以长久化文件较小.复原数据的速度较快. 工作的效率较高. 3.命令:用户能够通过命令要求redis进行长久化操作.1).save 是同步操作 要求redis立刻执行长久化操作. 用户可能会陷入阻塞状态.2).bgsave 是异步操作, 开启独自的线程执行长久化操作. 长久化时不会影响用户的应用. 不能保障立刻马上执行. 4.长久化策略阐明:LG: save 900 1 redis在900秒内执行一次set操作时则长久化一次.用户操作越频繁则长久化的周期越短. 5.长久化目录: 能够执行长久化文件生成的地位.dir ./ 6.长久化文件名称的设定.dbfilename dump.rdb AOF模式1.特点:1).AOF模式默认的条件下是敞开状态,须要手动的开启.2).AOF模式记录的是用户的执行的状态.所以长久化文件占用空间绝对较大.复原数据的速度较慢.所以效率较低.3).能够保证用户的数据尽可能不失落. 2.配置:1).开启AOF配置appendonly yes2).AOF模式的长久化策略 appendfsync always 如果用户执行的了一次set操作则长久化一次appendfsync everysec aof每秒长久化一次appendfsync no 不被动长久化.对于RDB/AOF模式特点1.如果用户能够容许大量的数据失落能够选用RDB模式(快).2.如果用户不容许数据失落则选用AOF模式.3.理论开发过程中个别2种形式都会配置. 个别主机开启RDB模式,从机开启AOF模式. 理论状况如果在线上执行了FLUSHALL命令怎么办?---应该将AOF模式中flushAll删除,之后重启redis即可. Redis内存优化Redis能够当做内存应用,然而如果始终往里存储不删除数据,则必然导致内存溢出. LRU算法1.LRU是Least Recently Used的缩写,即最近起码应用,是一种罕用的页面置换算法,抉择最近最久未应用的页面予以淘汰。该算法赋予每个页面一个拜访字段,用来记录一个页面自上次被拜访以来所经验的工夫 t,当须淘汰一个页面时,抉择现有页面中其 t 值最大的,即最近起码应用的页面予以淘汰。2.维度:工夫T3.LRU算法是当下实现内存清理的最优算法. LFU算法1.LFU(least frequently used (LFU) page-replacement algorithm)。即最不常常应用页置换算法,要求在页置换时置换援用计数最小的页,因为常常应用的页应该有一个较大的援用次数。然而有些页在开始时应用次数很多,但当前就不再应用,这类页将会长工夫留在内存中,因而能够将援用计数寄存器定时右移一位,造成指数衰减的均匀应用次数。2.维度: 援用次数 ...

September 14, 2020 · 1 min · jiezi

关于redis集群:缓存服务器Redis-07-Redis集群

redis集群劣势采纳redis集群,能够保证数据扩散存储(主机-主机),同时保证数据存储的一致性(主机-从机),并且在外部实现高可用的机制,实现了服务故障的主动迁徙. 搭建打算主从--3台主/3台从(1主1从) 端口--7000/7001/7002/7003/7004/7005 集群搭建1.筹备集群文件夹:筹备集群文件夹Mkdir cluster在cluster文件夹中别离创立7000-7005文件夹 2.复制配置文件:将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保留cp redis.conf cluster/7000/ 3.编辑配置文件:1).正文本地绑定IP地址(69行)#bind 127.0.0.12).敞开保护模式(88行)protected-mode no3).批改端口号(92行)port 70004).启动后盾启动(136行)daemonize yes5).批改pid文件(158行)pidfile /usr/local/src/redis/cluster/7000/redis.pid6).批改长久化文件(263行)dir /usr/local/src/redis/cluster/70007).设定内存优化策略(597行)maxmemory-policy volatile-lru8).敞开AOF模式(699行)appendonly no9).开启集群配置(838行)cluster-enabled yes10).开启集群配置文件(846行)cluster-config-file nodes.conf11).批改集群超时工夫(852行)cluster-node-timeout 15000 4.复制批改后的配置文件:阐明:将7000文件夹下的redis.conf文件别离复制到7001-7005中 [root@localhost cluster]# cp 7000/redis.conf 7001/[root@localhost cluster]# cp 7000/redis.conf 7002/[root@localhost cluster]# cp 7000/redis.conf 7003/[root@localhost cluster]# cp 7000/redis.conf 7004/[root@localhost cluster]# cp 7000/redis.conf 7005/5.批量批改配置文件:阐明:别离将7001-7005文件中的7000改为对应的端口号的名称,批改时留神方向键的应用在vim编辑器内底行模式,通过:%s/7000/7001/g命令批改g--示意批量批改,将文件内7000都替换为7001/7002... 6.通过脚本编辑启动/敞开指令:1).创立启动脚本 vim start.sh #!/bin/shredis-server 7000/redis.conf &redis-server 7001/redis.conf &redis-server 7002/redis.conf &redis-server 7003/redis.conf &redis-server 7004/redis.conf &redis-server 7005/redis.conf &2).编辑敞开的脚本 vim shutdown.sh #!/bin/shredis-cli -p 7000 shutdown &redis-cli -p 7001 shutdown &redis-cli -p 7002 shutdown &redis-cli -p 7003 shutdown &redis-cli -p 7004 shutdown &redis-cli -p 7005 shutdown &3).启动redis节点 sh start.sh4).查看redis节点启动是否失常 ps -ef | grep redis ...

September 12, 2020 · 1 min · jiezi

关于redis集群:Redis事件处理机制详解

全是干货的技术号:本文已收录在github,欢送 star/fork:https://github.com/Wasabi1234...Redis 服务器的事件次要解决两方面: 解决文件事件:在多个客户端中实现多路复用,承受它们发来的命令申请,并将命令的执行后果返回给客户端工夫事件:实现服务器惯例操作1 文件事件Redis server通过在多个客户端间多路复用, 实现了高效的命令申请解决: 多个客户端通过socket连贯到 Redis server, 但只有在socket可无阻塞读/写时, server才会和这些客户端交互。 Redis 将这类因为对socket进行多路复用而产生的事件称为文件事件, 文件事件可分类如下: 1.1 读事件读事件标记着客户端命令申请的发送状态。 当一个新的client连贯到服务器时, server会给该client绑定读事件, 直到client断开连接后, 该读事件才会被移除。 读事件在整个网络连接的生命期内, 都会在期待和就绪两种状态之间切换: 当client只是连贯到server,但并未向server发送命令时,该客户端的读事件就处于期待状态当client给server发送命令申请,并且申请已达到时(相应的套接字能够无阻塞地执行读操作),该client的读事件处于就绪状态。示例如图展现三个已连贯到server、但并未发命令的client 此时客户端的状态: Client读事件状态命令发送状态A期待未发送B期待未发送C期待未发送起初,A向服务器发送命令申请, 并且命令申请已达到时, A的读事件状态变为就绪:此时客户端的状态: Client读事件状态命令发送状态A就绪已发送且已达到B期待未发送C期待未发送当事件处理器被执行时,就绪的文件事件会被辨认到,相应的命令申请就会被发送到命令执行器,并对命令进行求值。 1.2 写事件写事件标记着client对命令后果的接管状态。 和client从头至尾都关联着读事件不同, server只会在有命令后果要传回给client时, 才会为client关联写事件, 并且在命令后果传送结束之后, client和写事件的关联就会被移除。 一个写事件会在两种状态之间切换: 当server有命令后果需返回给client,但client还未能执行无阻塞写,那么写事件处期待状态当server有命令后果需返回给client,且client可无阻塞写,那么写事件处就绪状态当client向server发命令申请, 且申请被承受并执行后, server就需将保留在缓存内的命令执行后果返回给client, 这时server就会为client关联写事件。 示例server正等待client A 变得可写, 从而将命令后果返回给A:此时客户端的状态: Client读事件状态写事件状态A期待期待B期待无C期待无当A的socket可无阻塞写时, 写事件就绪, server将保留在缓存内的命令执行后果返回给client:此时client状态: Client读事件状态写事件状态A期待已就绪B期待无C期待无当命令执行后果被传回client后, client和写事件的关联会被解除(只剩读事件),返回命令执行后果的动作执行结束,回到最后: 1.3 同时关联读/写事件咱们说过,读事件只有在client断开和server的连贯时,才会被移除。即当client关联写事件时,实际上它在同时关联读/写事件。 因为在同一次文件事件处理器的调用中, 单个客户端只能执行其中一种事件(要么读,要么写,不能又读又写), 当呈现读事件和写事件同时就绪时,事件处理器优先解决读事件。 即当server有命令后果要返回client, 而client又有新命令申请进入时, server先解决新命令申请。 2 工夫事件工夫事件记录着那些要在指定工夫点运行的事件,多个工夫事件以无序链表构造保留在服务器状态中。 无序链表并不影响工夫事件处理器的性能。在Redis3.0版本,失常模式下的 Redis 只带有 serverCron 一个工夫事件, 而在 benchmark 模式下, Redis 也只应用两个工夫事件。在这种状况下, 程序简直是将无序链表进化成一个指针来应用, 所以应用无序链表来保留工夫事件, 并不影响事件处理器性能。工夫事件的数据结构 ...

September 4, 2020 · 2 min · jiezi

redis-集群模式安装本地模拟

1、参考官网教程https://redis.io/topics/clust...2、下载redis-5.0.83、解压源码包,编译4、新建一个redis目录 用来模拟安装redis集群在redis 目录下新建 7000,7001,7002,7003,7004,7005这个几个目录mkdir 7000 7001 7002 7003 7004 7005 将编译后的可运行程序分别拷贝到7000、7001、7002、7003、7004、7005 目录下进入7000目录,修改配置文件redis.confvi redis.conf修改如下配置 port 7000cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes保存:wq依次修改7001、7002、7003、7004、7005的配置文件其中各个目录下的端口号要配置成与目录一致,例如7001目录下的端口号要配置成7001。不能有相同的端口号,否则会启动失败。 进入7000/src/目录启动 redis服务器 ,启动命令为 ./redis-server ../redis.conf依次启动各个目录下的redis ,命令相同 进入7000/src 使用redis-cli创建redis集群 redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \--cluster-replicas 1当集群创建成功可以看到 [OK] All 16384 slots covered使用redis-cli连接集群的一个节点 redis-cli -c -p 7000设置一个key 为foo value 为bar的键值对 set foo bar-> Redirected to slot [12182] located at 127.0.0.1:7002OK实际上会根据key的值,具体存在某个几点,虽然连接的事7000这个节点,但是实际数据存储在老了7002节点上查看集群节点情况使用一下命令 redis-cli -p 7000 cluster nodes其中slave为从节点,master为主节点 往集群中添加新的节点 ...

June 21, 2020 · 1 min · jiezi