目录
[1 Redis 主从复制介绍](#1 Redis 主从复制介绍)
[2 Redis主从复制原理](#2 Redis主从复制原理)
[2.1 主从同步过程](#2.1 主从同步过程)
[3 Redis实现主从复制](#3 Redis实现主从复制)
[3.1 环境配置](#3.1 环境配置)
[3.2 修改各节点的配置文件](#3.2 修改各节点的配置文件)
[3.2.1 MASTER](#3.2.1 MASTER)
[3.2.2 SLAVE](#3.2.2 SLAVE)
[3.3.3 重启Redis](#3.3.3 重启Redis)
[3.3 查看是否实现了主从复制](#3.3 查看是否实现了主从复制)
[3.3.1 MASTER](#3.3.1 MASTER)
[3.3.2 SLAVE](#3.3.2 SLAVE)
[3.3.3 Redis 常用操作](#3.3.3 Redis 常用操作)
[3.3.4 数据添加查看效果](#3.3.4 数据添加查看效果)
1 Redis****主从复制介绍
随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主。
2 Redis主从复制原理
-
Redis 一般是使用一个 Master 节点来进行写操作,而若干个 Slave 节点进行读操作,Master 和 Slave 分别代表了一个个不同的 Redis Server 实例。
-
定期的数据备份操作也是单独选择一个 Slave 去完成,这样可以最大程度发挥 Redis 的性能,为的是保证数据的弱一致性和最终一致性。
-
Master 和 Slave 的数据不是一定要即时同步的,但是在一段时间后 Master 和 Slave 的数据是趋于同步的,这就是最终一致性。
2.1 主从同步过程
-
slave节点发送同步请求到master节点
-
slave节点通过master节点的认证开始进行同步
-
master节点会开启bgsave进程发送内存rbd内存快照到slave节点,在此过程中是异步操作,也就是说
-
master节点仍然可以进行写入动作
-
slave节点收到rdb后首先清空自己的所有数据
-
slave节点加载rdb并进行数据恢复
-
在master和slave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存
-
然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave中
3 Redis实现主从复制
3.1 环境配置
节点名称 | 角色 | IP地址 |
---|---|---|
node1 | MASTER | 192.168.239.10 |
node2 | SLAVE-1 | 192.168.239.20 |
node3 | SLAVE-2 | 192.168.239.30 |
3.2 修改各****节点的配置文件
3.2.1 MASTER
bash
[root@node-1 ~]# vim /etc/redis/redis.conf
bind * -::* # 允许所有IP所有端口连接
protected-mode no # 关闭安全模式即密码验证
3.2.2 SLAVE
bash
[root@node-2 ~]# vim /etc/redis/redis.conf
bind * -::* # 允许所有IP所有端口连接
protected-mode no # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379 # 向 MASTER 进行同步
bash
[root@node-3 ~]# vim /etc/redis/redis.conf
bind * -::* # 允许所有IP所有端口连接
protected-mode no # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379 # 向 MASTER 进行同步
3.3.3 重启Redis
bash
[root@node-1 ~]# systemctl restart redis_6379.service
[root@node-2 ~]# systemctl restart redis_6379.service
[root@node-3 ~]# systemctl restart redis_6379.service
3.3 查看是否实现了主从复制
3.3.1 MASTER
bash
[root@node-1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.239.30,port=6379,state=online,offset=0,lag=1
slave1:ip=192.168.239.20,port=6379,state=online,offset=0,lag=0
master_failover_state:no-failover
master_replid:6cae489b55bf61b8432df467e53d93081effc1ce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
3.3.2 SLAVE
bash
[root@node-2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.239.10
master_port:6379
master_link_status:up
[root@node-3 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.239.10
master_port:6379
master_link_status:up
3.3.3 Redis 常用操作
命令 | 功能 |
---|---|
config get * | 查看配置 |
select 1 | 选择数据库 |
flush db | 清空当前数据库 |
flush all | 清空所有数据库 |
move key 1 | 移动 key |
del key | 删除 |
rename oldkey newkey | 改名 |
expire key 10 | 设置过期时间 |
persist key | 设置持久化 |
keys user* | 查询 |
exists key | 判断是否存在 |
3.3.4 数据添加查看效果
MASTER
bash
[root@node-1 ~]# redis-cli
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set name shuyan
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"
SLAVE
bash
[root@node-2 ~]# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"
bash
[root@node-3 ~]# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"
从节点尝试写入数据
有一个疑问,从节点是否能写入数据呢?
下面拿node-2 来进行一个测试,实验结果很显然是不行的
结论:主从复制中,只能由主节点来对数据进行写入,而从节点是不能写入的。从节点只能查看不能添加数据,在收到主节点发送过来的rdb之后会清空自己的数据再进行同步。