Redis 클러스터 아키텍처 다이어그램
위 그림의 파란색은 Redis 클러스터의 노드입니다.
노드 간 ping 명령을 사용하여 연결이 정상인지 테스트합니다. 노드 간 기본 구분은 없습니다. 작동을 위해 어떤 노드에 연결하면 다른 노드로 전달될 수 있습니다.
1. Redis 결함 허용 메커니즘
노드는 정기적으로 서로에게 ping 명령을 보내 노드의 상태를 테스트합니다. ping 명령을 받으면 퐁 문자열이 반환됩니다.
투표 메커니즘: 노드 A가 노드 B에 핑을 보냈지만 퐁 반환을 받지 못한 경우 클러스터의 노드 중 절반 이상이 노드 B로부터 퐁을 받을 수 없는 경우 다른 노드에 B에 핑을 다시 보내라는 알림이 전달됩니다. 노드 B. 그러면 노드 B가 다운된 것으로 간주됩니다. 일반적으로 각 노드마다 백업 노드가 제공되는데, 장애가 발생하면 백업 노드로 전환됩니다.
2. Redis 클러스터 저장 원리
Redis는 저장된 각 키에 대해 해시 작업을 수행하여 [0-16384]의 해시 값을 생성합니다(먼저
crc 알고리즘을 수행한 다음 나머지 16384를 사용합니다).
클러스터의 경우 간격 [0-16384]이 분할되어 다른 Redis에 배치됩니다.
3. Redis 지속성
스냅샷: Redis 메모리의 데이터를 정기적으로 하드 디스크에 저장합니다.
AOF: 데이터가 손실되더라도 모든 명령 작업을 aof에 저장합니다. 세분성도 매우 작지만 성능에 영향을 미칩니다.
2. 클러스터 환경 구축
redis 클러스터 관리 도구 redis-trib.rb는 Ruby 환경에 따라 다릅니다. 먼저 Ruby 환경을 설치해야 합니다.
Ruby를 설치해야 합니다.
yum install ruby yum install rubygems
Ruby 및 Redis 인터페이스 프로그램 설치
redis-3.0.0.gem을 /usr/local
에 복사합니다. 실행:
gem install /usr/local/redis-3.0.0.gem
3 Redis 클러스터 생성
한 서버에서, 다른 포트 번호를 사용하여 다른 Redis 서버를 나타낼 수 있습니다.
Redis 클러스터에는 최소 3개의 서버가 필요하며, 각 서버마다 백업 서버가 필요하므로 최소 6개의 서버가 필요합니다. 포트 계획은 다음과 같습니다.
메인 서버: 192.168.100.66:7001:7002:7003
슬레이브 서버: 192.168.100.66:7004:7005:7006
서버 프로그램을 저장할 폴더를 /usr/local에 생성합니다.
mkdir 7001 7002 7003 7004 7005 7006
redis가 클러스터링을 지원하도록 하려면 redis.config 구성 파일에서 Cluster-enabled yes를 수정해야 합니다.
이 예에서는 포트를 사용하여 다양한 Redis 서비스를 구별합니다. 따라서 redis.config의 포트도 수정해야 합니다. 해당 포트
에 대한 구성 파일을 수정한 후, redis 설치 디렉터리의 bin을 위의 각 디렉터리에 복사합니다.
각각 7001/bin/ 7002/bin을 입력하세요...
서비스 시작 ./redis-server ./redis.conf
redis 프로세스 보기: ps -aux|grep redis 다음 그림은 시작이 성공
클러스터 생성:
이전에 압축을 푼 폴더의 redis-3.0.0/src/redis-trib.rb를 redis-cluster 디렉터리에 복사합니다.
실행
./redis-trib.rb create --replicas 1 192.168.100.66:7001 192.168.100.66:7002 192.168.100.66:7003 192.168.100.66:7004 192.168.100.66:7005 192.168.100.66:7006
다음 오류가 보고되면 실행 중:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
해결 방법은 생성된 구성 파일인 node.conf를 삭제하는 것입니다. 작동하지 않으면 이제 생성된 노드에 이전 클러스터의 노드 정보가 포함되어 있다는 의미입니다. redis를 다시 시작한 후 다음과 같이 redis를 다시 시작하세요. 예:appendonly.aof, dump.rdb
성공하면 다음을 입력하세요.
클러스터 정보 쿼리:
지침:
./redis-cli -c -h 192.168.101.3 -p 7001 여기서 -c는 클러스터 모드 redis에서의 연결을 의미하고, -h는 IP 주소를 지정하고, -p는 포트 번호를 지정합니다
cluster 노드 클러스터 노드 정보 쿼리
cluster info 클러스터 상태 정보 쿼리
해시 슬롯 재배포
1단계: 클러스터에 연결
./redis-trib.rb reshard 192.168.101.3:7001(클러스터에서 사용 가능한 모든 노드에 연결할 수 있음)
2단계: Enter 할당할 슬롯 수
500개를 할당하려면 500을 입력하세요
3단계: 수신 슬롯의 노드 ID를 입력하세요
这里准备给7007分配槽,通过cluster nodes查看7007结点id为15b809eadae88955e36bcdbb8144f61bbbaf38fb
输入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
第四步:输入源结点id
这里输入all
第五步:输入yes开始移动槽到目标结点id
添加从节点
集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。
添加7008从结点,将7008作为7007的从结点。
./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口
执行如下命令:
./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 192.168.101.3:7008 192.168.101.3:7001
cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 是7007结点的id,可通过cluster nodes查看。
注意:如果原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令
查看集群中的结点,刚添加的7008为7007的从节点:
删除结点:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
删除已经占有hash槽的结点会失败,报错如下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
需要将该结点占用的hash槽分配出去(参考hash槽重新分配章节)。
测试:
Maven: <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.0</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.10.RELEASE</version> <scope>test</scope> </dependency> </dependencies>
普通测试:
@Test public void redisClusterTest1(){ JedisPoolConfig config=new JedisPoolConfig(); config.setMaxTotal(30); config.setMaxIdle(2); Set<HostAndPort> jedisNode=new HashSet<HostAndPort>(); jedisNode.add(new HostAndPort("192.168.100.66",7001)); jedisNode.add(new HostAndPort("192.168.100.66",7002)); jedisNode.add(new HostAndPort("192.168.100.66",7003)); jedisNode.add(new HostAndPort("192.168.100.66",7004)); jedisNode.add(new HostAndPort("192.168.100.66",7005)); jedisNode.add(new HostAndPort("192.168.100.66",7006)); JedisCluster jc=new JedisCluster(jedisNode,config); jc.set("name","老王"); String value=jc.get("name"); System.out.println(value); }
Spring测试:
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最大连接数 --> <property name="maxTotal" value="30" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="10" /> <!-- 每次释放连接的最大数目 --> <property name="numTestsPerEvictionRun" value="1024" /> <!-- 释放连接的扫描间隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!-- 连接最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 --> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 --> <property name="maxWaitMillis" value="1500" /> <!-- 在获取连接的时候检查有效性, 默认false --> <property name="testOnBorrow" value="true" /> <!-- 在空闲时检查有效性, 默认false --> <property name="testWhileIdle" value="true" /> <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true --> <property name="blockWhenExhausted" value="false" /> </bean> <!-- redis集群 --> <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg index="0"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7001"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7002"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7003"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7004"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7005"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.100.66"></constructor-arg> <constructor-arg index="1" value="7006"></constructor-arg> </bean> </set> </constructor-arg> <constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg> </bean> </beans>
测试类:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:spring-config.xml"}) public class RedisClusterTest { @Autowired private JedisCluster jedisCluster; @Test public void redisClusterTest2(){ jedisCluster.set("username","小明啦啦"); String name=jedisCluster.get("username"); System.out.println(name); } }
更多redis知识请关注redis数据库教程栏目。
위 내용은 Redis 분산 클러스터 구축 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于实现秒杀的相关内容,包括了秒杀逻辑、存在的链接超时、超卖和库存遗留的问题,下面一起来看一下,希望对大家有帮助。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
