docker笔记8--配置 redis

1 简介

Redis 是一个开源的内存数据库,具有运算效率高、占用资源少、反应速度快等特性,迅速获得业界认可并得到普及。
Redis 本身只能运行于单线程,在使用上又有它独特的地方,支持高并发读写,但一些不当的使用可能会导致服务阻塞,引起问题。
Redis 提供了丰富的数据类型,当包括 Keys, Strings, Lists, Hashes, Sets, Sorted sets, Bitmaps, HyperLogLogs 等8种数据类型。

Redis 有大量的使用场景,其中最为流行的一些使用案例包括:

  1. 用户会话存储:当你的应用需要快速管理大量用户和读写的时候,Redis 提供丰富的格 式支持,以及键过时特性,以最少的复杂度实现用户会话管理功能。
  2. 数据实时分析:常见不同应用如游戏的实时分析,Redis 对于存在内存中的数据进行快 速的排序、求交集等操作,或者电商应用中用于实时寻找相关性较大的商品,用于对每个 用户进行实时推荐的功能,大大提高应用的响应速度。
  3. 消息队列:Redis 中的列表(List)结构能够为应用提供队列功能,内置命令能够实现 丰富的队列功能,例如将条目从一个队列中剔除并加入到另一个队列中,可以通过一个命 令快速实现。
  4. 社交关系功能:对于大量用户的社交关系,比如需要找出两个用户之间的共同好友,或者找到朋友的朋友关系,具有相同偏好的用户等等,能够利用 Redis 命令实现。

2 部署redis

笔者有3台服务器,IP分别为 10.120.75.102、10.120.75.103、10.120.75.107,以下用这3台服务器测试主从版 和 sentinel 版本的reids。

2.1 单机版

单实例提供 Redis 服务最基本的单位,单机版本直接docker run部署,指定端口即可。

docker run -d --name=redis-6.0.6 -p 6379:6379 -p 26379:26379 redis:6.0.6
端口映射: 6379是redis端口,26379是哨兵端口

2.2 主从版本

主从复制,在使用上跟单实例完全一致,只是在单实例的 master 发生故障的时候,有多个副本保存信息,且master可读可写,slave只读不可写;
相对单机版本,主从可以考虑1主2从,部署的时候需要在从节点中通过 SLAVEOF master_ip master_port 来设置主节点。

1) 在3台机器上分别部署docker实例
docker run -d --name=redis-6.0.6 -p 6379:6379 -p 26379:26379 redis:6.0.6
此时进入docker内,redis-cli 连接到redis服务器,通过info 查看redis信息, 发现三个redis都master:
127.0.0.1:6379> info
....
# Replication
role:master
connected_slaves:0

2)在103,107 上设置master为102
103执行: SLAVEOF 10.120.75.102 6379
107执行: SLAVEOF 10.120.75.102 6379

3)此时info查看发现102 为master, 103、107为slave
102: info
···...
# Replication
role:master
connected_slaves:2
slave0:ip=10.120.75.103,port=6379,state=online,offset=28,lag=0
slave1:ip=10.120.75.107,port=6379,state=online,offset=28,lag=1
103、107: info
......
# Replication
role:slave
master_host:10.120.75.102
master_port:6379

2.3 sentinel 版本

Redis Sentinel 为 Redis 实例提供了高可用方案。通过故障转移 (failover) 能够实现 当 Redis 节点实例发生故障时,将备份的 Redis 节点提升到主节点的角色,继续为应用 程序提供 Redis 服务。

除此之外,Sentinel 还提供监控、通知、提供 Redis 新配置的能力。

当应用在接入 Redis Sentinel 架构的 Redis 服务时,应用程序不再直接连接 Redis 实例,而是通过 Sentinel 去获取当前主节点 (master) 的地址和端口信息 (ip:port), 再去连接节点。当 master 发生故障时,Sentinel 集群能够及时发现,并提供新的可用的 master 节点,继续提供 Redis 服务。

因此客户端在接入的时候,连接的是一组 sentinel 集群的 ip:port 信息。在实际环境中,因为 Sentinel 服务本身消耗较少,我们常将 Sentinel 和 Redis 服务放在同一个服务器上面,以节省服务器的使用。

