>  기사  >  데이터 베이스  >  k8s에 Redis 클러스터를 배포하는 방법

k8s에 Redis 클러스터를 배포하는 방법

WBOY
WBOY앞으로
2023-05-31 17:25:391500검색

redis 클러스터 구성

1.1 redis-cli를 사용하여 클러스터 만들기

# 查看redis的pod对应的ip
kubectl get pod -n jxbp -o wide
>NAME                             READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
 redis-0                          1/1     Running   0          18h    10.168.235.196   k8s-master   <none>           <none>
 redis-1                          1/1     Running   0          18h    10.168.235.225   k8s-master   <none>           <none>
 redis-2                          1/1     Running   0          18h    10.168.235.239   k8s-master   <none>           <none>
 redis-3                          1/1     Running   0          18h    10.168.235.198   k8s-master   <none>           <none>
 redis-4                          1/1     Running   0          18h    10.168.235.222   k8s-master   <none>           <none>
 redis-5                          1/1     Running   0          18h    10.168.235.238   k8s-master   <none>           <none>
# 进入到redis-0容器
kubectl exec -it redis-0 /bin/bash -n jxbp
# 创建master节点(redis-0、redis-2、redis-4)
redis-cli --cluster create 10.168.235.196:6379 10.168.235.239:6379 10.168.235.222:6379 -a jxbd
    > Warning: Using a password with &#39;-a&#39; or &#39;-u&#39; option on the command line interface may not be safe.
    >>> Performing hash slots allocation on 3 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
       slots:[0-5460] (5461 slots) master
    M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
       slots:[5461-10922] (5462 slots) master
    M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
       slots:[10923-16383] (5461 slots) master
    Can I set the above configuration? (type &#39;yes&#39; to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join
    .
    >>> Performing Cluster Check (using node 10.168.235.196:6379)
    M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
       slots:[0-5460] (5461 slots) master
    M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
       slots:[10923-16383] (5461 slots) master
    M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
       slots:[5461-10922] (5462 slots) master
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

위의 마스터 노드에 주의하세요. 해당 노드 ID가 생성됩니다: bcae187137a9b30d7dab8fe0d8a46c6e39638, a2cec159bbe2efa11a8f602 87b90 927bcb214729 code>, <code>4367e4a45e557406a3112e7b79f82a44d4ce485e , 슬레이브 노드를 생성하는 데 사용됩니다. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638a2cec159bbe2efa11a8f60287b90927bcb2147294367e4a45e557406a3112e7b79f82a44d4ce485e,用于创建slave节点。

# 为每个master节点添加slave节点
# 10.168.235.196:6379的位置可以是任意一个master节点,一般我们用第一个master节点即redis-0的ip地址
# --cluster-master-id参数指定该salve节点对应的master节点的id
# -a参数指定redis的密码
# redis-0的master节点,添加redis-1为slave节点
redis-cli --cluster add-node 10.168.235.225:6379 10.168.235.196:6379 --cluster-slave --cluster-master-id bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 -a jxbd
# redis-2的master节点,添加redis-3为slave节点
redis-cli --cluster add-node 10.168.235.198:6379 10.168.235.239:6379 --cluster-slave --cluster-master-id a2cec159bbe2efa11a8f60287b90927bcb214729 -a jxbd
# redis-4的master节点,添加redis-5为slave节点
redis-cli --cluster add-node 10.168.233.238:6379 10.168.235.222:6379 --cluster-slave --cluster-master-id 4367e4a45e557406a3112e7b79f82a44d4ce485e -a jxbd

显示以下信息,即为添加成功:

[OK] All nodes agree about slots configuration.

[OK] All 16384 slots covered.

[OK] New node added correctly.

坑:

一开始是想用headless的域名创建redis集群的,这样节点重启后就不需要更新ip,但是redis不支持使用域名,所以只能绕了一圈又回到固定ip的方法,和容器环境很不协调。

1.2redis集群状态验证(可选)

  • cluster info

# 进入到redis客户端,集群需要带上-c,有密码需要带上-a
redis-cli -c -a jxbd
# 查看redis集群信息
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:7996
cluster_stats_messages_pong_sent:7713
cluster_stats_messages_sent:15709
cluster_stats_messages_ping_received:7710
cluster_stats_messages_pong_received:7996
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:15709

注意:

现在进入集群中的任意一个Pod中都可以访问Redis服务,前面我们创建了一个headless类型的Service,kubernetes集群会为该服务分配一个DNS记录,格式为:$(pod.name).$(headless server.name).${namespace}.svc.cluster.local,每次访问该服务名时,将会直接进入到redis的节点上。svc.cluster.local可省略。 例如:

redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379

  • cluster nodes

# 查看redis集群状态
127.0.0.1:6379> cluster nodes
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670306292673 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670306290558 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670306291162 3 connected
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 master - 0 1670306291561 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 myself,master - 0 1670306291000 1 connected 0-5460
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670306292166 3 connected 10923-16383

可以看到3个master,3个slave节点,都是connected状态。

  • get,set验证

# 会找到对应的槽进行set操作,去到10.168.235.222节点
set name1 llsydn
-> Redirected to slot [12933] located at 10.168.235.222:6379
OK

# set name1成功
10.168.235.222:6379> set name1 llsydn
OK

# get name1成功
10.168.235.222:6379> get name1
"llsydn"

master节点进行set操作,slave节点复制。主从复制

1.3重启pod,验证集群(可选)

# redis-1未重启之前
10.168.235.239:6379> cluster nodes
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307319000 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307319575 1 connected 0-5460
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307318000 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307319781 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307319071 3 connected
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307318000 3 connected 10923-16383

# 重启redis-1
kubectl delete pod redis-1 -n jxbp
pod "redis-1" deleted

# redis-1重启之后
10.168.235.239:6379> cluster nodes
4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307349000 2 connected 5461-10922
bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307349988 1 connected 0-5460
70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307349000 2 connected
122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.232:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307350089 1 connected
c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307350000 3 connected
a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307348000 3 connected 10923-16383

可以看到重启后的,redis-1节点,虽然ip变了,但是redis集群,还是可以识别到新的ip,集群还是正常的。

10.168.235.225 ---> 10.168.235.232

1.4创建Service服务

前面我们创建了用于实现StatefulSet的Headless Service,但该Service没有Cluster Ip,因此不能用于外界访问。因此,我们需要创建一个专门为Redis集群提供访问和负载均衡的Service。

这里可以使用ClusterIPNodePort。这里,我使用的是NodePort

vi redis-ss.yaml

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  name: redis-ss
  namespace: jxbp
spec:
  ports:
    - name: imdgss
      port: 6379
      protocol: TCP
      targetPort: 6379
      nodePort: 6379
  selector:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  type: NodePort

创建名称为:redis-ss的服务。

在K8S集群中暴露6379端口,并且会对labels namek8s.kuboard.cn/name: redis的pod进行负载均衡。

然后在K8S集群中,就可以通过redis-ss:6379

kubectl get service -n jxbp

>NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                         AGE
redis-hs        ClusterIP   None            <none>        6379/TCP                                                        76m
redis-ss        NodePort    10.96.54.201    <none>        6379:6379/TCP                                                   2s

다음 정보가 표시되며 이는 추가가 성공했음을 의미합니다.

[OK] 모든 노드가 슬롯 구성에 동의합니다.

[OK] 16384 슬롯이 모두 적용되었습니다.

[OK] 새 노드가 올바르게 추가되었습니다.

함정:

처음에는 노드가 다시 시작된 후 IP를 업데이트할 필요가 없도록 헤드리스 도메인 이름을 사용하여 Redis 클러스터를 생성하려고 했습니다. 그러나 Redis는 도메인 이름 사용을 지원하지 않습니다. 그래서 돌아다니다가 고정 IP 방식으로 돌아갈 수 밖에 없는데, 이는 컨테이너 환경과 매우 다릅니다.

1.2 redis 클러스터 상태 확인(선택 사항)

  • cluster info🎜
spring.redis.cluster.nodes=redis-ss:6379
🎜참고: 🎜🎜이제 Redis 클러스터에 들어갑니다. 서비스는 모든 포드에서 액세스할 수 있습니다. 이전에 kubernetes 클러스터는 $(pod.name).$(headless) 형식으로 서비스에 DNS 레코드를 할당합니다. server.name).${namespace}.svc.cluster.local, 서비스 이름에 접근할 때마다 redis 노드에 직접 들어가게 됩니다. . svc.cluster.local은 생략 가능합니다. 예: 🎜🎜redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379🎜
  • 🎜클러스터 노드🎜
