首页 > 编程语言 >python操作哨兵、集群、缓存优化

python操作哨兵、集群、缓存优化

时间:2024-07-03 15:23:22浏览次数:1  
标签:缓存 python -- redis 哨兵 cluster conf 7000 节点

【python操作哨兵】

 1  1 redis的主从,一主多从
 2  2 高可用:sentinal:哨兵
 3     多个哨兵:配置文件---》监控我们主从状态--》当发现主库--》故障转移
 4  3 python如何操作哨兵
 5 
 6 
 7 ---------------------------------------------------------------------------------------
 8 import redis
 9 from redis.sentinel import Sentinel
10 
11 # 连接哨兵服务器(主机名也可以用域名)
12 # 10.0.0.101:26379
13 sentinel = Sentinel([('10.0.0.101', 26379),
14                      ('10.0.0.101', 26380),
15                      ('10.0.0.101', 26381)],socket_timeout=5)
16 
17 # print(sentinel)
18 # 获取主服务器地址
19  master = sentinel.discover_master('mymaster')
20  print(master)
21 
22 # 获取从
23  slave = sentinel.discover_slaves('mymaster')
24  print(slave)
25 
26 # 往主库中写入
27  master = sentinel.master_for('mymaster', socket_timeout=0.5,password='654321')
28  w_ret = master.set('foo', 'bar')
29 
30 
31 # 从从库读
32 slave = sentinel.slave_for('mymaster', socket_timeout=0.5,password='654321')
33 print(slave.client().connection_pool)
34 # from redis.client import Redis
35 r_ret = slave.get('foo')
36 print(r_ret)

【集群】

(集群原理)

 1 # 1 存在问题 
 2     1 并发量:单机redis qps为10w/s,但是我们可能需要百万级别的并发量
 3     2 数据量:机器内存16g--256g,如果存500g数据呢?
 4 
 5 # 2 使用集群解决上述问题
 6 
 7 # 3 数据分布(分布式数据库)---》集群方案
 8     -分区方式
 9         -哈希分布 数据分散度高,建值分布与业务无关,无法顺序访问,支持批量操作    一致性哈希memcache,redis cluster,其他缓存产品
10         -顺序分布    数据分散度易倾斜,建值业务相关,可顺序访问,支持批量操作    BigTable,HBase
11 
12 # 问题:mysql 集群分区方案是什么?
13     mysql 官方早期是不支持集群的---》出了很多第三方方案--》官方有集群方案
14     -可以顺序
15     -可以hash
16 # 4 顺序分区
17     原理:100个数据分到3个节点上 1--33第一个节点;34--66第二个节点;67--100第三个节点(很多关系型数据库使用此种方式)
18   
19 # 5 hash分区
20     - 节点取余分区:
21         -把key通过hash运算后,对节点个数取余--》决定数据存在哪个节点
22         -扩容--》需要迁移数据量很大
23         -推荐翻倍扩容
24         
25     - 一致性哈希分区
26         -客户端分片:哈希+顺时针(优化取余)
27         节点伸缩:只影响临近节点,但是还有数据迁移的情况
28         伸缩:保证最小迁移数据和无法保证负载均衡(这样总共5个节点,数据就不均匀了),翻倍扩容可以实现负载均衡
29     
30     - 虚拟槽分区 :redis使用此种方式
31         预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
32         良好的哈希函数:如CRC16
33         服务端管理节点、槽、数据:如redis cluster(槽的范围0–16383)
34         5个节点,把16384个槽平均分配到每个节点,客户端会把数据发送给任意一个节点,通过CRC16对key进行哈希对16383进行取余,算出当前key属于哪部分槽,属于哪个节点,每个节点都会记录是不是负责这部分槽,如果是负责的,进行保存,如果槽不在自己范围内,redis cluster是共享消息的模式,它知道哪个节点负责哪些槽,返回结果,让客户端找对应的节点去存
35 服务端管理节点,槽,关系

 

 

 

(搭建redis集群)

