实战docker部署redis集群(一主二从)+ 哨兵模式

前言:自学部署,并不专业,勿喷!!!

1.  服务器环境

服务器名称IP系统版本
主服务器10.30.10.1centos7.6
从服务器110.30.10.2centos7.6
从服务器210.30.10.3centos7.6

避坑说明:必须3台服务器数量及以上,符合2n+1(n>=1)台服务器规则,否则哨兵无法自动切换主从。

2.  使用docker搭建rdis一主二从

2.1 拉取redis镜像

        说明:请先安装docker,过程忽略。。。。

        1.有网情况下可直接在线拉取镜像

docker pull redis

        2.无网情况下需要在另一台有网的服务器进行下载

docker pull redis

    
docker save -o redis.tar redis

       再去到需要部署redis无网服务器,将redis.tar进行上传并拉取本地镜像

 docker load -i redis.tar

2.2 创建redis的存储,日志,配置文件挂载路径

mkdir -p /home/redis/{data,conf,log}

2.3 拉取redis.conf文件和创建redis.log文件夹并赋予777权限

4.1.1 拉取redis.conf文件

1.有网络情况下可以在线拉取

先切换目录

cd /home/redis/conf

下载

wget http://download.redis.io/redis-stable/redis.conf

  

2.无网情况下找台有网电脑输入下面的网站即可下载,再上传到需要部署的服务器上

http://download.redis.io/redis-stable/redis.conf

   

4.1.2 创建redis.log文件

touch /home/redis/log/redis.log

(提示:如果日志文件占用过大,可将其删除后,重新创建,重启redis即可)

   

4.1.3 赋予redis.conf,redis.log文件权限

chmod 777 /home/redis/conf/redis.conf

chomd 777 /home/redis/logs/redis.log

2.4 修改redis.conf(主)配置文件

# 让外部设备连接

bind 0.0.0.0

     

# 关闭保护模式

protected-mode no

   

# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)

daemonize no

    

# 设置日志文件路径(避坑提示,此路径为容器内的路径,切勿当成宿主路径)

logfile "/etc/redis.log"

    

# 设置主服务器密码(避坑提示,因为在哨兵模式下当主挂掉后,再重新启动主后,主变成了从,不写入masterauth,原来的主会无密码验证,会导致主从无法复制报错)

masterauth 123456

     

# 设置redis密码(避坑提示,一定要把三台服务器的redis密码设置成一致的,不然无法自动切换主从,因为假如主服务器挂掉后,会有一台从redis变成主,此时另外一台redis从会拿sentinel配置文件里面的sentinel auth-pass mymaster 123456 去验证密码,此sentinel auth-pass mymaster对应redis.conf配置文件里面的requirepass)

requirepass 123456

2.5 修改redis.conf(从)配置文件,两个从机同如下修改

# 让外部设备连接

bind 0.0.0.0

   

# 关闭保护模式

protected-mode no

    

# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)

daemonize no

   

# 设置日志文件路径(避坑提示,此路径为容器内的路径,切勿当成宿主路径)

logfile "/etc/redis.log"

   

# 设置主 IP 端口(避坑提示,此段必须写在 masterauth 123456 上面,不然无法启动redis)

slaveof 10.30.10.1 6379

   

# 设置主服务器密码

masterauth 123456

    

# 设置redis密码(避坑提示,一定要把三台服务器的redis密码设置成一致的,不然无法自动切换主从,因为假如主服务器挂掉后,会有一台从redis变成主,此时另外一台redis从会拿sentinel配置文件里面的sentinel auth-pass mymaster 123456 去验证密码,此sentinel auth-pass mymaster对应redis.conf配置文件里面的requirepass)

requirepass 123456

2.6 docker启动redis镜像,3台服务器同样执行以下启动命令

启动镜像命令

温馨提示:请先记得把防火墙6379端口打开

docker run --name redis \--restart=always \-p 6379:6379 \-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \-v /home/redis/data:/data \-v /home/redis/log/redis.log:/etc/redis.log \-d redis redis-server /etc/redis/redis.conf

解析

#设置容器名称

--name redis

   

#设置端口,前为宿主端口,后为容器端口(避坑提示,从机端口必须是6379,否则出现无法自动切换主从)

-p 6379:6379 

   

#设置redis跟随docker启动后进行自动启动

--restart=always

   

 #挂载redis.conf文件,方便修改配置文件

-v /home/redis/conf/redis.conf:/etc/redis/redis.conf

   

#挂载存储文件

-v /home/redis/data:/data

   

 #挂载日志文件,方便查看日志进行运维

-v /home/redis/log/redis.log:/etc/redis.log

   

#指定redis镜像名称并带配置文件进行启动

-d redis redis-server /etc/redis/redis.conf

2.7 验证主从和复制功能

1.验证主从

docker exec -it redis bash -c "redis-cli -a 123456 info replication"

   

主应显示如下,能看到两个从机state=online

# Replication
role:master
connected_slaves:2
slave0:ip=10.30.10.2,port=6379,state=online
slave1:ip=10.30.10.3,port=6379,state=online

   

从应显示如下,能看到连接主机成功

# Replication

role:slave

master_host:10.30.10.1

master_port:6379

master_link_status:up

2.验证复制功能是否正常

在主机插入数据

127.0.0.1:6379>set a test

127.0.0.1:6379>get a

返回 test,则正常

   

在两个从机获取

127.0.0.1:6379>get a

反回test,则说明主从复制功能正常

3. 搭建哨兵模式

三台服务器都进行以下相同操作

3.1 创建redis-sentinel配置文件路径

mkdir -p /home/sentinel/conf

