Directorio de artículos
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
- Ver información del clúster
- Ver nodos de clúster
- 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:
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