Redis之Redis Cluster集群方案

数据分布:

分布式数据库首先需要解决的是,把整个数据集按照分区规则映射到多个节点的问题,常见的分区规则有哈希分区和顺序分区。

哈希分区:

  • 离散度好
  • 数据分布业务无关
  • 无法顺序访问

顺序分区:

  • 离散度倾斜
  • 数据分布业务相关
  • 可以顺序访问

Redis Cluster 采用的是哈希分区:
常见的哈希分区方案:

  1. 节点取余
    优点是简单,缺点是当节点数量变化时,数据节点映射关系需要重新计算,会导致数据迁移问题。
  2. 一致性哈希
    优点是节点变化无数据迁移问题,缺点是①加减节点会导致哈希环中部分数据无法命中,②节点太少时,不适用(可用虚拟节点解决),③需要增减一倍或一半节点才能保证数据的负载均衡问题
  3. 虚拟槽
    特点:
    ①解耦数据和节点之间的关系,简化节点扩容和收缩难度
    ②节点自身维护槽的映射关系
    ③支持节点、槽、键之间的映射查询

Redis集群的限制:

节点通信

分布式存储需要提供维护节点元数据信息的机制。常见的方式:集中式和P2P式。

元数据:节点负责那些数据,是否出现故障等状态信息。

Redis采用Gossip协议(P2P)通信,过程如下:

  1. 集群中每个节点会单独开辟一个TCP通道,用于节点之间通信
  2. 每个节点在固定周期内通过指定规则选几个节点发送ping消息
  3. 接收到ping消息的节点用pong消息作为响应

节点选择:
定时任务默认每1秒执行10次,每秒随机找出最久没有通信的节点发送ping消息。

集群伸缩

集群伸缩=槽和数据在节点之间的移动

集群扩容:

  1. 准备新节点
  2. 接入集群
  3. 迁移槽和数据

集群收缩:

  1. 下线节点是否有负责的槽,①如果有,把槽迁移到其他节点
  2. 当下线节点不再负责槽或本身是从节点时,通知集群内其他节点忘记该节点,所有节点忘记以后,就关闭该节点。

请求路由

集群模式下,Redis接收任何键相关命令时,首先计算键对应的槽,再根据槽找出对应的节点,如果不是当前节点,回复MOVED重定向错误,通知客户端(注意是客户端处理重定向转发)请求正确的节点。

Smart客户端:
Smart客户端通过在内部维护slot—node的映射关系,提高重定向转发带来的IO效率问题。MOVED重定向负责协助Smart客户端更新slot—node的映射。

潜在问题:

  1. 当集群规模很大时,客户端会维护非常多的连接并消耗更多的内存。
  2. Too many Cluster redirections 错误,节点宕机或请求超时,会触发随机重试,重试次数耗尽就会出现这个错误。
  3. JedisConnectionException错误的几种情况:①Jedis连接节点发送socket错误②所有命令读写超时③JedisPool连接池获取jedis对象超时(2.8.1以后抛另外的异常)
    4.cluster slots风暴问题:升级到2.8.2以上防止这个问题。

ASK重定向和MOVED重定向的区别:ASK说明集群正在进行slot数据迁移,客户端不知道什么时候迁移完成,只能临时的重定向,客户端不会更新slots缓存。MOVED会更新slots缓存。

故障转移

