python3连接redis sentinel集群

2024-08-21 04:32

本文主要是介绍python3连接redis sentinel集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装

pip install redis

示例代码

# import redis
from redis.sentinel import Sentinel"""
1、通过访问Sentinel服务的方式,获取redis的master、slave节点信息
2、向master redis写入数据
3、从slave redis读取数据
"""# 连接哨兵服务器(主机名也可以用域名)
sentinel = Sentinel([('192.168.196.129', 26379),('192.168.196.132', 26379)],socket_timeout=0.5)# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 输出:('192.168.196.132', 6379)# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 输出:[('192.168.196.129', 6379)]# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='newpwd', db=0)
w_ret = master.set('foo', 'bar')
# 输出:True# 获取从服务器进行读取(默认是round-roubin,随机从多个slave服务中读取数据)
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='newpwd', db=0)
r_ret = slave.get('foo')
print(r_ret)
# 输出:bar

封装工具类方法

from redis.sentinel import Sentinelclass redisSentinelHelper():def __init__(self,sentinel_list,service_name,password,db):self.sentinel = Sentinel(sentinel_list,socket_timeout=0.5)self.service_name = service_nameself.password = passwordself.db = dbdef get_master_redis(self):return self.sentinel.discover_master(self.service_name)def get_slave_redis(self):return self.sentinel.discover_slaves(self.service_name)def set_key(self,key,value):master = self.sentinel.master_for(service_name=self.service_name,socket_timeout=0.5,password=self.password,db=self.db)return master.set(key,value)def get_key(self,key):slave = self.sentinel.slave_for(service_name=self.service_name,socket_timeout=0.5,password=self.password,db=self.db)return slave.get(key)def _test():# redis infosentinel_list = [('192.168.196.129', 26379),('192.168.196.132', 26379)]password = 'newpwd'db = 0service_name = 'mymaster'# create redis linkrsh = redisSentinelHelper(sentinel_list=sentinel_list,password=password,service_name=service_name,db=db)# test set key : key1 test-insert-key1rsh.set_key('key1','test-insert-key1')# get key1print(rsh.get_key('key1'))if __name__ == '__main__':_test()

运行如下:

D:\Python37\python3.exe D:/pythonProject/redis-test/test7.py
b'test-insert-key1'

其中,我没有把设置master节点写在初始化,而是在set key操作的时候才创建连接,主要是后续想要测试master节点变化的情况下,写入能够继续。

当然这样的话性能肯定不会很好,有很多可以根据实际情况修改的地方。

测试:当master节点切换,能否自动连续写入

当然,在sentinel执行master切点切换的过程,肯定会有些丢失,但是主要是要看切换之后,是否可以自动继续写入数据。

首先编写一个循环写入的示例

from redis.sentinel import Sentinelclass redisSentinelHelper():def __init__(self,sentinel_list,service_name,password,db):self.sentinel = Sentinel(sentinel_list,socket_timeout=0.5)self.service_name = service_nameself.password = passwordself.db = dbdef get_master_redis(self):return self.sentinel.discover_master(self.service_name)def get_slave_redis(self):return self.sentinel.discover_slaves(self.service_name)def set_key(self,key,value):master = self.sentinel.master_for(service_name=self.service_name,socket_timeout=0.5,password=self.password,db=self.db)return master.set(key,value)def get_key(self,key):slave = self.sentinel.slave_for(service_name=self.service_name,socket_timeout=0.5,password=self.password,db=self.db)return slave.get(key)def _test():# redis infosentinel_list = [('192.168.196.129', 26379),('192.168.196.132', 26379)]password = 'newpwd'db = 0service_name = 'mymaster'# create redis linkrsh = redisSentinelHelper(sentinel_list=sentinel_list,password=password,service_name=service_name,db=db)# test set key : key1 test-insert-key1# rsh.set_key('key1','test-insert-key1')# get key1# print(rsh.get_key('key1'))# loop set keyfor i in range(0,1000000):rsh.set_key('key' + str(i), i)print(rsh.get_key('key' + str(i)))if __name__ == '__main__':_test()

运行如下:

13423234-be354f9fc300530f.png

在写入的过程停止master服务

13423234-f6083e868c5bd704.png

脚本由于socket连接异常,直接报终止了。

13423234-0364afd6ef7f5232.png

查看sentinel的日志如下:

1825:X 17 Apr 17:44:51.101 # +sdown master mymaster 192.168.196.132 6379
1825:X 17 Apr 17:44:51.194 # +new-epoch 3
1825:X 17 Apr 17:44:51.195 # +vote-for-leader 3607cde178c7ac4255d5f862e8f3892f5599100f 3
1825:X 17 Apr 17:44:52.230 # +odown master mymaster 192.168.196.132 6379 #quorum 2/2
1825:X 17 Apr 17:44:52.230 # Next failover delay: I will not start a failover before Wed Apr 17 17:50:52 2019
1825:X 17 Apr 17:44:52.274 # +config-update-from sentinel 3607cde178c7ac4255d5f862e8f3892f5599100f 192.168.196.129 26379 @ mymaster 192.168.196.132 6379
1825:X 17 Apr 17:44:52.274 # +switch-master mymaster 192.168.196.132 6379 192.168.196.129 6379
1825:X 17 Apr 17:44:52.274 * +slave slave 192.168.196.131:6379 192.168.196.131 6379 @ mymaster 192.168.196.129 6379
1825:X 17 Apr 17:44:52.274 * +slave slave 192.168.196.132:6379 192.168.196.132 6379 @ mymaster 192.168.196.129 6379
1825:X 17 Apr 17:45:22.298 # +sdown slave 192.168.196.132:6379 192.168.196.132 6379 @ mymaster 192.168.196.129 6379
1825:X 17 Apr 17:45:22.298 # +sdown slave 192.168.196.131:6379 192.168.196.131 6379 @ mymaster 192.168.196.129 6379
[root@centos7-server02 redis]# 

可以看到已经切换了master节点,这时候抛开刚才的异常问题,再执行一下脚本看看。

在master节点切换之后,再次运行脚本

13423234-f0b4500cd04702bc.png

直接就可以访问处理了。
这里就体现了通过sentinel集群来获取master节点的优势。

13423234-0e3934319aa622f6.png

这篇关于python3连接redis sentinel集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092124

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(