概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master / leader),后者称为从节点(slave / follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。(用于读写分离,降低单个服务器的压力)
默认情况下,每台Redis服务器都是主节点
;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余的方式。
- 故障恢复:当主节点故障时,从节点可以暂时替代主节点提供服务,是一种服务冗余的方式
- 负载均衡:在主从复制的基础上,配合读写分离,由主节点进行写操作,从节点进行读操作,分担服务器的负载;尤其是在多读少写的场景下,通过多个从节点分担负载,提高并发量。
- 高可用基石:主从复制还是哨兵和集群能够实施的基础。
为什么要使用集群
- 单台服务器难以负载大量的请求
- 结构上:单台服务器故障率高,系统崩坏概率大
- 容量上:单台服务器内存容量有限。
环境配置
只配置从库,不配置主库!
查看当前库的信息
127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master #当前服务器角色 master
connected_slaves:0 #从机的数量
master_failover_state:no-failover
master_replid:4b503b2a08479b91d793ad3dd2058f51f9d5e826
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
配置redis集群
需要搭建一主二从的redis集群,因此需要3个配置文件
配置文件中需要修改的地方(在不同的docker容器中修改端口就够了):
port 6380 #设置redis端口
pidfile /var/run/redis_6380.pid #重命名pid文件,方便区分
logfile "6380.log" #redis的日志文件,便于区分
然后启动三个docker容器:
更换端口和数据卷挂载文件分别启动
docker run -p 6379:6379 --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
image.png
一主二从
默认情况下,每台redis服务器都是主节点
配置从机就相当于认老大,一主(80)二从(81,82)
配置从结点:
127.0.0.1:6381> SLAVEOF 1.15.233.193 6380 #配置主结点
OK
127.0.0.1:6381> info replication #查询当前结点的信息
# Replication
role:slave #结点变为从节点了
master_host:1.15.233.193 #自己主节点的地址
master_port:6380 #跟随的主节点的端口
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:56
slave_repl_offset:56
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:635800713dfc55f6ec94eb3fafecb4b2c8ace7a4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
查看主节点信息
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2 #从结点的数量,有两个
slave0:ip=1.15.233.193,port=6381,state=online,offset=126,lag=1
slave1:ip=1.15.233.193,port=6382,state=online,offset=126,lag=0
master_failover_state:no-failover
master_replid:635800713dfc55f6ec94eb3fafecb4b2c8ace7a4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
上面这样就完成了一个简单的主从结点配置。
真正的主从结点配置应该在配置文件中配置才是永久的,使用命令行配置重启数据库它就不见了。
replication 主机pi 主机端口 #配置主结点
masterauth password #主机的密码(没有密码不用写)
细节
主机可读可写,从机只能读不能写!主机中的所有信息和数据都会被从机自动保存!
###########主机3680####################
127.0.0.1:6380> keys *
(empty array)
127.0.0.1:6380> set k1 v1
OK
127.0.0.1:6380> get k1
"v1"
##############从机3681##########
127.0.0.1:6381> get k1
"v1"
############从机3682##########
127.0.0.1:6382> get k1
"v1"
#########尝试用从机写数据###########
127.0.0.1:6381> set k2 v2
(error) READONLY You can't write against a read only replica.
您不能对只读副本进行写入。
测试:主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息!
一台新的redis主机只要变为从机,立马就会从主机中获取值!
复制原理
Slave(从机)启动成功连接到master(主机)后会发送一个sync同步命令
Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步
。
全量复制︰而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行!我们的数据一定可以在从机中看到!
网友评论