关于redis-cluster:2022最新版-Redis大厂面试题总结附答案

专一于PHP、MySQL、Linux和前端开发,感兴趣的感激点个关注哟!!!文章已收录,次要蕴含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相干理论知识、面试题和实战内容。文章导语大家好,前段时间始终在忙找工作相干的事件。最近工作稳固了,于是把面试过程中遇到的Redis相干常识问题总结下来,心愿可能对大家面试、学习有所帮忙。本文重点分享数据类型,其余内容后续章节分享,也能够点击上方收录链接。 本系列面试题会从意识Redis、Redis几大数据类型、常见的应用场景和解决方案、Redis主从复制、Redis哨兵、Redis集群等相干知识点进行总结。不仅仅单纯的从文字方面终结,还会带有更多的图文方面,尽可能的让大家深刻的学习。 同时我也筹备了一份汇总纲要,绝对文字来说更加的清晰、明了。须要的小伙伴也能够回复Redis面试纲要。同时该系列问题也会一直的欠缺、更新。让大家学习到更多的常识。 意识RedisREmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的应用 ANSI C 语言编写、恪守 BSD 协定、反对网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis的数据类型都有哪些有五种根本数据类型,别离是string、hash、list、有序汇合(zset)、汇合(set)。在5.0之后减少了一种Stream类型。额定的有GEO、HyperLogLog、BitMap。Redis应用的场景有哪些数据缓存(用户信息、商品数量、文章浏览数量)音讯推送(站点的订阅)队列(削峰、解耦、异步)排行榜(积分排行)社交网络(独特好友、互踩、下拉刷新)计数器(商品库存,站点在线人数、文章浏览、点赞)基数计算GEO计算Redis性能特点都有哪些长久化丰盛的数据类型(string、list、hash、set、zset、公布订阅等)高可用计划(哨兵、集群、主从)事务丰盛的客户端提供事务音讯公布订阅GeoHyperLogLog事务分布式事务锁Redis如何实现分布式锁Redis能够应用setnx key value + expire key expire_time来实现分布式锁。失常状况下,下面的命令是没有问题的。当Redis出现异常的状况下,很容易呈现非原子性操作。非原子性操作指的的setnx命令执行胜利,然而expire没有执行胜利,此时key就成为了一个无过期工夫的key,始终保留在Redis中,导致其余的申请就无奈执行。要解决该问题,能够应用lua脚本实现。通过lua实现命令的原子性操作。 在Redis中应用set命令,加参数也能够实现分布式锁。set key vale nx ex|px ttl<!-- tabs:start --> 通过数组定义--- getLock keylocal key = KEYS[1]local requestId = KEYS[2]local ttl = tonumber(KEYS[3])local result = redis.call('setnx', key, requestId)if result == 1 then --PEXPIRE:以毫秒的模式指定过期工夫 redis.call('pexpire', key, ttl)else result = -1; -- 如果value雷同,则认为是同一个线程的申请,则认为重入锁 local value = redis.call('get', key) if (value == requestId) then result = 1; redis.call('pexpire', key, ttl) endend-- 如果获取锁胜利,则返回 1return result通过数组定义-- releaseLock keylocal key = KEYS[1]local requestId = KEYS[2]local value = redis.call('get', key)if value == requestId then redis.call('del', key); return 1;endreturn -1<!-- tabs:end --> ...

September 21, 2022 · 1 min · jiezi

关于redis-cluster:redis重新分片

为什么会呈现从新分片呈现上面状况后redis集群会从新进行分片: 有新的节点退出有节点须要下线某些节点数据分布不平均须要从新调整如何从新分片从新分片须要人工应用redis.trib工具,流程如下: 执行命令./redis-trib.rb reshard ip:port执行了这个命令之后,控制台会显示集群里所有节点信息,包含ip,port,每个节点负责的slots,每个节点的master/slave角色,及每个节点的ID。相似:$ ./redis-trib.rb reshard 127.0.0.1:7000Connecting to node 127.0.0.1:7000: OKConnecting to node 127.0.0.1:7002: OKConnecting to node 127.0.0.1:7005: OKConnecting to node 127.0.0.1:7001: OKConnecting to node 127.0.0.1:7003: OKConnecting to node 127.0.0.1:7004: OK>>> Performing Cluster Check (using node 127.0.0.1:7000)M: 9991306f0e50640a5684f1958fd754b38fa034c9 127.0.0.1:7000slots:0-5460 (5461 slots) masterM: 393c6df5eb4b4cec323f0e4ca961c8b256e3460a 127.0.0.1:7002slots:10922-16383 (5462 slots) masterS: 3375be2ccc321932e8853234ffa87ee9fde973ff 127.0.0.1:7005slots: (0 slots) slaveM: e68e52cee0550f558b03b342f2f0354d2b8a083b 127.0.0.1:7001slots:5461-10921 (5461 slots) masterS: 48b728dbcedff6bf056231eb44990b7d1c35c3e0 127.0.0.1:7003slots: (0 slots) slaveS: 345ede084ac784a5c030a0387f8aaa9edfc59af3 127.0.0.1:7004slots: (0 slots) slave[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)? 1000同时还会询问咱们须要迁徙多少个slots,示例中咱们迁徙1000. ...

January 5, 2022 · 1 min · jiezi

关于redis-cluster:Rediscluster安装

