启动Redis集群
下文介绍使用Redis命令行界面的集群创建功能来启动一个Redis集群的过程。
- 执行以下命令。
export REDIS_HOME=/home/redis-6.0.20 export PATH="$REDIS_HOME/src:$PATH"
- 在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
- 在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

- 在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。
父主题: 超节点集群模式部署