2、docker 安装redis(单机安装,主从复制,哨兵,cluster集群)

单机

  1. 下载Redis程序包 image.jpg
  2. 在宿主机上创建Redis挂载目录
/SystemUtils/Data/Redis/config/
/SystemUtils/Data/Redis/data
  1. 解压Redis程序包,将redis.cong上传到服务器/SystemUtils/Data/Redis/config/目录下
  2. 拉取Redis镜像
# 这样拉取的是latest版本,需要其他版本跟对应版本号
docker pull redis
  1. 启动Redis容器
docker run -p 6379:6379 \
--name single-redis \
-v /SystemUtils/Data/Redis/config:/etc/redis  \
-v /SystemUtils/Data/Redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

说明: --appendonly yes redis启动后数据持久化

主从复制

什么是主从复制

Master-Slave replication是一种数据处理(备份)机制,主机更新数据后根据配置的策略自动同步给从机(备份机),通常情况下Master写为主、Slave读为主。如下图所示: image.jpg
主从复制的原理

  1. slave启动成功连接到master后发送一个sync命令
  2. master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
  3. 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
  4. 增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步
  5. 但是只要是重新链接master,一次完全同步(全量复制)将被自动执行

主从复制的缺点 复制的延迟,由于所有的写都在一个master节点上操作,然后同步更新到slave节点上,所以master同步到slave机器是有一定的延迟的,当系统很繁忙的时候,延迟问题会更加严重,slave数量的增加也会使这个问题变严重。

能干什么?

读写分离,常用读多写少的场景,例如电商平台 容灾备份/数据恢复

如何实现

  1. 首先使用docker启动3台redis 这里的主从复制是1主2从的模式,且3个redis服务分别部署在(ych-data-001、ych-data-002、ych-data-003)三台虚拟机上面,因此下面的每个docker 容器的启动命令的端口映射都是相同的端口。
# ych-data-001虚拟机
docker run -p 6379:6379 \
--name redis-server-01 \
-v /SystemUtils/Data/Redis/config:/etc/redis  \
-v /SystemUtils/Data/Redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

# ych-data-002虚拟机
docker run -p 6379:6379 \
--name redis-server-02 \
-v /SystemUtils/Data/Redis/config:/etc/redis  \
-v /SystemUtils/Data/Redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

# ych-data-003虚拟机
docker run -p 6379:6379 \
--name redis-server-03 \
-v /SystemUtils/Data/Redis/config:/etc/redis  \
-v /SystemUtils/Data/Redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

运行成功后,我们通过info replication命令查询主从的状态,我们会发现redis服务默认都是master。 image.jpg
那么怎么进行主从复制呢? 我们需要在从机(slave)的redis.conf中添加配置,使从机挂载到主机下面。 我们从官网的redis.conf中可以看到如下一段配置描述及其案例:

# Master-Replica replication. Use replicaof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
# 翻译:
# 主-从复制。
# 使用replicaof将一个Redis实例变成另一个Redis服务器的副本。
# 关于Redis复制的一些事情需要尽快了解。
#
#   +------------------+      +---------------+
#   |      Master      | ---> |    Replica    |
#   | (receive writes) |      |  (exact copy) |
#   +------------------+      +---------------+
#
# 1) Redis replication is asynchronous, but you can configure a master to
#    stop accepting writes if it appears to be not connected with at least
#    a given number of replicas.
#    Redis复制是异步的,但是你可以配置一个master,如果它看起来没有连接到至少一个给定数量
#    的副本,它就会停止接受写操作。
#
# 2) Redis replicas are able to perform a partial resynchronization with the
#    master if the replication link is lost for a relatively small amount of
#    time. You may want to configure the replication backlog size (see the next
#    sections of this file) with a sensible value depending on your needs.
#    如果复制链路丢失相对较短的时间,Redis副本可以执行与主服务器的部分重同步。您
#    可能希望根据您的需要将复制积压大小(请参阅本文件的下一部分)配置为合理的值。
#
# 3) Replication is automatic and does not need user intervention. After a
#    network partition replicas automatically try to reconnect to masters
#    and resynchronize with them.
#    复制是自动的,不需要用户干预。在网络分区之后,副本会自动尝试重新连接到主服务器
#
# replicaof <masterip> <masterport>