1、装置前筹备redis cluster的装置的环境筹备,请先回顾单机版装置流程Redis单机装置(生产环境配置) 在每台服务器上配备好Redis实例。本次装置筹备三台服务器搭建三主个节点,三个从节点: 序号IP端口1172.17.73.23070012172.17.73.23070023172.17.73.23270034172.17.73.23270045172.17.73.23370056172.17.73.23370062、编写配置文件redis cluster 集群,要求至多3个master,去组成一个高可用,强壮的分布式集群,每个master都倡议至多给一个slave,3个master,3个slave起码要求。 正式环境下,倡议在6台服务器上搭建,至多3台。 保障每个master都和本人slave不在同一台服务器上,如果6台更好,一个master + slave. 本次3台服务器搭建6个实例的redis cluster 创立目录: mkdir -p /etc/redis-clustermkdir -p /var/log/redismkdir -p /var/redis/logredis.confg 批改 port 7001cluster-enabled yescluster-config-file /etc/redis-cluster/node-7001.confcluster-node-timeout 15000daemonize yespidfile /var/run/redis_7001.piddir /var/redis/7001logfile /var/log/redis/7001.log#本级IPbind 172.17.73.230 protected-mode no appendonly yes依照下面的配置批改将六个实例的配置文件筹备好后别离copy到对应服务器的地位: /etc/redis7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf筹备生产环境的启动脚本:在以下目录下别离寄存对应的启动脚本 /etc/init.d/redis_7001、redis_7002、redis_7003、redis_7004、redis_7005、redis_7006别离在启动六个redis实例 3、创立集群redis-cli --cluster create 172.17.73.230:7001 172.17.73.230:7002 172.17.73.232:7003 172.17.73.232:7004 172.17.73.233:7005 172.17.73.233:7006 --cluster-replicas 1提醒输出yes即可: 到这本次集群搭建就实现了。

April 16, 2021 · 1 min · jiezi

关于redis-cluster:中间件使用redis-cluster

没有用spring-data-redis,封装了service层,针对罕用操作实现了get,set,delete,hasKey,hget,hset,hdelete,lpush,rpop,ttl,publish等办法实现了分布式锁,分布式计数器,get后立刻生效,集群环境下执行lua脚本的命令 分布式锁:如果key在redis中存在,则获取失败返回false,否则设置该key及生效工夫,返回胜利。Redis操作为单线程,判断key是否存在及设置key应为一个原子操作,通过lua脚本实现。在分布式定时工作中抢锁执行定时工作有用到,定时工作在多个服务中启用,但同时只有抢到锁的那个服务能调用胜利,保障服务的冗余及同一时刻只有一个节点执行定时工作。分布式计数器:和分布式锁相似,如果key在redis中存在,则+1,否则设为1。该过程为原子操作。用于接口限流。get后立刻生效:和分布式锁相似,如果key在redis中存在,则删除,返回true,否则返回false。用于用户登录时校验图片验证码,校验后验证码立刻生效,进步脚本防御的难度。lua脚本执行办法。因为在集群环境下,key存储在不同节点,为确保lua脚本是一个原子操作,须要不同的key在同一节点执行。即lua脚本中的每个key前增加同一{xx},cluster分片时会依照xx进行hash分槽。反对同时连贯多个cluster,依据dbkey指定集群。为了将缓存隔离,搭建了多个redis集群,配置文件中通过dbkey辨别不同的集群。调用redisService办法时如果不指定dbkey则操作默认cluster,如果传入dbkey参数则操作指定cluster可按cluster增加对立前缀。因为测试环境分为sit,qa,uat,心愿应用同一套cluster,cluster没有单机db的概念,因而在配置cluster时,对立增加前缀sit,qa,uat进行辨别,调用redisService办法时主动增加。反对配置明码。可连贯配置和不配置明码的cluster,由配置文件决定

March 5, 2021 · 1 min · jiezi

关于redis-cluster:Redis-Cluster

MASTER yum install -y epel-releaseyum install -y redisvi /etc/redis.conf<code>bind 192.168.1.193protected-mode yesport 6379tcp-backlog 65535syslog-enabled yeslogfile /dev/nullmaxclients 51200timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /var/run/redis_6379.pidloglevel noticedatabases 16always-show-logo yesstop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /var/lib/redisreplica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noreplica-priority 100lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush noappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yeslua-time-limit 5000slowlog-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 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yes</code>redis-sentinelvi /etc/redis-sentinel.conf<code>port 26379bind LocalhostIPsyslog-enabled yesdir /tmp###监控mymaster主服务器,有2个sentinel主观认为master down,则批准master转移sentinel monitor mymaster MASTERIP 6379 2###在3000毫秒(3s)内无奈和master通信(ping或者info),则认为master downsentinel down-after-milliseconds mymaster 3000###这个配置项指定了在产生failover主备切换时最多能够有多少个slave同时对新的master进行同步,这个数字越小,实现failover所需的工夫就越长,然而如果这个数字越大###就意味着越多的slave因为replication而不可用。能够通过将这个值设为 1 来保障每次只有一个slave 处于不能解决命令申请的状态。sentinel parallel-syncs mymaster 1###同一个sentinel对同一个master两次failover之间的间隔时间###当一个slave从一个谬误的master那里同步数据开始计算工夫,直到slave被纠正为向正确的master那里同步数据时###当想要勾销一个正在进行的failover所须要的工夫。###当进行failover时,配置所有slaves指向新的master所需的最大工夫。不过,即便过了这个超时,slaves仍然会被正确配置为指向master,然而就不按parallel-syncs所配###置的规定来了。sentinel failover-timeout mymaster 180000</code>SLAVE装置redis,批改redis.conf配置文件,指向master进入集群执行slaveof 192.168.1.193 6379

February 23, 2021 · 1 min · jiezi

