Redis 클러스터 구현 및 PHP를 사용하여 호출

不言
풀어 주다: 2023-03-22 22:24:01
원래의
3617명이 탐색했습니다.

이 글에서는 Redis 클러스터를 구현하고 PHP를 사용하여 이를 호출하는 방법을 소개합니다. 필요한 친구들이 참고할 수 있습니다.

1. Redis 클러스터 구축
1. 3.0에서 redis -cluster 클러스터를 지원한 이후 Redis-Cluster는 센터리스 구조를 채택하고 각 노드는 데이터와 전체 클러스터 상태를 저장하며 각 노드는 다른 모든 노드와 연결됩니다. redis-cluster 아키텍처 다이어그램은 다음과 같습니다:

Redis 클러스터 구현 및 PHP를 사용하여 호출 구조적 특징:

 1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
 2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
 3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
 4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护nodeslotvalue。

 5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
로그인 후 복사
  现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:


      节点A覆盖0-5460;
      节点B覆盖5461-10922;
      节点C覆盖10923-16383.
로그인 후 복사

이해할 수 없습니다,,,,

     获取数据:

      如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据
로그인 후 복사

2. Redis 클러스터 마스터-슬레이브 모드

redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。并且如果之前的旧主节点恢复正常时。
로그인 후 복사
  上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。

     所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。

     B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。

    不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
로그인 후 복사

3. Redis 클러스터 구축

集群中至少应该有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点,所以下面使用6节点(主节点、备份节点由redis-cluster集群确定)。
로그인 후 복사

모두 최소 6개의 Redis 서비스가 필요합니다.

그런 다음 이 머신에서 6개의 Redis 서비스를 시작하세요. 단, 시작하기 전에 구성을 수정하는 것을 잊지 마세요.

port  7000                                        //端口7000,7002,7003        bind 10.93.84.53                                     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群daemonize    yes                               //redis后台运行pidfile  ./redis_7000.pid          //pidfile文件对应7000,7001,7002cluster-enabled  yes                           //开启集群  把注释#去掉cluster-config-file  nodes.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
로그인 후 복사

그런 다음 redis 소스 코드의 src 디렉토리에 있는 redis-trib.rb를 현재 경로에 복사하세요.

Ruby 환경 설치

yum install ruby  
yum install rubygems  
gem install redis-3.2.2.gem
로그인 후 복사

이 머신에서 6개의 Redis의 시작 상태를 확인하세요

ps -ef | grep redis
로그인 후 복사

마지막으로 redis-trib.rb를 사용하여 Redis 클러스터를 생성합니다. create 명령 –replicas 1 매개변수를 사용하여 각 마스터 노드에 대한 슬레이브 노드(두 쌍)를 생성합니다. 첫 번째는 마스터이고 두 번째는 슬레이브입니다.

./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
로그인 후 복사

테스트에는 redis-cli를 사용하세요. 클러스터 모드로 연결하려면 -c 매개변수를 추가해야 합니다.

redis-cli -c
로그인 후 복사

-c 매개변수를 추가해야 합니다. 이는 연결이 클러스터 모드에 있음을 의미합니다.

이 시점에서 redis 클러스터가 성공적으로 구축되었습니다.
하지만 여기서는 로컬 테스트를 위해 6개의 포트만 필요합니다. 현실적으로는 최소한 2개의 머신이 필요합니다. 보안은 어떻게 합니까?
1. redis.conf를 수정하고 바인딩 옵션을 현재 LAN IP로 변경합니다.
2. 다른 Redis 서버에만 액세스할 수 있도록 방화벽을 구성합니다. 물론 애플리케이션 서버의 IP도 액세스를 허용해야 합니다. . . 그렇지 않으면 프로그램이 redis 서비스에 연결할 수 없으며 이는 시간 낭비입니다. . . .

//先关掉6379(redis服务使用的端口)iptables -I INPUT -p tcp --dport 6379  -j DROP 
//允许192.168.1.0这个机器进行访问本机的6379端口iptables -I INPUT -s 192.168.1.0 -p tcp --dport 6379 -j ACCEPT
로그인 후 복사

2. php에서 redis 클러스터에 연결합니다.

먼저 php –ri redis를 사용하여 redis 확장 버전을 확인하세요. 버전 3.0 이상이어야 합니다.
참조
두 번째 매개변수는 클러스터에 하나의 노드만 필요하므로 모두 채울 필요는 없습니다

$obj_cluster = new RedisCluster(NULL, ['127.0.0.1:6380']);echo $obj_cluster->get('name1');
로그인 후 복사
완료하세요

관련 권장 사항:


mysql을 쿼리하고 redis에 캐시하는 php 메서드

php redis 운영 명령어 공유


위 내용은 Redis 클러스터 구현 및 PHP를 사용하여 호출의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