之前已经熟悉redis的下载、安装和使用了。今天就部署一个redis集群(cluster),简单体验一下redis集群的高可用特性。环境准备Redis是用C语言开发的。安装Redis需要先编译Redis的源码。编译依赖gcc环境安装gcc-c++yuminstallgcc-c++查看版本[root@---redis]#gcc-vUsingbuilt-inspecs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapperTarget:x86_64-redhat-linuxConfiguredwith:../configure--prefix=/usr--mandir=/usr/share/man--infodir=/usr/share/info--with-bugurl=http://bugzilla.redhat.com/bugzilla--enable-bootstrap--enable-shared--enable-threads=posix--enable-checking=release--with-system-zlib--enable-__cxa_atexit--disable-libunwind-exceptions--enable-gnu-unique-object--enable-linker-build-id--with-linker-hash-style=gnu--enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto--enable-plugin--enable-initfini-array--disable-libgcj--with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install--with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install--enable-gnu-indirect-功能--与-tune=generic--with-arch_32=x86-64--build=x86_64-redhat-linuxThreadmodel:posixgccversion4.8.520150623(RedHat4.8.5-44)(GCC)[root@---redis]#Redis的四种模式单机模式master+slave(主从)sentinel(哨兵)cluster(集群)创建redis网卡[root@---~]#dockernetworkcreateredis--subnet172.38.0.0/160350d84612bef09bc32b39f15ac6b608dae17cbd75d04b282c0bd37c0283bb7c[root@iZm5e23n3ueobwkjtfartxZ~]#dockernetworklsNETWORKIDNAMEDRIVERSCOPEfeafa30d4051bridgebridgelocale8bf4fced9e2hosthostlocal0096a971fd2cmynetbridgelocal6263db0933b9nonenulllocal0350d84612beredisbridgelocal799426d70aa2test-networkbridgelocal[root@---~]#创建6个redis服务通过编写脚本创建6个redisservicecluster-enabled:whethertostartthecluster,value:yes,nocluster-config-fileconfigurationfile.conf:specifynodeinformation,automaticallygeneratecluster-node-timeoutmillisecondvalue:configurenodeconnectiontimeoutappendonly:whethertoenablepersistence,Selectedvalue:yes,nodaemonize:Daemonprocessstartup(backgroundstartup)Createascriptfilecreate_redis_script.shtouchcreate_inthe/vardirectoryredis_script.sh写入脚本内容vimcreate_redis_script.sh,在$(seq16)中为端口写入如下内容;\do\mkdir-p/var/redisNode/node-${port}/conftouch/var/redisNode/node-${port}/conf/redis.confcat</var/redisNode/node-${port}/conf/redis.confport6379bind0.0.0.0cluster-enabledyescluster-config-filenodes.confcluster-node-timeout5000cluster-announce-ip172.38.0.1${port}cluster-announce-port6379cluster-announce-bus-port16379appendonlyyes#daemonizeyesEOFdone查看脚本文件catcreate_redis_script.sh赋予create_redis_script.sh文件可执行权限[root@---~]#chmodo+xcreate_redis_script.sh执行脚本,创建redis服务./create_redis_script.sh查看redisnode[root@---redisNode]#pwd/var/redisNode[root@---redisNode]#lsnode-1node-2node-3node-4node-5node-6[root@---redisNode]#查看redis.conf配置文件startredisservice-vmountdatavolumeredis:5.0.9-alpine3.11Redis镜像6379为redis端口:映射云服务器端口6371-637616379为redis集群TCP端口:映射云服务器端口16371-16376--netUseacustomredisnetwork--ip是绑定到这个容器的ip:172.38.0.11-16--name容器名称:redis-1-6redis-server/etc/redis/redis.conf添加命令,通过redis.conf启动启动方式一(不推荐):逐个启动第一个redis节点dockerrun-p6371:6379-p16371:16379--名称redis-1\-v/var/redisNode/node-1/data:/data\-v/var/redisNode/node-1/conf/redis.conf:/etc/redis/redis.conf\-d--netredis--ip172.38.0.11redis:5.0.9-alpine3.11redis-server/etc/redis/redis.conf同上,ip、port、name递增,其他5个redis节点也一样启动麻烦,可以通过写脚本的方式一次启动6个服务启动方式二(推荐):写一个启动脚本,启动所有6个创建start_redis_script.sh文件touchstart_redis_script.sh写脚本内容vimstart_redis_script.sh,为端口写如下内容在$(seq16);\do\echo${port}dockerrun-p637${port}:6379-p1637${port}:16379--nameredis-${port}\-v/var/redisNode/node-${port}/data:/data\-v/var/redisNode/node-${port}/conf/redis.conf:/etc/redis/redis.conf\-d--netredis--ip172.38.0.1${端口}redis:5.0.9-alpine3.11redis-server/etc/redis/redis.conf;\done赋予start_redis_script.sh文件可执行权限[root@---~]#chmodo+xstart_redis_script.sh执行脚本,启动redis容器服务。/start_redis_script.sh查看redis容器[root@---var]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES0d3c18b61098redis:5.0.9-alpine3.11"docker-entrypoint.s..."2秒前Up1秒0.0.0.0:6376->6379/tcp,0.0.0.0:16376->16379/tcpredis-6ee896fb093daredis:5.0.9-alpine3.11"docker-entrypoint.s..."13秒前Up12秒0.0.0.0:6375->6379/tcp,0.0.0.0:16375->16379/tcpredis-5a83bb7b16dffredis:5.0.9-alpine3.11"docker-entrypoint.s..."48秒前向上47秒0.0.0.0:6374->6379/tcp,0.0.0.0:16374->16379/tcpredis-4ffe4c9619bedredis:5.0.9-alpine3.11"docker-entrypoint.s..."58秒前上升57秒0.0.0.0:6373->6379/tcp,0.0.0.0:16373->16379/tcpredis-3a316a31e273fredis:5.0.9-alpine3.11"docker-entrypoint.s..."大约一分钟前Up大约一分钟0.0.0.0:6372->6379/tcp,0.0.0.0:16372->16379/tcpredis-271c072f57c29redis:5.0.9-alpine3.11"docker-entrypoint.s…"9分钟前Up9分钟0.0.0.0:6371->6379/tcp,0.0.0.0:16371->16379/tcpredis-1[root@---var]#创建集群,进入任意Redisinstance进入redis-1容器dockerexec-itredis-1/bin/sh创建集群master节点RedisCluster最低要求3个master节点--cluster-replicas参数为数字,1表示每个master节点需要1个从节点#redis-1容器/数据#redis-cli--clustercreate172.38.0.11:6379172.38.0.12:6379172.38.0.13:6379172.38.0.14:6379172.38.0.15:6379172.38.0.16:63791--集群副本测试连接集群连接cluster-c#redis-1container/data#redis-cli-c127.0.0.1:6379>查看集群信息clusterinfo127.0.0.1:6379>clusterinfocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_nodester_known:0clu:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:292cluster_stats_messages_pong_sent:307cluster_stats_messages_sent:599cluster_stats_messages_ping_received:302cluster_stats_messages_pong_received:292cluster_stats_messages_meet_received:5cluster_stats_messages_received:599127.0.0.1:6379>查看节点信息clusternodes127.0.0.1:6379>clusternodesb3f737d0d77b823794087011f1501fd43a2ea316172.38.0.12:6379@16379master-016333324525602连接5461-10922506ff2bf1020d468e7d7a81ddbfb616a7e9b7d96172.38.0.13:6379@16379master-016333324530003connected10923-163837f57f8a01493fa9e46e24ad8a9e46995634f7442172.38.0.15:6379@16379slave70ebdca0264c079bb2c33452e6388d37706da282016333324530005connected70ebdca0264c079bb2c33452e6388d37706da282172.38.0.11:6379@16379myself,master-016333324520001connected0-5460f839b6924977e99d3b74324f2ef70b3678e1a257172.38.0.14:6379@16379slave506ff2bf1020d468e7d7a81ddbfb616a7e9b7d96016333324537624connectedbbc4dd0639b90e9ddfb5cef278be04a24276cbdb172.38.0.16:6379@16379slaveb3f737d0d77b823794087011f1501fd43a2ea316016333324530006connected127.0.0.1:6379>测试主从节点替换验证高可用set一个值,然后停掉对应的服务,再次get,验证是否Youcangetthevaluesetvalue127.0.0.1:6379>setab->Redirectedtoslot[15495]locatedat172.38.0.13:6379OK172.38.0.13:6379>foundthatavalueissetonthe172.38.0.13container,andthenweTrytostoptheserviceoftheredis-3container,thengetitagain,lookattheresultgetvalue172.38.0.13:6379>geta"b"172.38.0.13:6379>stoptheredisserviceintheredis-3containerdockerstopredis-3takesvalueagain172.38.0.13:6379>getaCouldnotconnecttoRedisat172.38.0.13:6379:Hostisunreachable(34.04s)notconnected>exit#Reconnectcluster/data#redis-cli-c127.0.0.1:6379>geta->Redirectedtoslot[15495]位于at172.38.0.14:6379"b"172.38.0.14:6379>发现a的值存放在172.38.0.14机器上,172.38.0.14是172.38.0.13的从节点。当master节点172.38.0.13出现故障时,会自动替换为172.38.0.13,这是高可用查看redis节点服务信息,发现172.38.0.13节点出现故障,172.38.0.14成为masterdocker,搭建redis集群完成小技术,对技术和产品兴趣广泛浓厚,等待创业机会本号主要致力于分享个人经验总结,希望能给小部分人一些小小的帮助。希望与大家一起营造良好的学习氛围,为个人和家庭,为我国的物联网技术、数字化转型、数字经济发展尽一份微薄之力。数风流人物还是看中国,看当下,看你我。