两台虚拟机实现Redis集群

    科技2026-03-29  16

    1、安装虚拟机

    详细教程(含镜像下载地址): https://blog.csdn.net/qq_35526165/article/details/108961674

    2、安装Redis

    下载redis

    cd /opt wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar zxf redis-4.0.14.tar.gz

    问题:

    bash:wget: command not found

    解决方法:

    yum -y install wget

    移动reids

    mv redis-4.0.14 redis cp -r redis /usr/local/

    安装依赖包

    yum install -y tcl gcc zlib-devel openssl-devel automake autoconf libtool make

    编译

    cd /usr/local/redis make MALLOC=libc

    添加环境变量

    vi ~/.bash_profile export REDIS_HOME=redis的路径 PATH=$PATH:&HOME/bin:$REDIS_HOME/src

    使环境变量生效

    source ~/.bash_profile

    3、配置集群

    创建 Redis 集群目录

    mkdir -p /opt/redis-cluster/nodes-{7001,7002,7003}

    在以上三个目录下,创建redis.conf

    # 当前机器IP地址绑定设置port bind 192.168.213.131 # redis 监听端口 port 7001 # 使用 yes 启用守护进程 daemonize yes # 当 Redis 以守护进程方式运行时,Redis 默认会把 pid pidfile redis_7001.pid # 日志记录级别,共4个级别:debug、verbose、notice(默认)、warning loglevel notice # 日志目录 logfile "/opt/redis-cluster/nodes-7001/redis_7001.log" # 本地数据库存放目录 dir /opt/redis-cluster/nodes-7001/ # 保存节点配置,自动创建,自动更新 cluster-config-file nodes-7001.conf # 通过upstart和systemd管理Redis守护进程,与具体的操作系统相关的 supervised no # 每次更新操作后进行日志记录,默认:no appendonly yes # 开启集群模式 cluster-enabled yes # 集群超时时间,节点超过这个时间没反应就断定是宕机 cluster-node-timeout 15000 # 多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 save 900 1 save 300 10 save 60 10000 # 本地数据库的名字 dbfilename dump.rdb # 存储到本地文件开启压缩,默认:yes rdbcompression yes # 更新日志文件名 appendfilename "appendonly.aof" # 指定更新日志条件: # no: 等操作系统进行数据缓存同步到磁盘(快) # always: 每次更新操作后手动调用 fsync() 将数据写磁盘(慢,安全) # everysec: 每秒同步一次(折中,默认值) appendfsync everysec # 密码暂未设置,给出配置 # 当 master 服务设置了密码保护时,slav 服务连接 master 的密码 #masterauth # 连接密码,客户端需使用AUTH <password>命令连接 #requirepass

    可以先在本地创建redis.conf,再使用 VMware-Tools 上传到虚拟机

    快速修改node-7002和node-7003目录下redis.conf的端口

    vi redis.conf :%s/7001/7002/g vi redis.conf :%s/7001/7003/g

    4、下载并安装 ruby

    下载ruby安装包

    cd /opt wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz tar zxf ruby-2.3.4.tar.gz

    拷贝到/usr/local目录下,重命名为ruby目录

    mv ruby-2.3.4 /usr/local/ruby

    编译

    cd /usr/local/ruby/ && ./configure && make && make install

    查看版本

    ruby -v

    问题:

    bash: ruby: command not found

    解决方法:

    ln -s /usr/local/bin/ruby /usr/bin/ruby

    如果 ruby 版本过低,则卸载重装

    rpm -qa | grep ruby yum erase ruby

    安装 ruby-redis.gem

    cd /usr/local/redis && gem install redis

    问题: 没有gem命令。

    解决方法:

    ln -s /usr/local/bin/gem /usr/bin/gem

    5、关闭防火墙

    注意: 两台虚拟机都必须关闭防火墙,或者都只关闭redis防火墙端口,确保两台虚拟机的redis可以正常通讯。

    systemctl stop firewalld

    6、启动所有 Redis 节点

    两台虚拟机完成相同配置后,都需要执行所有节点

    redis-server /opt/redis-cluster/nodes-7001/redis.conf redis-server /opt/redis-cluster/nodes-7002/redis.conf redis-server /opt/redis-cluster/nodes-7003/redis.conf

    查看节点

    ps -ef | grep redis

    7、创建 Redis 集群

    使用 redis-trib.rb 脚本创建 Redis 集群,执行如下命令后,会自动分配集群中的 3 个 master 和 3 个 slave。

    注意: redis集群至少需要6个节点才能创建。

    在其中一台虚拟机执行如下命令

    cd /usr/local/redis/src ./redis-trib.rb create --replicas 1 192.168.213.131:7001 192.168.213.131:7002 192.168.213.131:7003 192.168.213.132:7001 192.168.213.132:7002 192.168.213.132:7003

    注意: 遇到询问时,输入 yes ,不能只输入 y。

    8、测试节点

    登录其中某一个节点,测试

    使用虚拟机2号,登录虚拟机1号的7003端口的节点(也可以登录虚拟机2号的节点),设置键值对 在虚拟机1号获取键值对 查看集群配置信息:

    cluster nodes

    9、设置开机自启动

    cd /etc/init.d/

    创建并编辑 redis 文件

    vi redis #!/bin/bash #chkconfig: 22345 10 90 #description: Start and Stop redis IP=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'` REDISPORT_1=7001 REDISPORT_2=7002 REDISPORT_3=7003 PIDFILE_1=/opt/redis-cluster/nodes-7001/redis_7001.pid PIDFILE_2=/opt/redis-cluster/nodes-7002/redis_7002.pid PIDFILE_3=/opt/redis-cluster/nodes-7003/redis_7003.pid CONF_1="/opt/redis-cluster/nodes-7001/redis.conf" CONF_2="/opt/redis-cluster/nodes-7002/redis.conf" CONF_3="/opt/redis-cluster/nodes-7003/redis.conf" EXEC=/usr/local/redis/src/redis-server CLIEXEC=/usr/local/redis/src/redis-cli case "$1" in start) if [ -f $PIDFILE_1 ];then echo "$PIDFILE_1 exists,process is already running or crashed" else echo "Starting Redis server... $CONF_1" $EXEC $CONF_1 fi if [ -f $PIDFILE_2 ];then echo "$PIDFILE_2 exists,process is already running or crashed" else echo "Starting Redis server... $CONF_2" $EXEC $CONF_2 fi if [ -f $PIDFILE_3 ];then echo "$PIDFILE_3 exists,process is already running or crashed" else echo "Starting Redis server... $CONF_3" $EXEC $CONF_3 fi ;; stop) if [ ! -f $PIDFILE_1 ];then echo "$PIDFILE_1 does not exist,process is not running" else PID=$(cat $PIDFILE_1) echo "Stopping..." $CLIEXEC -h $IP -p $REDISPORT_1 shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped $CONF_1" fi if [ ! -f $PIDFILE_2 ];then echo "$PIDFILE_2 does not exist,process is not running" else PID=$(cat $PIDFILE_2) echo "Stopping..." $CLIEXEC -h $IP -p $REDISPORT_2 shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped $CONF_2" fi if [ ! -f $PIDFILE_3 ];then echo "$PIDFILE_3 does not exist,process is not running" else PID=$(cat $PIDFILE_3) echo "Stopping..." $CLIEXEC -h $IP -p $REDISPORT_3 shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped $CONF_3" fi ;; restart) "$0" stop sleep 3 "$0" start ;; *) echo "Please use start or stop or restart as first argument" ;; esac

    修改为可执行文件

    chmod +x /etc/init.d/redis

    添加到系统服务列表

    # 将 /etc/init.d/redis 添加到系统服务列表 chkconfig --add redis # 设置开机自启动 chkconfig redis on # 查看所有注册的脚本文件 chkconfig --list

    问题: /bin/bash^M: bad interpreter: 没有那个文件或目录 原因:本地编写redis文件上传到虚拟机,因为操作系统是windows,所以有可能有不可见字符。

    解决方法:

    vi redis

    查看文件格式

    :set ff?

    如果是dos格式,则修改为unix

    :set ff=unix

    最后,保存退出

    启动redis

    # 启动服务 service redis start # 停止服务 service redis stop # 重启服务 service redis restart

    另一台虚拟机也进行相同操作。

    注意: 每次虚拟机重启后,两台虚拟机都必须关闭防火墙,或者都只关闭redis防火墙端口,确保两台虚拟机的redis可以正常通讯。

    10、重新创建Redis集群 或 新增节点

    创建节点

    cd /usr/local/redis/src ./redis-trib.rb create --replicas 1 192.168.213.131:7001 192.168.213.131:7002 192.168.213.131:7003 192.168.213.132:7001 192.168.213.132:7002 192.168.213.132:7003

    报错:

    [ERR] Node 192.168.213.131:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

    解决方法: 删除两个虚拟机所有节点下,除了redis.conf的所有文件,重启各个节点redis

    登录到两台虚拟机各个节点上,删除数据库

    redis-cli -c -h 192.168.213.131 -p 7001 192.168.0.114:7001> flushall OK 192.168.0.114:7001> cluster reset OK

    如果flushall报错,无需理睬,确保cluster reset重置成功即可。

    所有节点清理完毕后,再次重新创建集群。

    参考资料: https://blog.csdn.net/IT_lukaifang/article/details/105146390

    Processed: 0.019, SQL: 9