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