二十一Redis集群

Redis 的集群
Redis 的复制特性,以及 Redis Sentinel 和 twemproxy 这两个程
序,其中:
    复制特性可以创建指定服务器的复制品,这些复制品可以用于扩展系统处理读请求的能力
    Redis Sentinel 可以在复制特性的基础上,通过监视主从服务器并在主服务器故障时执行自动故 障转移来保证系统的可用性
    twemproxy 使用分片策略来将数据 库划分到多个不同的服 务器,以此来扩展系统储存的数据量, 并通过将命令请求分散给不同的服务器来处理,以此来扩展系统处理命令请求的能力
    以上这些特性或程序都是独立的,如果我 们需要一个完整地包含复制、高可用和分片特性的 Redis服务器群那么就需要用到Redis的集群(cluster)特性。

集群(Redis的分布式数据库实现)
Redis 集群是一个由多个 Redis 服务器组成的分布式网络服务器群,集群中的各个服务器被称为节 点(node),这些节点会相互连接并进行通信
分布式的 Redis 集群没有中心节点,所以用户不必担心某个节点会成为整个集群的性能瓶颈。

复制
Redis 集群的每个节点都有两种角色可选,一个是主节点(master node),另一个是从节点(slave node):其中主节点用于储存数据,而从节点则是某个主节点的复制品
当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。因为 Redis 集群重用了单机Redis 复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为十完全一样的



节点故障检测和自动故障转移
Redis 集群的主节点内置了类似 Redis Sentinel 的节点故障检测和自动故障转移功能,当集群中的某
个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

集群进行故障转移的方法和 Redis Sentinel 进行故障转移的方法基本一样,不同的是,在集群里面,
故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用 Redis Sentinel


分片
集群将整个数据库分为 16384 个槽(slot),所有键都属于这 16384 个槽的其中一个,计算键 key 属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16位的循环冗余校验 和函数。
集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时, 集群进入上线状态,并开始处理客户端发送的数据命令请求。
比如说,如果我们有三个主节点 7000 、 7001 和 7002 ,那么我们可以:
- 将槽 0 至 5460 指派给节点 7000 负责处理;
- 将槽 5461 至 10922 指派给节点 7001 负责处理;
- 将槽 10923 至 16383 指派给节点 7002 负责处理;
这样就可以将 16384 个槽平均地指派给三个节点负责处理。



转向
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。
如果一个节点接收到了和自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误 (redirection error),告诉客户端,哪个节点才是负责处理这条命令的,之后客户端需要根据错误中包含 的地址和端口号重新向正确的 节点发送命令请求。



集群搭建
集群搭建步骤
搭建一个 Redis 集群需要执行以下步骤:
1. 创建多个节点。
2. 为每个节点指派槽,并将多个 节点连接起来,组成一个集群。
3. 当集群数据库的 16384 个槽都有节点在处理时,集群进入上线状态。
接下来,就让我们来搭建一个包含六个节点的 Redis 集群,其中三个节点为主节点,而另外三个节点 为从节点,每个主 节点都有一个从 节点。
注意,在极端情况下,如果将 16384 个槽都指派给一个主节点,那么只有一个主 节点也可以让集群进 入上线状态,但是要让集群的故障转移特性生效,最起码要有三个主节点;而要让故障转移真正有意义, 最少要为三个主节点分别设置一个从节点,这也是我们使用六个节点作为例子的原因。


创建节点
集群中的节点就是运行在集群模式下的 Redis 服务器,为了构建一个集群,我 们需要一一创建集群中
的每个节点。
为了让 Redis 服务器以集群模式运行,我们需要在启动服务器时,打开服务器的集群模式选项:
cluster-enabled yes
另外,如果有多个 节点运行在同一台机器里面,那么我 们还需要为每个节点指定不同的端口号: port 7000
我们可以将这两个配置值写入到 redis.conf 文件里面,然后执行以下命令来启动一个节点: $ redis-server redis.conf




