文章目录
- Redis主从复制:
- 原理:
- 全同步过程:
- 增量同步过程:
- 主从复制配置:
- 关闭防火墙和Selinux(三台都要)
- 修改bindIP:
- node3
- node2
- master
- 以138为主,140,141为从
- 检查结果:
- 改变主服务器:
- 例如:
Redis主从复制:
master以写为主,slave以读为主。
原理:
Redis一般是使用一个Master节点来进行写操作,而若干个Slave节点进行读操作,Master和Slave分别代表了一个个不同的 Redis Server 实例。
另外定期的数据备份操作也是单独选择一个Slave去完成,这样可以最大程度发挥Redis 的性能,为的是保证数据的弱一致性和最终一致性。
另外,Master和 Slave的数据不是一定要即时同步的,但是在一段时间后Master和 Slave的数据是趋于同步的,这就是最终一致性。
全同步过程:
- Slave 发送Sync命令到Master。
- Master启动一个后台进程,将 Redis 中的数据快照保存到文件中。
- Master 将保存数据快照期间接收到的写命令缓存起来。
- Master完成写文件操作后,将该文件发送给Slave。
- 使用新的RDB或AOF文件替换掉旧的RDB或AOF文件。
- Master将这期间收集的增量写命令发送给Slave端。
增量同步过程:
- Master接收到用户的操作指令,判断是否需要传播到Slave。
- 将操作记录追加到AOF文件。
- 将操作传播到其他Slave:对齐主从库;往响应缓存写入指令。
- 将缓存中的数据发送给Slave。
主从复制配置:
准备三台虚拟机或三个实例
我这边准备了三个虚拟机:
关闭防火墙和Selinux(三台都要)
[root@rhel7 ~]# systemctl stop firewalld.service
[root@rhel7 ~]# setenforce 0
修改bindIP:
node3
[root@redis3 ~]# redis-server /etc/redis/redis.conf
[root@redis3 ~]# redis-cli -h 192.168.110.141
192.168.110.141:6379> ping
PONG
node2
[root@redis2 ~]# redis-server /etc/redis/redis.conf
[root@redis2 ~]# redis-cli -h 192.168.110.140
192.168.110.140:6379> ping
PONG
master
[root@rhel7 ~]# redis-server /etc/redis/redis.conf
[root@rhel7 ~]# redis-cli -h 192.168.110.138
192.168.110.138:6379> ping
PONG
192.168.110.138:6379>
执行以下命令检查信息:
192.168.110.138:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:19fcb46c603434fd1fc3ed7402d1d6452e49068b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
以138为主,140,141为从
则需要在140及141上如下配置:
192.168.110.140:6379> SLAVEOF 192.168.110.138 6379
OK
192.168.110.141:6379> SLAVEOF 192.168.110.138 6379
OK
检查结果:
#查看角色
192.168.110.138:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.110.140,port=6379,state=online,offset=478,lag=0
slave1:ip=192.168.110.141,port=6379,state=online,offset=478,lag=0
master_replid:17fd54608d77ecf7eef93bff047b96bdc2edbeaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:478
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:478
#在138上设置键
192.168.110.138:6379> set words 'i am master of 138'
OK
#140,141都拿到了该建
192.168.110.140:6379> keys *
1) "words"
192.168.110.141:6379> keys *
1) "words"
192.168.110.141:6379> get words
"i am master of 138"
注意:
从服务器只能读,若从服务器写入数据则会报错。
若从服务器宕机后需要再次执行slaveof命令才能变为从服务器。
改变主服务器:
slaveof no one
例如:
#在140上执行
192.168.110.140:6379> SLAVEOF no one
OK
192.168.110.140:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:16f6113a27fcc013d1cff83923802bc3213ea8ff
master_replid2:17fd54608d77ecf7eef93bff047b96bdc2edbeaf
master_repl_offset:1136
second_repl_offset:1137
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1136
#此时其他服务器还没有添加140为主,所以此时140是一个独立的服务器。