开发者
资源
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

启动Redis集群

下文介绍使用Redis命令行界面的集群创建功能来启动一个Redis集群的过程。

  1. 执行以下命令。
    export REDIS_HOME=/home/redis-6.0.20
    export PATH="$REDIS_HOME/src:$PATH"
  2. 在controller节点执行以下命令创建Redis集群管理脚本redis-cluster.sh。
    mkdir -p /home/redis/scripts
    vi /home/redis/scripts/redis-cluster.sh

    写入以下内容:

    #!/bin/bash
    
    ROOT_DIR="/home/redis/cluster"
    
    NODE0_IP="192.168.100.100"
    NODE1_IP="192.168.100.101"
    
    NODE0_PORTS=(7001 7003 7005)
    NODE1_PORTS=(7002 7004 7006)
    
    SSH_USER="root"
    
    REDIS_SERVER="/home/redis-6.0.20/src/redis-server"
    REDIS_CLI="/home/redis-6.0.20/src/redis-cli"
    
    
    usage()
    {
        echo "Usage:"
        echo "  $0 start  0|1|all"
        echo "  $0 stop   0|1|all"
        echo "  $0 status 0|1|all"
    }
    
    
    start_local()
    {
        local ip=$1
        shift
        local ports=("$@")
    
        for port in "${ports[@]}";
        do
            conf="${ROOT_DIR}/${port}/redis.conf"
    
            if [ ! -f "${conf}" ]; then
                echo "ERROR: ${conf} does not exist."
                return 1
            fi
    
            if ${REDIS_CLI} -h "${ip}" -p "${port}" ping \
                >/dev/null 2>&1;
            then
                echo "Redis ${port} is already running."
                continue
            fi
    
            echo "Starting Redis ${port}..."
    
            cd ${ROOT_DIR}/${port}/
            ${REDIS_SERVER} "${conf}" --port ${port}  &
    
            sleep 1
    
            if ${REDIS_CLI} -h "${ip}" -p "${port}" ping \
                >/dev/null 2>&1;
            then
                echo "Redis ${port} started successfully."
            else
                echo "ERROR: Redis ${port} failed to start."
            fi
        done
    }
    
    
    stop_local()
    {
        local ip=$1
        shift
        local ports=("$@")
    
        for port in "${ports[@]}";
        do
            if ${REDIS_CLI} -h "${ip}" -p "${port}" ping \
                >/dev/null 2>&1;
            then
                echo "Stopping Redis ${port}..."
    
                ${REDIS_CLI} \
                    -h "${ip}" \
                    -p "${port}" \
                    shutdown
    
                sleep 1
            else
                echo "Redis ${port} is not running."
            fi
        done
    }
    
    
    status_local()
    {
        local ip=$1
        shift
        local ports=("$@")
    
        for port in "${ports[@]}";
        do
            printf "Redis ${ip}:${port}: "
    
            if ${REDIS_CLI} \
                -h "${ip}" \
                -p "${port}" \
                ping 2>/dev/null | grep -q PONG;
            then
                echo "RUNNING"
            else
                echo "STOPPED"
            fi
        done
    }
    
    
    start_node0()
    {
        echo "===== Start Node0 ====="
    
        start_local \
            "${NODE0_IP}" \
            "${NODE0_PORTS[@]}"
    }
    
    
    start_node1()
    {
        echo "===== Start Node1 ====="
    
        ssh ${SSH_USER}@${NODE1_IP} \
            "ROOT_DIR='${ROOT_DIR}' bash -s" <<'EOF'
    
    NODE1_IP="192.168.100.101"
    NODE1_PORTS=(7002 7004 7006)
    
    REDIS_SERVER="/home/redis-6.0.20/src/redis-server"
    REDIS_CLI="/home/redis-6.0.20/src/redis-cli"
    
    for port in "${NODE1_PORTS[@]}";
    do
        conf="${ROOT_DIR}/${port}/redis.conf"
    
        if [ ! -f "${conf}" ]; then
            echo "ERROR: ${conf} does not exist."
            continue
        fi
    
        if ${REDIS_CLI} -h "${NODE1_IP}" -p "${port}" ping \
            >/dev/null 2>&1;
        then
            echo "Redis ${port} is already running."
            continue
        fi
    
        echo "Starting Redis ${port}..."
    
        cd ${ROOT_DIR}/${port}/
        ${REDIS_SERVER} "${conf}" --port ${port} &
    
        sleep 1
    
        if ${REDIS_CLI} -h "${NODE1_IP}" -p "${port}" ping \
            >/dev/null 2>&1;
        then
            echo "Redis ${port} started successfully."
        else
            echo "ERROR: Redis ${port} failed to start."
        fi
    done
    
    EOF
    }
    
    
    stop_node1()
    {
        echo "===== Stop Node1 ====="
    
        ssh ${SSH_USER}@${NODE1_IP} 'bash -s' <<'EOF'
    
    NODE1_IP="192.168.100.101"
    NODE1_PORTS=(7002 7004 7006)
    
    REDIS_SERVER="/home/redis-6.0.20/src/redis-server"
    REDIS_CLI="/home/redis-6.0.20/src/redis-cli"
    
    for port in "${NODE1_PORTS[@]}";
    do
        if ${REDIS_CLI} -h "${NODE1_IP}" -p "${port}" ping \
            >/dev/null 2>&1;
        then
            echo "Stopping Redis ${port}..."
    
            ${REDIS_CLI} \
                -h "${NODE1_IP}" \
                -p "${port}" \
                shutdown
    
            sleep 1
        else
            echo "Redis ${port} is not running."
        fi
    done
    
    EOF
    }
    
    
    status_node1()
    {
        echo "===== Node1 Status ====="
    
        ssh ${SSH_USER}@${NODE1_IP} 'bash -s' <<'EOF'
    
    NODE1_IP="192.168.100.101"
    NODE1_PORTS=(7002 7004 7006)
    
    REDIS_SERVER="/home/redis-6.0.20/src/redis-server"
    REDIS_CLI="/home/redis-6.0.20/src/redis-cli"
    
    for port in "${NODE1_PORTS[@]}";
    do
        printf "Redis ${NODE1_IP}:${port}: "
    
        if ${REDIS_CLI} \
            -h "${NODE1_IP}" \
            -p "${port}" \
            ping 2>/dev/null | grep -q PONG;
        then
            echo "RUNNING"
        else
            echo "STOPPED"
        fi
    done
    
    EOF
    }
    
    
    cluster_status()
    {
        echo ""
        echo "===== Redis Cluster Status ====="
    
        ${REDIS_CLI} \
            -h "${NODE0_IP}" \
            -p 7001 \
            cluster info
    
        echo ""
        echo "===== Redis Cluster Nodes ====="
    
        ${REDIS_CLI} \
            -h "${NODE0_IP}" \
            -p 7001 \
            cluster nodes
    }
    
    
    ACTION=$1
    NODE=$2
    
    
    if [ -z "${ACTION}" ] || [ -z "${NODE}" ]; then
        usage
        exit 1
    fi
    
    
    case "${ACTION}" in
    
        start)
    
            case "${NODE}" in
    
                0)
                    start_node0
                    ;;
    
                1)
                    start_node1
                    ;;
    
                all)
                    start_node0
                    start_node1
                    ;;
    
                *)
                    usage
                    exit 1
                    ;;
    
            esac
    
            ;;
    
    
        stop)
    
            case "${NODE}" in
    
                0)
                    stop_local \
                        "${NODE0_IP}" \
                        "${NODE0_PORTS[@]}"
                    ;;
    
                1)
                    stop_node1
                    ;;
    
                all)
                    stop_local \
                        "${NODE0_IP}" \
                        "${NODE0_PORTS[@]}"
    
                    stop_node1
                    ;;
    
                *)
                    usage
                    exit 1
                    ;;
    
            esac
    
            ;;
    
    
        status)
    
            case "${NODE}" in
    
                0)
                    status_local \
                        "${NODE0_IP}" \
                        "${NODE0_PORTS[@]}"
                    ;;
    
                1)
                    status_node1
                    ;;
    
                all)
                    status_local \
                        "${NODE0_IP}" \
                        "${NODE0_PORTS[@]}"
    
                    status_node1
    
                    cluster_status
                    ;;
    
                *)
                    usage
                    exit 1
                    ;;
    
            esac
    
            ;;
    
    
        *)
            usage
            exit 1
            ;;
    
    esac

    将以上脚本赋予执行权限。

    chmod +x /home/redis/scripts/redis-cluster.sh
  3. 在controller节点执行以下命令启动Redis实例并检查启动状态。
    /home/redis/scripts/redis-cluster.sh start all &
    /home/redis/scripts/redis-cluster.sh status all &

    预期产生以下回显:

    Redis 192.168.100.100:7001: RUNNING
    Redis 192.168.100.100:7003: RUNNING
    Redis 192.168.100.100:7005: RUNNING
    
    Redis 192.168.100.101:7002: RUNNING
    Redis 192.168.100.101:7004: RUNNING
    Redis 192.168.100.101:7006: RUNNING

  4. 在controller节点执行以下命令创建Cluster。
    redis-cli \
    --cluster create \
    192.168.100.100:7001 \
    192.168.100.100:7003 \
    192.168.100.100:7005 \
    192.168.100.101:7002 \
    192.168.100.101:7004 \
    192.168.100.101:7006 \
    --cluster-replicas 1

    确认节点分配后输入:

    yes

    Redis会自动创建3个Master和3个Replica。