github学习笔记
Redis 的主从复制
1. 主从 – 同步原理
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步
当Slave需要和Master进行数据同步时:
1) 主从同步时,Salve会发送sync命令到Master
2) 当Master接到此命令后,就会调用bgsave指令来创建一个子进程专门进行数据持久化工作,
也就是将主服务器的数据写入RDB文件中
3) Master在启动后台进程进行数据持久化期间的同时,主服务器将执行的写指令都缓存在内存中
4) Master在bgsave指令执行完成后,Master会将持久化好的RDB文件发送给Salve
5) Salve接到此文件后会将其存储到磁盘上,然后再将其读取到内存中
6) 当Salve完成数据快照的恢复这个动作完成后,Master会将这段时间缓存的写指令再以redis协议的格式发送给从服务器
7) 当有有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发
给多个从服务器
在2.8版本之后,redis支持了效率更高的增量同步策略,大大降低了连接断开的恢复成本。主服务器会在内存中维护一个缓冲区,
缓冲区中存储着将要发给从服务器的内容。从服务器在与主服务器出现网络瞬断之后,从服务器会尝试再次与主服务器连接,一旦连
接成功,主服务器就会向从服务器发送增量内容。增量同步功能,需要服务器端支持全新的PSYNC指令。(redis-2.8之后才具有)
2. 使用docker搭建主从(一主一从)
主从配置流程
# 1. 下载配置,默认docker运行的redis是不存在配置文件的
wget http://download.redis.io/redis-stable/redis.conf
# 2. 修改配置文件
#----------redis.conf---------------
# bind 127.0.0.1 # 注释当前行,表示任意ip可连
daemonize yes # 让redis服务后台运行
requirepass masterpassword # 设定密码
# 也可以不在配置文件中配置,后续执行命令行即可
slaveof <masterip> <masterport>
masterauth <master-password>
#------------------end---------------------
# 3. 使用docker启动服务,使用-v 指定配置文件
docker run -it --name $container_server_name -v /root/redis/redis-master.conf:/usr/local/etc/redis/redis.conf -d -p 6300:6379 redis /bin/bash
Master
# 运行服务
[root@iZ2ze58f53sxjm9z7mgn5xZ redis-conf]# docker run -it --name redis-master -v /root/redis-conf/redis-master.conf:/usr/local/etc/redis/redis.conf -d -p 6370:6379 redis /bin/bash
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
31b3f1ad4ce1: Pull complete
ff29a33e56fb: Pull complete
b230e0fd0bf5: Pull complete
7fe3ad196642: Pull complete
3d8096d6920c: Pull complete
85e4b89053d8: Pull complete
Digest: sha256:091a7b5de688f283b30a4942280b64cf822bbdab0abfb2d2ce6db989f2d3c3f4
Status: Downloaded newer image for redis:latest
32fc87095593681d6d9c4ab848abb81eef5b2ed90474f2ddc9a4a4e88905f5b2
# 进入容器
[root@iZ2ze58f53sxjm9z7mgn5xZ redis-conf]# docker exec -it redis-master bash
root@32fc87095593:/data#
# 加载配置
root@32fc87095593:/data# redis-server /usr/local/etc/redis/redis.conf
# 测试连接
root@32fc87095593:/data# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379>
Slave
# 运行服务
[root@iZ2ze58f53sxjm9z7mgn5xZ init.d]# docker run -it --name redis-slave1 -v /root/redis-conf/redis-slave1.conf:/usr/local/etc/redis/redis.conf -d -p 6371:6379 redis /bin/bash
a5115f616ea97669afc2ab5426e247e2cfafc6f354132ebcf9699fa7f82206a3
# 进入容器
[root@iZ2ze58f53sxjm9z7mgn5xZ init.d]# docker exec -it redis-slave bash
# 加载配置
root@a5115f616ea9:/data# redis-server /usr/local/etc/redis/redis.conf
# 测试连接
root@a5115f616ea9:/data# redis-cli
# 密码认证
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
(empty array)
# 查看master容器的ip
[root@iZ2ze58f53sxjm9z7mgn5xZ redis-conf]# docker inspect redis-master
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "898ecd79eef9bfbc6fbe347f72da2784ccdfff92998af06a464601391d75bec2",
"EndpointID": "3f044d0695f26f7cadfeb4d9a852d3043b0df364153bee4ea5fedb23af42f095",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2", # 后续使用
# 在slave容器中关联master,低版本slaveof ,高版本用replicaof
127.0.0.1:6379> slaveof 172.17.0.2 6379
OK
# 如果配置文件中没有配置masterauth 则在该步执行以下进行认证
127.0.0.1:6379> config set masterauth 123456
OK
# 查看
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
# 结束主从
127.0.0.1:6379> slaveof no one
3. 主从验证
# 登录master进行增删该查查看是否同步
# Master
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set test1 value1
OK
127.0.0.1:6379> keys *
1) "test1"
127.0.0.1:6379>
# Slave
127.0.0.1:6379> keys *
(empty array)
# 主库增加之后同步成功
127.0.0.1:6379> keys *
1) "test1"
127.0.0.1:6379> get test1
"value1"
127.0.0.1:6379>