vi /opt/nfs/pv1/nodes.conf
> f6d4993467a4ab1f3fa806f1122edd39f6466394 10.168.235.228:6379@16379 slave ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 0 1670316449064 2 connected
ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 10.168.235.240:6379@16379 myself,master - 0 1670316450000 2 connected 5461-10922
955e1236652c2fcb11f47c20a43149dcd1f1f92b 10.168.235.255:6379@16379 master - 0 1670316449565 1 connected 0-5460
574c40485bb8f6cfaf8618d482efb06f3e323f88 10.168.235.224:6379@16379 slave 955e1236652c2fcb11f47c20a43149dcd1f1f92b 0 1670316449000 1 connected
91bd3dc859ce51f1ed0e7cbd07b13786297bd05b 10.168.235.237:6379@16379 slave fe0b74c5e461aa22d4d782f891b78ddc4306eed4 0 1670316450672 3 connected
fe0b74c5e461aa22d4d782f891b78ddc4306eed4 10.168.235.253:6379@16379 master - 0 1670316450068 3 connected 10923-16383
vars currentEpoch 3 lastVoteEpoch 0
🎜마스터 노드 3개와 슬레이브 노드 3개가 모두 연결됨 상태인 것을 볼 수 있습니다. 🎜
  • 🎜get, set verify🎜