1) 按照主从的方式部署3个redis节点,并确定初步的master, slave
方法同 2.2
2)分别在3个redis根目录创建配置文件 sentinel.conf
此处直接在本地创建,然后 docker cp sentinel.conf redis-6.0.6:/ 拷贝到根目录
port 26379 #哨兵端口号 一定要和启动命令映射第二个端口号一致
daemonize yes #后台启动
sentinel monitor mymaster 10.120.75.102 6379 2 # master_name 主节点ip 主节点端口 2
3) 启动redis-sentinel
依次三台在sentinel.conf 配置文件同一级目录执行:redis-sentinel sentinel.conf
root@584132e81cb8:/# redis-sentinel sentinel.conf 
65:X 10 Dec 2020 13:43:38.584 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
65:X 10 Dec 2020 13:43:38.584 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=65, just started
65:X 10 Dec 2020 13:43:38.584 # Configuration loaded
4) 此时关闭102 的redis
过 30s 后再依次查看各个节点info,发现 107 已经为master了:
# Replication
role:slave
master_host:10.120.75.107
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
随后拉起102上的redis,发现该节点已经变为slave了

3 测试

可以直接进入容器通过命令行测试,也可以通过python脚本测试;
python 测试需要安装pip包:pip install redis

3.1 单机版本

  1. python 脚本测试
    # -*- coding:utf-8 -*-
    
    import redis 
    
    r = redis.Redis(host='10.120.75.102', port=6379, db=0)
    print('set {}'.format(r.set('foo', 'bar')))
    print('get {}'.format(r.get('foo')))
    输出:
    set True
    get bar
    
  2. 进入docker 通过redis-cli测试
    docker exec -it redis-6.0.6 bash
    root@584132e81cb8:/data# redis-cli 
    127.0.0.1:6379> get foo
    "bar"
    127.0.0.1:6379> 
    

3.2 主从版本

  1. python 脚本测试、
    # -*- coding:utf-8 -*-
    
    import redis 
    
    r = redis.Redis(host='10.120.75.102', port=6379, db=0)
    print('set {}'.format(r.set('foo', 'bar')))
    print('get {}'.format(r.get('foo')))
    输出:
    set True
    get bar
    
    当把102 更改为103 的时候,set 会报错
    redis.exceptions.ReadOnlyError: You can't write against a read only replica.  
    即:master 可读可写,slave 只读不可写
    
  2. 进入docker 通过redis-cli测试
    102 master 上:
    docker exec -it redis-6.0.6 bash
    root@584132e81cb8:/data# redis-cli 
    127.0.0.1:6379> set foo bar1
    OK
    127.0.0.1:6379> get foo
    "bar1"
    127.0.0.1:6379> 
    
    103、107 slave 上:
    docker exec -it redis-6.0.6 bash
    root@04ec9eed1df2:/data# redis-cli 
    ......
    127.0.0.1:6379> get foo
    "bar1"
    127.0.0.1:6379> set foo bar
    (error) READONLY You can't write against a read only replica.  
    127.0.0.1:6379> 
    

3.3 sentinel 版本

sentinel 版本获取master和slave实例后,可以用master来读写,slave来读数据,此处提供一个python demo。

# -*- coding:utf-8 -*-

import redis 
from redis.sentinel import Sentinel

# 连接 sentinel 需要提供所有 sentinel 列表
sentinel = Sentinel([('10.120.75.102', 26379),
                     ('10.120.75.103', 26379),
                     ('10.120.75.107', 26379)],
                     socket_timeout=0.1)
# 当sentinel群组名称写错或不存在时,会报 redis.sentinel.MasterNotFoundError
sentinel.discover_master('mymaster')
master = sentinel.master_for('mymaster', socket_timeout=0.1)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
print('set {}'.format(master.set('foo', 'bar')))
print('master get {}'.format(master.get('foo')))
print('slave get {}'.format(slave.get('foo')))
输出:
set True
master get bar
slave get bar

4 说明

redis 官网
redis 官方文档
官方数据类型介绍文档
docker搭建Redis集群-主从复制以及哨兵模式

猜你喜欢

转载自blog.csdn.net/u011127242/article/details/110982215