两台虚拟机实现Redis集群

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值