Maison > base de données > Redis > Introduction détaillée au cluster haute disponibilité Redis

Introduction détaillée au cluster haute disponibilité Redis

Libérer: 2019-11-26 17:11:58
avant
1956 Les gens l'ont consulté

Introduction détaillée au cluster haute disponibilité Redis

Le modèle de cluster maître-esclave de Redis est une architecture de cluster hautement disponible. Le contenu principal de ce chapitre comprend : la configuration d'un cluster haute disponibilité, la connexion de Jedis au cluster, l'ajout de nœuds de cluster, la suppression de nœuds de cluster et des instructions de configuration supplémentaires. (Recommandé : Tutoriel vidéo Redis)

Construction de cluster à haute disponibilité

La technologie de cluster est une technologie relativement nouvelle, grâce à La technologie de cluster peut obtenir des gains relativement élevés en termes de performances, de fiabilité et de flexibilité à moindre coût, et la planification des tâches est la technologie de base des systèmes de cluster.

Redis prend en charge les clusters après la version 3.0. Il existe 16 384 emplacements de hachage intégrés au cluster Redis. Redis mappera les emplacements de hachage sur différents nœuds à peu près également en fonction du nombre de nœuds.
Tous les nœuds sont interconnectés les uns aux autres (mécanisme PING-PONG). Lorsque plus de la moitié des hôtes pensent qu'un certain hôte est en panne, l'hôte est réellement en panne et l'ensemble du cluster sera indisponible.
Si plusieurs machines esclaves sont attribuées à chaque hôte du cluster. Si la machine maître raccroche, la machine esclave peut toujours fonctionner normalement. Cependant, si plus de la moitié des hôtes du cluster sont en panne, le cluster sera indisponible, qu'il y ait ou non des machines esclaves.

Préparatifs avant la construction

Création de l'environnement Ruby

L'outil de gestion de cluster Redis redis-trib.rb dépend de l'environnement Ruby.

[root@itdragon ~]# yum install ruby
[root@itdragon ~]# yum install rubygems
[root@itdragon ~]# gem install redis
[root@itdragon ~]# cd redis-4.0.2/src/
[root@itdragon src]# cp redis-trib.rb /usr/local/redis-4/bin/
Copier après la connexion

Étape 1 : Installez l'environnement Ruby

Étape 2 : Installez le package gem (gem est utilisé pour étendre ou modifier les applications Ruby).

Étape 3 : Recherchez le fichier redis-trib.rb dans le répertoire de décompression redis et copiez-le dans le répertoire où le service redis est démarré pour une gestion facile.

Problèmes possibles

1 redis nécessite la version Ruby >= 2.2.2, la solution est la suivante

2 Il n'y a pas de /usr/local/rvm/scripts/ Répertoire rvm. Il se peut que l'exécution de l'étape précédente ait échoué

[root@itdragon ~]# ruby --version
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
[root@itdragon ~]# yum install curl
[root@itdragon ~]# curl -L get.rvm.io | bash -s stable
[root@itdragon ~]# source /usr/local/rvm/scripts/rvm 
[root@itdragon ~]# rvm list known
[root@itdragon ~]# rvm install 2.3.3
[root@itdragon ~]# rvm use 2.3.3
[root@itdragon ~]# gem install redis
Copier après la connexion

Préparez six serveurs redis

La même chose que la logique de réplication maître-esclave, copiez le redis. .conf 6 fois, et le port est de 6000~6005

[root@itdragon bin]# cp redis.conf redis6000.conf
[root@itdragon bin]# vim redis6000.conf  
port xxxx                           #修改端口
cluster-enabled yes                 #打开注释,开启集群模式
cluster-config-file nodes-xxxx.conf #集群的配置文件
pidfile /var/run/redis_xxxx.pid     #pidfile文件
logfile "xxxx.log"                  #日志文件
dbfilename dump_xxxx.rdb            #rdb持久化文件
cluster-node-timeout 5000           #请求超时,单位毫秒
appendonly yes                      #开启aof持久化方式
[root@itdragon bin]# vim start-all.sh
./redis-server redis6000.conf
./redis-server redis6001.conf
./redis-server redis6002.conf
./redis-server redis6003.conf
./redis-server redis6004.conf
./redis-server redis6005.conf
[root@itdragon bin]# chmod u+x start-all.sh
[root@itdragon bin]# ./start-all.sh 
[root@itdragon bin]# ps aux | grep redis
root     28001  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6000 [cluster]
root     28003  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6001 [cluster]
root     28008  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6002 [cluster]
root     28013  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6003 [cluster]
root     28018  0.1  0.9 145964  9652 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6004 [cluster]
root     28023  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6005 [cluster]
Copier après la connexion

