目录
Redis主从复制与集群
主从复制
,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主结点(master/leader)
,后者称为从节点(slave/follower)
;数据的复制是单向的
,只能由主节点到从节点。Master以写
为主,Slave 以读
为主。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的优缺点
- 数据冗余:主从复制实现了数据的热备份,造成数据冗余。
- 故障恢复:当主结点发生故障时,从结点可以顶替提供服务。
- 负载均衡:当实现多主多从结构时,不管时读请求还是写请求都能实现负载均衡。
- 高可用基石:主从复制是实现集群和负载均衡的基础。
主从复制原理
第一步:Slave 启动成功连接到 master 后会发送一个sync命令
第二步:Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行
第三步:收集完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
Redis的主从复制实现方案
主从复制实现redis性能的提升有多种解决方案,
- 一主一从,设置一台主结点和一台从节点实现读写分离,主机专门负责写操作,从机只负责读操作。
- 一主多从,设置一台主结点和多台从节点,一台主结点负责写操作,多台从节点负责读操作。
- 多主多从,设置多台主节点和多台从节点,多台主节点负责写操作,多台从节点负责读操作,服务具有高可用特性。
特别注意,主节点是可读可写的,但是从结点只读(也可手动修改设置)
一主一从实现方案
在一主一从方案中,只是简单的实现了读写分离,一旦主机或者从机发生宕机,都会导致主机或者从机的不可用。并且底层关于主从系结点的复制同步不需要我们考虑,我们只需要手动的更改配置即可实现。
主节点配置文件
# 命名为redis6379.conf
# 只展示需要修改的内容
port 6379 # 端口号
dbfilename dump6379.rdb # 持久化文件名
pidfile /var/run/redis_6379.pid # pid进程号管理
logfile "6379.log" # log日志文件名
从节点配置文件
# 命名为redis6380.conf
# 只展示需要修改的内容
port 6380 # 端口号
dbfilename dump6380.rdb # 持久化文件名
pidfile /var/run/redis_6380.pid # pid进程号管理
logfile "6380.log" # log日志文件名
replicaof 127.0.0.1 6379 # 设置主节点ip及端口号
启动测试
# 启动主节点配置文件
[root@localhost myconf]# redis-server redis6379.conf
# 启动从节点配置文件
[root@localhost myconf]# redis-server redis6380.conf
# 查看进程信息
[root@localhost myconf]# ps -ef | grep redis
root 11155 1 0 11:20 ? 00:00:00 redis-server 127.0.0.1:6379
root 12675 1 5 11:22 ? 00:00:00 redis-server 127.0.0.1:6380
root 12721 1850 0 11:22 pts/0 00:00:00 grep --color=auto redis
# 客户端连接redis主节点服务器查看信息
[root@localhost myconf]# redis-cli -p 6379 # 指定服务器端口端口
127.0.0.1:6379> info replication # 查看服务器信息
# Replication
role:master # 角色为主节点
connected_slaves:1 # 从节点数量
slave0:ip=127.0.0.1,port=6380,state=online,offset=770,lag=1 # 从节点信息
master_replid:0832d82a2a71124f33af0b67a81a7889245edf5f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:770
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:770
# 客户端连接redis从节点服务器查看信息
[root@localhost myconf]# redis-cli -p 6380
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:2
master_sync_in_progress:0
slave_repl_offset:56
slave_priority:100
slave_read_only:1 # 从节点是否只读
connected_slaves:0
master_replid:0832d82a2a71124f33af0b67a81a7889245edf5f
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:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
# 从节点
127.0.0.1:6380> set name zhangsan
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380> get name
"zhangsan"
一主多从实现方案
一主多从方案下,写专门由一个主节点负责,而读由两个从节点专门负责,这样的话,一个从节点的宕机不会影响我们正常业务的进行,实现一定程度上的高可用。但是主节点宕机,仍然影响程序的写操作。
主配置文件
# 命名为redis6379.conf
# 只展示需要修改的内容
port 6379 # 端口号
dbfilename dump6379.rdb # 持久化文件名
pidfile /var/run/redis_6379.pid # pid进程号管理
logfile "6379.log" # log日志文件名
从结点一配置文件
# 命名为redis6380.conf
# 只展示需要修改的内容
port 6380
dbfilename dump6380.rdb
pidfile /var/run/redis_6380.pid
logfile "6380.log"
replicaof 127.0.0.1 6379
从节点二配置文件
# 命名为redis6380.conf
# 只展示需要修改的内容
port 6381
dbfilename dump6381.rdb
pidfile /var/run/redis_6381.pid
logfile "6381.log"
replicaof 127.0.0.1 6379
启动测试
[root@localhost myconf]# redis-server redis6379.conf # 启动主节点
[root@localhost myconf]# redis-server redis6380.conf # 启动从节点
[root@localhost myconf]# redis-server redis6381.conf # 启动从节点
[root@localhost myconf]# redis-cli -p 6379 # 连接主节点
127.0.0.1:6379> info replication # 查看主节点信息
# Replication
role:master
c