关于redis-cluster:k8s部署有状态应用rediscluster集群踩坑总结

redis-cluster集群的部署网上一堆,用k8s部署也不在少数,但都是抄来抄去,问题不少,实际操作分享进去的还是太少。1、redis启动配置文件,应用CofigMap来治理比拟不便,redis-config.yaml apiVersion: v1kind: ConfigMapmetadata: name: redis-config namespace: defaultdata: update-node.sh: | #!/bin/sh REDIS_NODES="/data/nodes.conf" sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${MY_POD_IP}/" ${REDIS_NODES} exec "$@" redis.conf: |+ port 7001 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 #cluster-announce-ip ${MY_POD_IP} #cluster-announce-port 7001 #cluster-announce-bus-port 17001 logfile "/data/redis.log"阐明:2个文件,node-update.sh用来redis启动时执行脚本,具体前面再介绍为何要减少一个启动脚本;redis.conf为redis启动配置文件。 2、redis长久化存储pv,pv应用nfs服务存储,集群6个节点别离创立6个pv不同存储,动态创立pv文件redis-pv.yaml apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv0 labels: pv: nfs-pv0spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster0---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv1 labels: pv: nfs-pv1spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster1---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv2 labels: pv: nfs-pv2spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster2---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv3 labels: pv: nfs-pv3spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster3---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv4 labels: pv: nfs-pv4spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster4---apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pv5 labels: pv: nfs-pv5spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.11.242 path: /root/nfs/redis-cluster53、应用StatefulSet创立redis-cluster集群节点和headless service ...

February 8, 2021 · 2 min · jiezi

关于redis-cluster:Docker-Redis集群搭建

最早看Redis集群搭建的文章,还是多开几个虚拟机或者单机多开几个端口的办法,起初发现其实用docker更加简略不便。 1.拉取镜像docker search redisdocker pull redis2.生成配置文件mkdir redis-clustercd redis-clustervim redis-cluster.tmplport ${PORT}masterauth 123456requirepass 123456cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 192.168.10.83cluster-announce-port ${PORT}cluster-announce-bus-port 1${PORT}appendonly yes参数形容(1)port(端口号)(2)masterauth(设置集群节点间拜访明码,跟上面统一)(3)requirepass(设置redis拜访明码)(4)cluster-enabled yes(启动集群模式)(5)cluster-config-file nodes.conf(集群节点信息文件)(6)cluster-node-timeout 5000(redis节点宕机被发现的工夫)(7)cluster-announce-ip(集群节点的汇报ip,避免nat,事后填写为网关ip后续须要手动批改配置文件)(8)cluster-announce-port(集群节点的汇报port,避免nat)(9)cluster-announce-bus-port(集群节点的汇报bus-port,避免nat)(10) appendonly yes(开启aof)3.生成配置文件和数据目录执行以下命令,按模板生成文件以及文件夹for port in `seq 7001 7006`; do \ mkdir -p ./${port}/conf \ && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \ && mkdir -p ./${port}/data; \done 4.创立6个redis容器docker run -d --net=host -v /redis-cluster/7001/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7001/data:/data --restart always --name=redis-7001 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7002/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7002/data:/data --restart always --name=redis-7002 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7003/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7003/data:/data --restart always --name=redis-7003 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7004/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7004/data:/data --restart always --name=redis-7004 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7005/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7005/data:/data --restart always --name=redis-7005 redis redis-server /etc/redis/redis.confdocker run -d --net=host -v /redis-cluster/7006/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/7006/data:/data --restart always --name=redis-7006 redis redis-server /etc/redis/redis.conf或者for port in `seq 7001 7006`; do \ docker run -d --net=host -v /redis-cluster/${port}/conf/redis.conf:/etc/redis/redis.conf -v /redis-cluster/${port}/data:/data --restart always --name=redis-${port} redis redis-server /etc/redis/redis.conf \donedocker ps ...

December 31, 2020 · 1 min · jiezi

Redis压缩包没有redisconf快速启动之记录一

转载请标明出处: http://dujinyang.blog.csdn.net/本文出自:【奥特曼超人的博客】Redis压缩包配置环境变量,直接CMD中启动,默认是打开redis.conf,当然,压缩包是没有的,这里是自行创建的 redis.windows-service.conf 和 redis.windows.conf 对应服务端和客户端的使用。 直接启动应该都会遇到这个提示警告warning,这里不是win7,懒得去找etc下的文件,也没找到…… Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf所以这里自己写了redis-ser.exe 和redis-ser.bat 作为调用,在命令行CMD输入就可以调起。 加入启动服务: redis-server.exe --service-install redis.windows.conf命令: redis-server redis.windows.confredis-cli –h 127.0.0.1 –p 8088<port> -a dujinyang<pwd> 快速启动: redis-ser 或 redis-cli2redis.windows.conf日志记录级别:loglevel notice (Redis支持四个级别:debug、verbose、notice、warning)日志记录方式:logfile ""数据库的数量:databases 16 (可以使用SELECT<dbid>命令在连接上指定数据库id)指定在多长时间内,有多少次更新操作,将数据同步到数据文件: save <seconds> <changes>save 900 1 //900秒至少有1次更新同步到数据文件 save 300 10 //300秒至少有10次更新同步到数据文件 save 60 10000 //60秒如果有10000次更新同步到数据文件指定存储至本地数据库时是否压缩数据: rdbcompression yes.默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大。指定本地数据库文件名: dbfilename dump.rdb指定本地数据库存放目录: dir ./设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步: slaveof <masterip> <masterport>当master服务设置了密码保护时,slav服务连接master的密码: masterauth <master-password>设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH<password>命令提供密码: requirepass foobared(默认关闭)设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。 当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息: maxclients 10000指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区: maxmemory <bytes>指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。appendonly no (默认为no)指定更新日志文件名。appendfilename "appendonly.aof"指定更新日志条件。appendfsync everysecappendfsync always //表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) appendfsync everysec //表示每秒同步一次(折衷,默认值) appendfsync no //表示等操作系统进行数据缓存同步到磁盘(快)指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件。include /path/to/local.conf ...