rrreee🎜 마스터 노드가 설정 작업을 수행하고 슬레이브 노드가 복제합니다. 마스터-슬레이브 복제🎜🎜1.3 포드를 다시 시작하고 클러스터를 확인합니다(선택 사항)🎜rrreee🎜다시 시작한 후 redis-1 노드를 볼 수 있습니다. IP가 변경되었지만 redis 클러스터는 여전히 새 IP와 클러스터를 인식할 수 있습니다. 아직은 정상입니다. 🎜🎜10.168.235.225 ---> 10.168.235.232🎜🎜1.4 서비스 생성 🎜🎜 앞서 StatefulSet을 구현하기 위해 Headless Service를 생성했지만 이 서비스에는 클러스터 IP가 없으므로 외부 액세스에 사용할 수 없습니다. 따라서 Redis 클러스터에 대한 액세스 및 로드 밸런싱을 제공하기 위해 특별히 서비스를 생성해야 합니다. 🎜🎜여기에서 ClusterIPNodePort를 사용할 수 있습니다. 여기서는 NodePort를 사용하고 있습니다. 🎜🎜vi redis-ss.yaml🎜rrreee🎜 redis-ss라는 서비스를 생성합니다. 🎜🎜K8S 클러스터에서 포트 6379를 노출하고 레이블 이름k8s.kuboard.cn/name: redis인 Pod의 로드 밸런싱을 수행합니다. 🎜🎜그런 다음 K8S 클러스터에서 redis-ss:6379를 통해 redis 클러스터에 액세스할 수 있습니다. 🎜rrreee🎜1.5 Springboot 프로젝트 구성🎜rrreee🎜1.6 관련 질문 분석🎜🎜이 시점에서 왜 Redis Pod는 stable 플래그를 사용하지 않고 정상적으로 장애 조치가 가능한지 궁금할 것입니다. 여기에는 Redis 자체의 메커니즘이 포함됩니다. Redis 클러스터의 각 노드에는 자체 NodeId(자동 생성된 node.conf에 저장됨)가 있고 NodeId는 IP에 따라 변경되지 않기 때문입니다. 이는 실제로 고정된 네트워크 기호입니다. 즉, 재부팅으로 인해 Redis Pod가 다시 시작되더라도 Pod는 저장된 NodeId를 계속 사용하여 ID를 유지합니다. 위와 같이 NFS🎜rrreee🎜를 통해 redis-0 노드 구성 파일인 nodeId를 볼 수 있습니다. 두 번째 열은 IP 및 포트 정보이며 변경될 수 있습니다. 🎜🎜여기에서는 NodeId의 두 가지 사용 시나리오를 소개합니다. 🎜🎜슬레이브 Pod의 연결이 끊어졌다가 다시 연결되면 IP가 변경되지만 마스터는 NodeId가 여전히 동일하다는 것을 확인하므로 슬레이브가 여전히 이전 슬레이브라고 생각합니다. . 🎜🎜마스터 포드의 연결이 끊어지면 클러스터의 다른 슬레이브가 새 마스터를 선택합니다. 이전 마스터가 온라인 상태가 되고 클러스터에서 NodeId가 여전히 동일하다는 것을 알게 되면 새 마스터의 슬레이브 노드가 됩니다. 🎜

위 내용은 k8s에 Redis 클러스터를 배포하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제