其中replicaof就是将从机挂载到主机的配置
replicaof

  • masterip:表示主机的ip地址
  • masterport:表示主机的端口

案例:
replicaof 192.168.2.175 6379

  1. 将从机挂载到主机下 我将ych-data-001虚拟机上的redis作为主机,ych-data-002、ych-data-003上面的redis作为从机。 那么我们需要分别在两台从机的redis.conf文件中添加或修改如下配置:

replicaof 192.168.2.175 6379
此处的ip应是主机的ip,端口也应该是主机的端口。 添加或修改完成配置之后,我们应该重启redis的docker容器:

# ych-data-002
docker restart redis-server-02
# ych-data-003
docker restart redis-server-03

重启之后我们再通过info replication查看redis个节点的主从状态: image.jpg 我们会发现,ych-data-001的redis的状态已经是master,并且从机的数量是2,其余的两台从机的状态也已经从msater变为的slave状态了且master_host也指向了主机

哨兵模式

你可以理解为是一个监控,哨兵巡逻监控你的master节点,如果发现master挂了,则会在存活的从机中通过投票选主的方式选出一个从机来作为新的master节点。
那么如何实现呢?

  1. 首先我们需要从Redis官网,拷贝一份sentinel.conf配置文件到宿主机。 这里我是将sentinel.conf放到了和redis.conf相同的目录下。根据实际情况进行修改。
  2. 编辑sentinel.conf配置。 主要配置如下:
# 监控主节点
  sentinel monitor mymaster 192.168.2.175 6379 2
# mymaster:表示主节点别名
# 192.168.1.56:主节点IP
# 6379:主节点端口

# 是否以守护进程运行
daemonize no
# 表示是否以后台进行运行。
# 这里需要注意,如果是docker启动其值应为no,否者容器启动失败

# 其它配置根据需要自行配置,这里不做介绍.

上面提示docker启动哨兵daemonize配置的值必须是no,这是因为我在使用docker启动哨兵时,将其值设置成了yes表示守护进程启动,这就与docker的启动方式产生冲突因此启动不起来(我的理解是这样的:假设设置为yes,那么使用docker启动时使用-d命令这就设置了两个后台启动,会有问题的;如果不使用-d表示直接启动,但是哨兵配置了后台启动这就冲突了到底是前台启动还是后台启动呢?) 我这里使用的配置如下

port 26379
  daemonize no
  pidfile /var/run/redis-sentinel.pid
  logfile ""
  dir /tmp
  sentinel monitor mymaster 192.168.2.175 6379 2
  sentinel auth-pass mymaster centos
  sentinel down-after-milliseconds mymaster 3000
  sentinel parallel-syncs mymaster 1
  sentinel failover-timeout mymaster 180000
  sentinel deny-scripts-reconfig yes

ych-data-001、ych-data-002、ych-data-003在这3台虚拟机上使用的sentinel.conf是相同的配置,这是因为分别在3台虚拟机上,他们的环境时一样的,挂载目录也是一样的,又是3台独立的虚拟机不是在同一台虚拟机上面,因此可以使用相同的配置。

  1. 分别在3台虚拟上启动哨兵
# ych-data-001
docker run --name redis-sentinel-01 \
-v /SystemUtils/Data/Redis/config/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf \
--privileged=true \
-p 26379:26379 
# 或使用如下命令
# 这两条命令的区别就是-v挂载的区别,一个是挂载了指定配置文件,一个则是挂载了目录。
docker run --name redis-sentinel-01 \
-v /SystemUtils/Data/Redis/config:/etc/redis \
-d redis redis-sentinel /etc/redis/sentinel.conf \
--privileged=true \
-p 26379:26379 



# ych-data-002虚拟机
docker run --name redis-sentinel-02 \
-v /SystemUtils/Data/Redis/config/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf \
--privileged=true \
-p 26379:26379 