Première étape : copiez six redis.conf et modifiez les configurations pertinentes. Si vous trouvez cela problématique, vous pouvez utiliser les fichiers que j'ai configurés : https. ://github.com/ITDragonBlog/daydayup/tree/master /Redis/reids.conf
Étape 2 : Ajoutez un nouveau lot de programmes de service Redis et augmentez les autorisations d'exécution

Étape 3 : Vérifiez si le six services Redis sont démarrés avec succès

Construction de cluster maître-esclave

Commande de création de cluster : ./redis-trib.rb create crée un cluster , --replicas 1 attribue un esclave à chaque hôte, suivi de Les autres paramètres sont l'ip:port du service redis. Enfin entrez oui pour accepter la configuration recommandée

[root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
112.74.83.71:6000
112.74.83.71:6001
112.74.83.71:6002
Adding replica 112.74.83.71:6003 to 112.74.83.71:6000
Adding replica 112.74.83.71:6004 to 112.74.83.71:6001
Adding replica 112.74.83.71:6005 to 112.74.83.71:6002
...... #省略
Can I set the above configuration? (type 'yes' to accept): yes
...... #省略
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #有16384个可用的插槽提供服务说明搭建成功

[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c
112.74.83.71:6002> set testKey value
-> Redirected to slot [5203] located at 112.74.83.71:6000
OK

112.74.83.71:6000> cluster info
cluster_state:ok
......

112.74.83.71:6000> cluster nodes
0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connected
a3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected
1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460
a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922
915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected
Copier après la connexion

Étape 1 : Construisez le cluster./redis-trib.rb créez, sélectionnez oui pour accepter la configuration recommandée

Étape 2 : Entrez le client du cluster ./redis-cli -h n'importe quel hôte hôte -p n'importe quel port hôte -c, -c signifie connecter Redis en mode cluster

Étape 3 : Enregistrer les données

Étape 4 : informations sur le cluster Requête du cluster informations d'état

Étape 5 : nœuds de cluster Interroger les informations sur les nœuds de cluster. Il y a un trou ici

Les problèmes possibles seront présentés plus tard

Désolé, les nœuds du fichier de configuration du cluster. conf est déjà utilisé par un autre nœud du cluster Redis. Veuillez vous assurer que différents nœuds utilisent des fichiers de configuration de cluster différents.

C'est très clair, modifiez le fichier cluster-config-file nodes.conf pour éviter la duplication du nom, ou supprimez le fichier et recréez le cluster.

Nœuds de cluster Interroger les informations sur les nœuds de cluster

Il s'agit d'une commande très importante. Les informations dont nous devons nous soucier sont :

Premier paramètre : ID de nœud

<🎜. >Deuxième paramètre : IP:PORT@TCP Il y a un piège ici. Les versions antérieures à jedis-2.9.0 ont une erreur d'analyse @

Troisième paramètre : Flag (Maître, Esclave, Moi-même, Échec...)

Le quatrième paramètre : S'il s'agit d'un esclave, c'est l'ID du nœud de l'hôte

Les deux derniers paramètres : l'état de la connexion et l'emplacement du slot.

Cluster de connexion Jedis

Tout d'abord, configurez le pare-feu

[root@itdragon ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT
[root@itdragon ~]# service iptables restart
Copier après la connexion

Enfin, intégrez le Spring

<!-- jedis集群版配置 -->
<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
    <constructor-arg name="nodes">
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6000" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6001" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6002" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6003" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6004" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6005" />
            </bean>
        </set>
    </constructor-arg>
    <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="jedisClientCluster" class="com.itdragon.service.impl.JedisClientCluster"></bean>
Copier après la connexion

Test unitaire

/**
 * 集群版测试
 * 若提示以下类似的错误:
 * java.lang.NumberFormatException: For input string: "6002@16002"
 * 若安装的redis 版本大于4,则可能是jedis 的版本低了。选择 2.9.0
 * 因为 cluster nodes 打印的信息中,4版本之前的是没有 @16002 tcp端口信息
 * 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
 */
@Test
public void testJedisCluster() throws IOException {
    HashSet<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort(HOST, 6000));
    nodes.add(new HostAndPort(HOST, 6001));
    nodes.add(new HostAndPort(HOST, 6002));
    nodes.add(new HostAndPort(HOST, 6003));
    nodes.add(new HostAndPort(HOST, 6004));
    nodes.add(new HostAndPort(HOST, 6005));
    JedisCluster cluster = new JedisCluster(nodes);
    cluster.set("cluster-key", "cluster-value");
    System.out.println("集群测试 : " + cluster.get("cluster-key"));
    cluster.close();
}
Copier après la connexion

Problèmes possibles

java.lang.NumberFormatException : Pour la chaîne d'entrée : "6002@16002"

Si la version Redis est supérieure à 4.0.0, il il est recommandé d'utiliser jedis-2.9.0 ou supérieur.

Code source :

https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis

Fonctionnement du nœud de cluster

Ajouter un nœud maître

[root@itdragon bin]# cp redis6005.conf redis6006.conf
[root@itdragon bin]# ./redis-server redis6006.conf
[root@itdragon bin]# ./redis-trib.rb add-node 112.74.83.71:6006 112.74.83.71:6000
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected   # 没有分配槽
[root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000
How many slots do you want to move (from 1 to 16384)? 500
What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f
Please enter all the source node IDs.
  Type &#39;all&#39; to use all the nodes as source nodes for the hash slots.
  Type &#39;done&#39; once you entered all the source nodes IDs.
Source node #1:all
Do you want to proceed with the proposed reshard plan (yes/no)? yes
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088
Copier après la connexion

Étape 1 : Créez un nouvel hôte de redis6006.conf et démarrez le service Redis

Étape 2 : Ajoutez un nœud hôte, Si « [OK] Nouveau nœud ajouté correctement. » est imprimé, cela signifie que l'ajout a réussi

Étape 3 : interrogez les informations du nœud de cluster et constatez que bien que l'hôte du port 6006 ait été ajouté, il n'y a aucun contenu derrière l'état de la connexion, c'est-à-dire qu'aucun emplacement n'est alloué

.

第四步:给6006端口主机分配槽,

第一个参数:需要移动槽的个数,

第二个参数:接受槽的节点ID,

第三个参数:输入"all"表示从所有原节点中获取槽,

第四个参数:输入"yes"开始移动槽到目标结点id

第五步:查询集群节点信息,发现6006端口的主机已经分配了槽

核心命令:
./redis-trib.rb add-node 新增主机ip:port 集群任意节点ip:port
./redis-trib.rb reshard 集群任意节点ip:port

可能存在的问题
[ERR] Sorry, can't connect to node 112.74.83.71:6006
说明:新增的主机必须要是启动状态。

添加从节点

[root@itdragon bin]# cp redis6006.conf redis6007.conf
[root@itdragon bin]# vim redis6007.conf 
[root@itdragon bin]# ./redis-server redis6007.conf
[root@itdragon bin]# ./redis-trib.rb add-node --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected
Copier après la connexion

第一步:创建 redis6007.conf 的新主机,并启动Redis服务
第二步:新增从机节点,在原来的命令上多了 --slave --master-id 主节点ID
第三步:查询集群节点信息

删除结点

删除节点前,要确保该节点没有值,否则提示:is not empty! Reshard data away and try again. 若该节点有值,则需要把槽分配出去

./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f
Copier après la connexion

配置文件补充

前几章Redis教程中介绍了以下配置

1 开启Redis 的守护进程 :daemonize yes

2 指定pid文件写入文件名 :pidfile /var/run/redis.pid

3 指定Redis 端口:port 6379

4 绑定的主机地址 :bind 127.0.0.1

5 Redis持久化默认开启压缩数据:rdbcompression yes

6 指定rdb文件名:dbfilename dump.rdb

7 指定rdb文件位置:dir ./

8 从机启动时,它会自动从master进行数据同步:slaveof < masterip> < masterport>

9 开启aof持久化方式:appendonly yes

10 指定aof文件名:appendfilename appendonly.aof

11 触发aof快照机制:appendfsync everysec (no/always)

本章节是Redis教程中的最后一章,把剩下的配置也一起说了吧

1 设置客户端连接超时时间,0表示关闭 :timeout 300

2 设置Redis日志级别,debug、verbose(默认)、notice、warning:loglevel verbose

3 设置数据库的数量:databases 1

4 设置Redis连接密码:requirepass foobared

5 设置同一时间最大客户端连接数,默认无限制:maxclients 128

6 指定Redis最大内存限制:maxmemory < bytes>

7 指定是否启用虚拟内存机制:vm-enabled no

8 指定虚拟内存文件路径:vm-swap-file /tmp/redis.swap

9 指定包含其它的配置文件:include /path/to/local.conf

更多redis知识请关注redis数据库教程栏目。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal