侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

redis集群配置+配置哨兵做故障转移

2024-02-21 星期三 / 0 评论 / 0 点赞 / 32 阅读 / 18929 字

redis哨兵配置环境和说明:win10上配置伪分布集群redis版本:Redis-x64-3.0.5031,创建6个文件夹 20001--20006 每个文件夹里添加配置文件 redis.conf2

redis哨兵配置

环境和说明:win10上配置伪分布集群redis版本:Redis-x64-3.0.503

1,创建6个文件夹 20001--20006 每个文件夹里添加配置文件 redis.conf2,配置每个节点下的redis.conf文件daemonize yesport 20001dir "/var/redis/20001"pidfile "/var/redis/20001/redis.pid"logfile "/var/redis/20001/redis.log"#protected-mode no cluster-enabled yes注意:redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:	1、关闭protected-mode模式,此时外部网络可以直接访问	2、开启protected-mode保护模式,需配置bind ip或者设置访问密码我们当前用的数据库是3.0.503版本 ,没有这个属性。3,编写启动脚本 start-redis-cluster.bat[@echo](https://my.oschina.net/echolee1987) offd:cd development/redis/var/redisecho Starting redis port 20001...start ../../Redis-x64-3.0.503/redis-server.exe 20001/redis.confecho Starting redis port 20002...start ../../Redis-x64-3.0.503/redis-server.exe 20002/redis.confecho Starting redis port 20003...start ../../Redis-x64-3.0.503/redis-server.exe 20003/redis.confecho Starting redis port 20004...start ../../Redis-x64-3.0.503/redis-server.exe 20004/redis.confecho Starting redis port 20005...start ../../Redis-x64-3.0.503/redis-server.exe 20005/redis.confecho Starting redis port 20006...start ../../Redis-x64-3.0.503/redis-server.exe 20006/redis.confexit每个节点启动后都会输出类似下面的内容:No cluster configuration found, I'm 29dc490500ab4ee655d0c06c0adf752da631e821其中29dc490500ab4ee655d0c06c0adf752da631e821表示该节点的运行ID,运行ID是节点在集群中的唯一标识,同一个运行ID,可能地址和端口是不同的。启动后,可以使用redis命令行客户端连接任意一个节点使用info命令来判断集群是否正常启用了:D:/development/redis/Redis-x64-3.0.503>redis-cli.exe -p 20001 info cluster# Clustercluster_enabled:1其中cluster_enabled为1表示集群正常启用了。现在每个节点都是完全独立的,要将它们加入同一个集群里还需要几个步骤。redis源代码中提供了一个辅助工具redis-trib.rb可以非常方便地完成这一任务。因为redis-trib.rb是用ruby语言编写的,所以运行前需要在服务器上安装ruby程序。redis-trib.rb依赖于gem包redis,可以执行gem install redis来安装,该命令要求ruby版本在2.2.2及以上,否则报错:(windows环境参考:https://blog.csdn.net/weixin_42858906/article/details/83449194)使用redis-trib.rb来初始化集群,只需要执行:./redis-trib.rb create --replicas 1 127.0.0.1:20001 127.0.0.1:20002 127.0.0.1:20003 127.0.0.1:20004 127.0.0.1:20005 127.0.0.1:20006日志如下:>>> Creating clusterConnecting to node 127.0.0.1:20001: OKConnecting to node 127.0.0.1:20002: OKConnecting to node 127.0.0.1:20003: OKConnecting to node 127.0.0.1:20004: OKConnecting to node 127.0.0.1:20005: OKConnecting to node 127.0.0.1:20006: OK>>> Performing hash slots allocation on 6 nodes... 然后redis-trib.rb会分配主从库节点,分配的原则是尽量保证每个主库运行在不同的IP地址上,同时每个从库和主库均不运行在同一IP地址上,以保证系统的容灾能力。分配结果如下:Using 3 masters:127.0.0.1:20001127.0.0.1:20002127.0.0.1:20003Adding replica 127.0.0.1:20004 to 127.0.0.1:20001Adding replica 127.0.0.1:20005 to 127.0.0.1:20002Adding replica 127.0.0.1:20006 to 127.0.0.1:20003M: 44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001   slots:0-5460 (5461 slots) masterM: 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002   slots:5461-10922 (5462 slots) masterM: f11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003   slots:10923-16383 (5461 slots) masterS: 1c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004   replicates 44b351698dcba8461bc31acb1f60291e4fa38a87S: e553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005   replicates 1b22d0282a8f44b3c8399cb6ade63624fcbdcffbS: bf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006   replicates f11742cc0584f7bc37325149014e842b3e937c1a内容包括集群具体的分配方案,如果觉得没问题则输入yes来开始创建,接下来的输出如下:Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join....>>> Performing Cluster Check (using node 127.0.0.1:20001)M: 44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001   slots:0-5460 (5461 slots) masterM: 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002   slots:5461-10922 (5462 slots) masterM: f11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003   slots:10923-16383 (5461 slots) masterM: 1c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004   slots: (0 slots) master   replicates 44b351698dcba8461bc31acb1f60291e4fa38a87M: e553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005   slots: (0 slots) master   replicates 1b22d0282a8f44b3c8399cb6ade63624fcbdcffbM: bf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006   slots: (0 slots) master   replicates f11742cc0584f7bc37325149014e842b3e937c1a[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.PS D:/development/redis/cluster> 此时整个集群的过程即创建完成 使用redis命令行客户端连接任意一个节点执行cluster nodes可以获得集群中的所有节点信息,如在20001执行: PS D:/development/redis/Redis-x64-3.0.503> ./redis-cli.exe -p 20001 cluster nodes1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002 master - 0 1569469376219 2 connected 5461-1092244b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001 myself,master - 0 0 1 connected 0-54601c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004 slave 44b351698dcba8461bc31acb1f60291e4fa38a87 0 1569469373019 4 connectede553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005 slave 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 0 1569469374087 5 connectedbf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006 slave f11742cc0584f7bc37325149014e842b3e937c1a 0 1569469377301 6 connectedf11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003 master - 0 1569469375155 3 connected 10923-16383PS D:/development/redis/Redis-x64-3.0.503>二、增加节点  redis是使用cluster meet命令来使每个节点认识集群中的其它节点的,可想而知如果想要向集群中加入新的节点,也需要使用cluster meet命令实现。加入新节点非常简单,只需要向新节点(以下记作A)发送如下命令即可:  cluster meet ip port   ip和port是集群中任意一个节点(主从均可)的地址和端口号,A接收到客户端发来的命令后,会与该地址和端口号的节点B进行握手,使B将A认作当前集群中的一员。B与A握手成功后,B会使用Gossip协议将节点A的信息通知给集群中的每一个节点。通过这一方式,即使集群中有多个节点,也只需要选择meet其中任意一个节点,即可使新节点最终加入整个集群。1.启动20007、20008两个redis实例,目录与配置文件和其它节点类似(我又写了一个脚本:start-redis-cluster-addNodes.bat)  ../../Redis-x64-3.0.503/redis-server.exe 20007/redis.conf  ../../Redis-x64-3.0.503/redis-server.exe 20008/redis.conf 或者: 	[@echo](https://my.oschina.net/echolee1987) off	d:	cd development/redis/var/redis	echo Starting redis port 20007...	start ../../Redis-x64-3.0.503/redis-server.exe 20007/redis.conf	echo Starting redis port 20008...	start ../../Redis-x64-3.0.503/redis-server.exe 20008/redis.conf	exit 2. 将新节点加入集群	redis-cli -p 20007 cluster meet 127.0.0.1 20006	redis-cli -p 20008 cluster meet 127.0.0.1 20006	提示:	D:/development/redis/Redis-x64-3.0.503>redis-cli.exe -p 20007 cluster meet 127.0.0.1 20006	OK	 执行: 	 ./redis-cli.exe -p 20001 cluster nodes 	 发现新节点已经添加到集群中去了。都是master	 PS D:/development/redis/Redis-x64-3.0.503> ./redis-cli.exe -p 20001 cluster nodes                                       1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002 master - 0 1569470759092 2 connected 5461-10922	37dbcdbe17a45418a5753e21e35f8d6505a22647 127.0.0.1:20007 master - 0 1569470760216 0 connected	44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001 myself,master - 0 0 1 connected 0-5460	1c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004 slave 44b351698dcba8461bc31acb1f60291e4fa38a87 0 1569470761211 4 connected	e553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005 slave 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 0 1569470755886 5 connected	bf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006 slave f11742cc0584f7bc37325149014e842b3e937c1a 0 1569470760116 6 connected	6644823a1ad17cb75c5c3866caa2262f7b702045 127.0.0.1:20008 master - 0 1569470759096 0 connected	f11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003 master - 0 1569470758016 3 connected 10923-16383