September 19, 2019 · 1 min · jiezi

Redis-Cluster配置传播及故障恢复笔记

本笔记是对Redis Cluster Spec - Configuration handling, propagation, and failovers的归纳总结。 Epoch可以把Epoch当作是一个版本号,是一个64位无符号整形每个Node自己有一份Cluster.currentEpoch、MySelf.configEpoch、其他Node.configEpoch,详见文档。每个Master有自己的ConfigEpoch且在整个Cluster中唯一Slave的ConfigEpoch随其MasterCluster.currentEpoch,该值等于所有Node中最大的ConfigEpoch的值Master的ConfigEpoch初始值是0,也就是说Cluster.CurrentEpoch的初始值也是0Node之间Gossip传输消息时,Receiver发现Sender的ConfigEpoch比自己大,那么就更新自己的Cluster.CurrentEpoch为该值,随时间收敛,所有Node的Cluster.CurrentEpoch都变成一样。Slave PromotionSlave的动作下面是总结的在发生Slave Promotion时,Slave做的事情。 Master的动作下面是总结的在发生Slave Promotion时,Master做的事情。 传播Slots的配置Slave赢得选举之后会在己侧更新Slots上的归属信息,然后在定时的PING/PONG中将这个信息传播出去。 PING/PONG总是会携带上Slots所属Master的信息(包括ConfigEpoch) PING的Reciever如果发现Sender的某个Slot上的Master.ConfigEpoch比自己这里记录的小,那么就会返回UPDATE告诉Sender更新Slots归属信息。 下面是两个规则: 如果一个Slot不属于任何Master,然后有一个Master宣称拥有它,那么就修改己侧的Slots信息把这个Slot关联到这个Master上。如果一个Slot已经归属一个Master,然后又有一个Master宣称拥有它,那么就看谁的ConfigEpoch大,大的那个赢Node复活后遇到的问题Node A有两个Slot,然后它死了,它被顶替了,等它复活时发现两个Slot一个被Node B接管,另一个被Node C接管了,那么它: 因为自己的ConfigEpoch已经很旧了,所以它复活后不负责任何Slot然后它会成为最后一个Slot的Master的SlaveSlave迁移算法Slave迁移时一个自动过程。 举个例子,现在有Master A、B,它们对应的Slave有A1、B1、B2。现在A死了,A1顶替上去,不过这个时候A1就是一个光棍Master(它没有Slave),B有富余的Slave(B1和B2),把其中一个匀给A1当Slave。 这个过程不需要共识,因为只是修改Slave的归属,也不会修改ConfigEpoch。 Slave迁移有两个规则: 当有多个Slave富余时,选择NodeID字典顺最小的那个来迁移只有当Master的Slave数量>=cluster-migration-barrier时,才会挑选它的Slave做Migration两个跳过共识修改ConfigEpoch的操作下面两个操作比较危险,最好确定一个成功后再执行另一个: CLUSTER_FAILOVER TAKEOVER(手动Failover)直接将一个Slave提升为Master,不需要大多数Master同意。Slot Migration同样不需要大多数Master同意。所以就有可能出现同一个Slot有两个相同ConfigEpoch的Master宣称由自己负责,这种冲突的解决算法是: 如果Master A发现Master B也宣称了对Slot X的主权,并且两者的ConfigEpoch一样如果Master A的NodeID的字典顺比Master B的小那么Master A就把己侧的CurrentEpoch+1,同时ConfigEpoch改成和CurrentEpoch一样Node重制略,见文档。 移除Node略,见文档。 一些自问自答Q:ConfigEpoch何时变化? A:Slave Promotion时、手动Failover时、Slot Migration时 Q:ConfigEpoch怎么变化? A:Node->ConfigEpoch = Cluster->CurrentEpoch + 1,结果也就是Cluster->CurrentEpoch加1了。源码见这里。 Q:两个Master的ConfigEpoch一样怎么办? A:这个会出现在两个Slave同时Promotion时,解决办法是NodeID字典序比较小的那个会再一次Bump ConfigEpoch,源码见这里。 Q:ConfigEpoch有什么用? A:当有两个Master宣称自己拥有同一个/批Slot时,ConfigEpoch大的那个赢,因为大的那个代表最新信息,其他Node只会采用赢的那方所宣称的信息。 Q:CurrentEpoch有什么用? A:1)用来判定Node所获得的Cluster信息的新旧。2)当Node要变更ConfigEpoch时派用处。 参考资料官方文档: Redis Cluster Spec - Configuration handling, propagation, and failovers下面是饿了么工程师写的文章,比较透彻: ...

July 11, 2019 · 1 min · jiezi

Redis-Cluster节点故障探测算法笔记

