基于docker搭建redis主从集群

github学习笔记

Redis 的主从复制

1. 主从 – 同步原理

基于docker搭建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    
masterauth 
#------------------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> 

你可能感兴趣的:(集群搭建,redis,docker,数据库)