外卖网站建设文档,汕头网站制作哪家强,淘宝官网首页卖家中心,网站模板案例集群环境搭建
在 Redis 5版本以前是用 Ruby 来搭建集群#xff0c;在后面的版本中仍保留了相关功能可以再源码src目录中#xff0c;看到 redis-trib.rb 这个东西#xff0c;只是现在用这种方式搭建的少了我们看新的版本是怎样搭建集群的#xff0c;新版构建集群的方式简单…集群环境搭建
在 Redis 5版本以前是用 Ruby 来搭建集群在后面的版本中仍保留了相关功能可以再源码src目录中看到 redis-trib.rb 这个东西只是现在用这种方式搭建的少了我们看新的版本是怎样搭建集群的新版构建集群的方式简单好用构建集群我们可以用6台机器如果机器少也可以使用3台每台机器上有2个redis实例但是这里需要注意, 主从机器不是我们说的算而是基于它内部的算法来确定也就是说同一台机器上不一定是主从的关系这个要明确我们现在用这种方式在3台机器上提供6台Redis实例的方式来搭建集群模拟 每天机器上基于端口来区分使用不同的配置文件最好的方式还是每台机器上一个Redis提供至少6台机器的方式但是这里没有太多资源做模拟集群搭建方式大同小异我们使用 redis-cli --cluster 的方式来搭建集群
1 ) 节点准备
IPRedis 节点192.168.10.1016371, 6372192.168.10.1026373, 6374192.168.10.1036375, 6376 在3个节点分别创建如下目录 $ mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/log$ vi /usr/local/redis/cluster/conf/redis-6371.conf 这个仅做演示分别在不同节点上创建不同的配置 3个节点分别创建 redis-*.conf这个 * 替换成上面准备的端口并添加如下通用配置信息 示例 vi /usr/local/redis/cluster/conf/redis-6371.conf # 放行访问IP限制
bind 0.0.0.0
# 端口
port 6371
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile /usr/local/redis/custer/log/redis-6371.log
# rdb数据文件名
dbfilename dump-6371.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename appendonly-6371.aof
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/cluster/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码必须与 requirepass 一致
masterauth 123456
# 是否开启集群模式默认 no
cluster-enabled yes
# 集群节点信息文件会保存在dir配置对应目录下
cluster-config-file nodes-6371.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点 IP
cluster-announce-ip 192.168.10.101
# 集群节点映射端口
cluster-announce-port 6371
# 集群节点总线端口
cluster-announce-bus-port 16371上面为什么会有一个总线端口 每个 Redis 集群节点需要打开两个TCP的连接一个是为客户端提供服务的正常的 Redis TCP 端口, 比如这里的 6371还有一个是基于这个端口加1w产生的 16371, 这个端口是集群总线集群总线它是一个二进制协议的节点到节点通信的一个通道就是节点之间使用这个端口来进行故障检测配置更新故障转移授权等等 所以客户端不要跟这个集群总线端口进行通信与正常的 Redis 的TCP的这个端口通信即可 你现在要搭建集群要确保防火墙里边这两个端口都是打开的 或者说你把防火墙直接关了简单粗暴否则你的这个 Redis 集群可能没有办法互相通信就构建不了集群环境 注意其他节点在修改 IP 和 端口 部分内容的时候使用 vi 命令 %s/old/new/g 全局替换 示例$ :%s/6371/6372/g注意每个节点的 IP 不要搞错了 在其余节点上都进行上述快速的配置
2 开始构建集群
并在3个节点上启动上述 6个 redis 实例 示例$ /usr/ocal/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6371.conf从 6371 ~ 6376 3个节点上redis-server全部启动 每个节点上启动后都需要检查一下$ ps -ef | grep redis创建集群的语法如下 $ /usr/local/redis/bin/redis-cli --cluster create --cluster-replicas 1 --cluster 构建集群环境的所有 Redis 节点 IP PORT 信息--cluster-replicas 表示构建集群中主从的比例1:1 在101节点上(随便找一个节点即可操作)开始创建集群/usr/local/redis/bin/redis-cli -a 123456 --cluster create \
192.168.10.101:6371 192.168.10.101:6372 \
192.168.10.101:6373 192.168.10.101:6374 \
192.168.10.101:6375 192.168.10.101:6376 \
--cluster-replicas 1输入 yes 现在一个高可用的 Redis Cluster 集群搭建完成该集群包含 6个 Redis 节点3主3从3个节点会分配槽处理客户端的命令请求而从节点可用在主节点故障后顶替主节点
检查集群状态
找到任意集群内的节点执行 $ /usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.10.103:6371 这里可以看到很多集群内的信息 主节点IP和端口存储了多少key, 槽有多少对应备份从节点多少这里有很多信息可以反映集群内的情况
分析主从日志
在这个集群中去查看主节点和它对应的从节点即可否则没有太多意义比如现在101:6371 是一个主节点102:6374 是其从节点 $ tail -f -n 1000 /usr/local/redis/cluster/log/redis-6371.log这里面有整个集群初始化的过程 再来看从节点的日志, 这个要去到 102 节点上了 $ tail -f -n 1000 /usr/local/redis/cluster/log/redis-6374.log主要和6371.log的区别在于变为从节点之前的准备工作 连接到主节点主从同步开始触发SYNC非阻塞连接事件收到 Master 的 PING, 尝试增量复制被Master拒绝(因为环境初始化需要全量复制)在全量复制之前会抛弃之前缓存的主节点的状态全量复制会接收数据刷新数据加载数据到内存之后加载RDB相关主从复制顺利完成后台开启 aof 基于aof来继续写入数据aof 完成 这是初次构建集群中从节点的初始化日志
查看集群信息 随便找一个节点$ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376 *-c 表示以集群的方式让客户端连接 连接进来之后$ CLUSTER INFO cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:2027
cluster_stats_messages_pong_sent:2171
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:4199
cluster_stats_messages_ping_received:2171
cluster_stats_messages_pong_received:2028
cluster_stats_messages_received:4199cluster_slots_assigned 在集群中分配的总槽数cluster_slots_ok 成功分配的总槽数cluster_slots_pfail 可能失效的槽数cluster_slots_fail 已经失效的槽数cluster_known_nodes 集群环境的节点cluster_size 主节点的个数/分片的个数cluster_current_epoch 当前环境的节点cluster_my_epoch 我的节点 $ CLUSTER NODES f3353d11eae2dae1e46cdee9134beea872d1c6e8 192.168.10.103:637516375 master -0 1607339167170 5 connected 10923 -16383
afe0b3936c837a46972055c7b9b691bdd8149b7d 192.168.10.101:637116371 master -0 1607339166164 1 connected 0-5460
70613e4ec9d16162808accd9e5e2da0792c9ec12 192.168.10.101:637216372 slave f3353d11eae2dae1e46cdee9134beea872d1c6e8 0 1607339165000 5 connected
b444cc7e6a6ee077e2d2292c68abde22977c7e5d 192.168.10.102:637416374 slave afe0b3936c837a46972055c7b9b691bdd8149b7d 0 1607339165000 1 connected
d3028e6da602735c18f5917102a818daaf4f5a8a 192.168.10.103:637616376 myself,slave 339e0d0b6f92322fb269a83c0b43c44850e7e0aa 0 1607339163000 3 connected
339e0d0b6f92322fb269a83c0b43c44850e7e0aa 192.168.10.102:637316373 master -0 1607339167000 3 connected 5461-10922第一个是节点ID之后是 当前这个节点的一个IP:端口集群总线端口再后面是 节点的角色如果当前节点是 slave(从节点)后面会紧跟主节点的ID再后面 -0 表示当前没有从节点连接到这个主节点负号通常表示没有连接的从节点数量即这是一个主节点且当前没有从属关系再后面是 集群最近一次向节点发送PING命令之后过了多长时间还没有收到回复再后面就是节点纪元的配置之后是节点网络情况如果是 master 角色那它最后是所在插槽的范围 上面的输出也会被存储在 /usr/local/redis/cluster/data/nodes-*.conf 中这个是之前配置文件中指定的 这里的 * 替换成自己之前配置的数字
关于纪元
纪元Epoch在Redis集群中是一个重要的概念它用于记录集群状态变更的递增版本号以下是关于Redis集群中纪元的详细解释
1 ) 纪元的定义
纪元是一个整数它在Redis集群中用于标识集群状态的不同版本每当集群的拓扑结构发生变化时例如添加或删除节点、主从切换等纪元就会递增这样集群中的每个节点都可以通过比较纪元来确定哪个节点的集群状态信息是最新的
2 纪元的类型
在Redis集群中主要有两种类型的纪元 currentEpoch当前纪元表示集群当前的状态版本号。每当集群状态发生变化时currentEpoch就会增加。集群中的每个节点都会维护一个currentEpoch并且最终会达成一致以确保对集群状态的认知是一致的configEpoch配置纪元用于记录节点的配置信息如负责的槽位的版本号。当节点的配置发生变化时例如负责的槽位发生变化configEpoch就会增加。这有助于解决节点配置冲突的问题
3 纪元的作用 确保集群状态的一致性通过递增的纪元集群中的节点可以确保它们对集群状态的认知是一致的。当某个节点发起状态变更时它会增加currentEpoch并通知其他节点。其他节点在收到通知后会更新自己的currentEpoch以确保与发起变更的节点保持一致 解决配置冲突在Redis集群中每个节点都有自己的configEpoch。当多个节点试图同时更新同一个槽位的配置时它们会比较自己的configEpoch。具有更大configEpoch的节点的配置将被接受从而解决配置冲突 支持故障转移在Redis集群中当主节点发生故障时其从节点会尝试发起故障转移流程。在这个过程中从节点会增加自己的currentEpoch并向其他节点发起拉票请求。其他节点在收到请求后会根据currentEpoch的大小来判断是否投票给该从节点。当从节点获得足够多的选票时它就会成为新的主节点并增加自己的configEpoch来更新槽位配置
4 纪元的更新机制 在Redis集群中纪元的更新通常是由节点间的通信和状态变更触发的。例如当某个节点接收到来自其他节点的状态变更通知时它会比较通知中的纪元与自己的纪元。如果通知中的纪元更大则更新自己的纪元。此外在故障转移等过程中节点也会主动增加自己的纪元来发起或响应状态变更 综上所述纪元是Redis集群中用于记录集群状态变更和确保集群一致性的重要机制。通过递增的纪元版本号集群中的节点可以确保它们对集群状态的认知是一致的并解决可能出现的配置冲突问题