Tres máquinas crean registros de problemas y procesos de clúster de redis

1. Introducción

Redis versión 5.0.4
versión del servidor Linux CentOS 6; CentOS 7; CentOS 9; el
clúster redis requiere al menos tres nodos maestros, construimos tres nodos maestros aquí y construimos un nodo esclavo para cada maestro, un total de 6 nodos redis, tres amos y tres esclavos.

2. Crea un clúster


  • Instale redis Linux en las tres máquinas para instalar e implementar Redis
    https://blog.csdn.net/craftsman2020/article/details/122851974

  • Cree un directorio de redis-cluster
    Cree un directorio de redis-cluster en el directorio de instalación de redis (/usr/local/redis/) de cada servidor

cd  /usr/local/redis/
mkdir  redis-cluster

Cree 8001 y 8002 respectivamente en redis-cluster

cd /usr/local/redis/redis-cluster
mkdir 8001 8002

El mismo funcionamiento que las otras dos máquinas, los puertos son 8003 8004, 8005 8006

  • 2.3 Copie el archivo de configuración
    Copie el redis.conf anterior al directorio 8001
cp /usr/local/redis/redis.conf  /usr/local/redis/redis-cluster/8001/

Haz lo mismo con los otros 5 directorios

  • Modificar redis.conf
1)daemonize yes
2)port 8001(分别对每个机器的端口号进行设置)
3)dir /usr/local/redis/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
4)cluster-enabled yes(启动集群模式)
5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
6)cluster-node-timeout 5000
7) bind 127.0.0.1(去掉bind绑定访问ip信息, 注释掉,或改为0.0.0.0也可)
8) protected-mode no (关闭保护模式)
9)appendonly yes
如果要设置密码需要增加如下配置:
10)requirepass xxx (设置redis访问密码)
11)masterauth xxx (设置集群节点间访问密码,跟上面一致)

Copie el archivo de configuración redis.conf modificado de 8001 a 8002-8006 respectivamente, y modifique el puerto y el nombre de archivo correspondientes

cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8002/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8003/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8004/
scp  /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8005/
scp  /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8006/

Los cinco archivos recién copiados solo modifican los elementos de configuración: puerto, directorio, archivo de configuración de clúster

  • Inicie 6 instancias de redis por separado
redis-server /usr/local/redis/redis-cluster/8001/redis.conf
redis-server /usr/local/redis/redis-cluster/8002/redis.conf
redis-server /usr/local/redis/redis-cluster/8003/redis.conf
redis-server /usr/local/redis/redis-cluster/8004/redis.conf
redis-server /usr/local/redis/redis-cluster/8005/redis.conf
redis-server /usr/local/redis/redis-cluster/8006/redis.conf
  • crear clúster
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.2.58:8001 192.168.2.58:8002 192.168.2.59:8003 192.168.2.59:8004 192.168.1.60:8005 192.168.1.60:8006

  • Verifique el clúster
    Conéctese a cualquier nodo de la máquina A
redis-cli -a 123456 -c -h 192.168.2.58 -p 8001  -a 123456

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

  • Ver información del clúster
    inserte la descripción de la imagen aquí
  • Ver nodos de clúster
    inserte la descripción de la imagen aquí
  • Cerrar el clúster
redis-cli -a 123456 -c -h 192.168.2.58 -p 8001 shutdown
redis-cli -a 123456 -c -h 192.168.2.58-p 8002 shutdown
redis-cli -a 123456 -c -h 192.168.2.59 -p 8003 shutdown
redis-cli -a 123456 -c -h 192.168.2.59 -p 8004 shutdown
redis-cli -a 123456 -c -h 192.168.1.60 -p 8005 shutdown
redis-cli -a 123456 -c -h 192.168.1.60 -p 8006 shutdown

  • Cerrar e iniciar el clúster con scripts
  • Apague el clúster con un script
#!/bin/bash
#所有服务器节点的hostname
allnodes=('10.12.2.59' '10.12.2.58' '192.168.1.60')
local_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"​`
echo "### " date
echo "### local_ip: ${local_ip}"
PORT=8001
ENDPORT=8007
PASSWROD=123456
while [ $((PORT < ENDPORT)) != "0" ]; do
    for ip in ${
    
    allnodes[@]};
    do
        if [ "$ip" = "$local_ip" ];
        then 
            local_count=`ps -ef|grep redis |grep $PORT | wc -l`
            if [ $local_count -gt 0 ];
            then
                echo "### Stoping Local Redis $ip:$PORT"
                redis-cli -p $PORT -a $PASSWROD shutdown
            else 
                echo "no Local redis $ip:$PORT"
            fi
        else
            #判断某个端口是否已被占用,如果是,则执行关闭命令
            count=`ssh root@$ip lsof -i:$PORT | wc -l`
            if [ $count -gt 0 ];
            then
                echo "### Stopping Redis $ip:$PORT"
                ssh root@$ip redis-cli -p $PORT -a $PASSWROD shutdown 2>/dev/null
            else
                echo "no redis $ip:$PORT"
            fi
        fi
    done
    PORT=$((PORT+1))