本笔记是对Redis Cluster Spec - Failure Detection的归纳总结 状态转换图每个Node在本地维护了一张其他Node的状态表,并根据Failure Detection算法更新这张表里的Node的状态每个Node可以自行把其他Node的状态设置为GOOD(这个状态在文档和源码中均不存在,等价于不是PFAIL也不是FAIL)、PFAIL。如果要把其他Node的状态设置为FAIL则需要大多数Master Node同意才行,一旦设置成功要将这个消息传播给所有其他能连接的Node,其他Node收到这个信息后也要更新本地Node状态表,将Failed Node的状态更新为FAIL。下面是状态转换图,例举的是Node A观察Node B的例子: 少数派和多数派多数派:拥有多数Master的一方,可含有Slave。 少数派:拥有少数Master的一方,可含有Slave。 少数派视角少数派只会看到大多数Master处于PFAIL/FAIL状态,0-所有Slave处于PFAIL/FAIL状态。 多数派视角多数派只会看到少数Master处于PFAIL/FAIL状态,0-所有Slave处于PFAIL/FAIL状态。 不会存在以下情况:多数派看到大多数Master处于FAIL状态,因为大多数Master处于FAIL就意味着活着的Master们变成了少数派,这就矛盾了。 一些自问自答Q:为何少数派能够看到Master处于FAIL状态?不是说要大多数Master同意才能变成FAIL状态吗?A:考虑这个情况,在Partition发生的前一秒某些Master被决定为FAIL,随即Partition发生,那么在少数派眼里这些Master依然是处于FAIL状态的。 Q:这里的每个Node是Slave还是Master呢?A:随便,只要是Node就行。 Q:既然每个Master独占的负责Slots,那么少数派继续工作为啥不可以,反正各自管各自的。A:因为在多数派方,这个Master有可能会被Slave顶替,如果允许少数派继续工作,那么就会形成两个Master,造成split brain Q:少数派节点是如何知道自己应该停止工作的?A:它发现大多数Master变成了PFAIL / FAIL 状态时,就知道自己不能工作了,Redis源码里是这么写的。 Q:多数派节点时如何知道自己应该停止工作的?A:如果这个Cluster要求所有Slots被覆盖,那么当有一个Master处于FAIL状态时,便停止工作,见源码。如果不要求,则继续工作,只不过部分Slots的操作会报错。

July 10, 2019 · 1 min · jiezi

高并发探测二redis集群部署整理

1.节点规划:2种方式:1主+多从,多对主从,第二种分担主节点、容易扩容缩减。 容器名称 容器IP地址 映射端口号 服务运行模式Redis-master1 172.1.50.11 6391->6379,16391->6379 masterRedis-master2 172.1.50.12 6392->6379,16392->6379 masterRedis-master3 172.1.50.13 6393->6379,16393->6379 masterredis-slave1 172.1.30.11 6394->6379,16394->6379 Slaveredis-slave2 172.1.30.12 6395->6379,16395->6379 Slaveredis-slave3 172.1.30.13 6396->6379,16396->6379 Slave添加10000+ 的“bus-port”端口,可以查看官方redis.conf的说明: # * cluster-announce-ip# * cluster-announce-port# * cluster-announce-bus-port # 解释在上述段落下方,多余端口用于集群的自动检测。官方参考文档。 a.创建自定义网络这里为了方便,把redis加入之前的mybridge网络,方便php、lua的调用。高可用时通过主机网络访问,所以主从都要对主机开放端口。如上。 2.初步创建集群a.制作容器创建脚本简化名称:clmx 主服务器clsx 从服务器 docker stop clm1 clm2 clm3 cls1 cls2 cls3docker rm clm1 clm2 clm3 cls1 cls2 cls3docker run --name clm1 \ -p 6391:6379 -p 16391:16379 \ --restart=always \ --network=mybridge --ip=172.1.50.11 \ -v /root/tmp/dk/cluster_redis/6391/data:/data \ -v /root/tmp/dk/cluster_redis/6391:/etc/redis \ -d cffycls/redis5:1.7 docker run --name clm2 \ -p 6392:6379 -p 16392:16379 \ --restart=always \ --network=mybridge --ip=172.1.50.12 \ -v /root/tmp/dk/cluster_redis/6392/data:/data \ -v /root/tmp/dk/cluster_redis/6392:/etc/redis \ -d cffycls/redis5:1.7 docker run --name clm3 \ -p 6393:6379 -p 16393:16379 \ --restart=always \ --network=mybridge --ip=172.1.50.13 \ -v /root/tmp/dk/cluster_redis/6393/data:/data \ -v /root/tmp/dk/cluster_redis/6393:/etc/redis \ -d cffycls/redis5:1.7 docker run --name cls1 \ -p 6394:6379 -p 16394:16379 \ --restart=always \ --network=mybridge --ip=172.1.30.11 \ -v /root/tmp/dk/cluster_redis/6394/data:/data \ -v /root/tmp/dk/cluster_redis/6394:/etc/redis \ -d cffycls/redis5:1.7 docker run --name cls2 \ -p 6395:6379 -p 16395:16379 \ --restart=always \ --network=mybridge --ip=172.1.30.12 \ -v /root/tmp/dk/cluster_redis/6395/data:/data \ -v /root/tmp/dk/cluster_redis/6395:/etc/redis \ -d cffycls/redis5:1.7 docker run --name cls3 \ -p 6396:6379 -p 16396:16379 \ --restart=always \ --network=mybridge --ip=172.1.30.13 \ -v /root/tmp/dk/cluster_redis/6396/data:/data \ -v /root/tmp/dk/cluster_redis/6396:/etc/redis \ -d cffycls/redis5:1.7 b.测试配置文件,建立集群在之前主从配置基础上,搜索修改 ...

July 3, 2019 · 3 min · jiezi

Redis-Cluster-的数据分片机制