3.2 创建和修改配置文件

切换目录

cd /home/sentinel/conf

   

1.服务器有网情况下,可在线下载配置文件

wget http://download.redis.io/redis-stable/sentinel.conf

 2.服务器无网情况下,可电脑输入网站下载,并上传到服务器/

http://download.redis.io/redis-stable/sentinel.conf

        

修改配置文件名称

mv sentinel.conf redis-sentinel.conf

          

修改配置文件内容

#允许让外部设备连接

bind 0.0.0.0

       

#关闭保护模式

protected-mode no

       

#关闭守护进程

daemonize no

        

#设置日志路径

logfile "/etc/sentinel.log"

      

#mymaster代表服务器的名称可⾃定义,设置主服务器IP,端口,哨兵票数

sentinel monitor mymaster 10.30.10.1 6379 2

   

#在 sentinel monitor mymaster 10.30.10.1 6379 2 下插入,mymaster是服务名称,123456是Redis服务器密码

sentinel auth-pass mymaster 123456

        

#修改超时时间,单位毫秒,设置个3秒就好,1000毫秒等于1秒

sentinel down-after-milliseconds mymaster 3000

3.3 启动sentinel容器

启动镜像命令

避坑提醒:必须把先防火墙开放26379端口,然后启动顺序为先主后从

docker run --restart=always \--privileged=true \--name redis-sentinel \-p 26379:26379 \-v /home/sentinel/conf:/etc/redis/conf/ \--net host \-d redis \redis-sentinel /etc/redis/conf/redis-sentinel.conf

解析

#设置sentinel跟随docker启动后进行自动启动

--restart=always

       

#设置容器名称

--name redis

       

#很重要啊!!!这个是给容器root权限,容器需要给宿主挂载的redis-sentinel.conf文件修改内容,有权限才行,不然会报错

--privileged=true

   

#给容器命名

--name redis-sentinel

      

#设置端口

-p 26379:26379

       

#设置redis-sentinel的配置文件目录路径,避坑提醒:千万别写文件路径,写了文件会导致主从切换不成功,直接挂载目录即可

/home/sentinel/conf:/etc/redis/conf/

       

#设置容器内部的网络跟主机的网络共享

--net host

       

#指定redis镜像,并带配置文件进行启动

-d redis \redis-sentinel /etc/redis/conf/redis-sentinel.conf

4. 验证

4.1 验证sentinel状态,redis-sentinel.conf文件是否已修改

不进入容器快捷查看,三台服务器都查看

docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"

   

返回以下这条信息,主IP和端口正确,两个从,sentinels=3则表示myid未冲突,状态正常

master0:name=mymaster,status=ok,address=10.30.10.1:6379,slaves=2,sentinels=3

   

直接查看redis-sentinel.conf

因为sentinel启动后会自动写入配置文件,拉到最下面可看到生成的myid,以及另外两台服务器的IP和端口,以及他们的哨兵myid

   

如果有问题,可进入容器查看日志

docker exec -it redis-sentinel bash

cat /etc/sentinel.log

正常的日志可以看到另外两台服务器的redis,IP,端口。另外两台服务器哨兵的id,IP,端口

4.2 模拟主服务器故障后主从切换

停止主服务器redis服务

docker stop redis

查看两台从服务器的redis信息

docker exec -it redis bash -c "redis-cli -a 123456 info replication"  

其中一台返回显示信息role:master,并且slave连接着一个,代表主从切换成功

   

查看两台从服务器的sentinel状态

docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"

正常返回以下其中一条信息,发现从服务器10.30.20.1已变成了主

master0:name=mymaster,status=ok,address=10.30.20.1:6379,slaves=2,sentinels=3

        

启动被停掉的原主服务器

docker start redis

查看原主服务器redis信息

docker exec -it redis bash -c "redis-cli -a 123456 info replication"  

正常返回信息显示role:slave 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用Docker部署Redis集群的步骤: 1.拉取Redis官方镜像: ```shell docker pull redis ``` 2.创建一个自定义的网络: ```shell docker network create redis-net ``` 3.创建6个Redis容器,3个作为主节点,3个作为从节点: ```shell docker run -d --name redis-1 --net redis-net redis redis-server --appendonly yes docker run -d --name redis-2 --net redis-net redis redis-server --appendonly yes docker run -d --name redis-3 --net redis-net redis redis-server --appendonly yes docker run -d --name redis-4 --net redis-net redis redis-server --appendonly yes docker run -d --name redis-5 --net redis-net redis redis-server --appendonly yes docker run -d --name redis-6 --net redis-net redis redis-server --appendonly yes ``` 4.将容器分配到不同的主节点和从节点: ```shell docker exec -it redis-1 redis-cli cluster meet <ip-address-of-redis-2> 6379 docker exec -it redis-1 redis-cli cluster meet <ip-address-of-redis-3> 6379 docker exec -it redis-4 redis-cli cluster meet <ip-address-of-redis-5> 6379 docker exec -it redis-4 redis-cli cluster meet <ip-address-of-redis-6> 6379 docker exec -it redis-1 redis-cli cluster replicate <node-id-of-redis-2> docker exec -it redis-1 redis-cli cluster replicate <node-id-of-redis-3> docker exec -it redis-4 redis-cli cluster replicate <node-id-of-redis-5> docker exec -it redis-4 redis-cli cluster replicate <node-id-of-redis-6> ``` 5.检查集群状态: ```shell docker exec -it redis-1 redis-cli cluster info ``` 6.在集群中添加键值对: ```shell docker exec -it redis-1 redis-cli set mykey "Hello World" docker exec -it redis-4 redis-cli get mykey ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值