Redis主从复制的过程原理
1.当从库和主库建立MS关系后,会向主数据库发送SYNC命令
2.主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来
3.当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis
4.从Redis接收到后,会载入快照文件并且执行收到的缓存的命令
5.之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致
准备工作:下载redis.conf配置文件并修改配置分别拷贝为:redis-master.conf ,redis-slave1.conf
修改配置参数
主机(Master)修改下载下来的redis.conf,主要修改参数如下:
#bind 127.0.0.1 #如果bind选项为空的话,则允许所有来自于可用网络接口的连接
protected-mode no #保护模式,若为yes,只允许本地客户端连接
appendonly yes #开启后,Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里
从机(Slave)修改下载下来的redis.conf,主要修改参数如下:
#bind 127.0.0.1
protected-mode no
appendonly yes
# replicaof <master ip> <master port>
replicaof 172.17.0.2 6379 #Redis主机(Master)IP 端口
1. 运行Redis
1.1 master(主库)
# 运行服务 redis.conf需要下载修改配置
docker run -itd --name redis-master -v /Users/yunwang/Documents/redis/redis-master.conf:/etc/redis.conf -v /Users/yunwang/Documents/redis/data:/data -p 6379:6379 redis
# docker run -it --name redis-master -d -p 6379:6379 redis redis-server --requirepass 123456
# 测试连接redis
docker exec -it redis-master redis-cli -a 123456
1.2 slave(从库)
# 运行服务
# docker run -it --name redis-slave -d -p 6301:6379 redis redis-server --requirepass 234567 # 设定从库密码,可选
docker run -itd --name redis-slave1 -v /Users/yunwang/Documents/redis/redis-slave.conf:/etc/redis.conf -v /Users/yunwang/Documents/redis/data:/data -p 6301:6379 redis
docker run -itd --name redis-slave2 -v /Users/yunwang/Documents/redis/redis-slave.conf:/etc/redis.conf -v /Users/yunwang/Documents/redis/data:/data -p 6302:6379 redis
# 测试连接redis
docker exec -it redis-slave1 redis-cli
# 进行密码认证
auth <slave-password>
docker inspect redis-master #查看容器内网ip
三个redis内网地址分别为:
redis-master 172.17.0.2:6379 6379
redis-slave1 172.17.0.3:6379 6301
redis-slave2 172.17.0.4:6379 6302
1.3查看信息
进入docker容器内部,查看当前redis角色(主还是从) info replication
[root@tcy1 tcy]# docker exec -it reids-master /bin/bash
root@ab54741166e1:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:333dfec36d78274ea16fa0cd8f20cbfd8058b1ff
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
127.0.0.1:6379>
目前三个都是master状态(即主人状态)
2. 主从连接及查看
2.1 从库配置
slaveof <master-ip> <master-port>
。<master-ip>
为主库服务ip,<master-port>
表示主库所在端口,默认6379
➜ ~ docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:6379> quit
➜ ~ docker exec -it redis-slave2 redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:6379>
2.2 密码认证
config set masterauth <master-password>
。<master-password>
即为主库访问密码
2.3 测试命令
进入reidis-master输入info
或info Replication
➜ ~ docker exec -it redis-master redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=498,lag=0
slave1:ip=172.17.0.4,port=6379,state=online,offset=498,lag=0
master_replid:8fbf1483a6e388156e8c643ad99df5a3ca311f74
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:498
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:498
从库信息:
➜ ~ docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> info repliacation
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:624
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8fbf1483a6e388156e8c643ad99df5a3ca311f74
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:624
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:624
以后主库可以读写,从库只能读取。主库写入的信息及时会同步到从库。
3. Redis 主从复制、哨兵和集群三者区别
主从复制是为了数据备份,哨兵是为了高可用,Redis主服务器挂了哨兵可以切换,集群则是因为单实例能力有限,搞多个分散压力,简短总结如下:
主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。
sentinel发现master挂了后,就会从slave中重新选举一个master。
cluster是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器。
sentinel着眼于高可用,Cluster提高并发量。
1. 主从模式:读写分离,备份,一个Master可以有多个Slaves。
2. 哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。
3. 集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。