运维之道 | Redis 主从复制 (一主多从) 搭建、并实现读写分离

Redis 主从复制 (一主多从) 搭建、并实现读写分离

前言:

由于redis的高性能,在应用中对其依赖很高,有时候一台redis服务器性能不够,需要配置redis集群。最简单来说就是一台用来读,一台用来写。一般对读的需求比较大,所以可以配置一主(读)多从(写)
在这里插入图片描述

  • 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
  • 为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。
  • 这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,这时候就用到了Redis的主从复制。

在这里插入图片描述
Redis提供了复制(replication)功能来自动实现多台redis服务器的数据同步(例如:每天19点新闻联播,基本从cctv1-8,各大卫视都会播放)


一、主从复制的方式和工作原理

Redis的主从复制是异步复制,异步分为两个方面,一个是master服务器在将数据同步到slave时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的。

1、复制方式
Redis主从复制分为以下三种方式
  • 当master服务器与slave服务器正常连接时,master服务器会发送数据命令流给slave服务器,将自身数据的改变复制到slave服务器。
  • 当因为各种原因master服务器与slave服务器断开后,slave服务器在重新连上master服务器时,会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。
  • 如果无法部分同步(比如初次同步),则会请求进行全量同步,这时master服务器会将自己的rdb文件发送给slave服务器进行数据同步,并记录同步期间的其他写入,再发送给slave服务器,以达到完全同步的目的,这种方式称为全量复制。
2、工作原理

master服务器会记录一个replicationId的伪随机字符串,用于标识当前的数据集版本,还会记录一个当数据集的偏移量offset,不管master是否有配置slave服务器,replication Id和offset会一直记录并成对存在,我们可以通过以下命令查看replication Id和offset:

info repliaction

通过redis-cli在master或slave服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同):

connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=9472,lag=1
master_replid:2cbd65f847c0acd608c69f93010dcaa6dd551cee
master_repl_offset:9472

当master与slave正常连接时,slave使用PSYNC命令向master发送自己记录的旧master的replication id和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致。

而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步。


二、主机规划

主机 IP
master 192.168.182.11
slave 192.168.182.12
slave 192.168.182.13

三、Redis 安装

1、运维之道 | Redis 安装及配置解析

需要在三台主机中安装部署 Redis 服务

2、关闭安全策略
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

四、Redis 主从复制搭建

1、修改master主库配置文件
# bind 127.0.0.1   		 ///将bind 127.0.0.1这行注释或者指定ip。(本例是注释,即所有ip都能连接)
daemonize yes	 		 ///开启守护进程
requirepass 123456		 ///设置访问密码(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定ip)
启动redis-server服务
[root@localhost bin]# redis-server redis.conf 
18912:C 11 Jan 2020 11:16:40.530 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18912:C 11 Jan 2020 11:16:40.530 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=18912, just started
18912:C 11 Jan 2020 11:16:40.530 # Configuration loaded

拓展:既然用到主从了,那说明对redis依赖非常高,还有几个参数可根据服务器配置需要来设置

  • 第一个就是客户端最大连接数(maxclients),默认是10000,可根据需求更改
# maxclients 10000
  • 第二个就是最大内存(默认不受限制,但如果有多个从服务器,建议还是设置个低于服务器内存的值)
# maxmemory <bytes>
  • 第三个是内存策略,如果内存足够用则不用管,如果内存不够用,建议设置最近最少使用策略(LRU),默认是内存不够则报错
# maxmemory-policy noeviction
2、修改slave从库配置文件
daemonize yes	 		 				 开启守护进程

286 # replicaof <masterip> <masterport>  配置所属主服务器ip和端口,在第287行新增
slaveof 192.168.182.11 6379

293 # masterauth <master-password>       配置所属主服务器的密码,在第294行新增
masterauth 123456

325 replica-read-only yes				从服务器通常是只读,所以要配置只读(默认是只读,不要更改即可)
启动 redis-cli 服务
[root@localhost bin]# redis-server redis.conf 
17707:C 11 Jan 2020 11:38:35.620 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17707:C 11 Jan 2020 11:38:35.620 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=17707, just started
17707:C 11 Jan 2020 11:38:35.620 # Configuration loaded

五、测试 redis 主从复制

1、info 查询主从信息
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.182.13,port=6379,state=online,offset=238,lag=1
slave1:ip=192.168.182.12,port=6379,state=online,offset=238,lag=0
master_replid:58a9ddd240c352682fa91579cecf02abfca8db54
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:238
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:238
2、读写测试
  • 在主库中创建key键值
127.0.0.1:6379> set redis:test villian
OK
127.0.0.1:6379> get redis:test
"villian"
  • 在从库中可查询到主库创建的key键值
127.0.0.1:6379> keys *
1) "redis:test"
  • 当向从库写入数据时,从库会报错,因为设置了只读模式
127.0.0.1:6379> set redis:1 villian
(error) READONLY You can't write against a read only replica.

翻译:https://blog.csdn.net/qq_39669058/article/details/87720731

发布了97 篇原创文章 · 获赞 10 · 访问量 3375

猜你喜欢

转载自blog.csdn.net/VillianTsang/article/details/103933940