1 # 为什么redis的虚拟槽是16384个?
2     在 Redis 集群中,Redis 根据公式 HASH_SLOT=CRC16(key) mod 16384 ,来确定客户端的 key 映射到哪个分片上,然后 Redis 会去相应节点进行操作。然而,CRC16 算法最多可产生 65535 个槽位,但是 Redis 的取模 是16384 ,主要基于如下两个原因:
3 
4 Redis 节点在发送心跳数据包时需要将所有槽都放入到这个心跳包里,如果采用 16384 个插槽,占用空间为 2KB(16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。8KB 的心跳数据有点儿大。
5 Redis Cluster 不太可能扩展到超过 1000 个节点,太多会导致网络拥堵。选择 16384 ,照样可以确保每个主节点都有足够的槽。
6 所以,选择 16384 既可以保证集群中每个节点都有足够的槽,又能保证心跳数据包不会过

方式:

  1 3个节点搭建步骤
  2 
  3 # 第一步:写6个redis配置文件
  4 # vi redis-7000.conf
  5 port 7000
  6 daemonize yes
  7 dir "/root/redis/data/"
  8 logfile "7000.log"
  9 dbfilename "dump-7000.rdb"
 10 
 11 cluster-enabled yes
 12 cluster-config-file nodes-7000.conf
 13 cluster-require-full-coverage yes 
 14 
 15 # 第二步:快速生成剩余5个配置文件
 16 sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
 17 sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
 18 sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
 19 sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
 20 sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
 21 
 22 # 第三步;启动6个节点
 23 redis-server ./redis-7000.conf
 24 redis-server ./redis-7001.conf
 25 redis-server ./redis-7002.conf
 26 redis-server ./redis-7003.conf
 27 redis-server ./redis-7004.conf
 28 redis-server ./redis-7005.conf
 29 
 30 # 查看集群信息
 31 cluster info
 32 cluster nodes
 33 
 34 # 第四步:搭建集群  
 35 redis-cli --cluster create --cluster-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
 36 # yes  同意
 37 
 38 # 第五步:测试
 39     往 7000 上写 set name lqz 这个数据,写不进去
 40     原因是:name被hash后,得到的槽不归 7000管[0--5460槽]
 41     返回给我们错误,让我们去7001上写,顺利写进去
 42     
 43 # 第六步:查看机器信息
 44     cluster nodes
 45     cluster info
 46     
 47 # 第六步:集群模式连接--->自动切换到不同节点
 48      redis-cli -p 7000 -c 
 49 
 50 # 第七:停掉一个主---》原来的从会升级为主
 51 
 52 # 第八步:python操作redis集群
 53 # pip3 install redis-py-cluster
 54 
 55 from rediscluster import RedisCluster
 56 startup_nodes = [{"host":"127.0.0.1", "port": "7005"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}]
 57 rc = RedisCluster(startup_nodes=startup_nodes)
 58 rc.set("foo", "bar")
 59 print(rc.get("foo"))
 60 
 61 
 62 ===============================================
 63 扩容
 64 
 65 #1 准备两台机器
 66 sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
 67 sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf
 68 #2 启动两台机器
 69 redis-server ./redis-7006.conf
 70 redis-server ./redis-7007.conf
 71 
 72 # 3 两台机器加入到集群中去
 73 redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
 74 redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
 75         
 76 # 4 让7007复制7006
 77 redis-cli -p 7007 cluster replicate 2bab67072c1b1f95cf6e3cb79e8cd29cd5b147f9
 78         
 79 # 5 迁移槽
 80 redis-cli --cluster reshard 127.0.0.1:7000
 81     -迁移4096个槽   16384/4
 82     -7006的机器接收槽
 83     -all
 84 
 85 ================================================
 86 缩容
 87 
 88 # 第一步:下线迁槽(把7006的1366个槽迁移到7000上)
 89 redis-cli --cluster reshard --cluster-from 2bab67072c1b1f95cf6e3cb79e8cd29cd5b147f9 --cluster-to 65cc604cdcb4ecf1566dc1182e6f25b276589d20 --cluster-slots 1365 127.0.0.1:7000
 90 yes
 91 
 92 redis-cli --cluster reshard --cluster-from 2bab67072c1b1f95cf6e3cb79e8cd29cd5b147f9 --cluster-to 25652d07d3da463255f6f794b61f156e8015f6cb --cluster-slots 1366 127.0.0.1:7001
 93 yes
 94 
 95 redis-cli --cluster reshard --cluster-from 2bab67072c1b1f95cf6e3cb79e8cd29cd5b147f9 --cluster-to de4ad907904bda3c12ddadbf69533d34a0ff31f2 --cluster-slots 1365 127.0.0.1:7002
 96 yes
 97 
 98 
 99 #第二步:下线节点 忘记节点,关闭节点
100 redis-cli --cluster del-node 127.0.0.1:7000 2bab67072c1b1f95cf6e3cb79e8cd29cd5b147f9 # 先下从,再下主,因为先下主会触发故障转移
101 redis-cli --cluster del-node 127.0.0.1:7000 842d379b428100880ed5414cd9816df2cda02d3a
102 
103 # 第三步:关掉其中一个主,另一个从立马变成主顶上, 重启停止的主,发现变成了从

 

 

 。

【缓存优化】

缓存更新策略

1 # LRU/LFU/FIFO算法剔除:例如maxmemory-policy(到了最大内存,对应的应对策略)
2 
3 LRU -Least Recently Used,没有被使用时间最长的
4 
5 LFU -Least Frequenty Use,一定时间段内使用次数最少的
6 
7 FIFO -First In First Out,先进先出

 

缓存穿透,缓存击穿,缓存雪崩

 1 ###  缓存穿透
 2 #描述:
 3 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
 4 #解决方案:
 5 1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
 6 2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
 7 3 通过布隆过滤器实现
 8 
 9 
10 ### 缓存击穿
11 #描述:
12 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
13 #解决方案:
14 设置热点数据永远不过期。
15 
16  
17 ### 缓存雪崩
18 #描述:
19 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,        缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
20 # 解决方案:
21 1 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
22 2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
23 3 设置热点数据永远不过期。
24 
25 
26 
27 # 跳跃表
28     有序集合 内部存储的数据结构

 

标签:缓存,python,--,redis,哨兵,cluster,conf,7000,节点
From: https://www.cnblogs.com/liuliu1/p/18281674

相关文章

  • 这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
    微软在UserVoice上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将Python作为Excel的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015年这个点⼦发布以来并没有什么实质性进展,但在2020年年末,Python之⽗GuidovanRoss......
  • GuavaCache、EVCache、Tair、Aerospike 缓存框架比较
    GuavaCache、EVCache、Tair、Aerospike是不同类型的缓存解决方案,它们各有特点和应用场景。下面我会逐一分析这些缓存系统的优势、应用场景,并提供一些基本的代码示例。GuavaCache优势特点:内置在Guava库中,易于集成和使用。提供了丰富的缓存配置选项,如过期策略、缓存加载策略......
  • 使用Python进行开发人工智能
    AI人工智能(AI)是当前科技领域的热门话题使用Python进行AI开发成为许多开发者的首选因为Python语言简单易学庞大的库和框架支持使得AI开发更加高效和便捷本文将为你提供一个使用Python开发人工智能的学习路线并结合一些代码示例帮助你快速入门和掌握这项技术......
  • ESP32 wifi 串口转发数据 UART micropython
    最近有个项目需要远距离读uart串口打印出来的数据,但是淘宝的调试助手太贵了,开源平台找了圈也许是因为功能太简单,好像没怎么找到或者说连接配置的方式很麻烦,所以我花了半天时间写了一个.如果有同样需求的小白可以直接用这个程序跑本方案主要是把esp32配置成AP模式.并且......
  • Python爬虫实战案例——王者荣耀皮肤抓取
    大家好,我是你们的老朋友——南枫,今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。老规矩,直接上代码:导入我们需要使用到的,也是唯一用到的库:我们要抓取皮肤其实就是相当于抓图片,那么像这种大网站,大批量的图片它基本上是在一个文件里......
  • 完美解决stack Error: Can‘t find Python executable “python“, you can set the P
    解决方案:node版本太高了,我同时说他环境是node14的,我就来了个14.18的,结果还是不是,应该是14系列,我的二级版本还是高了。python什么的安装了没什么用!!!一步一步来,先解决第一部分:错误提示的意思是说我没有python,我电脑里确实没有下载python,但实际上不用下载python也能解决这个问题。......
  • 常见排序原理及 python 实现
    时间复杂度与空间复杂度常用O(1)或O(n)表示,其中1表示一个单位(最简单的单位,可以是多个或1个,但在时间上总体是较低且连续的),时间通常指的是程序运行时间,空间则是指程序在运行时所占用的内存空间。各个阶段的复杂度可用下面的顺序比较:O(1)<O(logn)<O(n)<O(nlogn)<O(n2).......
  • python 输入文件夹路径,返回所有的层次结构 excel
    importosimportopenpyxlfromopenpyxl.stylesimportFontdefget_folder_structure(root_folder):folder_structure=[]forroot,dirs,filesinos.walk(root_folder):level=root.replace(root_folder,'').count(os.sep)indent=......
  • 【Python&GIS】基于Geopandas和Shapely计算矢量面最短路径
    ​    在GIS进行空间分析时经常会需要计算最短路径,我也是最近在计算DPC的时候有这方面的需求,刚开始直接是用面的中心点求得距离,但其对不规则或空洞面很不友好。所以今天跟大家分享一下基于Geopandas和Shapely计算矢量面最短路径,这里的最短即点/边的最短!原创作者:RS迷......
  • python+中医病案管理系统设计与实现-计算机毕业设计源码131320
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的中医病案管理系统,会使;中医病案管理系统的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本系统是针对目前中医病案管理系统的实际需求,从实际工作出发,对过......