上一篇《分布式数据缓存中的一致性哈希算法》文章中讲述了一致性哈希算法的基本原理和实现,今天就以 Redis Cluster 为例,详细讲解一下分布式数据缓存中的数据分片,上线下线时数据迁移以及请求重定向等操作。 Redis 集群简介 Redis Cluster 是 Redis 的分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 分布式方面的需求。 Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。 图片来源 redislabs 如上图所示,该集群中包含 6 个 Redis 节点,3主3从,分别为M1,M2,M3,S1,S2,S3。除了主从 Redis 节点之间进行数据复制外,所有 Redis 节点之间采用 Gossip 协议进行通信,交换维护节点元数据信息。 一般来说,主 Redis 节点会处理 Clients 的读写操作,而从节点只处理读操作。 数据分片策略分布式数据存储方案中最为重要的一点就是数据分片,也就是所谓的 Sharding。为了使得集群能够水平扩展,首要解决的问题就是如何将整个数据集按照一定的规则分配到多个节点上,常用的数据分片的方法有:范围分片,哈希分片,一致性哈希算法,哈希槽等。 范围分片假设数据集是有序,将顺序相临近的数据放在一起,可以很好的支持遍历操作。范围分片的缺点是面对顺序写时,会存在热点。比如日志类型的写入,一般日志的顺序都是和时间相关的,时间是单调递增的,因此写入的热点永远在最后一个分片。 对于关系型的数据库,因为经常性的需要表扫描或者索引扫描,基本上都会使用范围的分片策略。 哈希分片和一致性哈希算法在上一篇文章中已经学习过了,感兴趣的同学可以去了解一下《分布式数据缓存中的一致性哈希算法》。我们接下来主要来看Redis 的虚拟哈希槽策略。 Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。 Redis 虚拟槽分区的特点: 解耦数据和节点之间的关系,简化了节点扩容和收缩难度。节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据支持节点、槽和键之间的映射查询,用于数据路由,在线集群伸缩等场景。 Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。可以说,槽是 Redis 集群管理数据的基本单位,集群伸缩就是槽和数据在节点之间的移动。 下面我们就先来看一下 Redis 集群伸缩的原理。然后再了解当 Redis 节点数据迁移过程中或者故障恢复时如何保证集群可用。 ...

May 25, 2019 · 2 min · jiezi

基于 Redis3.2.4 集群搭建说明