三、分配插槽新的节点加入集群后有两种选择,要么使用cluster replicate命令复制每个主库来以从库的形式运行,要么向集群申请分配插槽(slot)来以主库的形式运行。

	可以通过命令cluster slots来查看插槽的分配情况:	redis-cli -p 20001 cluster slots	./redis-trib.rb create --replicas 1 127.0.0.1:20007 127.0.0.1:20008	PS D:/development/redis/cluster> ./redis-trib.rb create --replicas 1 127.0.0.1:20007 127.0.0.1:20008                    >>> Creating cluster	Connecting to node 127.0.0.1:20007: OK	[ERR] Node 127.0.0.1:20007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.	报错:添加节点时候遇到一个问题,提示新增的Node不为空:	换个方法:   其中第一种情况使用cluster addslots命令来实现	PS D:/development/redis/Redis-x64-3.0.503> ./redis-cli.exe -p 20007 cluster addslots 100 101                            (error) ERR Slot 100 is already busy	还原插槽0(不重要,是练习)	../Redis-x64-3.0.503/redis-cli.exe -p 20001 cluster setslot 0 node 44b351698dcba8461bc31acb1f60291e4fa38a87            	参考资料:https://blog.csdn.net/wzy0623/article/details/82706614	redis 集群的具体使用:	使用redis desktop manager 客户端,随便登陆一个节点,然后set username admin 返回	20001:0>set username admin	MOVED 14315 127.0.0.1:20003	实际上,当客户端向集群中的任意一个节点发送命令后,该节点会判断相应的键是否在当前节点中,如果键在该节点中,则会像单机实例一样正常处理该命令;如果键不在该节点中,就会返回一个MOVE重定向请求,告诉客户端这个键目前由哪个节点负责,然后客户端再将同样的请求向目标节点重新发送一次以获得结果。

        一些语言的redis库支持代理MOVE请求,所以对于开发者而言命令重定向的过程是透明的,使用集群与使用单机实例没有什么不同。然而有些语言 的redis库并不支持集群,这时就需要在客户端编码处理了。

        还是以上面的集群配置为例,键foo实际应该由20003负责,通过尝试在20001节点执行与键username相关的命令,就会有上面输出:

	返回的是一个MOVE重定向请求,12182表示foo所属的插槽号,127.0.0.1:20003则是负责该插槽的节点地址和端口,客户端收到重定向请求后,应该将命令重定向20003节点发送一次:	 redis命令行客户端提供了集群模式来支持自动重定向,使用-c参数来启用:	 redis-cli -c -p 20001	 注意:Java 的redis的客户端Jedis 支持Cluster	 参考资料:	 https://www.jianshu.com/p/51361558ba5a

