Published on

docker redis集群

Authors
  • avatar
    Name
    yushenw
    Linkedin

创建网络

docker network create redis-cluster-net

启动redis

创建由3个redis节点

docker run -d --name redis-node1 --net redis-cluster-net -p 7000:6379 -v /docker/redis-cluster/redis-node1:/data redis:6.2 redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /data/nodes.conf --logfile /data/redis.log --cluster-node-timeout 5000 --bind 0.0.0.0 --requirepass redispwd
docker run -d --name redis-node2 --net redis-cluster-net -p 7001:6379 -v /docker/redis-cluster/redis-node2:/data redis:6.2 redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /data/nodes.conf --logfile /data/redis.log --cluster-node-timeout 5000 --bind 0.0.0.0 --requirepass redispwd
docker run -d --name redis-node3 --net redis-cluster-net -p 7002:6379 -v /docker/redis-cluster/redis-node3:/data redis:6.2 redis-server --appendonly yes --cluster-enabled yes --cluster-config-file /data/nodes.conf --logfile /data/redis.log --cluster-node-timeout 5000 --bind 0.0.0.0 --requirepass redispwd

创建由3个redis master节点构成的集群

先查看redis节点ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node1

创建集群

docker run -it --rm --net redis-cluster-net redis:6.2 redis-cli --cluster create 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 --cluster-replicas 0 --a redispwd
  • --cluster-replicas 0 代表每个节点都没有备用节点 备用节点会复制主节点数据,如果主节点挂掉,会重新启用备用节点升级为master节点

连接集群查看集群状态

docker run -it --rm --net redis-cluster-net redis redis-cli -c -h 172.18.0.2 -p 6379

cluster nodes:这将显示集群中所有节点的详细信息,包括它们的角色(如主节点或从节点)、状态、分片等。 cluster info:提供集群的一般信息。 cluster slots:显示关于键空间分片的信息。

crc16简介

redis集群校验和 计算crc16校验和与16384(集群的 hash slot 总数)进行模运算,得到的结果决定了 key 应该存储在哪个 hash slot 中。

使用golang连接

package main

import (
	"context"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis/v8"
)

var ctx = context.Background()

func main() {
	rdb := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs:    []string{"172.19.0.3:6379", "172.19.0.4:6379", "172.19.0.5:6379"},
		Password: "redispwd",
	})
	defer rdb.Close()

	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Welcome")
	})

	r.GET("/ping", func(c *gin.Context) {
		err := rdb.Set(ctx, "ping", "pong", 0).Err()
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		}
		val, err := rdb.Get(ctx, "ping").Result()
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
		}
		c.JSON(http.StatusOK, gin.H{"message": val})
	})
	r.Run(":8080")
}

docker中启动

dockerfile

FROM golang:1.21-alpine as builder 

ENV http_proxy http://proxy-addr:proxy-port
ENV https_proxy http://proxy-addr:proxy-port

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download -x

COPY . . 

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o my-gin-web .


FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=builder /app/my-gin-web .

EXPOSE 8080

CMD ["./my-gin-web"]

构建dockerfile

docker build -t my-gin-web .

启动go服务

docker run --rm -d -p 10080:8080 --net redis-cluster-net my-gin-web:latest