主观下线:当cluster-node-timeout时间内某节点无法与另一个节点顺利完成ping消息通信时,则将该节点标记为主观下线状态。
客观下线:集群内多个节点都认为该节点不可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
redis-cluster-tool 是一个非常便利的 Redis 集群管理工具。help        Usage: redis-cluster-tool [-?hVds] [-v verbosity level] [-o output file]                  [-c conf file] [-a addr] [-i interval]                  [-p pid file] [-C command] [-r redis role]                  [-t thread number] [-b buffer size]    Options:      -h, --help             : this help      -V, --version          : show version and exit      -d, --daemonize        : run as a daemon      -s, --simple           : show the output not in detail      -v, --verbosity=N      : set logging level (default: 5, min: 0, max: 11)      -o, --output=S         : set logging file (default: stderr)      -c, --conf-file=S      : set configuration file (default: conf/rct.yml)      -a, --addr=S           : set redis cluster address (default: 127.0.0.1:6379)      -i, --interval=N       : set interval in msec (default: 1000 msec)      -p, --pid-file=S       : set pid file (default: off)      -C, --command=S        : set command to execute (default: cluster_state)      -r, --role=S           : set the role of the nodes that command to execute on (default: all, you can input: all, master or slave)      -t, --thread=N         : set how many threads to run the job(default: 8)      -b, --buffer=S         : set buffer size to run the job (default: 1048576 byte, unit:G/M/K)        Commands:        cluster_state                 :Show the cluster state.        cluster_used_memory           :Show the cluster used memory.        cluster_keys_num              :Show the cluster holds keys num.        slots_state                   :Show the slots state.        node_slot_num                 :Show the node hold slots number.        new_nodes_name                :Show the new nodes name that not covered slots.        cluster_rebalance             :Show the cluster how to rebalance.        flushall                      :Flush all the cluster.        cluster_config_get            :Get config from every node in the cluster and check consistency.        cluster_config_set            :Set config to every node in the cluster.        cluster_config_rewrite        :Rewrite every node config to echo node for the cluster.        node_list                     :List the nodes            del_keys                      :Delete keys in the cluster. The keys must match a given glob-style pattern.(This command not block the redis)ExampleGet the cluster state:        $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_state -r master    master[127.0.0.1:34504] cluster_state is ok     master[127.0.0.1:34501] cluster_state is ok     master[127.0.0.1:34502] cluster_state is ok     master[127.0.0.1:34503] cluster_state is ok     all nodes cluster_state is ok    Get the cluster used memory:    $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_used_memory -r master    master[127.0.0.1:34504] used 195 M 25%    master[127.0.0.1:34501] used 195 M 25%    master[127.0.0.1:34502] used 195 M 25%    master[127.0.0.1:34503] used 195 M 25%    cluster used 780 MRebalance the cluster slots:    $redis-cluster-tool -a 127.0.0.1:34501 -C cluster_rebalance    --from e1a4ba9922555bfc961f987213e3d4e6659c9316 --to 785862477453bc6b91765ffba0b5bc803052d70a --slots 2048    --from 437c719f50dc9d0745032f3b280ce7ecc40792ac --to cb8299390ce53cefb2352db34976dd768708bf64 --slots 2048    --from a497fc619d4f6c93bd4afb85f3f8a148a3f35adb --to a0cf6c1f12d295cd80f5811afab713cdc858ea30 --slots 2048    --from 0bdef694d08cb3daab9aac518d3ad6f8035ec896 --to 471eaf98ff43ba9a0aadd9579f5af1609239c5b7 --slots 2048Then you can use "redis-trib.rb reshard --yes --from e1a4ba9922555bfc961f987213e3d4e6659c9316 --to 785862477453bc6b91765ffba0b5bc803052d70a --slots 2048 127.0.0.1:34501" to rebalance the cluster slots     Flushall the cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C flushall -s    Do you really want to execute the "flushall"?    please input "yes" or "no" :        yes    OKGet a config from every node in cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "cluster_config_get maxmemory" -r master    master[127.0.0.1:34501] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34502] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34503] config maxmemory is 1048576000 (1000MB)    master[127.0.0.1:34504] config maxmemory is 1048576000 (1000MB)    All nodes config are Consistent    cluster total maxmemory: 4194304000 (4000MB)Set a config from every node in cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "cluster_config_set maxmemory 10000000" -s    Do you really want to execute the "cluster_config_set"?    please input "yes" or "no" :    yes        OKDelete keys in the cluster:    $redis-cluster-tool -a 127.0.0.1:34501 -C "del_keys abc*"    Do you really want to execute the "del_keys"?    please input "yes" or "no" :    yes    delete keys job is running...    delete keys job finished, deleted: 999999 keys, used: 4 s 标签:redis
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值