之前项目需要使用redis集群,然后花了时间安装,记录安装步骤和一些坑。
先了解redis集群。
Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。也就是3主3从节点,由于服务器只有3台,一台2个节点,redis创建集群自动分配节点。
一些环境准备:
一.服务器环境
三台服务器,设置hosts
172.16.4.45 RJL-Redis1
172.16.4.46 RJL-Redis2
172.16.4.47 RJL-Redis3
修改主机名分三步
1.命令
localhost 主机名
2.修改/etc/sysconfig/network文件
NETWORKING=yes
HOSTNAME=主机名
3.修改/etc/hosts文件
ip 主机名
端口分配及主从分配
RJL-Redis1:7000 master1
RJL-Redis1:7001 slave1
RJL-Redis2:7002 master2
RJL-Redis2:7003 slave2
RJL-Redis3:7004 master3
RJL-Redis3:7005 slave3
二.安装ruby
cd /usr/local
tar –zxvf ruby-2.5.1.tar.gz
cd ruby-2.5.1
./configure
make
sudo make install
ruby -v
三.安装zlib
cd /usr/local
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
sudo make install
四.修改ruby依赖zlib
cd /usr/local
cd ruby-2.5.1/ext/zlib
ruby ./extconf.rb
make (修改的参数具体如下(否则make操作会报错)zlib.o:$(top_srcdir)/include/ruby.h ****#将$(topsrcdir)修改为../..**** 修改后的具体代码结果如下 zlib.o: ../../include/ruby.h)
sudo make install
五.安装rubygems
cd /usr/local
tar -zxvf rubygems-2.7.7.tgz
cd rubygems-2.7.7
ruby setup.rb
六.安装openssl(可以不用安装)
cd /usr/local
tar -zxvf openssl-1.0.2f.tar.gz
cd openssl-1.0.2f
./config
make
sudo make install
备份旧版openssl
mkdir -p /backup/openssl_old
mv /usr/bin/openssl /backup/openssl_old/
替换新版openssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
检查更新后的OpenSSL版本
openssl version
七.ruby依赖openssl(第六步没有安装 省略第七步)
cd /usr/local
cd ruby-2.5.1/ext/openssl
ruby extconf.rb --with-openssl-dir=/usr/local/ssl
make (修改的参数具体如下 ****#将$(topsrcdir)修改为../..**** )
sudo make install
附:关于openssl重新编译
cd /usr/local/openssl-1.0.2f
make clean
./config -fPIC
./config -t
make
sudo make install
八.安装redis-4.0.0.gem
cd /usr/local
gem install -l ./redis-4.0.0.gem
九.安装redis
cd /usr/local
tar –zxvf redis-4.0.11.tar.gz
建立软连接
ln -s redis-4.0.11 redis
指定安装目录到:/usr/local/redis
cd redis
make && make install PREFIX=/usr/local/redis
创建配置节点
RJL-Redis1服务器:
mkdir -p /usr/local/redis/redis_cluster/7000
mkdir -p /usr/local/redis/redis_cluster/7001
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7000
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7001
RJL-Redis2服务器:
mkdir -p /usr/local/redis/redis_cluster/7002
mkdir -p /usr/local/redis/redis_cluster/7003
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7002
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7003
RJL-Redis3服务器:
mkdir -p /usr/local/redis/redis_cluster/7004
mkdir -p /usr/local/redis/redis_cluster/7005
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7004
cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7005
修改redis.conf
切记:不能设置密码,否则集群启动时会连接不上
port 7000 //端口根据对应的文件夹去配制端口 7000,7001,7002,7003,7004,7005
bind 本机ip //根据本机所在的IP或hostname去配制 172.16.4.45 172.16.4.46 172.16.4.47
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002,7003,7004,7005
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002,7003,7004,7005
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
复制src目录中的redis-trib.rb 到/usr/local/redis/bin目录
cp /usr/local/redis/src/redis-trib.rb /usr/local/redis/bin
启动各个节点
RJL-Redis1服务器:
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7000/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7001/redis.conf
RJL-Redis2服务器:
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7002/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7003/redis.conf
RJL-Redis3服务器:
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7004/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7005/redis.conf
检查各节点是否启动
查看进程
ps -ef | grep redis
查看端口
netstat -tnlp | grep redis
创建集群
进入RJL-Redis1的bin目录下,执行以下脚本
./redis-trib.rb create --replicas 1 172.16.4.45:7000 172.16.4.45:7001 172.16.4.46:7002 172.16.4.46:7003 172.16.4.47:7004 172.16.4.47:7005
集群维护
进入每台服务器的redis/src目录,记住参数 -c不可以少
cd /usr/local/redis/src
./redis-cli -h RJL-Redis1 -p 7000 -c
./redis-cli -h RJL-Redis2 -p 7002 -c
./redis-cli -h RJL-Redis3 -p 7004 -c
关闭节点
cd /usr/local/redis/src
./redis-cli -p 端口号 shutdown
查看集群
cd /usr/local/redis/src
./redis-cli -c -p 7000 -h 172.16.4.45 cluster nodes
创建集群问题
1.ERR Slot 3853 is already busy
只要把redis.conf中定义的 cluster-config-file 所在的文件删除,重新启动redis-server及运行redis-trib即可。
2. ERR Slot 0 is already busy
用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
flushdb
flushall
cluster reset