Redis--分布式开发

一: 数据库主从

1:redis数据库的配置信息:

1: redis的配置文件所在地:
cd /etc/redis
sudo vi redis.config

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2:redis主从配置:

1: 将当前的redis开启的杀死:

ps -aux | grep redis
kill -9

2:复制配置文件,将6381设置成主机,将6380设置成从机。

cd /etc/redis

在这里插入图片描述
3: 修改主机的配置文件:

sudo vi 6381.conf

在这里插入图片描述

4:修改从机的配置文件:
在这里插入图片描述
在这里插入图片描述
5:开启主机和从机服务端:
在这里插入图片描述

在这里插入图片描述
6: 验证主从配置成功:
在这里插入图片描述
在这里插入图片描述

二:哨兵机制:

  • 1:监视redis服务器的运行状态,可以进行自动的故障转移。实现高可用。
  • 2:一般与主从配合使用的机制。
  • 3: 哨兵是个独立的进程,每台redis服务器应该至少配置一个哨兵机制。
  • 4: 出现故障后,向其他的哨兵发送通知。
  • 5:出现故障后,自动进行故障转移, 并向客户端提供新的访问地址。

1:内部协议:

  • 流言协议:当某个哨兵程序ping 发现监视的主服务器下线后(心跳检测), 会向监听该服务器的其他哨兵询问, 是否确认主服务器下线, 当 确认的哨兵数量 达到要求(配置文件中设置)后, 会确认主服务器下线(客观下线), 然后进入投票环节。
  • 投票协议:
  • 1:当确认主服务器客观下线后, 哨兵会通过 投票的方式 来授权其中一个哨兵主导故障转移处理。
  • 2:只有在 大多数哨兵都参加投票 的前提下, 才会进行授权, 比如有5个哨兵, 则需要至少3个哨兵投票才可能授权。
  • 3:目的是避免出现错误的故障迁移。

2: 哨兵的配置信息:

  • 哨兵数2,指的是确认下线的最小哨兵数量。
  • 6000指的是60秒。
# bind 127.0.0.1  # 哨兵绑定的ip, 如果注释则表示接受任意IP发来的请求
port 26381  # 哨兵监听的端口号, redis客户端需要访问哨兵的ip和端口号
sentinel monitor mymaster 192.168.105.140 6381 2  # 设置哨兵  (主数据库别名 主数据库ip 主数据库端口 确认下线的最小哨兵数量)

sentinel down-after-milliseconds mymaster 60000  # 服务器断线超时时长
daemonize yes  # 设置后台服务
logfile "/var/log/redis-sentinel-26379.log"  # 哨兵生成的日志文件路径
sudo redis-sentinel sentinel.conf

在这里插入图片描述

3: 配置三个哨兵监视主服务器:

如果本地启动redis

# 在/etc/redis中创建三个配置文件
# sentinel_26380.conf
port 26380  
sentinel monitor mymaster 192.168.44.128 6381 2  
sentinel down-after-milliseconds mymaster 30000  
daemonize yes 
logfile "/var/log/redis-sentinel-26380.log"
  
# sentinel_26381.conf
port 26381  
sentinel monitor mymaster 192.168.44.128  6381 2  
sentinel down-after-milliseconds mymaster 30000  
daemonize yes 
logfile "/var/log/redis-sentinel-26381.log"

# sentinel_26382.conf
port 26382
sentinel monitor mymaster 192.168.44.128 6381 2  
sentinel down-after-milliseconds mymaster 30000  
daemonize yes 
logfile "/var/log/redis-sentinel-26382.log"


# 启动哨兵
sudo redis-sentinel sentinel_26380.conf
sudor redis-sentinel sentinel_26381.conf
sudo redis-sentinel sentinel_26382.conf

如果需要远程连接CentOs:
1:sudo vi sentinel_26381.conf ,修改成主库的ip和端口。

在这里插入图片描述

2:启动命令:
sudo /usr/local/bin/redis-sentinel /etc/redis/sentinel_26382.conf

在这里插入图片描述
3: 验证启动成功:

from redis.sentinel import Sentinel

sentinel_list = [
    ("192.168.44.129", 26380),
    ("192.168.44.129", 26381),
    ("192.168.44.129", 26382),
]

# 1: 创建哨兵客户端对象
sentinel = Sentinel(sentinels=sentinel_list)
# 2: 构建哨兵监视主服务器
master_name = "mymaster"
# 3: 利用客户端获取redis主客户端对象,和从客户端对象
redis_master = sentinel.master_for(master_name, decode_responses=True)
redis_slave = sentinel.slave_for(master_name, decode_responses=True)
# 4: 主库写操作:
redis_master.set("user:666", "小明")
# 5: 从库读操作
print(redis_slave.get("user:666"))

在这里插入图片描述