哨兵配置开始

windows 版本redis 参考https://blog.csdn.net/weixin_41846320/article/details/83753182

1,新建文件夹 D:/development/redis/Sentinel/Sentinel200012,编写配置文件:sentinel.conf

port 20011daemonize yeslogfile "D:/development/redis/Sentinel/Sentinel20001/sentinel.log"dir "D:/development/redis/Sentinel/Sentinel20001"sentinel monitor master1 127.0.0.1 20001 1sentinel down-after-milliseconds master1 5000sentinel failover-timeout master1 9000#sentinel auth-pass master1 redispass

Generated by CONFIG REWRITE

sentinel config-epoch master1 0sentinel leader-epoch master1 0sentinel known-slave master1 127.0.0.1 20004sentinel current-epoch 0

启动哨兵./redis-server.exe D:/development/redis/Sentinel/Sentinel20001/sentinel.conf --sentinel

[10996] 26 Sep 15:08:38.351 # Windows does not support daemonize. Start Redis as service.
.-__ ''-._ _.- . . ''-._ Redis 3.0.503 (00000000/0) 64 bit.- .-```. ```// _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.-.|'_.-'| Port: 20011 | -. ._ / _.-' | PID: 10996 -._ -._ -./ .-' .-'
|-._-.
-.__.-' _.-'_.-'| | -.
-._ _.-'_.-' | http://redis.io -._ -._-..-'.-' .-'
|-._-.
-.__.-' _.-'_.-'| | -.
-._ _.-'_.-' | -._ -._-.
.-'_.-' _.-'
-._ -..-' _.-'
-._ _.-' -.
.-'

[10996] 26 Sep 15:08:38.358 # Sentinel runid is d996eefccc1eb6fb55a00a301ba9e74636d08227[10996] 26 Sep 15:08:38.358 # +monitor master master1 127.0.0.1 20001 quorum 1[10996] 26 Sep 15:08:38.360 * +slave slave 127.0.0.1:20004 127.0.0.1 20004 @ master1 127.0.0.1 20001

