目录

redis-py和Redis

redis-py和Redis 哨兵

主机改变和哨兵故障转移


关于Redis复制和Redis哨兵的主题仍然是——使用Python的redis-py库的几个例子。

以前的系列帖子:

  1. Redis:复制,第1部分——概述 复制与分片、哨兵与集群、Redis拓扑
  2. Redis:复制,第2部分——主从复制和Redis哨兵

可以在此处找到Python的所有Redis客户端——redis.io/clients。

首先,我们将使用没有哨兵的redis-py,只是为了检查它是如何工作的。

然后——我们将启动哨兵并检查主机和从机的发现。

在上一篇文章中已经配置了一个名为Redis复制和Redis 哨兵的工作环境——这里只是Python示例。

redis-py和Redis

redis-py在Debian上安装:

root@redis-0:/home/admin# apt install python-redis

此外,pip可以使用,但我更喜欢使用普通的存储库。

检查:

root@redis-0:/home/admin# python
Python 2.7.13 (default, Sep 26 2018, 18:42:22)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, db=0)
>>> r.get('test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 880, in get
return self.execute_command('GET', name)
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 573, in execute_command
return self.parse_response(connection, command_name, **options)
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 585, in parse_response
response = connection.read_response()
File "/usr/lib/python2.7/dist-packages/redis/connection.py", line 582, in read_response
raise response
redis.exceptions.ResponseError: NOAUTH Authentication required.

好的,有效。

在文档中查找授权:

>>> help(redis.Redis)

添加password:

>>> r = redis.Redis(host='localhost', password='foobared', port=6379, db=0)
>>> r.get('test')
'test'

好了。

redis-py和Redis 哨兵

现在运行哨兵实例(如果它们尚未启动),让我们通过Redis 哨兵集群客户端尝试Redis。

sentinel monitor redis-test 52.58.69.184 6379 2
sentinel down-after-milliseconds redis-test 6001
sentinel failover-timeout redis-test 60000
bind 0.0.0.0
sentinel auth-pass redis-test foobared

哨兵实例启动后——它将更新配置,所以现在redis-1(这是第一个从机),配置看起来像:

admin@redis-1:~$ cat /etc/redis/sentinel.conf
sentinel myid e3e62e6577aa975f93346dad3d4f8e25833fd8f1
sentinel monitor redis-test 52.29.101.118 6379 2
sentinel down-after-milliseconds redis-test 6001
bind 0.0.0.0
sentinel failover-timeout redis-test 60000
Generated by CONFIG REWRITE
port 26379
dir "/home/admin"
sentinel auth-pass redis-test foobared
sentinel config-epoch redis-test 1
sentinel leader-epoch redis-test 1
sentinel known-slave redis-test 52.58.69.184 6379
sentinel known-slave redis-test 35.159.18.26 6379
sentinel known-sentinel redis-test 172.31.46.202 26379 e0fe655c59aa3cc32eab1c0858c52418700abe79
sentinel known-sentinel redis-test 172.31.41.39 26379 07a450af0d2f178410b78ee0f5ae99ce1cd0ac62
sentinel current-epoch 1

检查哨兵群集状态:

root@redis-0:/home/admin# redis-cli -p 26379 info 哨兵

root@redis-0:/home/admin# redis-cli -p 26379 info sentinel
Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-test,status=ok,address=52.58.69.184:6379,slaves=2,sentinels=3

并使用redis-py:

>>> from redis.sentinel import Sentinel
>>> sentinel = Sentinel([('localhost', 26379)], socket_timeout=0.1)

您可以使用以下discover_master()方法获取主机IP :

>>> sentinel.discover_master('redis-test')
('52.58.69.184', 6379)

和从机IP:

>>> sentinel.discover_slaves('redis-test')
[('52.29.101.118', 6379), ('35.159.18.26', 6379)]

要使用master,请使用master_for()方法:

| master_for(self, service_name, redis_class=<class ‘redis.client.StrictRedis’>,
connection_pool_class=<class ‘redis.sentinel.SentinelConnectionPool’>, **kwargs)
| Returns a redis client instance for the "service_name" master.
>>> master = sentinel.master_for('redis-test', socket_timeout=0.1)

但是如果现在调用master——它会告诉我们我们没有被授权:

>>> master.set('test-key', 'test-value')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 1072, in set
return self.execute_command('SET', *pieces)
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 573, in execute_command
return self.parse_response(connection, command_name, **options)
File "/usr/lib/python2.7/dist-packages/redis/client.py", line 585, in parse_response
response = connection.read_response()
File "/usr/lib/python2.7/dist-packages/redis/sentinel.py", line 55, in read_response
return super(SentinelManagedConnection, self).read_response()
File "/usr/lib/python2.7/dist-packages/redis/connection.py", line 582, in read_response
raise response
redis.exceptions.ResponseError: NOAUTH Authentication required.

所以在创建master对象时——添加password:

>>> master = sentinel.master_for('redis-test', socket_timeout=0.1, password='foobared')

现在检查:

>>> master.set('test-key', 'test-value')
True

此外,您可以获得整个主机的配置:

>>> master.config_get()
{'appendonly': 'no', ... 'slave-announce-port': '0'}

或者以更易读的视图:

>>> for i in master.config_get():
...   print(i)
...
appendonly
requirepass
daemonize
protected-mode
zset-max-ziplist-entries
zset-max-ziplist-value
dir
slave-serve-stale-data
cluster-require-full-coverage
slowlog-log-slower-than
masterauth
rdbchecksum
...

在从机上——检查我们之前添加的密钥:

admin@redis-1:~$ redis-cli -a foobared get test-key
"test-value"

使用从机与主机方式类似:

>>> slave = sentinel.slave_for('redis-test', socket_timeout=0.1, password='foobared')
>>> slave.get('test-key')
'test-value'

主机改变和哨兵故障转移

我们现在来看看主机:

>>> sentinel.discover_master('redis-test')
('52.58.69.184', 6379)

最后,让我们尝试在主机上停止Redis主机redis-0:

root@redis-0:/home/admin# systemctl stop redis-server

或者通过:

root@redis-0:/home/admin# redis-cli -a foobared DEBUG sleep 600

(如果你只是用kill来杀死redis-server进程——哨兵将重新启动它)。

检查哨兵的日志:

10633:X 01 Apr 13:46:10.430 # +sdown master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.486 # +odown master redis-test 52.58.69.184 6379 #quorum 2/2
10633:X 01 Apr 13:46:10.486 # +new-epoch 1
10633:X 01 Apr 13:46:10.486 # +try-failover master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.488 # +vote-for-leader e3e62e6577aa975f93346dad3d4f8e25833fd8f1 1
10633:X 01 Apr 13:46:10.492 # 07a450af0d2f178410b78ee0f5ae99ce1cd0ac62 voted for e3e62e6577aa975f93346dad3d4f8e25833fd8f1 1
10633:X 01 Apr 13:46:10.492 # e0fe655c59aa3cc32eab1c0858c52418700abe79 voted for e3e62e6577aa975f93346dad3d4f8e25833fd8f1 1
10633:X 01 Apr 13:46:10.559 # +elected-leader master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.559 # +failover-state-select-slave master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.611 # +selected-slave slave 52.29.101.118:6379 52.29.101.118 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.612 * +failover-state-send-slaveof-noone slave 52.29.101.118:6379 52.29.101.118 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:10.664 * +failover-state-wait-promotion slave 52.29.101.118:6379 52.29.101.118 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:11.498 # +promoted-slave slave 52.29.101.118:6379 52.29.101.118 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:11.498 # +failover-state-reconf-slaves master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:11.557 * +slave-reconf-sent slave 35.159.18.26:6379 35.159.18.26 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:12.550 * +slave-reconf-inprog slave 35.159.18.26:6379 35.159.18.26 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:12.550 * +slave-reconf-done slave 35.159.18.26:6379 35.159.18.26 6379 @ redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:12.632 # -odown master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:12.632 # +failover-end master redis-test 52.58.69.184 6379
10633:X 01 Apr 13:46:12.632 # +switch-master redis-test 52.58.69.184 6379 52.29.101.118 6379
10633:X 01 Apr 13:46:12.632 * +slave slave 35.159.18.26:6379 35.159.18.26 6379 @ redis-test 52.29.101.118 6379
10633:X 01 Apr 13:46:12.632 * +slave slave 52.58.69.184:6379 52.58.69.184 6379 @ redis-test 52.29.101.118 6379
10633:X 01 Apr 13:46:18.647 # +sdown slave 52.58.69.184:6379 52.58.69.184 6379 @ redis-test 52.29.101.118 6379

从Python检查:

>>> sentinel.discover_master('redis-test')
('52.29.101.118', 6379)

主机改变了——52.29.101.118——这是redis-1主几。

检查redis-1状态:

admin@redis-1:~$ redis-cli -a foobared info replication

复制角色:master connected_slaves:1 slave0:ip = 35.159.18.26,port = 6379,state = online,offset = 76847,lag = 0 ...

检查redis-0主机上的Redis节点状态——它现在必须成为从机:

root@redis-0:/home/admin# redis-cli -a foobared info replication
Replication
role:slave
...

并尝试使用我们之前创建的相同master对象在redis-0主机上添加Python的新密钥:

>>> master.set('test-key2', 'test-value2')
True

校验:

admin@redis-2:~$ redis-cli -a foobared get test-key2
"test-value2"

完成。

原文地址:https://www.codeproject.com/Articles/1354304/Redis-Replication-Part-3-redis-py-and-Work-with-Re

Redis:复制,第3部分——redis-py和Python中的Redi哨兵一起使用相关推荐

  1. python导入其他py文件-Python中py文件引用另一个py文件变量的方法

    最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requests r = requests.get(&quo ...

  2. linux修改py内容,python中修改文件行内容

    fileinput模块提供处理一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行.它的工作方式和readlines很类似,不同点在于它不是将全部的行读到列表中而是创建了一 ...

  3. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

    前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...

  4. Redis复制的高可用详解

    一.sentinel基础 在Redis的主从复制中有一个问题很明显,比如说在一主三从的架构下,如果主节点宕机,那么所有的写操作也就不能执行了,这个主从复制架构也就瘫痪了,所以Redis引入了senti ...

  5. Redis复制(Replication)

    Redis复制(Replication) 本文档翻译自: http://redis.io/topics/replication . Redis 支持简单且易用的主从复制(master-slave re ...

  6. 【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】

    由于人权问题,slave更改为了replica Redis默认采用异步复制的持久化方案(RDB),具备低延迟.高性能的特点.这是大多数Redis的自然复制模式. 主从复制(master-replica ...

  7. redis复制_Redis复制

    redis复制 本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 . 这是Redis的速成课程. 您将学习如何安装Redis和启动服务器. 此外,您还会在Redis命令行上乱七八糟. ...

  8. java redis 重连_突破Java面试(23-4) - Redis 复制原理

    全是干货的技术号: 本文已收录在github,欢迎 star/fork: 在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能),使用和配 ...

  9. redis复制原理和应用

    1.前言 说到分布式高可用,必然少不了复制,一来是为了做个冗余备份防止数据丢失,二来还可以达到分流来提高性能的目的.基本架构: 下面用M表示Master(主服务器),S表示Slave(从服务器),话不 ...

最新文章

  1. Java成员变量与成员方法
  2. 利用SQL Server EXISTS结构
  3. ubuntn终端缩小_缩小可以通过终端执行的工具
  4. 什么是ABAP的STATE_READ_ACCESS
  5. Oracle bigfile 大文件表空间会影响rman等备份效率
  6. oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽
  7. 润乾报表鼠标移动行、单元格变色
  8. 多图详解freeBSD8.2安装过程
  9. 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用
  10. elasticsearch+kibana 日志系统配置java日志解析和过滤无用字段
  11. DPDK X710 DDP PPPoE 实践
  12. 高斯-勒让德积分学习
  13. 下载Google瓦片地图并在Unity中作为场景底图
  14. 找不到硬盘分区怎么办
  15. 【verilog】b站-[Verilog HDL] Installing and Testing Icarus Verilog + GTKWave 笔记
  16. 什么是数据安全,为什么需要保证数据安全
  17. 降维技术 (Dimensionality Reduction)
  18. [总结]蓝牙各个版本的关系和区别
  19. .NET 开源开发项目
  20. 如何上传本地代码到码云

热门文章

  1. 网络存储空间_网络存储服务器的三大分类,你都清楚吗?
  2. 的ppt_PPT制作小白,如和做好PPT
  3. python 给类添加属性_python – 如何动态添加属性到类中?
  4. 安装linux到服务器配置,CentOS 6.3 服务器安装配置
  5. 配色的协调性的重要性,你知道吗?
  6. 如何更快获取想要的设计资源?
  7. Redhat或者Centos手动安装Vim,
  8. Kickstart文件的编写
  9. Python基础学习总结、学习展望
  10. java url 缩略图_java根据url生成网页截图,缩略图 | 学步园