摘要用两台虚拟机(ip: 10.60.44.76、ip: 10.60.44.105)共 6 个节点,一台虚拟机 3 个节点,模拟出 3 master、3 salve 环境redis 版本:redis-3.2.4linux 版本:centos6.5(ip: 10.60.44.76)、centos7.0(ip: 10.60.44.105)注意:一个 redis 实例就是一个节点linux 最好是都在 root 权限下操作redis-cluster 最小配置是三主三从关闭防火墙(节点与节点之间通信需要开放指定的端口,单纯为了方便,在生产环境忌用)centos 6.5service iptables stop # 关闭命令:chkconfig iptables off # 永久关闭防火墙service iptables status # 两个命令同时运行,运行完成后查看防火墙关闭状态 centos 7.0systemctl stop firewalld.service # 停止firewallsystemctl disable firewalld.service # 禁止firewall开机启动firewall-cmd –state # 查看默认防火墙状态(关闭后显示notrunning,开启后显示running)一、下载安装包安装包在附件 redis-3.2.4.tar.gz。也可以使用 wget 插件下载wget http://download.redis.io/releases/redis-3.2.4.tar.gz二、单点安装部署单点指的是一个 redis 实例,需要先下载 redis 的源码,接着进行编译、安装,完成通过命令启动该实例解压、编译、安装[root@localhost Desktop]# tar zxvf redis-3.2.4.tar.gz[root@localhost Desktop]# cd redis-3.2.4[root@localhost redis-3.2.4]# cd src && make install创建相关目录# 存放 redis 相关命令文件[root@localhost src]# mkdir -p /usr/local/redis/bin# 存放 redis 的配置文件[root@localhost src]# mkdir -p /usr/local/redis/etc移动命令、配置文件# 移动 redis 配置文件(配置文件在解压好的目录)[root@localhost redis-3.2.4]# mv redis.conf /usr/local/redis/etc# 移动 redis 命令文件(命令文件在解压好的目录中的 src 目录)[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin启动服务# 指定配置文件启动 redis[root@localhost src]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf查看状态# 或者是 netstat -tunpl | grep 6379ps -ef | grep redis三、集群搭建部署创建集群节点文件夹名为 7031-7033 的文件夹置于 10.60.44.76 的机子中,7034-7036 文件夹置于 10.60.44.105 的机子中mkdir -p /usr/local/redis-clustercd /usr/local/redis-cluster# 创建各个节点文件夹mkdir 7031 7032 7033 # IP 为 10.60.44.76 的机子上执行mkdir 7034 7035 7036 # IP 为 10.60.44.105 的机子上执行修改、拷贝配置文件此处以 10.60.44.76 的机子为例,另一台操作一致cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7031cd /usr/local/redis-cluster/7031vi redis.conf 修改配置文件,范本如下port 7031 # 绑定端口bind 本机ip # 物理 ip:如 10.60.44.76 dir /usr/local/redis-cluster/7031 # 指定数据存放路径cluster-enabled yes # 启动集群模式cluster-config-file redis-7031.conf # 指定集群节点配置文件daemonize yes # 后台启动cluster-node-timeout 5000 # 指定集群节点超时时间appendonly yes # 指定持久化方式将 7031 的 redis.conf 改完后再拷贝到剩下的 2 个目录(7032、7033)中,再全局替换 redis.conf 中的 7031 为对应的节点编号(7032、7033)即可。同理得 10.60.44.105 机子移动完后 ip 为 10.60.44.76 的 /usr/local/ 目录结构图如下:(10.60.44.105 同理)[root@localhost local]# cd /usr/local/ && tree -L 3.├── bin…….├── redis│ ├── bin│ │ ├── mkreleasehdr.sh│ │ ├── redis-benchmark│ │ ├── redis-check-aof│ │ ├── redis-check-rdb│ │ ├── redis-cli│ │ ├── redis-sentinel│ │ ├── redis-server│ │ └── redis-trib.rb│ └── etc│ └── redis.conf├── redis-cluster│ ├── 7031│ │ └── redis.conf│ ├── 7032│ │ └── redis.conf│ └── 7033│ └── redis.conf…….└── src安装 Ruby 和启动插件集群的启动需要用到 Ruby 实现的 redis-trib.rb 插件,所以需要先安装 Ruby 环境和其插件,命令如下:# 步骤一:建议不使用 yum 安装。使用网上自己下载源码的形式安装,版本可以稍微新一点yum install ruby# 步骤二:一般不会出错yum install rubygems# 步骤三:容易出错,下面有常见解决方案gem install redis此步骤需要很多环境,容易出错,附上常见错误解决方法:错误一:no such file to load – zlib进入 ruby 源码文件夹并安装 ruby 自身提供的 zlib 包[root@localhost ruby-2.3.3]# cd ext/zlib[root@localhost zlib]# ruby ./extconf.rb[root@localhost zlib]# make[root@localhost zlib]# make install错误二:–with-openssl-include=/usr/local/ssl/include/ –with-openssl-lib=/usr/local/ssl/lib处理方法同错误一:[root@localhost ruby-2.3.3]# cd ext/openssl[root@localhost zlib]# ruby ./extconf.rb[root@localhost zlib]# make[root@localhost zlib]# make install错误三:Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources首先查看一下 $openssl version 是不是安装了 OpenSSL[root@localhost /]# openssl versionOpenSSL 1.0.1e-fips 11 Feb 2013没有,则新安装一个 OpenSSL,具体教程不展开。如果有,则更换 gem 源的地址:# 查看 gem 源[root@localhost /]# gem source# 删除 https 源 [root@localhost /]# gem source -r https://rubygems.org/ to remove# 添加 http 源[root@localhost /]# gem source -a http://rubygems.org/ to read开启集群个节点在两台机子中分别运行下面命令,启动集群中的每个节点 # 10.60.44.76for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done# 10.60.44.105for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done 查看各节点状态查看节点的开启状态ps -ef | grep redis-server结果如下:### 10.60.44.76root 18992 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7031 [cluster] root 18994 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7032 [cluster] root 18998 1 0 04:37 ? 00:00:10 /usr/local/redis/bin/redis-server 10.60.44.76:7033 [cluster] root 41471 16554 0 05:29 pts/2 00:00:00 grep redis-server### 10.60.44.105root 50565 1 0 04:37 ? 00:00:07 /usr/local/redis/bin/redis-server 10.60.44.105:7034 [cluster]root 50567 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7035 [cluster]root 50571 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7036 [cluster]root 51273 34592 0 05:29 pts/1 00:00:00 grep –color=auto redis-server创建集群每个节点正常开启后,在两台机子任意一台上运行:/usr/local/redis/bin/redis-trib.rb create –replicas 1 10.60.44.76:7031 10.60.44.76:7032 10.60.44.76:7033 10.60.44.105:7034 10.60.44.105:7035 10.60.44.105:7036连接集群查看状态登录客户端,并测试读写(记得要加上 -c 选项,不然会报错)# 10.60.44.76/usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 7031cluster info # 显示集群信息显示字段 cluster_state:ok 为正常运行状态,说明集群搭建成功使用 cluster nodes 查看集群各节点的当前状态,可以查看主从节点的分配和连接和情况。如下:10.60.44.76:7031> cluster nodes1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498187489957 11 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498187486928 9 connected 5461-1092237ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 slave 396e92e2e8207be6a4a93e29fd16670656477131 0 1498187488947 9 connected82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498187483893 6 connected1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498187487937 11 connected 0-5460135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 myself,master - 0 0 3 connected 10923-16383关闭集群关闭集群需要将节点逐个关闭,可以使用脚本自动完成:# 10.60.44.76for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 703$i shutdown; done # 10.60.44.105for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.105 -p 703$i shutdown; done 删除集群文件每次新创建集群之前需要将自动生成的配置文件和数据库删除,命令如下:# 10.60.44.76for((i=1;i<=3;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done# 10.60.44.105for((i=4;i<=6;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done四、集群操作当前存在集群节点情况如下:# 7034(主)- 7032(从)# 7035(主)- 7033(从)# 7036(主)- 7031(从)82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498199288536 6 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199282454 9 connected 5461-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199289546 3 connected 10923-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199285499 11 connected 0-546037ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 myself,slave 396e92e2e8207be6a4a93e29fd16670656477131 0 0 1 connected1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498199287523 11 connected增加一个主节点在原有的集群之上添加一个新的主节点,需要开启新的节点,接着将此节点添加进集群中并分配槽,详细如下描述:1. 创建节点需要的相关文件(文件夹、配置文件)[root@localhost /]# mkdir /usr/local/redis-cluster/70372. 拷贝并修改配置文件将配置文件中的 7036 字符串全部替换为 7037,此处不再累述[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7037/3. 启动新创建的节点[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf4. 将新节点添加进已存在集群中成为其中一主节点# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7037 10.60.44.105:7034成功后打印信息如下:>>> Adding node 10.60.44.105:7037 to cluster 10.60.44.105:7034>>> Performing Cluster Check (using node 10.60.44.105:7034)…………… 省略>>> Send CLUSTER MEET to node 10.60.44.105:7037 to make it join the cluster.[OK] New node added correctly.5. 查看添加新节点后的集群节点信息3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498199380639 0 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199384698 9 connected 5461-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199381655 3 connected 10923-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199383685 11 connected 0-54606. 给新节点分配哈希槽[root@localhost /]# /usr/local/redis/bin/redis-trib.rb reshard 10.60.44.105:7037# 分配多少槽点给新节点How many slots do you want to move (from 1 to 16384)? 1000# 哪个是接受节点?(填入新节点的 id)What is the receiving node ID? 3f2c74e5888907c494b8b728210175144657f218Please enter all the source node IDs. Type ‘all’ to use all the nodes as source nodes for the hash slots. Type ‘done’ once you entered all the source nodes IDs.# 从所有主节点中随机选取Source node #1: all7. 查看分配槽后的集群节点信息3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201081749 12 connected 0-332 5461-5794 10923-11255396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498201080733 9 connected 5795-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498201082755 3 connected 11256-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498201078714 11 connected 333-5460增加一个从节点在原有的集群之上为其中一个主节点(7037)添加一个新的从节点(7038),需要开启新的从节点,并将此节点添加进集群中,详细如下描述:1. 创建节点需要的相关文件(文件夹、配置文件)[root@localhost /]# mkdir /usr/local/redis-cluster/70382. 拷贝并修改配置文件将配置文件中的 7036 字符串,全部替换为 7038,此处不再累述[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7038/3. 启动新创建的节点[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf4. 将新节点添加进集群中# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7038 10.60.44.105:7034成功后打印信息如下:>>> Adding node 10.60.44.105:7038 to cluster 10.60.44.105:7034>>> Performing Cluster Check (using node 10.60.44.105:7034)…………… 省略>>> Send CLUSTER MEET to node 10.60.44.105:7038 to make it join the cluster.[OK] New node added correctly.5. 查看添加新节点后的集群节点信息9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 master - 0 1498201399078 0 connected3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255…….6. 将端口为 7038 的节点置为 7037 端口的从节点[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f2187. 查看设置为从节点后的集群节点信息9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 slave 3f2c74e5888907c494b8b728210175144657f218 0 1498201731111 12 connected3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255…….删除一个主节点删除集群中端口为 7037 的主节点,填入集群中集群中任意节点 ip 端口和所要删除节点的 id。(需要先将所拥有的槽分配到其他的主节点)[root@localhost /]# usr/local/redis/bin/redis-trib.rb del-node 10.60.44.105:7034 3f2c74e5888907c494b8b728210175144657f218删除一个从节点同理得主节点五、集群测试模拟 oom(Out Of Meomery)redis-cli debug oom模拟宕机redis-cli debug segfault模拟 hangredis-cli -p 6379 DEBUG sleep 30参考资料:http://www.cnblogs.com/hjwubl…http://blog.csdn.net/cfl20121...http://www.cnblogs.com/wuxl36...http://www.redis.cn/topics/cl...http://wiki.jikexueyuan.com/p… ...