节点创建示例
为了在同一台机器上构建一个包含六个节点的集群,其中三个主节点分别运行在机器的 7000 、 7001 和 7002 端口,而三个从节点则分别运行在机器的 7003 、 7004 和 7005 端口,我们可以先 创建一个 rediscluster 文件夹,然后分别创建 7000 至 7005 这六个文件夹,每个文件夹都包含一个 redis.conf 文件,它的内容为:
port <number> cluster-enabled yes
然后只要分 别执行:
~/rediscluster/7000$ redis-server redis.conf ...
~/rediscluster/7005$ redis-server redis.conf
就可以创建出六个节点了(节点启动时默认为主节点,之后要将其中三个 节点转为从节点)。


创建集群
在创建出六个节点之后,我们需要让这六个节点互相连接以构成一个集群,然后为三个主节点指派槽,并为这三
个主节点分别设置一个从节点。
创建集群的操作可以通过使用位于 Redis 安装文件夹内的 redis-trib.rb 程序来完成,这是一个使用 Ruby 编 写的 Redis 集群管理程序,它具有创建集群、检查集群的上线情况和槽指派情况、对集群进行重新分片、向集群 添加新节点或者从集群中移除节点等功能。
不带任何参数地执行 redis-trib.rb 可以看到它的各项用法


redis-trib.rb 的 create 方法
为了创建一个包含三个主节点和三个从节点的集群,我们需要执行以下命令:
$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
其中,create 方法表示我们要创建一个集群,而之后的 --replicas 1 则表示让 redis-trib.rb 为集群中 的每个主节点设置一个从节点,再之后输入的是各个节点的 IP 地址和端口号。
在输入该命令之后, redis-trib 会为各个节点指派槽以及角色,并询问用户是否接受这种节点配置


redis-trib.rb 首先尝试连接给定的六个节 点,检查它们是否存在。
在确定这些节点都是可连接之后,redis- trib.rb 再将 7000 、 7001 和 7002 设 置为主节点,而 7003 、 7004 和 7005 则分别被设置为三个主节点的从节点。
对于三个主节点,redis-trib.rb 会分别为 它们指派 5461 、 5462 和 5461 个槽 (默认情况下使用平均分配)。
如果觉得这个配置没问题的话,就可以键 入 yes 并按下回车



进行监测
Performing Cluster Check(using node 127.0.0.1:7000)
之后, redis-trib.rb 会对集群进行测试,检查是否每个节点都按照原先展示的配置 设置好了。 如果整个集群数据库的 16384 个槽都有节点在处理,那么集群就会进入上线状态,之后用户就可以
开始向集群发送命令请求了。




访问集群
适用集群客户端向集群发送命令请求
集群客户端
因为集群功能比起单机功能要复杂得多,所以不同语言的 Redis 客户端通常需要为集群添加特别的
支持,或者 专门开发一个集群客 户端。
目前主要的 Redis 集群客户端(或者说,支持集群功能的 Redis 客户端)有以下这些:
- redis-rb-cluster:antirez 使用 Ruby 编写的 Redis 集群客户端,集群客户端的官方实现。
- predis:Redis 的 PHP 客户端,支持集群功能。
- jedis:Redis 的 JAVA 客户端,支持集群功能。
- StackExchange.Redis:Redis 的 C# 客户端,支持集群功能。
- 内置的 redis-cli :在启动时给定 -c 参数即可进入集群模式,支持部分集群功能。 我们这里使用集群模式的 redis-cli 来进行,需要更完整功能的话,大家可
以选择上面列举的其他客户端。

连接节点并执行命令
redis-cli -p 7000 -c
127.0.0.1:7000> SET date 2014-10-10 # 键 date 所在的槽位于节点 7000 ,节点直接执行命令 OK
127.0.0.1:7000> SET msg "hello world" # 键 msg 所在的槽位于节点 7001
-> Redirected to slot [6257] located at 127.0.0.1:7001 # 客户端从 7000 转向至 7001 OK
127.0.0.1:7001> SADD fruits “apple” “banana” “cherry” # 键 fruits 所在的槽位于 节点 7002 -> Redirected to slot [14943] located at 127.0.0.1:7002 # 客户端从 7001 转向至 7002 (integer) 2
127.0.0.1:7002> # 转向是自动完成的,无需任何用 户操作


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值