Redis分布式

1.1 数据库主从
  • 作用
    • 数据备份
    • 读写分离
  • 特点
    • 只能一主多从
  • 配置
# 主从数据库分别配置ip/端口
bind 127.0.0.1
port 6379
# 从数据库配置slaveof参数
slaveof 127.0.0.1 6379

# 以下两条连起来: 当至少有2个从数据库可以进行复制并且响应延迟都在10秒以内时, 主数据库才允许写操作
min-slaves-to-write 2
min-slaves-max-lag 10

# ubuntu的redis安装目录, 其中包含了redis和sentinel的配置模板
/usr/local/redis/
# ubuntu中 启动/重启/停止 默认的redis服务
/etc/init.d/redis-server start/stop/restart
1.2 哨兵
  • 作用
    • 监控redis服务器的运行状态,可以进自动故障转移(failover), 实现高可用
    • 数据库主从配合使用的机制
  • 特点
    • 独立的进程, 每台redis服务器应该至少配置一个哨兵程序
    • 监控redis主服务器的运行状态
    • 出现故障后可以向管理员/其他程序发出通知
    • 针对故障, 可以进行自动转移, 并向客户端提供新的访问地址
  • 哨兵机制
    • 流言协议
      • 当某个哨兵程序发现监视的主服务器下线后(心跳检测), 会向监听该服务器的其他哨兵询问, 是否确认主服务器下线, 当确认的哨兵数量达到要求(配置文件中设置)后, 会确认主服务器下线(客观下线), 然后进入投票环节
    • 投票协议
      • 当确认的主服务器下线后, 哨兵会通过投票的的方式来授权其中一个哨兵主导故障转移处理
      • 只有在大多数哨兵都参加投票的前提下, 才会进行授权, 比如有5个哨兵, 则需要至少3个哨兵投票才可能授权
    • 建议最低配置
      • 至少在3台服务器上分别启动至少一个哨兵
      • 如果只有一台, 则服务器宕机后, 姜无法进行故障转移
      • 如果只有两台, 一旦一个哨兵挂掉了, 则投票会失败
    • 相关配置(sentinel.conf)
bind 127.0.0.1  # 哨兵绑定的ip
port 26381  # 哨兵监听的端口号, redis客户端需要访问哨兵的ip和端口号
sentinel monitor mymaster 127.0.0.1 6380 2  # 设置哨兵  (主数据库别名 主数据库ip 主数据库端口 确认下线的最小哨兵数量)
sentinel down-after-milliseconds mumaster 60000  # 服务器断线超时时长
sentinel failover-timeout-mymaster 180000  # 故障转移的超时时间
sentinel parallel-syncs mymaster 1  # 执行故障转移时, 最多几个从数据库可以同步主数据库(数量少会增加完成转移的时长; 数量多可能会影响主数据库的数量查询)

min-slave-to-write 2  # 可执行故障转移的从数据库的最小数量(低于当数量时, 主数据库将禁止写入操作)
min-slave-max-lag 10  # 从数据库的最大响应时长
# 以上两条连起来: 当至少有2个从数据库可以进行复制并且响应延时都在10秒之内时, 主数据库才允许写操作
  • 启动哨兵
redis-sentinel sentinel.conf
  • python代码实现
from redis import Sentinel

# 设置哨兵的ip和端口
REDIS_SENTINEL= [
	('127.0.0.1', 26380),
	('127.0.0.1', 26381),
	('127.0.0.1', 26382)
]
# 设置主数据库的别名
REDIS_SENTINEL_NAME= 'mymaster'
# 创建哨兵
sentinel = Sentinel(REDIS_SENTINEL)
# 通过哨兵来获取朱从数据库
master_redis = sentinel.master_for(REDIS_SENTINELNAME)
slave_redis = sentinel.slave_for(REDIS_SENTINELNAME)
# 正常的使用redis操作
master_redis.set('name', 'zhangsan')
print(slave_redis.get('name').decode('utf-8'))

读写分离建议:

  • 如果只需要读, 可以选择从数据库谅解
  • 如果既有读也有写, 建议只是用主数据库连接
    1>. 可以使用管道批量发送命令
    2>. 数据库主从不支持事务和乐观锁
1.3 集群
  • 多个节点共同保存数据
    • 作用
      • 扩展存储空间
      • 提高吞吐量, 提高写能力
    • 和单机的不用点
      • 不再区分数据库, 只有0号库, 单机默认0-15
      • 不支持事务/管道/多值操作
    • 特点
      • 要求至少三主三从
      • 要求必须开启 AOF持久化
      • 自动选择集群节点进行存储
      • 默认集成哨兵,自动故障转移
  • 配置
# 每个节点分别配置ip/端口
bind 127.0.0.1
port 6379
# 集群配置
cluster-enabled yes  # 开启集群
cluster-config-file nodes-7000.conf  # 节点日志文件
cluster-node-timeout 15000  # 节点超时时长 15秒
# 开启AOF 及相关配置
appendonly yes
  • 创建集群
    • redis的安装包中包含了redis-trib.rb, 用于创建集群
    • 创建集群后, 重启redis会自动启动集群
# 将命令复制, 这样可以在任何目录下调用此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
# 安装ruby环境, 因为redis-trib.rb使用ruby开发的
sudo apt-get inistall ruby
gem sources --add https://gems.ruby-china.com/  --remove https://rubygems.org/
sudo gem install redis

# 启动主从数据库 7000-7005.conf
sudo redis-server 7001.conf
...

# 创建集群(命令行)
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 
# 访问集群 访问集群必须加-c选项, 否则无法进行读写操作
redis-cli -p 7000 -c
  • redis集群不能支持事务和WATCH, 并发控制只能自己设计悲观锁(分布式锁)
  • python操作redis集群
    • 安装 pip install redis-cluster
from rediscluster import StrictRedisCluster

# 设置集群中的主数据库的ip和端口
startup_nodes = [
	{'host': '127.0.0.1', 'port': 7000},
	{'host': '127.0.0.1', 'port': 7001},
	{'host': '127.0.0.1', 'port': 7002}
]

# 创建集群对象
cluster = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
# 正常操作redis即可
cluster.set('name', 'zhangsan')
print(cluster.get('name'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值