1.为什么要实现分布式
一、提升性能
- 资源利用最大化
- 并行处理
- 分布式系统允许对任务进行并行处理。对于一些复杂的计算任务,如大数据分析、机器学习中的模型训练等,可以将任务分解成多个子任务,并在不同的节点上同时执行这些子任务。
- 例如,在处理海量数据的排序任务时,可以将数据分成多个部分,每个部分在一个独立的节点上进行排序,最后再将各个部分的排序结果合并起来,这样可以大大缩短任务的处理时间。
二、提高可用性和容错性
- 避免单点故障
- 容错性增强
三、满足大规模数据存储和管理需求
- 存储容量扩展
- 数据分布与管理
- 对于大规模数据,分布式系统可以采用合适的数据分布策略(如数据分片等)将数据合理地分布在不同的节点上,便于数据的管理、查询和更新操作。
- 例如,在一个全球范围的社交网络应用中,用户数据可以根据地域或用户 ID 等规则分布在不同的服务器上,这样既方便了数据的就近访问,也提高了数据管理的效率。
二. Redis 实现分布式的几种常见方式
一、分布式锁
- 原理
- 示例代码(使用 Python 和 Redis - Python 客户端 redis - py)
import redisimport timedef acquire_lock(conn, lock_name, acquire_timeout = 10):identifier = str(uuid.uuid4())end = time.time() + acquire_timeoutwhile time.time() < end:if conn.setnx(lock_name, identifier):conn.expire(lock_name, 10)return identifierelif not conn.ttl(lock_name):conn.expire(lock_name, 10)time.sleep(0.001)return Falsedef release_lock(conn, lock_name, identifier):pipe = conn.pipeline(True)while True:try:pipe.watch(lock_name)if pipe.get(lock_name) == identifier:pipe.multi()pipe.delete(lock_name)pipe.execute()return Truepipe.unwatch()breakexcept redis.exceptions.WatchError:passreturn Falser = redis.Redis(host='localhost', port = 6379, db = 0)lock_name = "my_lock"identifier = acquire_lock(r, lock_name)if identifier:# 执行业务逻辑print("获取锁成功,执行业务逻辑")release_lock(r, lock_name, identifier)else:print("获取锁失败")
二、分布式计数器
- 原理
- 示例代码(继续使用 Python 和 redis - py)
import redisr = redis.Redis(host='localhost', port = 6379, db = 0)counter_key = "visit_count"r.incr(counter_key)count = r.get(counter_key)print(f"当前访问次数: {count.decode('utf - 8')}")
三、数据分片(Sharding)
- 原理
- 当数据量过大时,将数据分布到多个 Redis 实例(节点)上可以提高存储能力和性能。有多种数据分片方法,例如范围分片、哈希分片等。
- 哈希分片是比较常用的一种。通过对数据的键进行哈希计算,然后根据哈希结果将数据分配到不同的 Redis 节点。例如,计算键的 CRC16 或 CRC32 哈希值,然后将哈希值对节点数量取模,确定数据应该存储到哪个节点。
- 示例实现(概念性)
-
假设我们有 3 个 Redis 节点,节点 1(IP: 192.168.1.101)、节点 2(IP: 192.168.1.102)和节点 3(IP: 192.168.1.103)。
-
对于要存储的键 “user:123”,首先计算其哈希值(假设使用 CRC16),得到哈希值为 12345。然后 12345 % 3 = 0,所以数据应该存储到节点 1。
-
在实际应用中,需要构建一个中间层来处理数据分片逻辑,使得应用程序不需要关心数据具体存储在哪个节点,这个中间层负责根据分片规则将操作转发到正确的 Redis 节点。
-
四、Redis Cluster(集群模式)
- 原理
- Redis Cluster 是 Redis 官方提供的分布式解决方案。它将数据自动分片到多个节点上,并且提供了一定的高可用性。
- Redis Cluster 使用哈希槽(Hash Slot)来进行数据分片,共有 16384 个哈希槽。每个节点负责一部分哈希槽。当客户端想要操作某个键时,通过对键进行 CRC16 哈希计算,然后对 16384 取模,得到哈希槽编号,再根据哈希槽编号找到负责该槽的节点进行操作。
- 它还提供了主从复制功能,每个主节点可以有一个或多个从节点。当主节点故障时,从节点可以被提升为新的主节点,保证了系统的可用性。
- 部署和使用
- 部署 Redis Cluster 通常需要配置多个 Redis 节点,指定每个节点的角色(主节点或从节点)、IP 地址、端口等信息。
- 在应用程序中,使用支持 Redis Cluster 的客户端(如 redis - py - cluster 等)来与集群进行交互。客户端会自动根据键计算哈希槽,并将操作发送到正确的节点。例如:
from rediscluster import RedisClusterstartup_nodes = [{"host": "192.168.1.101", "port": 7000},{"host": "192.168.1.102", "port": 7000},{"host": "192.168.1.103", "port": 7000}]rc = RedisCluster(startup_nodes = startup_nodes, decode_responses=True)rc.set('key1', 'value1')value = rc.get('key1')print(value)