目录
一: 数据库主从
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)