Redis---主从复制

Posted sre-chan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis---主从复制相关的知识,希望对你有一定的参考价值。

一、redis主从复制

主从复制:是存储数据的服务结构
主服务器:接受客户端连接的服务器
从服务器:自动与主服务器保持数据一致的服务器

配置主从复制

1、环境准备

主服务器    主机名:master     IP地址:192.168.11.101/24
从服务器    主机名:node01     IP地址:192.168.11.102/24
 客户端     主机名:node02     IP地址:192.168.11.103/24

主从服务器都要安装redis服务,分别修改redis监听的地址为192.168.11.101,192.168.11.102

2、192.168.11.101主服务器,修改监听的IP地址

root@Master:~# ss -lntup | grep 6379
tcp   LISTEN 0      128        127.0.0.1:6379      0.0.0.0:*    users:(("redis-server",pid=1147,fd=6))
root@Master:~# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
root@Master:~# ss -lntup | grep 6379
root@Master:~# vim /etc/redis/6379.conf
bind 192.168.11.101

3、修改完配置文件重启服务

root@Master:~# /etc/init.d/redis_6379 start 
Starting Redis server...

4、登录数据库

root@Master:~# redis-cli -h 192.168.11.101 -p 6379
192.168.11.101:6379> ping
PONG

5、查看当期服务器主从信息

192.168.11.101:6379> INFO replication
# Replication
role:master # 主节点
connected_slaves:0
master_replid:88c2e017cb0ea8cbd01a4f3874b314f8de1775b2
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
192.168.11.101:6379> 

6、node01从服务器

修改监听的IP地址

# 先停服务器
root@node01:~# /etc/init.d/redis_6379 stop 
Stopping ...
Redis stopped

# 修改配置文件
root@node01:~# vim /etc/redis/6379.conf
# 修改客户端连接redis服务的IP地址
bind 192.168.11.102

7、重启服务检查端口监听

root@node01:~# /etc/init.d/redis_6379 start 
Starting Redis server...
root@node01:~# ss -lntup |grep 6379
tcp   LISTEN 0      128    192.168.11.102:6379      0.0.0.0:*    users:(("redis-server",pid=7978,fd=6))

8、连接主机检查主从信息

PS:在这还没添加从服务器信息,所以看到是master是正常的!!!

root@node01:~# redis-cli -h 192.168.11.102 -p 6379
192.168.11.102:6379> ping
PONG
192.168.11.102:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_replid:f151ec960f14af322c6b07946a074a30a4c2c731
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

9、添加slave节点,将本机设置为node01的从服务器,node01端口号为6379

192.168.11.102:6379> SLAVEOF 192.168.11.101 6379
OK
192.168.11.102:6379> INFO replication
# Replication
role:slave
master_host:192.168.11.101
master_port:6379
master_link_status:down

错误信息:

解决方法:

关闭防火墙和selinux

root@Master:~# systemctl is-active firewalld.service
active
root@Master:~# systemctl stop firewalld.service
root@Master:~# systemctl disable firewalld.service
root@Master:~# setenforce 0

关闭连接 重启服务

# 第一次做忘了这条关闭连接命令 苦
root@node01:~# redis-cli -h 192.168.11.102 -p 6379 shutdown
root@node01:~# 
root@node01:~# /etc/init.d/redis_6379 restart 
/var/run/redis_6379.pid does not exist, process is not running
Starting Redis server...

10、以上是临时配置,修改配置文件,将本机永久配置为node01的从服务器

root@node01:~# redis-cli -h 192.168.11.102 -p 6379 shutdown
root@node01:~# vim  /etc/redis/6379.conf
slaveof 192.168.11.101  6379		#修改,指定主服务器的IP地址和端口号

11、重启服务

root@node01:~# /etc/init.d/redis_6379 start
root@node01:~# redis-cli -h 192.168.11.102 -p 6379
192.168.11.102:6379> info replication		#查看slave服务器的主从信息
# Replication
role:slave                  #从服务器
master_host:192.168.11.101    #主服务器IP地址
master_port:6379            #主服务器端口号
master_link_status:up       #和主服务器的连接状态:up

12、验证查看主服务器主从配置信息

192.168.11.101:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.11.102,port=6379,state=online,offset=1330,lag=0
master_replid:ecc43c0169695c02204b624365e75859defc0aec
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1330
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1330

13、测试主从同步,插入数据

# 添加数据
192.168.11.101:6379> set school qinghua
OK

# 查看数据
192.168.11.101:6379> GET school
"qinghua"

192.168.11.102:6379> KEYS *
1) "school"
192.168.11.102:6379> GET school
"qinghua"

14、反客为主:将从库恢复为主库,在node01上操作

root@node01:~# redis-cli -h 192.168.11.101 -p 6379
192.168.11.101:6379> ping
PONG
192.168.11.101:6379> SLAVEOF no one
OK
192.168.11.101:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.11.102,port=6379,state=online,offset=1853,lag=0
192.168.11.101:6379> exit

二、redis主从复制

主服务器    主机名:master      IP地址:192.168.11.101/24
从服务器    主机名:node01      IP地址:192.168.11.102/24
从服务器    主机名:node02      IP地址:192.168.11.103/24

1、三台都要安装redis服务,分别修改redis监听的地址为

192.168.11.101 192.168.11.102 192.168.11.103

