redis集群部署
程序运行操作系统版本
- Linux系统版本:CentOS release 6.7
- Linux内核版本:2.6.32-573.el6.x86_64
程序解释运行环境
Ruby 2.5.1(6个节点中,只需要有一个节点安装Ruby环境)
Redis 4.0.10
防火墙策略
关闭防火墙或者添加防火墙策略 6379 和16379
服务运行方式
6个节点上分别启动redis-server,并在其中一个安装有Ruby环境的节点上运行redis-trib.rb脚本,创建集群。
部署方式:
在每个服务节点上:
上传:redis包
1. 解压redis-4.0.10压缩文件
tar –xf redis-4.0.10.tar.gz
2. 进入redis-4.0.10目录,利用该目录下的makefile进行编译安装
cd redis-4.0.10
make
make install
完成后,在/usr/local/bin目录下会生成下面5个文件,由于该目录属于环境变量路径,在后面的操作中可以直接使用这些文件而不需要再次指定目录。
文件名 |
功能 |
redis-benchmark |
性能测试工具 |
redis-check-aof |
aof日志文件检测工具 |
redis-check-dump |
rdb快照文件检测工具 |
redis-cli |
客户端 |
redis-server |
服务端 |
3. 创建一个目录,用于存放Redis服务器相关文件
mkdir /home/redis
4. 在该目录下创建Redis配置文件
cd /root/redis
vi redis.conf
redis.conf文件内容如下:
port 6379
bind (改为具体服务器地址)
cluster-enabled yes
cluster-config-file "node_6379.conf" #多个集群节点在一起的话,必须要加端口号
cluster-node-timeout 5000
appendonly no
dbfilename dump.rdb
save 900 1 # RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘
save 300 10
save 60 10000
dir "/root/redis" #集群数据文件落地位置,尽量放到大一点的目录里面
pidfile
"/root/redis/node_pid.pid" #/root/redis/这个目录要存在
daemonize yes
安装ruby
在线安装:# yum install ruby (安装ruby)
# yum install rubygems(ruby的包管理器)
离线安装:# tar -zxvf ruby-2.4.1.tar.gz #先下载ruby-2.5.1.tar.gz
# ./configure –prefix=/usr/local/ruby -prefix是将ruby安装到指定目录,也可以自定义
# make && make install
# ruby -v
安装redis库
在线安装:gem install redis
离线安装:gem install -l redis #先下载redis-3.2.1.gem
离线安装可能会报:gem没有,执行:yum install rubygems
这里会报错如下:
ERROR: While executing gem ... (Gem::Exception)
Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
或者 ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
这里的意思代表zlib,openssl没有安装成功,下面是解决这个问题的办法:
首先解决openssl的问题
1)wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
2)tar -xzvf openssl-1.0.2h.tar.gz
3)cd openssl-1.0.2h
4)./config -fPIC --prefix=/usr/local/openssl enable-shared
5)./config -t
6)make && make install 使用 openssl version 验证是否安装成功
7)cd ../ruby-2.3.0 (此处目录不定就是进入ruby源代码中)
8)cd ext/openssl
9)ruby extconf.rb 提示没有找到ssl.h, 因为出现了错误:openssl/ssl.h:没有那个文件或目录
10)ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib
输出如下代表成功:
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for assert.h... yes
checking for openssl/ssl.h... yes
.............................................中间略.............................................
checking for EVP_CTRL_GCM_GET_TAG in openssl/evp.h... yes
creating extconf.h
creating Makefile
11)cp -r ruby-2.3.0/include / (将ruby源代码中的include目录拷贝到根目录下面,并且给个权限)
12)make
13)make install 至此openssl的问题解决
下面是zlib的问题
1)cd ../ruby-2.3.0 (此处目录不定就是进入ruby源代码中)
2)cd ext/zlib
3)yum install zlib-devel
3)ruby extconf.rb
3)make
4)make install
报错
make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop.
处理办法:
vim /tools/ruby-2.5.1/ext/zlib/Makefile
#zlib.o: $(top_srcdir)/include/ruby.h #把这一行替换成下面一行
zlib.o: ../../include/ruby.h
启动redis服务
#redis-servce ./redis-6379.conf #在redis配置文件的根目录下启动
添加防火墙端口
#vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16379 -j ACCEPT
创建集群
通过上述步骤,在6个节点上分别启动Redis服务,然后在其中安装有Ruby的服务器节点上,运行Redis安装包中解压出来的集群部署脚本redis-trib.rb
redis-trib.rb create --replicas 1 具体服务器地址:6379 具体服务器地址:6379 具体服务器地址:6379 具体服务器地址:6379 具体服务器地址:6379 具体服务器地址:6379
将上面命令中的具体服务器地址替换为各个Redis服务节点的地址。脚本运行后,命令窗口中出现[OK] All 16384 slots covered,代表集群创建成功。6个节点将会以三个主节点、三个从节点的形式运行,每个从节点都会与其对应的主节点保持数据一致。
注:集群创建以后,修改配置需要重新创建集群(重新建集群的时候需要先删除配置文件中的密码,否则会执行不成功)
设置集群密码
在创建完集群后,需要分别对每一个节点设置相同的密码。使用前面提到的/usr/local/bin目录下的redis-cli访问redis服务器,并热更新密码配置
redis-cli –h 具体服务器地址 –p 6379
> config
set requirepass password #执行完需要输入密码执行master密码设置
> config set masterauth password
> config rewrite
使用ctrl + c退出redis-cli。注意替换部分的节点地址和端口。password替换为节点的实际访问密码。对集群的6个节点均执行上面的命令,为每个节点都设置相同的密码。
检查
# redis-cli -h IP***** -c -p 6379 #-c集群模式
>set key值 value
>get key值 或者 keys *查看所有值(这个只适合刚部署)
查看集群状态:
>cluster info #查看集群的状态
>cluster nodes #查看集群的节点关系
异常排查
启动ruby脚本后,若创建集群失败,则
a) 将所有的redis服务全部停掉,先查看redis的进程id,可以查看指定的pidfile查看进程id也可以使用命令lsof -i:redis端口号查看进程,也可以使用ps -ef | grep redis 来查看进程id,然后使用kill -9杀死该进程,关闭redis实例。
b) 将redis目录下的nodes.conf和dump.rdb文件删除
c) 修改redis.conf文件,去掉其中的密码配置项requirepass和masterauth,使节点下次启动时无需密码即可访问,以便建立集群
d) 重启每台机器上的redis,然后再启动ruby脚本,重新创建集群
e) 执行3.8.3中的步骤,为集群设置密码
Redis数据导入导出
通过redis-dump数据导入导出:
迁移Redis数据一般有三种方式:
- 第三方工具:redis-dump、redis-load
- aof机制,需要开启aof功能
- rdb存储机制(一般redis集群)
安装软件:
由于安装redis-dump
需要依赖ruby
,且版本大于2.2.2
,所以这里需要先升级ruby,我们安装集群时已经安装过ruby,所以可以跳过,如果是安装的哨兵和主从模式的Redis,需要安装ruby,可以参照上面安装步骤安装,这里就不在说明了
安装redis-dump
gem install redis-dump -v
安装完后会生产
redis-dump导出数据
redis-dump -u:yourpassword@127.0.0.1:6380 > /tmp/redis-mv.json
redis-load 导入数据
cat /tmp/redis-mv.json |redis-load -u :yourpassword@127.0.0.1:6378 ERROR (Yajl::ParseError): lexical error: invalid bytes in UTF8 string. lue":{"maxInactiveInterval":"¬웵0000\u0005sr\u0000\u0011jav (right here) ------^ #如上报错可加参数 -n,不检查 utf-8格式
cat /tmp/redis-mv.json |redis-load -n -u :yourpassword@127.0.0.1:6378