Redis之主从同步
Redis之主从复制#
1. 概述#
定义#
- 一个redis服务可以有多个该服务的复制品,这个redis称为master,其他复制品称为slaves
- 网络正常,master会一致将自己的数据更新同步给slaves,保持主从同步
- 只有master可以执行写命令,slave只能执行读命令
作用#
- 分担了读的压力(高并发)
原理#
- 从服务器执行客户端发送的读命令,比如GET、LRANGE、SMEMMVERS、HGET、ZRANGE等等,客户端可以连接slaves执行读请求,来降低master的读压力
2. 实现#
法一(命令行)
redis-server --port 630 --slaveof 127.0.0.1 6379
# 从server端
redis-server --port 6300 --slaveof 127.0.0.1 6379
# 从client端
redis-cli -p 6300
127.0.0.1:6300> keys *
# 发现是复制了原6379端口的redis数据
127.0.0.1:6379> set sex man
OK
127.0.0.1:6300> keys *
1) "name"
2) "sex"
# 从server只能读取数据,不能写入`
法二(命令行)
127.0.0.1:6379> keys *
1) "name"
2) "sex"
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> slaveof 127.0.0.1 6379 # 切换为从server
OK
127.0.0.1:6379> set newkey 456
(error) READONLY You can't write against a read only slave.
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "sex"
127.0.0.1:6379> slaveof no one # 切换回主server
OK
法三(修改配置)
vim /etc/redis/redis.conf
slaveof 127.0.0.1 6379
port 6300
# 启动Redis服务
redis-server redis_6300.conf
# 客户端连接测试
redis-cli -p 6300
127.0.0.1> hset user_001 username guods
(error) READONLY You can't write against a read only slave.
问题:
- 一个master可以有多个slaves
- slaves下线,只是读请求的处理性能下降
- master下线,写请求无法执行
- 其中一台slave使用
slaveof no one
命令成为master,其他slaves执行slaveof命令指向新的master,从他这里同步数据
以上过程是手动的,能够实现自动,这就需要sentine哨兵,实现故障转移failover操作
3. 哨兵#
- sentinel会不断检查master和slaves是否正常
- 每一个sentinel可以监控任意多个master和master下的slaves
3.1 环境#
三台redis服务器
server1 (6379)
chancey@server:~$ sudo /etc/init.d/redis-server start
server2 (6380)
chancey@server:~$ redis-server --port 6380
chancey@server:~$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
server3 (6381)
chancey@server:~$ redis-server --port 6381
chancey@server:~$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
3.2 搭建哨兵#
安装并搭建sentine哨兵
# 安装redis-sentinel
sudo apt-get install redis-sentinel
# 新建配置文件sentinel.conf
port 26379
sentinel monitor demo 127.0.0.1 6379 1 # demo为监控器名,1为投票机制
# 启动sentinel
法一:redis-sentinel sentinel.conf
法二:redis-server sentinel.conf --sentinel
#将master的redis服务终止,查看是否会提升为主
sudo /etc/init.d/redis-server stop
# 发现提升6381为master,其他两个为从
# 在6381上设置新值,6380查看
127.0.0.1:6381> set name demo
OK
127.0.0.1:6380> get name
demo
作者:ChanceySolo
出处:https://www.cnblogs.com/chancey/p/11448611.html
版权:本作品采用「ChanceySolo-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!