done
exit 0

  • Inicie el clúster con un script
#!/bin/bash
#所有服务器节点的hostname
declare -A dic
dic=([8001]="10.12.2.58" [8002]="10.12.2.58" [8003]="10.12.2.59" [8004]="10.12.2.59" [8005]="192.168.1.60" [8006]="192.168.1.60")

local_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"​`
echo "### " date
echo "### local_ip: ${local_ip}"

for port in ${
    
    !dic[*]}
do 
    ip=${
    
    dic[${
    
    port}]}
    #echo ip: ${ip} ${port}
    if [ "$ip" = "$local_ip" ];
    then 
        local_count=`ps -ef|grep redis |grep $port | wc -l`
        if [ $local_count -eq 0 ];
        then
            echo "Start Local Redis Server $ip $port"
            redis-server /usr/local/redis/redis-cluster/$port/redis.conf
        else
            echo "Local Redis Server $ip $port already exists!"
        fi
    else
        count=`ssh root@$ip ps -ef|grep redis-server|grep -v grep|grep $port| wc -l`
        if [ $count -eq 0 ];
        then
            echo "Start Redis Server $ip $port"
            ssh root@$ip redis-server /usr/local/redis/redis-cluster/$port/redis.conf
        else
            echo "Redis Server $ip $port already exists!"
        fi
    fi    
done
exit 0

Aviso:

  • Cada clúster está configurado para iniciarse. Para conocer el método de configuración, consulte https://blog.csdn.net/craftsman2020/article/details/128130348?spm=1001.2014.3001.5502
  • Para facilitar el inicio y la finalización del programa, utilice scripts de shell.
  • Las versiones del sistema operativo de cada máquina en el clúster deben coordinarse tanto como sea posible para evitar el problema de que ssh no pueda acceder a Centos6 y Centos9.

3. Problemas encontrados

  • Las tres máquinas configuran visitas mutuas sin contraseña
    Sin embargo, debido a las grandes diferencias en las versiones centos de las tres máquinas, Centos9 y Centos6 no pueden configurar visitas mutuas sin secretos.
    Si configura sin contraseña e informa un error, también informará un error si se conecta directamente con el comando ssh:
    inserte la descripción de la imagen aquí
    intente crear un archivo de configuración (sin sufijo) en la carpeta donde se genera la clave pública (generalmente en el .ssh en el directorio de usuario actual) y ábralo en formato de documento de texto, agregue lo siguiente
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa

Referencia:
https://blog.csdn.net/weixin_51443484/article/details/125944815
https://weibo.com/ttarticle/p/show?id=2309404806141325738316
Pero no se ha resuelto.

Luego configure sin contraseña para centos9 en centos6:

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

El error es el siguiente:

no hostkey alg

En centos9, configure la configuración sin contraseña para centos6 e informe el error de la siguiente manera:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: Unable to negotiate with 192.168.1.30 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

Después de eso, se adoptó un compromiso, porque Centos7 puede configurar sin contraseña para los otros dos scripts, por lo que los scripts para iniciar y finalizar el clúster de redis se colocaron en Centos7.

  • Error al conectarse al clúster de redis: (error) solución MOVIDA
./redis-cli -h 192.168.2.58 -p 8001-a 123456

192.168.2.58 :8001 > get name

(error) MOVED 5798 192.168.2.58 :8001

Esta situación generalmente se debe a que no se configura el modo de clúster al iniciar redis-cli.

Use el parámetro -c para iniciar el modo de clúster al inicio, el comando es el siguiente:

./redis-cli -h 192.168.2.58 -p 8001 -a 123456 -c

192.168.2.58:8001 > get name

-> Redirected to slot [5798] located at 192.168.2.58 :8001
  • (error) READONLY No puede escribir en una réplica de solo lectura.
    Si ocurre el error anterior, significa que el servicio redis actual es de solo lectura y no tiene permiso de escritura. Se estima que el servicio se usa como una base de datos esclava .
    Al realizar operaciones de escritura en los nodos esclavos del clúster redis, se informará el error anterior.

  • Redis (error) Las claves CROSSSLOT en la solicitud no generan hash en la misma ranura
    参考 https://blog.csdn.net/TreeShu321/article/details/102766814

4. Artículos relacionados

Supongo que te gusta

Origin blog.csdn.net/craftsman2020/article/details/128175886
Recomendado
Clasificación