前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、redis单机部署存在的问题
Redis 单机部署一般存在如下几个问题:
- 机器故障,导致 Redis 不可用,数据丢失
- 容量瓶颈:容量不能水平扩展
- QPS 瓶颈:一台机器的处理能力、网络宽带总是有限的,如果能够划分一些流量到其他机器,可以有效解决 QPS 问题
二、redis提供了主从复制
Redis 提供的主从复制功能,实现了一份数据存在多个相同的副本,它是实现 Redis 高可用的基础,作用有如下几个
- 数据冗余:主从复制实现了数据的热备份,是 Redis 持久化之外的一种数据冗余方式
- 故障恢复:当主节点出现故障时,可以将从节点晋升为主节点继续提供服务,实现快速的故障恢复
- 读写分离:主从复制可以实现读写分离,主节点写,从节点读,读写分离提高了服务器的负载能力
- 高可用的基石:主从复制是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础
三、配置主从复制(快速搭建)
1. 使用命令实现主从复制
代码如下(示例):
先创建三个redis-server服务实例
./install-server.sh 6379 主节点
./install-server.sh 6385 从节点
./install-server.sh 6386 从节点
2. 修改配置文件
代码如下(示例):
找到以下文件
-rw-r--r--. 1 root root 84723 Jul 15 11:15 6379.conf
-rw-r--r--. 1 root root 84723 Jul 15 10:08 6385.conf
-rw-r--r--. 1 root root 84723 Jul 15 10:09 6386.conf
使用vim修改文件
vim 6379.conf
vim 6385.conf
vim 6386.conf
打开以后
1)将配置文件的端口号进行修改 port
2)将logfile注释掉
3)将appendonly 设置为 no
5)dbfilename 修改称自己的
目的是三个实例作为前台进程运行
3. 启动
路径为你的路劲
redis-server /路径/6379.conf
redis-server /路径/6380.conf
redis-server /路径/6381.conf
启动三个客户端
redis-cli 6379
redis-cli 6380
redis-cli 6381
4. 使用命令的方式设置从节点
在从节点的客户端中执行如下命令即可设置当前节点为从节点,连接主节点的地址和端口号:
REPLICAOF 127.0.0.1 6379 或者 slaveof 127.0.0.1 6379
5. 设置完成后看如下操作
#主节点
127.0.0.1:6379> set k1 wanghexi #set了个k1
OK
127.0.0.1:6379> get k1 这里直接#get到
"wanghexi"
127.0.0.1:6379>
#从节点
127.0.0.1:6386> get k1 #从节点可以get到主节点
"wanghexi"
127.0.0.1:6386> set k2 whx #这里注意从节点不能set 说明了从只能进行读的操作 而不能进行写的操作
(error) READONLY You can't write against a read only replica.
127.0.0.1:6386>
#所以这个从节点也不可以进行写的操作只能读去主节点的内容
127.0.0.1:6385> get k1
"wanghexi"
127.0.0.1:6385> set k2 whx
(error) READONLY You can't write against a read only replica.
127.0.0.1:6385>
6. 查看当前redis实例的状态命令
# 主节点
127.0.0.1:6379> set k1 wanghexi
OK
127.0.0.1:6379> get k1
"wanghexi"
127.0.0.1:6379> info replication #查看当前redis实例的状态
# Replication
role:master # 角色, master 表示当前节点为 master 节点
connected_slaves:2 # 表示该主节点下面有几个从节点
# 从节点的信息,包括 IP、port、state 状态,offset 偏移量
slave0:ip=127.0.0.1,port=6386,state=online,offset=3168,lag=1
slave1:ip=127.0.0.1,port=6385,state=online,offset=3168,lag=1
# 主节点的复制 ID,是一个 40 为 16 进制的字符串,注意他和 Redis 的 runid 没有直接关系
master_replid:64b8e29bcd47216fe95b4772ca5306d8ea191f92
# 复制 ID2,默认全为 0,用于存储上次主实例的replid1
master_replid2:0000000000000000000000000000000000000000
#主节点数据的偏移量,他和 slave 之间的差值就表示两者之间同步的数据差异
master_repl_offset:3168
second_repl_offset:-1
# 存储的是复制缓存相关的信息
repl_backlog_active:1 # 是否开启复制缓冲区,1 表示已开启
repl_backlog_size:1048576 # 复制缓冲区的最大长度
repl_backlog_first_byte_offset:1 # 起始偏移量,用于计算当前缓冲区可用范围
repl_backlog_histlen:3168 # 已保存数据的有效长度
127.0.0.1:6379>
# 从节点
127.0.0.1:6386> get k1
"wanghexi"
127.0.0.1:6386> set k2 whx
(error) READONLY You can't write against a read only replica.
127.0.0.1:6386> info replication #查看redis当前实例的状态
# Replication
role:slave # 角色为 slave 节点
master_host:127.0.0.1 # master 节点 IP
master_port:6379 # master 节点 port
master_link_status:up # master 是否在线状态
master_last_io_seconds_ago:7
master_sync_in_progress:0 # 数据同步状态,0 表示没有在进行数据同步
slave_repl_offset:3602 # 从节点同步数据的偏移量
slave_priority:100
slave_read_only:1 # 从节点是否只读。从节点默认是只读,我们知道复制是单向的只能有主节点到从节点,如果从节点修改了值,主节点是不会有感知的,会导致主从节点数据不一致现象,所以不推荐修改该值
connected_slaves:0
master_replid:64b8e29bcd47216fe95b4772ca5306d8ea191f92 # 主节点的复制 ID
master_replid2:0000000000000000000000000000000000000000 # 复制 ID2
master_repl_offset:3602 # 主节点数据的偏移量
second_repl_offset:-1 # 从节点同步数据的偏移量
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3602
127.0.0.1:6386>
7. 如果从节点突然挂掉了,可以重新恢复
redis-server /etc/redis/6385.conf REPLICAOF 127.0.0.1 6379
8. 如果主节点突然挂掉了,可以将从节点提升为主节点
在从节点的客户端连接中执行如下命令:
REPLICAOF no one 或者slaveof no one 此时从节点变为主节点,其他从节点需要重新连接到新的主节点