December 28, 2018 · 5 min · jiezi

Redis5.0集群版搭建

上一篇文章已经把单机版的Redis搭建的过程介绍完了,接下来介绍Redis集群版的搭建方法。首先我们回到local目录在这个目录里面创建一个redis-cluster目录:mkdir redis-cluster 接着就是复制6份Redis实例放到这个目录下面(Redis实例就是编译好的单机版的Redis),首先复制一份cp redis/bin redis-cluster/redis01 -r 因为刚才在单机版的Redis中有测试数据,在搭建集群版的时候必须是干净的节点,没有数据。所以要删除这个文件rm -f dump.rdb 然后就需要更改Redis的端口号这里设置从7001-7006六个端口号,使用vim打开redis.conf文件更改里面的端口: 还需要在这个文件中把这一段注释给打开,主要就是让这个Redis支持集群版: 然后就是让这个更改后的Redis版本再在redis-cluster目录下面复制五份: 在另外五个的redis.conf文件中更改端口,具体操作和上部分相同。(更改端口号的时候,在vim中输入/port,然后点击回车键,可以快速定位到这个字段) 这边端口号都已经更改完成。接下来创建一个批处理文件,同时启动着六个Redis。cd redis01./redis-server redis.confcd ..cd redis02./redis-server redis.confcd ..cd redis03./redis-server redis.confcd ..cd redis04./redis-server redis.confcd ..cd redis05./redis-server redis.confcd ..cd redis06./redis-server redis.confcd ..然后执行chmod u+x start-all.sh将start-all.sh变成可执行文件启动六个Redis:chmod u+x start-all.sh查看是否启动成功:ps aux|grep redis六个单机版的Redis已经启动起来了,然后就是将这六个连接起来。因为我们使用的5.0.2的版本的Redis搭建的集群只需要把编译后的redis目录中的这个redis-cli文件拷贝到redis-cluster目录过来即可。(Redis版本5.0以后都是用C语言直接启动)create 的意思是创建集群,1 的意思有一台备份机器。./redis-cli –cluster create 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 127.0.0.1:7006 –cluster-replicas 1搭建成功,下面这个图片主要是讲述了,谁谁谁分配了什么槽,占用了那些节点。终于把集群搭建好了,下面让我们一起进行测试一下。

December 20, 2018 · 1 min · jiezi