Part1Redis6.X集群搭建码哥带你完成CentOS7安装Redis6.x的教程,在学习RedisCluster集群之前,我们需要先搭建集群环境。机器有限,目标是在一台机器上搭建6个节点,组成三主三从的集群模式。1下载解压直接到Redis官网下载最新的稳定包,地址:https://redis.io/download。或者使用命令:sudowgethttp://download.redis.io/releases/redis-6.0.9.tar.gz下载安装包..codege统一将软件包放在/opt/soft目录下,并且创建目录mkdirredisCluster来放置集群配置文件。在redisCluster目录下执行mkdir700070017002700370047005为每个节点创建redis.conf配置模板对应的6个目录。tar-zxfredis-6.0.9.tar.gz-CredisCluster解压到redisCluster目录下。2make编译在编译之前,我们需要确认一下gcc的版本。从redis6.0.0开始,编译redis需要支持C11特性,4.9引入。Centos7默认的gcc版本是4.8.5,所以需要升级gcc版本。编译错误否则在编译过程中会遇到如下错误日志:Infileincludedfromserver.c:31:0:server.c:4999:59:error:'structredisServer'hasnomembernamed'cluster'(server.cluster_enabled&&nodeIsMaster(server.cluster->myself)));^cluster.h:58:27:note:indefinitionofmacro'nodeIsMaster'#definenodeIsMaster(n)((n)->flags&CLUSTER_NODE_MASTER)^server.c:Infunction'main':server.c:5047:11:错误:'structredisServer'hasnomembernamed'sentinel_mode'server.sentinel_mode=checkForSentinelMode(argc,argv);^server.c:5064:15:error:'structredisServer'hasnomembernamed'sentinel_mode'if(server.sentinel_mode){^server.c:5131:19:error:'structredisServer'hasnomembernamed'sentinel_mode'if(server.sentinel_mode&&configfile&&*configfile=='-'){^server.c:5153:168:error:'structredisServer'hasnomembernamed'sentinel_mode'serverLog(LL_WARNING,"瓦尔尼ng:noconfigfilespecified,usingthedefaultconfig.Inordertospecifyaconfigfileuse%s/path/to/%s.conf",argv[0],server.sentinel_mode?"sentinel":"redis");^server.c:5158:11:error:'structredisServer'hasnomembernamed'supervised'server.supervised=redisIsSupervised(server.supervised_mode);^server.c:5158:49:error:'structredisServer'hasnomembernamed'supervised_mode'server.supervised=redisIsSupervised(server.supervised_mode);^server.c:5159:28:error:'structredisServer'hasnomembernamed'daemonize'intbackground=server.daemonize&&!server.supervised;^server.c:5159:49:error:'structredisServer'hasnomembernamed'supervised'intbackground=server.daemonize&&!server。supervised;^server.c:5163:29:error:'structredisServer'hasnomembernamed'pidfile'if(background||server.pidfile)createPidFile();^server.c:5168:16:error:‘structredisServer'hasnomembernamed'sentinel_mode'if(!server.sentinel_mode){^server.c:5178:19:error:'structredisServer'hasnomembernamed'cluster_enabled'if(server.cluster_enabled){^server.c:5186:19:错误:'structredisServer'hasnomembernamed'ipfd_count'if(server.ipfd_count>0||server.tlsfd_count>0)^server.c:5186:44:错误:'structredisServer'hasnomembernamed'tlsfd_count'if(server.ipfd_count>0||server.tlsfd_count>0)^server.c:5188:19:error:'structredisServer'hasnomembernamed'sofd'if(server.sofd>0)^server.c:5189:94:error:'structredisServer'hasnomembernamed'unixsocket'serverLog(LL_NOTICE,"Theserverisnowreadytoacceptconnectionsat%s",server.unixsocket);^server.c:5190:19:error:'structredisServer'hasnomembernamed'supervised_mode'if(server.supervised_mode==SUPERVISED_SYSTEMD){^server.c:5191:24:error:'structredisServer'hasnomembernamed'masterhost'if(!server.masterhost){^server.c:5201:19:error:'structredisServer'hasnomembernamed'supervised_mode'if(server.supervised_mode==SUPERVISED_SYSTEMD){^server.c:5208:15:error:'structredisServer'hasnomembernamed'maxmemory'if(server.maxmemory>0&&server.maxmemory<1024*1024){^server.c:5208:39:error:'structredisServer'hasnomembernamed'maxmemory'if(server.maxmemory>0&&server.maxmemory<1024*1024){^server.c:5209:176:error:'structredisServer'hasnomembernamed'maxmemory'serverLog(LL_WARNING,"警告:您指定了小于1MB的最大内存值(当前值是%llubytes).Areyousurethisiswhatyoureallywant?",server.maxmemory);^server.c:5212:31:error:'structredisServer'hasnomembernamed'server_cpulist'redisSetCpuAffinity(server.server_cpulist);^server.c:Infunction'hasActiveChildProcess':server.c:1480:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]}^server.c:Infunction'allPersistenceDisabled':server.c:1486:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]}^server.c:Infunction'writeCommandsDeniedByDiskError':server.c:3826:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]}^server.c:Infunction'iAmMaster':server.c:5000:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]}^...解决方案yum-yinstallgccgcc-c++makeetclyum-yinstallcentos-release-sclyum-yinstalldevtoolset-9-gccdevtoolset-9-gcc-c++devtoolset-9-binutilssclennabledevtoolset-9Bash升级可以解决make报错问题。注意:scl命令只是暂时启用,退出xshell或重启后会恢复原来的gcc版本。如果想长期生效,执行下面的sudoecho"source/opt/rh/devtoolset-9/enable">>/etc/profile。cd/opt/soft/redisCluster/redis-6.0.9切换到目录,执行make。编译完成后,使用makeinstall安装redis,命令:sudomakeinstall。3修改配置文件cd/opt/soft/redisCluster/redis-6.0.9,将redis.conf分别复制到70007001700270037004目录下。修改6redis.conf##7000-7005portport7000##后台启动daemonizeyes##如果是单机模拟集群,必须指定bind的IP。如果不修改IP,如果使用程序连接集群会报错bind192.168.221.150##打开redis-clusterclustercluster-enabledyes##每个实例还包含文件路径存放本节点配置的,默认是nodes.conf,自动创建cluster-config-filenodes_7000.conf##timeoutcluster-node-timeout500##开启aofappendonlyyes#注意cluster集群下不允许复制。#replicaof127.0.0.19000#关闭保护模式,如果需要设置密码,比较麻烦,可以根据自己的需要使用protected-modeno,只需要修改端口和cluster-config-file对于每个配置文件。4启动节点并创建集群。启动节点进入redisCluster目录,依次执行指令启动各个节点。redis-6.0.9/src/redis-server700x/redis.conf注意指定各个节点的配置文件。如果不指定配置文件,默认使用src下的配置。创建集群并进入任意节点,执行如下命令创建集群命令如下:redis-6.0.9/src/redis-cli--clustercreate172.16.90.152:7000172.16.90.152:7001172.16.90.152:7002172.16.90.152:7003172.16.90.152:7004172.16.90.152:7005--cluster-replicas1集群参数说明:cluster-replicas1:表示要为集群中的每个主节点(一主一从)创建一个从节点。cluster-replicas2:表示要为集群中的每个主节点创建两个从节点(一主二从)。控制台响应:>>>Performinghashslotsallocationon6nodes...Master[0]->Slots0-5460Master[1]->Slots5461-10922Master[2]->Slots10923-16383Addingreplica172.16.90.152:7004to172.16.16.90.15ing16.90.15.152:7005to172.16.90.152:7001Addingreplica172.16.90.152:7003to172.16.90.152:7002>>>Tryingtooptimizeslavesallocationforanti-affinity[WARNING]SomeslavesareinthesamehostastheirmasterM:06c56f5a6a4436108fae931be499465985141d39172.16.90.152:7000slots:[0-5460](5461slots)masterM:0ab7c9efd97319d94a8ea52452ec58f7708d812d172.16.90.152:7001slots:[5461-10922](5462slots)masterM:096f076d99363270c02785a2fb298e2ee65d3f07172.16.90.152:7002slots:[10923-16383](5461slots)masterS:69d621060295eb433af3e34e702142df0fd4d73d172.16.90.152:7003replicates06c56f5a6a4436108fae931be499465985141d39S:1d37df0aa0e2310aedb5a380f95cc818256003f8172.16.90.152:7004replicates0ab7c9efd97319d94a8ea52452ec58f7708d812dS:d9204f6da875a4b2522c5fa25d9e6c1f95cf51ea172.16.90.152:7005replicates096f076d99363270c02785a2fb298e2ee65d3f07CanIsetttheaboveconfiguration?(type'yes'toaccept):我可以设置上面的配置吗?(type'yes'toaccept):询问是否确认节点槽分配方案,我们输入'y??es'>>>Nodesconfigurationupdated>>>Assignadifferentconfigepochtoeachnode>>>SendingCLUSTERMEETmessagestojointheclusterWaitingfortheclustertojoin.>>>PerformingClusterCheck(usingnode172.16.90.152:7000)M:06c56f5a6a4436108fae931be499465985141d39172.16.90.152:7000slots:[0-5460](5461slots)master1additionalreplica(s)S:1d37df0aa0e2310aedb5a380f95cc818256003f8172.16.90.152:7004slots:(0slots)slavereplicates0ab7c9efd97319d94a8ea52452ec58f7708d812dM:0ab7c9efd97319d94a8ea52452ec58f7708d812d172.16.90.152:7001slots:[5461-10922](5462slots)master1additionalreplica(s)S:d9204f6da875a4b2522c5fa25d9e6c1f95cf51ea172.16.90.152:7005slots:(0slots)slavereplicates096f076d99363270c02785a2fb298e2ee65d3f07S:69d621060295eb433af3e34e702142df0fd4d73d172.16.90.152:7003slots:(0slots)slavereplicates06c56f5a6a4436108fae931be499465985141d39M:096f076d99363270c02785a2fb298e2ee65d3f07172.16.90.152:7002slots:[10923-16383](5461slots)master1additionalreplica(s)[OK]Allnodesagreeaboutslotsconfiguration。>>>Checkforopenslots...>>>Checkslotscoverage...[OK]All16384slotscovered。[OK]覆盖所有16384个插槽。这是完整的!5查看集群状态redis-6.0.9/src/redis-cli--clustercheck172.16.90.152:70006使用redis-6.0.9/src/redis-cli--clustercreate172.16.90.152:7000172.16的注意事项。90.152:7001172.16.90.152:7002172.152.97003172.16.90.152:7004172.16.90.152:7005--cluster-replicas1集群创建完成后,创建一次,永久使用后,直接启动各个节点构建簇。结束命令:redis-6.0.9/src/redis-cli-c-h192.168.124.23-p7004shutdown输入集群命令redis-cli-c-hhost-pprot不带-c参数,集群不搭建好集群后,期待下一篇《Redis高可用:Cluster能支持多少数据?》
