Existem dois servidores. Um é o mestre, mestre: 172.24.69.180
, o outro é o escravo, escravo: 172.24.69.181
endereço vip: 172.24.69.185
1. Desligue o firewall
Os firewalls estão desativados em ambos os servidores
systemctl disable --now firewalld
firewall-cmd --state
Desligue o SELinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus
Primeiro, desligue o firewall. Como não o desliguei, o VIP não conseguiu se desviar. Levei muito tempo para encontrá-lo.
2. Instale a janela de encaixe
Instale o docker em ambos os servidores
usando a instalação binária:
1. Obtenha o pacote binário offline do docker
docker二进制包获取地址:https://download.docker.com/linux/static/stable/x86_64/
2. Faça upload para o servidor e descompacte
tar xzf docker-20.10.8.tgz
#解压缩完成后将docker目录中的所有文件复制至/usr/bin/目录下
cp docker/* /usr/bin
3. Configure o arquivo docker.service
vim /usr/lib/systemd/system/docker.service
e insira o seguinte conteúdo no arquivo
[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. Crie um diretório de montagem
创建目录
mkdir /data/docker
5. Confirme daemon.json
mkdir /etc/docker
vim /etc/docker/daemon.json
Digite o seguinte em daemon.json:
{
"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. Inicie o serviço docker
systemctl daemon-reload
systemctl enable --now docker
3. Instale o redis
Ambos os servidores possuem o redis instalado, mas a configuração mestre-escravo é um pouco diferente.
1. Extraia a imagem
docker pull redis:6.2.6
2. Crie um diretório de montagem
mkdir -p /data/redis/logs
mkdir -p /data/redis/data
chmod 777 /data/redis/data
chmod 777 /data/redis/logs
3. A configuração do nó mestre está em 172.24.69.180
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 no arquivo de configuração é a senha para redis set
Configuração do nó, em 172.24.69.181
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 Este é o ip do nó mestre
4. Docker inicia o
nó mestre redis
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
nó escravo
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. Após iniciar o redis, copie redis-cli para o
nó mestre no diretório /usr/local/bin/ da máquina host.
docker cp mianredis:/usr/local/bin/redis-cli /usr/local/bin/
nó escravo
docker cp slaveredis:/usr/local/bin/redis-cli /usr/local/bin/
4. Redis mestre-escravo + sentinela (sentinela) + keepalived
Ambos os nós estão instalados, mas a configuração é diferente
Princípio de implementação
Instale sentry e keepalived nos servidores mestre e de backup, respectivamente. A prioridade do mestre é 100 e a prioridade do backup é 99. Configure a regra de script de verificação vrrp_script no servidor salve para verificar o status da função atual do escravo. Uma vez o status da função redis do escravo é mestre, altere a prioridade do escravo de 2 para 101, para que ele possa obter o privilégio de vip;
quando o serviço redis do mestre desligar, o sentinela promoverá o escravo para o novo mestre, e o escravo aumentará a prioridade quando o status da função for mestre. 2 Obtenha vip, quando o serviço redis do mestre original estiver ativo, o sentinela se juntará a ele como um escravo para a replicação mestre-escravo. Quando o serviço redis estiver
ativado o nó escravo que se torna o mestre desliga, o sentinela definirá o mestre do redis como o nó mestre original, vrrp_script Ao verificar se seu redis não é o mestre, reduza a prioridade em 2 a 99. A prioridade do mestre original é maior que a prioridade do escravo e o mestre original obtém permissões VIP.
1. Configuração do Sentinel.conf.
O caminho de configuração do nó mestre
é /data/redis/sentinel.conf. Insira o seguinte conteúdo em sentinel.conf.
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
Defina a configuração do sentinel.conf a partir do nó
, o caminho é /data/redis/sentinel.conf
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 aqui é o ip do nó mestre
172.24.69.181 é o ip do nó escravo
2. Inicie o
nó mestre sentinela:
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
Do nó:
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. Instale o keepalived
Ambos os servidores estão instalados, mas a configuração é diferente.
Instale o keepalived
yum -y install keepalived
1. Modifique o arquivo de configuração
Configuração do nó mestre:
O arquivo de configuração é /etc/keepalived/keepalived.conf
! 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
}
}
Configuração do nó
! 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. Os scripts mestre e escravo são iguais. O conteúdo do script de verificação de status é:
#!/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. Dê permissões ao script
chmod -R 755 /etc/keepalived/chkmaster.sh
4. Reinicie o keepalived
systemctl daemon-reload
systemctl enable --now keepalived
systemctl stop keepalived #关闭keepalived
systemctl start keepalived #启动keepalived
5. Verifique se o redis está normal
#登录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. Verifique se o vip pode desviar
Verifique em qual servidor o vip está neste momento, pare manualmente o contêiner redis no servidor onde o vip está localizado e veja se o vip pode desviar para outro servidor, se puder desviar, reinicie o serviço interrompido, então pare o container redis do servidor onde o vip está localizado e veja se o vip pode migrar para outro. Se sim, será bem sucedido.
Veja as mudanças na prioridade verificando o status do keepalived