# ych-data-003虚拟机
docker run --name redis-sentinel-03 \
-v /SystemUtils/Data/Redis/config/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf \
--privileged=true \
-p 26379:26379

分片集群

分片集群的特征

  1. 集群中有多个master,每个master保存不同的数据

  2. 每个master主节点都可以有多个slave从节点

  3. master直接通过ping来感知彼此的健康状态

  4. 客户端的访问都可以转发到任意节点,最终转发到正确的节点。

    image.jpg

如何实现分片集群

  1. 创建redis配置挂载卷,并初始化配置 创建的目录分别为:

    redis配置文件目录

    /SystemUtils/Data/Redis/config/cluster-6379

    /SystemUtils/Data/Redis/config/cluster-6380

    /SystemUtils/Data/Redis/config/cluster-6381

    redis数据目录

    /SystemUtils/Data/Redis/data/cluster-6379

    /SystemUtils/Data/Redis/data/cluster-6380

    /SystemUtils/Data/Redis/data/cluster-6381

    image.jpgimage.jpg

  2. 在redis配置文件目录中创建redis.conf配置文件,并设置如下配置:

    这里需要注意:您使用的配置文件要和您使用 redis 的版本对应,建议从官方网站下载对应版本的 redis 包把配置文件拿出来改一下。

    # redis端口,不同阶段的redis端口是不同的,根据实际进行设置
    port 6379
    
    #redis 访问密码
    #requirepass 123456
    #redis 访问Master节点密码
    #masterauth 123456
    
    # 关闭保护模式
    protected-mode no
    
    # 开启集群
    cluster-enabled yes
    # 集群节点配置,nodes-端口号.conf配置文件会在data目录下生成
    cluster-config-file nodes-端口号.conf
    
    # 超时
    cluster-node-timeout 5000
    
    # 当前集群节点IP host模式为宿主机IP
    cluster-announce-ip 192.168.25.129
    # 当前集群节点端口 6379 根据实际情况进行设置
    cluster-announce-port 6379
    # redis总线端口
    # redis集群总线端口为redis客户端端口加上10000,比如说你的redis 6379端口为客户端通讯端口,那么16379端口为集群总线端口
    # 如果使用docker 启动那么宿主机也要开放该端口
    cluster-announce-bus-port 16379
    
    # 开启 appendonly 备份模式
    appendonly yes
    # 每秒钟备份
    appendfsync everysec
    # 对aof文件进行压缩时,是否执行同步操作
    no-appendfsync-on-rewrite no
    # 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
    auto-aof-rewrite-percentage 100
    # 重写前AOF文件的大小最小值 默认 64mb
    auto-aof-rewrite-min-size 64mb
    
    # 日志配置
    # debug:会打印生成大量信息,适用于开发/测试阶段
    # verbose:包含很多不太有用的信息,但是不像debug级别那么混乱
    # notice:适度冗长,适用于生产环境
    # warning:仅记录非常重要、关键的警告消息
    loglevel notice
    # 日志文件路径
    # 此处加端口是为了区分,是哪个redis节点的配置
    logfile "/data/redis-端口.log"
    
  3. 我们可以按照上面的方法配置多态redis实例并启动。 我这里是启动了9个redis实例,分别运行在ych-data-001、ych-data-002、ych-data-003这3台虚拟机上面,每台虚拟机上面运行的redis分别是6379、6380、63813台redis,使用这些redis实例组成了一个4主5从的redis分片集群。 下面是每台虚拟机启动redis的docker命令:

    docker run --name cluster-redis-6379 \
    -p 6379:6379 \
    -p 16379:16379 \
    -v /SystemUtils/Data/Redis/config/cluster-6379:/etc/redis  \
    -v /SystemUtils/Data/Redis/data/cluster-6379:/data \
    -d redis redis-server /etc/redis/redis.conf 
    
    docker run --name cluster-redis-6380 \
    -p 6380:6380 \
    -p 16380:16380 \
    -v /SystemUtils/Data/Redis/config/cluster-6380:/etc/redis  \
    -v /SystemUtils/Data/Redis/data/cluster-6380:/data \
    -d redis redis-server /etc/redis/redis.conf 
    
    docker run --name cluster-redis-6381 \
    -p 6381:6381 \
    -p 16381:16381 \
    -v /SystemUtils/Data/Redis/config/cluster-6381:/etc/redis  \
    -v /SystemUtils/Data/Redis/data/cluster-6381:/data \
    -d redis redis-server /etc/redis/redis.conf
    
  4. 将reids实例启动成功后,我们连接redis,进行分片初始化。 连接redis可以使用redis可视化工具的cli功能,也可以直接进入docker容器中使用redis-cli进行操作。 如下使用的是进行docker容器中,使用redis-cli进行操作的。

    [root@ych-data-001 ~]# 进入docker容器
    [root@ych-data-001 ~]# docker exec -it cluster-redis-6379  /bin/bash
    [root@ych-data-001 ~]# 连接redis客户端,并初始化分片集群
    root@fe16b49d78b6:/data# redis-cli -h 192.168.2.175 -p 6379 --cluster create 192.168.2.175:6379 192.168.2.79:6379 192.168.2.124:6379 192.168.2.175:6380 192.168.2.175:6381 192.168.2.79:6380 192.168.2.79:6381 192.168.2.124:6380 192.168.2.124:6381 --cluster-replicas 1
    >>> Performing hash slots allocation on 9 nodes...
    Master[0] -> Slots 0 - 4095
    Master[1] -> Slots 4096 - 8191
    Master[2] -> Slots 8192 - 12287
    Master[3] -> Slots 12288 - 16383
    Adding replica 192.168.2.124:6380 to 192.168.2.175:6379
    Adding replica 192.168.2.175:6381 to 192.168.2.79:6379
    Adding replica 192.168.2.79:6381 to 192.168.2.124:6379
    Adding replica 192.168.2.124:6381 to 192.168.2.175:6380
    Adding extra replicas...
    Adding replica 192.168.2.79:6380 to 192.168.2.175:6379
    M: b5303467d7ddf1fbf42a561a20bb5d07778d96fb 192.168.2.175:6379
       slots:[0-4095] (4096 slots) master
    M: af2df0aa3400c825f4be9f63f9403c975c6284c9 192.168.2.79:6379
       slots:[4096-8191] (4096 slots) master
    M: 2461bae863b0a77692193da45ccb162276246469 192.168.2.124:6379
       slots:[8192-12287] (4096 slots) master
    M: a1a54053c2e5da5f0ed932d168a64210d462608a 192.168.2.175:6380
       slots:[12288-16383] (4096 slots) master
    S: 50f5c89c4c3d7cfef4b51967fcc948aaf846f421 192.168.2.175:6381
       replicates af2df0aa3400c825f4be9f63f9403c975c6284c9
    S: e518932fb4686acae22c87d282dbca0502d66b5a 192.168.2.79:6380
       replicates b5303467d7ddf1fbf42a561a20bb5d07778d96fb
    S: 0fce35eb2ad3314342a03c2eb605486ea860cea0 192.168.2.79:6381
       replicates 2461bae863b0a77692193da45ccb162276246469
    S: f5a5eb25a3578ade3d82ecc5268b496ccdba13ba 192.168.2.124:6380
       replicates b5303467d7ddf1fbf42a561a20bb5d07778d96fb
    S: 548647e5521d63e38bbaff0a1a49144243af3472 192.168.2.124:6381
       replicates a1a54053c2e5da5f0ed932d168a64210d462608a
    # 以上配置中 M:表示主节点,S:表示从节点。也就是说上面提供的配置是4主5从,下面需要选择是否应用配置。
    Can I set the above configuration? (type 'yes' to accept): yes # 输入yes然后回车表示应用配置。
    '>>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    # 这里需要等待一定时间完成配置,如果这里等了很久没有初始化完成,请检查配置文件的中的redis节点ip,节点端口,节点总线端口是否配置正确,以及总线端口是否在宿主机开放和映射。
    Waiting for the cluster to join 
    ..
    # 等待完成之后下面就是配置好的各节点信息
    >>> Performing Cluster Check (using node 192.168.2.175:6379)
    M: b5303467d7ddf1fbf42a561a20bb5d07778d96fb 192.168.2.175:6379
       slots:[0-4095] (4096 slots) master
       2 additional replica(s)
    S: 50f5c89c4c3d7cfef4b51967fcc948aaf846f421 192.168.2.175:6381
       slots: (0 slots) slave
       replicates af2df0aa3400c825f4be9f63f9403c975c6284c9
    S: 0fce35eb2ad3314342a03c2eb605486ea860cea0 192.168.2.79:6381
       slots: (0 slots) slave
       replicates 2461bae863b0a77692193da45ccb162276246469
    M: 2461bae863b0a77692193da45ccb162276246469 192.168.2.124:6379
       slots:[8192-12287] (4096 slots) master
       1 additional replica(s)
    M: af2df0aa3400c825f4be9f63f9403c975c6284c9 192.168.2.79:6379
       slots:[4096-8191] (4096 slots) master
       1 additional replica(s)
    S: f5a5eb25a3578ade3d82ecc5268b496ccdba13ba 192.168.2.124:6380
       slots: (0 slots) slave
       replicates b5303467d7ddf1fbf42a561a20bb5d07778d96fb
    M: a1a54053c2e5da5f0ed932d168a64210d462608a 192.168.2.175:6380
       slots:[12288-16383] (4096 slots) master
       1 additional replica(s)
    S: e518932fb4686acae22c87d282dbca0502d66b5a 192.168.2.79:6380
       slots: (0 slots) slave
       replicates b5303467d7ddf1fbf42a561a20bb5d07778d96fb
    S: 548647e5521d63e38bbaff0a1a49144243af3472 192.168.2.124:6381
       slots: (0 slots) slave
       replicates a1a54053c2e5da5f0ed932d168a64210d462608a
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    
  5. 通过redis节点查看分片集群的节点信息:

    root@fe16b49d78b6:/data# redis-cli -h 192.168.2.124 -p 6379 cluster nodes
    a1a54053c2e5da5f0ed932d168a64210d462608a 192.168.2.175:6380@16380 master - 0 1684884433974 4 connected 12288-16383
    2461bae863b0a77692193da45ccb162276246469 192.168.2.124:6379@16379 myself,master - 0 1684884432000 3 connected 8192-12287
    0fce35eb2ad3314342a03c2eb605486ea860cea0 192.168.2.79:6381@16381 slave 2461bae863b0a77692193da45ccb162276246469 0 1684884432000 3 connected
    b5303467d7ddf1fbf42a561a20bb5d07778d96fb 192.168.2.175:6379@16379 master - 0 1684884432565 1 connected 0-4095
    548647e5521d63e38bbaff0a1a49144243af3472 192.168.2.124:6381@16381 slave a1a54053c2e5da5f0ed932d168a64210d462608a 0 1684884433000 4 connected
    50f5c89c4c3d7cfef4b51967fcc948aaf846f421 192.168.2.175:6381@16381 slave af2df0aa3400c825f4be9f63f9403c975c6284c9 0 1684884434000 2 connected
    f5a5eb25a3578ade3d82ecc5268b496ccdba13ba 192.168.2.124:6380@16380 slave b5303467d7ddf1fbf42a561a20bb5d07778d96fb 0 1684884433571 1 connected
    e518932fb4686acae22c87d282dbca0502d66b5a 192.168.2.79:6380@16380 slave b5303467d7ddf1fbf42a561a20bb5d07778d96fb 0 1684884433168 1 connected
    af2df0aa3400c825f4be9f63f9403c975c6284c9 192.168.2.79:6379@16379 master - 0 1684884433000 2 connected 4096-8191
    
  6. 测试集群 需要注意的是,使用分片集群只能有一个db0数据库,如图解释:

    image.jpg

    我们在ych-data-001-6379的redis节点插入了一条key为name的String类型的数据后,然后在访问其他节点,我们发现其他节点也同步到改数据,如下图所示:

    image.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值