2、由于之前master和node01做实验已经修改过,所以这次直接修改node02即可

# 停止服务
root@node02:~# /etc/init.d/redis_6379 stop 
Stopping ...
Redis stopped

# 修改配置文件
root@node02:~# vim /etc/redis/6379.conf
bind 192.168.11.103

3、重启服务并监听端口

root@node02:~# /etc/init.d/redis_6379 start 
Starting Redis server...
root@node02:~# ss -lntup |grep redis
tcp   LISTEN 0      128    192.168.11.103:6379      0.0.0.0:*    users:(("redis-server",pid=9860,fd=6))

4、master设置连接密码

root@Master:~# redis-cli -h 192.168.11.101 -p 6379 shutdown
501 requirepass plj123
root@Master:~# /etc/init.d/redis_6379 start
root@Master:~# redis-cli -h 192.168.11.101 -p 6379 -a plj123
192.168.4.51:6379> info  replication
# Replication
role:master
192.168.11.101:6379> set a 1
192.168.11.101:6379> set b 1
192.168.11.101:6379> set c 1

5、node01|2主机设置带验证的从库(从库配置一样,截取数据俩边混着搞得,看对应的主机信息即可)

192.168.11.103:6379>
192.168.11.103:6379> SLAVEOF 192.168.11.101 6379

6、关掉连接,添加密码

root@node01:~#  redis-cli -h 192.168.11.102 -p 6379 shutdown
root@node01:~# vim /etc/redis/6379.conf 
289 masterauth plj123

7、重启服务

root@node01:~# /etc/init.d/redis_6379 start
192.168.11.102:6379> info replication		
# Replication
role:slave
master_host:192.168.11.101
master_port:6379
master_link_status:up

8、查看数据是否同步

192.168.11.103:6379> INFO replication
# Replication
role:slave
master_host:192.168.11.101
master_port:6379
master_link_status:up


192.168.11.103:6379> KEYS *
1) "school" # 数据已经同步

9、测试当其中的一台从服务器停止,另外一台还能继续同步数据,

模拟node01宕机

root@node01:~# redis-cli -h 192.168.11.102 -p 6379 shutdow

10、master存数据

192.168.11.101:6379> set AAA CCC
OK
192.168.11.101:6379> KEYS *
1) "school"
2) "AAA"

11、node02查看

192.168.11.103:6379> KEYS *
1) "AAA"
2) "school"

12、node01机器恢复

root@node01:~# /etc/init.d/redis_6379 restart
root@node01:~# ss -lntup |grep redis
tcp   LISTEN 0      128    192.168.11.102:6379      0.0.0.0:*    users:(("redis-server",pid=15384,fd=6))

13、测试数据是否同步

#宕机期间的数据自动同步
root@node01:~# redis-cli -h 192.168.11.102 -p 6379 
192.168.11.102:6379> ping
PONG
192.168.11.102:6379> KEYS *
1) "AAA"
2) "school"

详解Redis 主从复制及主从复制原理

参考技术A

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

概述

在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。

2、容量瓶颈。 当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。

解决办法

要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。

Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。

主从复制

什么是主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用

1、数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2、故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3、负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

4、读写分离: 可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。

5、高可用基石: 除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

主从复制启用

从节点开启主从复制,有3种方式:

1、配置文件: 在从服务器的配置文件中加入 slaveof<masterip><masterport>。

2、启动命令: redis-server启动命令后加入 --slaveof<masterip><masterport>。

3、客户端命令: Redis服务器启动后,直接通过客户端执行命令 slaveof<masterip><masterport>,则该Redis实例成为从节点。

通过 info replication 命令可以看到复制的一些信息。

主从复制原理

主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。

在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示可以看出复制过程大致分为6个过程。

主从配置之后的日志记录也可以看出这个流程。

1、保存主节点(master)信息

执行 slaveof 后 Redis 会打印如下日志:

2、从节点与主节点建立网络连接

从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。

从节点与主节点建立网络连接。

从节点会建立一个 socket 套接字,从节点建立了一个端口为51234的套接字,专门用于接受主节点发送的复制命令。从节点连接成功后打印如下日志:

如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveofnoone 取消复制。

关于连接失败,可以在从节点执行 info replication 查看 master_link_down_since_seconds 指标,它会记录与主节点连接失败的系统时间。从节点连接主节点失败时也会每秒打印如下日志,方便发现问题:

3、发送 ping 命令

连接建立成功后从节点发送 ping 请求进行首次通信, ping 请求主要目的如下:

如果发送 ping 命令后,从节点没有收到主节点的 pong 回复或者超时,比如网络超时或者主节点正在阻塞无法响应命令,从节点会断开复制连接,下次定时任务会发起重连。

从节点发送的 ping 命令成功返回,Redis 打印如下日志,并继续后续复制流程:

4、权限验证

如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能通过验证。如果验证失败复制将终止,从节点重新发起复制流程。

5、同步数据集

主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的步骤。

6、命令持续复制

当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。

作者:LoyaltyLu

链接:https://segmentfault.com/a/1190000018268350

以上是关于Redis---主从复制的主要内容,如果未能解决你的问题,请参考以下文章

redis高可用之主从复制,哨兵,集群

Redis(主从复制哨兵模式集群)概述及部署

Redis主从复制

Redis主从复制

Redis 主从复制

Redis数据库——(主从复制哨兵模式集群)