什么是主从复制?
简单的意义上来讲就是一个主人带着几个奴隶,奴隶的全部都是主人给他的,刚开始的时候奴隶是一无所有,是主人将自己的一部分给到奴隶了。因此奴隶翻身了,变得有钱了,也就是有一定价值了,但是主人能够控制奴隶。能让变得很有money,也能让它变得一无所有。
主从复制,是指将一台 Redis 服务器(主人)的数据,复制到其他的 Redis 服务器(奴隶)
主人服务器被称为主节点(英文名叫:master / leader),奴隶称为从节点(slave / follower)。
注意:这里的复制是单向的,只能够从主节点复制数据到子节点
主节点master主要是以写为主,子节点slave主要一读为主
主页点可以拥有多个子节点,但是子节点却只能拥有一个主节点
在通常的情况下,每个Redis服务器都是主节点
为什么要使用主从复制?
1:数据冗余:它可以实现数据的热备份,是持久化的一种数据方式
2:故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复。这也是一种服务的冗余。
3:负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载。尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。
4:高可用:主从复制是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础。
一般来说,要将 Redis 运用于工程项目中,只使用一台 Redis 是万万不能的,原因如下:
-
结构上:单个 Redis 服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大。
-
容量上:单个 Redis 服务器内存容量有限,一般来说,单台 Redis 最大使用内存不应该超过 20G。
环境搭建
搭建集群环境
复制几个配置文件
[root@localhost myc]# ls
redis79.conf redis80.conf redis81.conf redis82.conf
这四个文件,一个是主三个是从
每个几点都有自己端口号和配置
修改配置文件
redis79.conf
一:端口号
2: 开启后台运行
3:修改持久化RDB文件名称
4:修改日志文件名称
5:修改pid文件名称
其他的三个配置文件也是如此
redis6380.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dbfilename dump6380.rdb
redis6381.conf
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
logfile "6381.log"
dbfilename dump6381.rdb
redis6382.conf
daemonize yes
port 6382
pidfile /var/run/redis_6381.pid
logfile "6382.log"
dbfilename dump6382.rdb
打开4个客户端分
在各个客户端界面,通过4个配置文件启动redis服务
页面一:
[root@localhost redis]# ./bin/redis-server ./myc/redis79.conf
页面二:
[root@localhost redis]# ./bin/redis-server ./myc/redis80.conf
页面三:
[root@localhost redis]# ./bin/redis-server ./myc/redis81.conf
页面四:
[root@localhost redis]# ./bin/redis-server ./myc/redis82.conf
看一下是否生成日志文件
查看开启的服务
环境搭建完成
前面有一句话提到过每台redis服务器都是主节点
登录不同端口的客户端,查看一下信息是否为主节点
79端口:主节点
代码含义:
127.0.0.1:6379> info replication 查看主从复制信息
# Replication
role:master 角色为主节点
connected_slaves:0 连接的子节点个数为0
master_failover_state:no-failover //剩下的都是一些配置信息
master_replid:aacf4caa93481ac43819eebbb266d8230b85d34f
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
查看其他节点的主从复制信息,都与79端口配置相同
一主三从
默认的配置为一主三从
主节点不需要进行配置,只需要配置子节点即可,子节点配置也很简单,只需要找到靠山就行
对安装的配置进行配置,一主(79端口号)三从(80,81,82)端口号
认主:
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 80端口认主成功
OK
127.0.0.1:6380>
查看主从复制配置信息
80端口:
127.0.0.1:6380> INFO replication
# Replication
role:slave 角色为从机
master_host:127.0.0.1 主节点的ip
master_port:6379 主节点的端口号
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:84
slave_repl_offset:84
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a2634fdf22a44fd46f3e73f78f0abed72b78b35e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:70
127.0.0.1:6380>
查看主节点配置信息:
127.0.0.1:6379> INFO replication
# Replication
role:master 角色为主节点
connected_slaves:1 一个子节点
slave0:ip=127.0.0.1,port=6380,state=online,offset=350,lag=1 子节点配置信息
master_failover_state:no-failover
master_replid:a2634fdf22a44fd46f3e73f78f0abed72b78b35e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350
127.0.0.1:6379>
接下来将其他的两个子节点进行认主
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381>127.0.0.1:6382> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6382>
查看主节点主从复制配置信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:3 三个子节点
slave0:ip=127.0.0.1,port=6380,state=online,offset=588,lag=1 子节点配置信息
slave1:ip=127.0.0.1,port=6381,state=online,offset=588,lag=1
slave2:ip=127.0.0.1,port=6382,state=online,offset=588,lag=0
master_failover_state:no-failover
master_replid:a2634fdf22a44fd46f3e73f78f0abed72b78b35e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:588
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:588
127.0.0.1:6379>
这里的主从复制配置是通过命令行进行配置的,这只是暂时的,具体的配置是通过配置文件进行配置的。
打开redis80.conf配置文件
配置修改为
replicaof 127.0.0.1 6379
只需要将三个从节点的配置文件配置成这样即可。
在主节点的进行写的操作:创建一个key
通过从机是否能够查看主节点创建的key?
前面就提到过,主节点的主要功能为写操作,而子节点的主要的功能为读操作,所以子节点是一定义访问主节点创建的内容,如果子节点没有访问到主节点创建的内容,说明您的配置出现了问题。
子节点1:能够访问到主节点创建的key值,但是子节点的权限只有读的权限,却没有写的权限,,所以当子节点创建key时;就会报错read only 只有读的权限。
其他的节点也是如此,这里就不进行一一展示了。
如果当主机出现了问题(宕机)等问题,导致主节点断掉了,会出现什么状况???
断掉主节点
子节点:正常使用,与主节点没断掉一样,对他没有任何的影响
查看配置:显示主节点关机,关于主从复制的配置并没有发生任何的变化
主节点重连:保留宕机前创建的key值,因为子节点保留主节点的内容,并且能够正常使用
重连后,关于主从复制的内容,并没有发生任何改变。正常使用
那如果子节点宕机了呢?
1:保留之前主节点创建的内容
2:重新启动后,身份发生了变化,不在是从机,而变成主机,与前面的主机没有了任何的关系
3:宕机后,如果主机创建了新的内容,宕机的子节点不会获取到,原因为2
4:身份转变为主机拥有主节点的所有权限
层层链路
按照下图进行配置
79端口号:只有一个子节点,本身角色为主节点
80端口号:它的主节点为79端口号,并且它拥有一个端口号为81的子节点,它的身份为子节点
81端口号:与80端口的配置差不多,除了主节点和子节点不同,剩下的都差不多
82端口号:本身角色为字节点,拥有一个主节点
如果其中一个,假设80端口号闹独立,想要当老大不想依附在任何人身上,通过命令该怎么实现?
127.0.0.1:6380> SLAVEOF no one
OK
80端口号独立,要当老大
角色为主节点,连接的子节点还是之前的那一个,小弟还是那个小弟
查看一下79端口的配置:
小弟给别人走了,光杆司令
当然也可以重新认主,还是给初次认主一样即可。
注意:上面关于主从复制的命令行代码都是暂时的,重新启动,所有的配置的都会丢失,如果想要永久的配置,从开启服务的配置文件进行配置,前面提到过。