Redis一主一从Docker方式部署通过keepalived和 sentinel哨兵模式实现高可用

有两台服务器一台是主,master : 172.24.69.180

另外一台是从, slave :172.24.69.181

vip 地址: 172.24.69.185

1、关闭防火墙

两台服务器都关闭防火墙

bash 复制代码
systemctl disable --now firewalld
firewall-cmd --state

关闭SELinux

bash 复制代码
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus

首先关闭防火墙,有一次我没有关闭,vip一直无法漂移,找了好久

2、安装docker

两台服务器都安装docker

用二进制安装:

1、获取docker离线二进制包

bash 复制代码
docker二进制包获取地址:https://download.docker.com/linux/static/stable/x86_64/

2、上传服务器,解压缩

bash 复制代码
tar xzf docker-20.10.8.tgz
#解压缩完成后将docker目录中的所有文件复制至/usr/bin/目录下
cp docker/* /usr/bin

3、配置docker.service文件

vim /usr/lib/systemd/system/docker.service

在文件输入下面内容

bash 复制代码
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

4、创建挂载目录

bash 复制代码
创建目录
mkdir /data/docker

5、确认daemon.json

bash 复制代码
mkdir /etc/docker

vim /etc/docker/daemon.json

在daemon.json中输入下面内容:

bash 复制代码
{
    "graph": "/data/docker",
    "storage-driver": "overlay2",
    "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
    "bip": "172.7.21.1/24",
    "log-driver":"json-file",
    "log-opts":{ "max-size" :"100m","max-file":"3"},
    "exec-opts": ["native.cgroupdriver=systemd"]
}

6、启动docker 服务

bash 复制代码
systemctl daemon-reload
systemctl enable --now docker

3、安装redis

两台服务器都安装redis ,只是主从的配置稍有不一样

1、拉取镜像

bash 复制代码
 docker pull redis:6.2.6

2、 创建挂载目录

bash 复制代码
mkdir -p /data/redis/logs
mkdir -p /data/redis/data
chmod 777 /data/redis/data
chmod 777 /data/redis/logs

3、 主节点的配置, 在172.24.69.180上

bash 复制代码
cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass pass123
masterauth pass123
EOF

配置文件中的 pass123 是设置的redis的密码

从节点的配置,在172.24.69.181 上

bash 复制代码
cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass pass123
masterauth  pass123
 
slaveof 172.24.69.180 6379        
EOF

slaveof 172.24.69.180 这个是主节点的ip

4、Docker启动redis

主节点

bash 复制代码
docker run -dit --name mianredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

从节点

bash 复制代码
docker run -dit --name slaveredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

5、启动redis之后copy redis-cli 到宿主机的 /usr/local/bin/目录下

主节点

bash 复制代码
docker cp mianredis:/usr/local/bin/redis-cli /usr/local/bin/

从节点

bash 复制代码
docker cp slaveredis:/usr/local/bin/redis-cli /usr/local/bin/

4、Redis主从+sentinel(哨兵)+keepalived

两个节点都安装,只是配置不一样

实现的原理

在master和backup服务器分别安装哨兵和keepalived,master的优先级为100,backup的优先级为99,在salve服务器上配置vrrp_script检查脚本规则,检查slave当前的角色状态,一旦slave的redis角色状态为master,就把slave的优先级加2变为101,使其获得vip的权限;

当master的redis服务挂掉后,哨兵会将slave提升为新的master,slave检查角色状态为master时将优先级加2获得vip,当原来master的redis服务起来后哨兵将其作为slave加入到主从复制

当变为master的slave节点上redis服务挂掉后,哨兵会将redis的master设置为原来的master节点,vrrp_script检查自己的redis不是master时,将优先级减2变为99,原来的master优先级比slave优先级高,原来的master获得vip权限

1、sentinel.conf配置

主节点配置

路径在/data/redis/sentinel.conf, 在sentinel.conf输入下面的内容

bash 复制代码
port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.180"
sentinel announce-port 26379

从节点配置

sentinel.conf配置, 路径在/data/redis/sentinel.conf

bash 复制代码
port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.181"
sentinel announce-port 26379

172.24.69.180此处是主节点ip

172.24.69.181 是从节点ip

2、启动哨兵

主节点:

bash 复制代码
docker run -d --name main --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

从节点:

bash 复制代码
docker run -d --name slave --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

5、安装keepalived

两个服务器都安装,只是配置不一样

安装keepalived

bash 复制代码
yum -y install keepalived 

1、 修改配置文件

主节点的配置:

配置文件为/etc/keepalived/keepalived.conf

bash 复制代码
! Configuration File for keepalived
global_defs {
   router_id redis-225 ##设备名称
}
vrrp_script chkmaster{
     script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
}
vrrp_instance VI_redis {
    state MASTER ##当前设备为master
    interface enp4s1  ##vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 100 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.180 ##(本地IP地址)
    unicast_peer {
                  172.24.69.181  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication {
        auth_type PASS
        auth_pass redis
    }

    virtual_ipaddress {
        172.24.69.185/24
    }
   track_script
     { ##调用状态检查
          chkmaster
     }
}

从节点配置

bash 复制代码
! Configuration File for keepalived
global_defs
 {
     router_id redis-224
 }
vrrp_script chkmaster
 {
     script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
  }
vrrp_instance VI_redis
{
   state BACKUP #本机的状态信息
   interface enp4s1   #vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 99 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.181 ##(本地IP地址)
    unicast_peer {
                  172.24.69.180  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication
    {
        auth_type PASS
        auth_pass redis
     }
     virtual_ipaddress
     {
         172.24.69.185/24
     }
     track_script
     { ##调用状态检查
          chkmaster
     }
}

2、主从的脚本都一样状态检查脚本内容:

bash 复制代码
#!/bin/bash
STATUS=`/usr/local/bin/redis-cli -h $1 -p $2 -a $3 info | grep role:master | wc -l`
echo $STATUS
if [ "$STATUS" -eq 0 ];then    
    exit 1
else    
    exit 0
fi

3、给脚本权限

bash 复制代码
chmod -R 755 /etc/keepalived/chkmaster.sh

4、重启keepalived

bash 复制代码
systemctl daemon-reload
systemctl enable --now keepalived
bash 复制代码
systemctl stop keepalived     #关闭keepalived
systemctl start keepalived     #启动keepalived

5、验证redis是否正常

bash 复制代码
#登录redis
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123
#查看redis信息
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123 info

6、验证vip 是否可以漂移

查看此时vip 在哪台服务器上,手动停止vip所在服务器上的redis 容器,看vip 是否能漂移到另外一台服务器,如果能漂移,把停掉的服务重新启动,再把vip所在的服务器的redis 容器停掉,看vip是否能漂移到另外一台,如果可以就成功了。

通过查看keepalived的状态,看到优先级的变化

相关推荐
m0_7417688544 分钟前
使用docker的小例子
运维·docker·容器
学习3人组1 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神2 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen012 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
码农郁郁久居人下2 小时前
Redis的配置与优化
数据库·redis·缓存
(⊙o⊙)~哦2 小时前
linux 解压缩
linux·运维·服务器
最新小梦4 小时前
Docker日志管理
运维·docker·容器
Hsu_kk4 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK4 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解