zoukankan      html  css  js  c++  java
  • 在Spring Boot项目中使用Redis 集群(续)

    说明

    之前在单机上配置了Redis集群,并在项目中集成了Redis集群。今天在实际的生产环境中还是遇到了很多问题。这里把生产环境的配置过程记录一下。

    在生产环境一共三台服务器,每台服务器上存在一个master节点和两个slave节点。这两个slave节点分别从属于另外两台服务器的master节点。这样在最极端的情况下,即使其中两台服务器宕机,也可以保证redis可用。当然,最后是有六台服务器,分别在不通的机柜中,来保证Redis集群最大的可用性。

    安装redis

    采用源代码安装方式

    cd /usr/local/src
    wget http://download.redis.io/releases/redis-5.0.3.tar.gz
    tar xzf redis-5.0.3.tar.gz
    cd redis-5.0.3
    make PREFIX=/usr/local/redis install
    

    注册redis服务

    复制启动脚本到 /etc/rc.d/init.d 目录

    cp /usr/local/src/redis-5.0.3/utils/redis_init_script  /etc/rc.d/init.d/redis6379
    cp /usr/local/src/redis-5.0.3/utils/redis_init_script  /etc/rc.d/init.d/redis6380
    cp /usr/local/src/redis-5.0.3/utils/redis_init_script  /etc/rc.d/init.d/redis6381
    

    之后编辑/etc/rc.d/init.d/redis6379文件

    修改为以下内容

    #!/bin/sh
    # chkconfig: 2345 80 90
    #
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    
    ### BEGIN INIT INFO
    # Provides:     redis_6379
    # Default-Start:        2 3 4 5
    # Default-Stop:         0 1 6
    # Short-Description:    Redis data structure server
    # Description:          Redis data structure server. See https://redis.io
    ### END INIT INFO
    
    REDISPORT=6379
    EXEC=/usr/local/redis/bin/redis-server
    CLIEXEC=/usr/local/redis/bin/redis-cli
    
    PIDFILE=/var/run/redis_${REDISPORT}.pid
    CONF="/etc/redis/${REDISPORT}.conf"
    
    PASS="password"
    
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $CLIEXEC -a $PASS -p $REDISPORT shutdown
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
            fi
            ;;
        restart)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $CLIEXEC -a $PASS -p $REDISPORT shutdown
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            ;;
        *)
            echo "Please use start or stop as first argument"
            ;;
    esac
    

    之后编辑/etc/rc.d/init.d/redis6380文件和/etc/rc.d/init.d/redis6380文件,其中端口替换为对应的63806381端口。

    编辑完启动脚本之后,添加redis的配置文件。将redis配置文件拷贝到/etf/redis/端口.conf

    mkdir /etc/redis 
    cp /usr/local/src/redis-5.0.3/redis.conf /etc/redis/6379.conf
    cp /usr/local/src/redis-5.0.3/redis.conf /etc/redis/6380.conf
    cp /usr/local/src/redis-5.0.3/redis.conf /etc/redis/6381.conf
    

    接下来为启动脚本添加执行权限

    chmod +x /etc/init.d/redis6379
    chmod +x /etc/init.d/redis6380
    chmod +x /etc/init.d/redis6381
    

    下面设置开机自启

    chkconfig --add redis6379
    chkconfig --add redis6380
    chkconfig --add redis6381
    

    接下来我们配置集群

    执行命令

    mkdir /usr/local/data/
    mkdir /usr/local/data/redis/
    mkdir /usr/local/data/redis/6379/
    mkdir /usr/local/data/redis/6380/
    mkdir /usr/local/data/redis/6381/
    

    我们编辑 /etc/redis/6379.conf将它作为一个master节点

    注释掉 bind 这一行

    protected-mode no
    requirepass password
    masterauth password
    port 6379
    daemonize yes
    cluster-enabled yes
    cluster-config-file /etc/redis/nodes-6379.conf
    cluster-node-timeout 15000
    pidfile /var/run/redis_6379.pid
    dir /usr/local/data/redis/6379/
    

    然后我们编辑redis6380.conf和redis6381.conf文件,修改的内容和6379.conf修改的内容一致,将6379.conf中的端口号6379替换为相应的端口号。

    之后我们重启服务器

    reboot
    

    或者使用命令

    service redis6379 start
    service redis6380 start
    service redis6381 start
    

    我们在另外俩台服务器上做相同的操作。

    之后,我们登录其中一台服务器,来做集群的最后配置,分配不同主机的slot

    vim addnode.sh
    

    addnode.sh内容如下

    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 111.111.111.111 6379
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 112.112.112.112 6379
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 113.113.113.113 6379
    
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 111.111.111.111 6380
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 112.112.112.112 6380
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 113.113.113.113 6380
    
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 111.111.111.111 6381
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 112.112.112.112 6381
    /usr/local/redis/bin/redis-cli -h 111.111.111.111 -p 6379 -a password cluster meet 113.113.113.113 6381
    

    编辑完内容之后执行下面的命令

    chmod +x addnode.sh && ./addnode.sh
    

    添加完节点之后,我们分配slot。

    vim addslots.sh
    

    addslots.sh内容如下

    host=$1
    port=$2
    pwd=$3
    start=$4
    end=$5
     
    for slot in `seq ${start} ${end}`  
    do  
        echo "add slot:${slot}"  
        redis-cli -h ${host}  -p ${port} -c -a ${pwd} cluster addslots ${slot}
    done
    

    编辑完之后保存退出。继续执行以下的命令

    chmod +x addnode.sh 
    ./addslots.sh 111.111.111.111 6379 password 0       5460 
    ./addslots.sh 112.112.112.112 6379 password 5461    10922
    ./addslots.sh 113.113.113.113 6379 password 10923   16383
    

    进入redis-cli终端,通过 cluster node的命令查看节点信息

    redis-cli -h 111.111.111.111 -p 6379 -a password -c cluster nodes
    

    输出内容文

    23c255***511ee7 111.111.111.111:6379@16379 myself,master - 0 1551942837000 1 connected 0-5460
    29574b***e7078c 111.111.111.111:6380@16380 master - 0 1551942834000 3 connected
    9c9ebe***7cc875 111.111.111.111:6381@16381 master - 0 1551942835000 0 connected
    
    5dff38***f7421c 112.112.112.112:6379@16379 master - 0 1551942836000 6 connected 5461-10922
    45e2b6***8baa79 112.112.112.112:6380@16380 master - 0 1551942837003 4 connected
    236e69***baea4e 112.112.112.112:6381@16381 master - 0 1551942835000 7 connected
    
    3786ac***be616c 113.113.113.113:6379@16379 master - 0 1551942835003 2 connected 10923-16383
    22ed09***92fc7e 113.113.113.113:6380@16380 master - 0 1551942838004 5 connected
    8d8fac***0a0d43 113.113.113.113:6381@16381 master - 0 1551942836003 8 connected
    

    之后我们配置它们之间的主从关系

    redis-cli -c -a password -h 111.111.111.111 -p 6380 cluster replicate 5dff38***f7421c
    redis-cli -c -a password -h 111.111.111.111 -p 6381 cluster replicate 3786ac***be616c
    
    redis-cli -c -a password -h 112.112.112.112 -p 6380 cluster replicate 23c255***511ee7
    redis-cli -c -a password -h 112.112.112.112 -p 6381 cluster replicate 3786ac***be616c
    
    redis-cli -c -a password -h 113.113.113.113 -p 6380 cluster replicate 23c255***511ee7
    redis-cli -c -a password -h 113.113.113.113 -p 6381 cluster replicate 5dff38***f7421c
    

    到这时redis集群就配置完成了。

    上面的输出中,Redis节点的ID较长,为了现实方便,我在贴代码的时候把区间一段替换成了***

  • 相关阅读:
    Python多线程_thread和Threading
    Python多线程_thread和Threading
    ICMP协议
    ICMP协议
    Python中的Pexpect模块的简单使用
    Python中的Pexpect模块的简单使用
    Python中math和cmath模块的使用
    Python中math和cmath模块的使用
    Python中sys模块的使用
    Python模块化编程
  • 原文地址:https://www.cnblogs.com/lave/p/10490804.html
Copyright © 2011-2022 走看看