查看sentinel的状态登陆:redis-cli.exe -p 20011 注意:端口是哨兵的端口执行命令:info sentinel

显示:

127.0.0.1:20011> info sentinel

Sentinel

sentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0master0:name=master1,status=ok,address=127.0.0.1:20001,slaves=1,sentinels=1

一个监控master 20001的哨兵就做好了

测试哨兵的故障转移功能(redis主从自动failover测试)1,查看redis服务器状态C:/Users/15701>redis-cli.exe -p 20001 cluster nodes1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002 master - 0 1569482177343 8 connected 0 5461-1092237dbcdbe17a45418a5753e21e35f8d6505a22647 127.0.0.1:20007 master - 0 1569482174325 7 connected44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001 myself,master - 0 0 1 connected 1-54601c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004 slave 44b351698dcba8461bc31acb1f60291e4fa38a87 0 1569482176336 4 connectede553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005 slave 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 0 1569482180362 8 connectedbf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006 slave f11742cc0584f7bc37325149014e842b3e937c1a 0 1569482179356 6 connected6644823a1ad17cb75c5c3866caa2262f7b702045 127.0.0.1:20008 master - 0 1569482175329 0 connectedf11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003 master - 0 1569482178348 3 connected 10923-163832、停止master服务器(20001端口的master)C:/Users/15701>redis-cli.exe -p 20001 shutdown3、查看剩余服务器的状态C:/Users/15701>redis-cli.exe -p 20003 cluster nodes 因为20001挂了,联不上,所以连接20001.如果1master 2个slave 主从就切换了。但是因为我们是一主一从,所以slave变成了master。但是master挂了。就只有一个master了。只有等down掉的master 再次启动,然后它会变成新master的slave.看日志:C:/Users/15701>redis-cli.exe -p 20003 cluster nodes44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001 master,fail - 1569482542471 1569482537038 1 connected1c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004 master - 0 1569482615524 9 connected 1-54601b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002 master - 0 1569482617036 8 connected 0 5461-10922bf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006 slave f11742cc0584f7bc37325149014e842b3e937c1a 0 1569482616532 6 connectede553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005 slave 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 0 1569482614519 8 connected37dbcdbe17a45418a5753e21e35f8d6505a22647 127.0.0.1:20007 master - 0 1569482613514 7 connectedf11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003 myself,master - 0 0 3 connected 10923-163836644823a1ad17cb75c5c3866caa2262f7b702045 127.0.0.1:20008 master - 0 1569482617539 0 connected下面两条日志,说明分析正确。127.0.0.1:20001 master,fail 127.0.0.1:20004 master - 0 1569482615524 9 connected 1-5460重启20001D:/development/redis/var/redis>redis-server.exe 20001/redis.conf查看剩余服务器的状态redis-cli.exe -p 20003 cluster nodes日志如下:C:/Users/15701>redis-cli.exe -p 20003 cluster nodes44b351698dcba8461bc31acb1f60291e4fa38a87 127.0.0.1:20001 slave 1c7956e83de119c1c550c5330b66a513ddc6f275 0 1569482993912 9 connected1c7956e83de119c1c550c5330b66a513ddc6f275 127.0.0.1:20004 master - 0 1569482996930 9 connected 1-54601b22d0282a8f44b3c8399cb6ade63624fcbdcffb 127.0.0.1:20002 master - 0 1569482990895 8 connected 0 5461-10922bf44575716df02b9511f86dc5cbf3abe717a2f67 127.0.0.1:20006 slave f11742cc0584f7bc37325149014e842b3e937c1a 0 1569482992907 6 connectede553f73b24e8e49c333889cd9fb574732e803512 127.0.0.1:20005 slave 1b22d0282a8f44b3c8399cb6ade63624fcbdcffb 0 1569482996427 8 connected37dbcdbe17a45418a5753e21e35f8d6505a22647 127.0.0.1:20007 master - 0 1569482994918 7 connectedf11742cc0584f7bc37325149014e842b3e937c1a 127.0.0.1:20003 myself,master - 0 0 3 connected 10923-163836644823a1ad17cb75c5c3866caa2262f7b702045 127.0.0.1:20008 master - 0 1569482995926 0 connected下面两条日志,说明分析又正确了 主从切换了。 127.0.0.1:20001 slave  127.0.0.1:20004 master 总结: 1主1从不合理,没法故障切换,1主2从 可以实现故障切换。切换应该发生在3个节点上。 如果是真实服务器环境(这次是为分布式)哨兵所在机器宕机怎么办?下回分解把

广告 广告

评论区