redis常用架构主从一主多从主从读写分离 daemonizenodocker要求容器内至少有一条前台进程,故不能设置为守护进程从节点设置主节点ipreplicaofmasteripmasterportversion:3services:master:image:rediscontainername:redismastercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredismasterfollowermasterconf:etcredisusrlocaletcdockercomposeredismasterfollowermasterdata:datausrlocaletcdockercomposeredismasterfollowermasterlog:logports:6380:6379networks:redisNet:ipv4address:192。168。88。80follower:image:rediscontainername:redisfollowercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredismasterfollowerfollowerconf:etcredisusrlocaletcdockercomposeredismasterfollowerfollowerdata:datausrlocaletcdockercomposeredismasterfollowerfollowerlog:logports:6381:6379networks:redisNet:ipv4address:192。168。88。81networks:redisNet:external:true sentinel哨兵保证高可用,解决主节点宕机后无法写入的问题主节点挂掉后哨兵会发布sdown(主观宕机),当sdown数量达到预设值时即为odown(客观宕机)一般配置成半数sdown即odown,所以sentinel架构最小单位应为1主2从3哨兵哨兵启动成功后写入myid设置哨兵监控的主服务器和odown数(sdown数累计达到odown即开启故障转移主从切换)sentinelmonitormymaster192。168。11。12863792x秒不回应即单sentinel判定为sdownsentineldownaftermilliseconds单次故障转移最长时间,超过则认定为故障转移失败sentinelfailovertimeoutmymaster10000当发生failover主备切换时最多可以有多少个slave同时对新的master同步,数字越小favilover越快。通常设为1sentinelparallelsyncsmasternamenumslaves哨兵启动后自动写入的唯一id,每个sentinel不一样,故不能用同一份配置文件sentinelmyid这里哨兵容器应该等待redis容器先启动,使用dependson控制version:3services:master:image:rediscontainername:redismastercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredissentinelmasterconf:etcredisusrlocaletcdockercomposeredissentinelmasterdata:datausrlocaletcdockercomposeredissentinelmasterlog:logports:6380:6379networks:redisNet:ipv4address:192。168。88。80follower1:image:rediscontainername:redisfollower1command:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredissentinelfollower1conf:etcredisusrlocaletcdockercomposeredissentinelfollower1data:datausrlocaletcdockercomposeredissentinelfollower1log:logports:6381:6379networks:redisNet:ipv4address:192。168。88。81follower2:image:rediscontainername:redisfollower2command:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredissentinelfollower2conf:etcredisusrlocaletcdockercomposeredissentinelfollower2data:datausrlocaletcdockercomposeredissentinelfollower2log:logports:6382:6379networks:redisNet:ipv4address:192。168。88。82sentinel1:image:redisdependson:masterfollower1follower2containername:redissentinel1command:binbashcredissentineletcredisredissentinel。confvolumes:usrlocaletcdockercomposeredissentinelsentinelsentinel1:etcredisusrlocaletcdockercomposeredissentinelsentinelsentinel1data:datausrlocaletcdockercomposeredissentinelsentinelsentinel1log:logports:26379:26379networks:redisNet:ipv4address:192。168。88。83sentinel2:image:redisdependson:masterfollower1follower2containername:redissentinel2command:binbashcredissentineletcredisredissentinel。confvolumes:usrlocaletcdockercomposeredissentinelsentinelsentinel2:etcredisusrlocaletcdockercomposeredissentinelsentinelsentinel2data:datausrlocaletcdockercomposeredissentinelsentinelsentinel2log:logports:26380:26379networks:redisNet:ipv4address:192。168。88。84sentinel3:image:redisdependson:masterfollower1follower2containername:redissentinel3command:binbashcredissentineletcredisredissentinel。confvolumes:usrlocaletcdockercomposeredissentinelsentinelsentinel3:etcredisusrlocaletcdockercomposeredissentinelsentinelsentinel3data:datausrlocaletcdockercomposeredissentinelsentinelsentinel3log:logports:26381:26379networks:redisNet:ipv4address:192。168。88。85networks:redisNet:external:truerediscluterredis5。0之后可以直接使用rediscli创建集群,不再需要ruby。redis会将slot平均分配给master。所有数据操作都会通过CRC16(key)mod16384得到的值决定此次操作所在分区。clusterclusterenabledyes开启集群模式clusternodetimeout:连接超时时间clusterannounceip:集群各节点IP地址(以下不配置也行,redis会自动搜索)clusterannounceport:集群节点映射端口clusterannouncebusport:集群总线端口clusterrequirefullcoveragenorediscluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。因此生产环境一般为noversion:3services:master1:image:rediscontainername:rediscluster1mastercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster1master:etcredisusrlocaletcdockercomposeredisclustercluster1master:datausrlocaletcdockercomposeredisclustercluster1master:logports:6379:6379networks:redisNet:ipv4address:192。168。88。80follow1:image:rediscontainername:rediscluster1followercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster1follower:etcredisusrlocaletcdockercomposeredisclustercluster1follower:datausrlocaletcdockercomposeredisclustercluster1follower:logports:6380:6379networks:redisNet:ipv4address:192。168。88。81master2:image:rediscontainername:rediscluster2mastercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster2master:etcredisusrlocaletcdockercomposeredisclustercluster2master:datausrlocaletcdockercomposeredisclustercluster2master:logports:6381:6379networks:redisNet:ipv4address:192。168。88。82follow2:image:rediscontainername:rediscluster2followercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster2follower:etcredisusrlocaletcdockercomposeredisclustercluster2follower:datausrlocaletcdockercomposeredisclustercluster2follower:logports:6382:6379networks:redisNet:ipv4address:192。168。88。83master3:image:rediscontainername:rediscluster3mastercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster3master:etcredisusrlocaletcdockercomposeredisclustercluster3master:datausrlocaletcdockercomposeredisclustercluster3master:logports:6383:6379networks:redisNet:ipv4address:192。168。88。84follow3:image:rediscontainername:rediscluster3followercommand:binbashcredisserveretcredisredis。confvolumes:usrlocaletcdockercomposeredisclustercluster3follower:etcredisusrlocaletcdockercomposeredisclustercluster3follower:datausrlocaletcdockercomposeredisclustercluster3follower:logports:6384:6379networks:redisNet:ipv4address:192。168。88。85networks:redisNet:external:true这里yml中的masterfollower没有实际意义,具体的主从分配是redis决定的。dockercompose成功启动六个redis容器之后,进入任意一个,配置rediscluster集群。编排容器dockercomposeupd进入容器dockerexecitcontaineridbinbash配置redis集群,每个master一个followerrediscliclustercreate192。168。88。80:6379192。168。88。81:6379192。168。88。82:6379192。168。88。83:6379192。168。88。84:6379192。168。88。85:6379clusterreplicas1 如图,16384个slot平均分配给三台master。绑定关系为 83replicaof82 85replicaof81 84replicaof80