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