docker安装redis(哨兵模式)

docker安装redis(哨兵模式)

准备工作,5台本地虚拟机,三台哨兵,2台redis(一主一从),安装好docker环境。(也可以在一台机器上启动5个实例,配置5个不同端口即可)

下载镜像

  • 搜索redis镜像
    1
    docker search redis

  • 下载镜像
    1
    docker pull docker.io/redis:5.0

redis 版本可在dockerhub仓库查看

主从配置

  • 创建数据目录和配置目录
    1
    2
    mkdir /usr/redis/data
    mkdir /usr/redis/config

后面将会把容器内的文件挂载出来

主节点配置

在/usr/redis/config下创建配置文件redis.conf并添加配置参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize no
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
#redis监听的端口号。
port 6379
#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求,或者写成0.0.0.0
#bind 127.0.0.1
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile /logs/redis-server.log
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
save 900 1
#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir /data

从节点配置

除了以上配置项外,从节点还需增加主从相关配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize no
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
#redis监听的端口号。
port 6379
#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求,或者写成0.0.0.0
#bind 127.0.0.1
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile /logs/redis-server.log
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
save 900 1
#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录,下面的文件路径将会挂载出去,自定义。
dir /data

############### 主从复制 ###############

#作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
slave-read-only yes
# 设定master的IP和端口号,redis配置文件中的默认端口号是6379
# 低版本的redis这里会是slaveof,意思是一样的,因为slave是比较敏感的词汇,所以在redis后面的版本中不在使用slave的概念,取而代之的是replica
# 将192.168.72.128做为主,其余一台机器做从。ip和端口号按照机器和配置做相应修改。
replicaof 192.168.72.128 6379

启动容器

1
2
3
4
5
docker run -d --name redis --restart=always -p 6379:6379 \
--privileged=true \
-v /usr/redis/data/:/data \
-v /usr/redis/redis.conf:/usr/local/etc/redis/redis.conf \
17a9b6c90ffd redis-server /usr/local/etc/redis/redis.conf
参数说明:
参数 说明
-d 后台运行容器
–name 容器名称
–restart 开机自动启动容器
-p 端口映射
–privileged=true 容器内root用户将真正拥有root权限(可不写)
-v 文件挂载,格式:外部文件:docker内部文件(与上面配置文件里定义的文件路径保持一致:如dir:/data)
17a9b6c90ffd 镜像ID
redis-server redis的启动服务,固定的
/usr/local/etc/redis/redis.conf 采用此配置文件启动redis-server服务

验证主从配置

  • 进入到容器中
    1
    2
    3
    4
    5
    6
    # redis是容器名
    docker exec -it redis bash
    # 进入redis 客户端,这里没设置密码
    redis-cli
    # 查看节点信息
    info replication

遇到的问题

  • Can’t open the log file: Permission denied

    这是因为没给挂载的文件写权限,给整个redis目录赋权就行了

    1
    chmod -R 777 /usr/redis

添加哨兵集群配置

哨兵本质上也是redis实例,只是配置不同而已,起到监控redis主从的作用,当主节点挂掉后将从节点提升为主节点,当主节点重新恢复后自动将其作为从节点加入到集群中。起到保证集群高可用的作用

添加配置文件

参考官方配置文件:http://download.redis.io/redis-stable/sentinel.conf

  • 修改配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize no
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
#redis监听的端口号。
port 6379
#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
#bind 127.0.0.1
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile /logs/redis-server.log
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
save 900 1
#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir /data
#设置AOF模式开启(持久化)
appendonly yes

##############哨兵#################

# 最后一个2表示,两台机器判定主被动下线后,就进行failover(故障转移),quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
sentinel monitor mymaster 192.168.72.128 6379 2
# 同时监控其他两台哨兵机器
#sentinel auth-pass <master-name> <password>

#这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel down-after-milliseconds mymaster 10000

#failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
sentinel failover-timeout mymaster 180000
  • 启动哨兵
    1
    2
    3
    4
    5
    6
    # 和启动主从类似,只需要把redis-server改为redis-sentinel即可
    docker run -d --name redis --restart=always -p 6379:6379 \
    --privileged=true -v /usr/redis/data:/data \
    -v /usr/redis/config/redis.conf:/usr/local/etc/redis/redis.conf \
    -v /usr/redis/logs/redis-server.log:/logs/redis-server.log \
    17a9b6c90ffd redis-sentinel /usr/local/etc/redis/redis.conf

查看哨兵是否启动成功

再次打开哨兵的配置文件,将会看到文件被改写,增加了3台哨兵之间的互相监控配置

验证哨兵的自动故障转移

  • 先查看从节点信息
  • 关闭主节点

    1
    docker stop redis
  • 等一会再次查看从节点信息

从节点自动变成了master节点。实现了自动转移

总结

填写配置文件一定要仔细,挂载文件也要仔细,即使挂载的文件不正确redis也能正常启动并采用默认的配置,导致主从配置不生效