4: 项目中使用:

1: 在app/__init__.py中创建两个redis主从客户端对象

# 创建redis数据库对象
# redis_cli = None
redis_master = None
redis_slave = None

2:在app/config中修改redis配置:

 # # redis数据库的配置信息
    # REDIS_HOST = "192.168.44.129"
    # REDIS_PORT = 6381
    SENTINEL_HOST_PORT = [
        ("192.168.44.129", 26380),
        ("192.168.44.129", 26381),
        ("192.168.44.129", 26382),
    ]
    MASTER_NAME = "mymaster"

3: 修改app/__init__.py中的注册app的配置:

def register_extensions(app:Flask):

    # 1: 数据库对象关联app,延后关联
    db.init_app(app)

    global redis_cli
    # 2: redis数据库关联app,延后关联,响应解码
    # redis_cli = StrictRedis(host=app.config['REDIS_HOST'], port=app.config['REDIS_PORT'], decode_responses=True)

    # 2.1: 创建哨兵客户端对象
    sentinel = Sentinel(sentinels=app.config['SENTINEL_HOST_PORT'])
    # 2.2: 创建redis主库客户端对象
    global redis_master
    redis_master = sentinel.master_for(app.config[' MASTER_NAME'], decode_responses=True)
    global redis_slave
    redis_slave = sentinel.slave_for(app.config[' MASTER_NAME'], decode_responses=True)
    

三: 集群:

1:集群的搭建:

在这里插入图片描述

# 新建:/etc/redis/7000.conf
port 7000
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes



# 新建:/etc/redis/7001.conf
port 7001
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes


# 新建:/etc/redis/7002.conf
port 7002
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes


# 新建:/etc/redis/7003.conf
port 7003
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes


# 新建:/etc/redis/7004.conf
port 7004
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes


# 新建:/etc/redis/7005.conf
port 7005
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
# ubantu集群配置
# 新建6个配置文件:/etc/redis/7000.conf

# 启动redis服务器
sudo /usr/local/bin/redis-server /etc/redis/7000.conf &
sudo /usr/local/bin/redis-server /etc/redis/7001.conf &
sudo /usr/local/bin/redis-server /etc/redis/7002.conf &
sudo /usr/local/bin/redis-server /etc/redis/7003.conf &
sudo /usr/local/bin/redis-server /etc/redis/7004.conf &
sudo /usr/local/bin/redis-server /etc/redis/7005.conf &

# 先查看⾃⼰的 gem 源是什么地址
gem source -l 

# 更新源
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
    
# 安装依赖
sudo gem install redis

# redis-trib.rb路径如下:
cd /usr/local/redis/src

sudo cp /usr/local/redis/src/redis-trib.rb  /usr/local/bin

# 创建集群
redis-trib.rb create --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
     
    
           
redis-trib.rb  创建集群的命令
create 创建集群
--replicas 1    带卡槽和没有卡槽的比例 1:1  集群中6台服务器 3台带卡槽的 3台未带卡槽
  主[带卡槽  读写]-[备份]

# 进入redis集群客户端记得加上 -c
redis-cli -h 127.0.0.1 -p 7000 -c

远程使用centos:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2: 代码中如何实现集群:

两种方案:第二种更标准。

from rediscluster import RedisCluster

# 1: 创建集群客户端对象
# 方案一: 根据集群的任意一个ip和端口就能创建集群对象,蔓延机制。
redis_cluter = RedisCluster(host="192.168.44.129", port=7005, decode_responses=True)
redis_cluter.set("name:888", 888)
print(redis_cluter.get("name:888"))
from rediscluster import RedisCluster

# 1: 创建集群客户端对象
# 方案一: 根据集群的任意一个ip和端口就能创建集群对象,蔓延机制。
# redis_cluter = RedisCluster(host="192.168.44.129", port=7005, decode_responses=True)

# 方案二:根据带卡槽的数据库连接信息,创建集群对象
startup_nodes = [
    {"host": "192.168.44.129", "port": 7000},
    {"host": "192.168.44.129", "port": 7001},
    {"host": "192.168.44.129", "port": 7002},
]
redis_cluter = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
redis_cluter.set("name:999", 999)
print(redis_cluter.get("name:999"))

3: 项目的集成:

1: 在settings中的BaseConfig中增加配置信息:

  SENTINEL_HOST_PORT = [
        ("192.168.44.129", 26380),
        ("192.168.44.129", 26381),
        ("192.168.44.129", 26382),
    ]

2: 在app/init文件中创建redis集群的客户端对象:

# 创建redis集群客户端对象
redis_cluster = None
def register_extensions(app:Flask):
	...
    global redis_cluster
    redis_cluster = RedisCluster(startup_nodes=app.config['SENTINEL_HOST_PORT'], decode_responses=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何碎银没有几两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值