1. 安装依赖
因为redis是C语言实现的,所以在Linux系统中需要安装gcc来进行编译
yum -y install gcc
yum -y install gcc-c++
yum -y install ruby
yum -y install rubygem*
yum -y install ruby-rdoc
yum -y install ruby-devel rubygems rpm-build
gem install redis
2. 部署方案
1. 安装实例 :准备三台虚拟机 :
192.168.66.128
192.168.66.129
192.168.66.130
2. 在每个虚拟机上部署两个redis :
192.168.66.128: 7000
192.168.66.128: 7001
192.168.66.129: 7002
192.168.66.129: 7003
192.168.66.130: 7004
192.168.66.130: 7005
3. 安装redis
3.1. 下载
下载网址:https://redis.io/download
写文章时最新版本为:redis-4.0.1.tar.gz
3.2. 上传
[root@localhost local]# mkdir redis
[root@localhost local]# ll
drwxrwxr-x. 7 root root 4096 9月 6 16:45 redis-4.0.1.tar.gz
3.3. 解压
[root@localhost redis]# tar -zxvf redis-4.0.1.tar.gz
[root@localhost redis]# ll
drwxrwxr-x. 7 root root 4096 9月 6 16:45 redis-4.0.1
3.4. 修改环境变量
# vi /etc/profile
export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin
RUBY_HOME=/usr/local/ruby
PATH=$PATH:$RUBY_HOME/bin
export RUBY_HOME PATH
# source /etc/profile
4. 编译安装
[root@localhost local]# cd /usr/local/redis
[root@localhost redis]# make MALLOC=libc
[root@localhost redis]# make & make install
说明:如果在make的时候不指定内存管理方式,会报错的:
问题:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录。
malloc是管理内存碎片的。
解释:说的是关于分配器allocator, 如果有MALLOC 这个 环境变量, 会有用这个环境变量的 去建立redis。
而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。
但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数
解决方案:
make MALLOC=libc
4.1. 启动Redis
然后新开终端,打开redis客户端
[root@localhost ~]# cd /usr/local/redis/redis-4.0.1/
[root@localhost redis-4.0.1]# redis-cli
表示已经启动成功。
4.2. Redis集群
redis集群要求最小3主3从,准备3台centos7服务器,其中192.168.88.128刚刚装了redis,并启动成功。
因为redis集群还需要安装ruby,还需要配置集群,所以先在一台机器上安装好之后,再拷贝整个系统到其它2台机器。这样我们做的重复工作就比较少了。
192.168.66.128
192.168.66.129
192.168.66.130
4.3. 将生成的文件copy到redis_cluster下
在redis-4.0.1新建redis-cluster文件夹用来创建节点
在192.168.88.128上创建了2个文件夹7000、7001
4.4. 将生成的文件copy到redis_cluster下
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/redis-4.0.1/redis-cluster/700#(0-5)
下面的第一张图是在redis-4.0.1/src/下可以看到
4.5. 修改配置文件
cp /usr/local/redis/redis-4.0.1/redis.conf /usr/local/redis/redis-4.0.1/redis-cluster
cd /usr/local/redis/redis-4.0.1/redis-cluster
vi redis.conf
port 7000 //端口根据对应的文件夹去配制端口7000,7001,7002,7003,7004,7005
bind 本机IP //根据本机所在的IP或hostname去配制
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 5000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005节点目录下,分别改为对应的文件夹的名称及上面的参数。
4.6. 分别启动redis 6个实例,并查看是否成功:ps -ef|grep redis
分别进入到700#(0-5)目录下,执行命令行redis-server redis.conf
至此,说明6个节点已经启动成功。
4.7. 执行redis命令创建集群(如果不出错,集群启动如下图)
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.66.128:7000 192.168.66.128:7001 192.168.66.129:7002 192.168.66.129:7003 192.168.66.130:7004 192.168.66.130:7005
4.8. 执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
**错误1:usr/bin/env: ruby: No such file or directory
**所以需要安装ruby的环境,网上大部分都是说按下面的命令安装yum install ruby;
**不要按着上面的步骤安装ruby环境,因为上面的安装的ruby版本是ruby2.0.0版本,
引文在执行gem install redis时
提示:
gem install redis
ERROR: Error installing redis:
redis requires Ruby version >= 2.2.2.
参考文档:http://blog.csdn.net/fengye_yulu/article/details/77628094(文档已经说得很清楚)
**错误2:针对错误1中出现的错误;
解决方案:先把安装的ruby版本卸载,这个地方比较坑,文件之间互相依赖,
检查系统是否已经安装了 ruby,
检查命令行:#rpm -qa | egrep ruby
#rpm -e 包的名字 ---删除指定的rpm包
如果遇到依赖,无法删除,使用rpm -e --nodeps 包的名字 ---不检查依赖,直接删除rpm包;
4.9. 安装RVM(或者直接去下载ruby直接安装)
1、安装curl
sudo yum install curl
2、然后在终端输入命令
curl -L get.rvm.io | bash -s stable
可能出现的问题:如下图
3、按照提示使用使用命令
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - 如上图;
4、继续在终端中,如下图安装成功
5、安装ruby2.3.3版本
先检查下ruby列表如下图,网上很多的都是让装2.3.3版本,如第二张图,安装2.3.3版本比较耗时,所以推荐直接下载2.4.1版本(最近版本)安装。
参考文档:1、http://blog.csdn.net/lixwjava/article/details/50408070
2、http://blog.csdn.net/fengye_yulu/article/details/77628094
3https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-centos-6-with-rvm
4、http://blog.csdn.net/moxiaomomo/article/details/17540813
5、http://blog.csdn.net/shinebar/article/details/54585050
6、http://blog.csdn.net/xu470438000/article/details/42971091
7、http://blog.csdn.net/moxiaomomo/article/details/17540813
8、http://blog.csdn.net/gqtcgq/article/details/50277419
9、http://blog.csdn.net/nuli888/article/details/52134117
4.10. 安装gem install redis
如下图,我已经安装了ruby2.4.1版本,并且gem install redis安装成功;
4.11. 再次启动集群
1、跟4.7步骤一样;
仔细看上图,其中
192.168.66.128:7000
192.168.66.129:7002
192.168.66.130:7004
三台节点自动设置成了主节点
192.168.66.128:7001
192.168.66.129:7003
192.168.66.130:7005
三台节点自动设置成了从节点,而且每个从节点对应哪个主节点都有说明。
4.12. 查看Redis集群状态
./redis-cli -h 192.168.66.128 -p 7000 cluster nodes
5. 集群相关命令
集群
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
节点
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
键
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
6. 后续错误总结
6.1. 重启服务器后,再次执行redis-trib.rb会报错如下错误:
[ERR] Node 192.168.66.128:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
这里解释一下dump.rdb文件:
dump.rdb是由Redis服务器自动生成的 默认情况下 每隔一段时间redis服务器程序会自动对数据库做一次遍历,把内存快照写在一个叫做“dump.rdb”的文件里,这个持久化机制叫做SNAPSHOT。有了SNAPSHOT后,如果服务器宕机,重新启动redis服务器程序时redis会自动加载dump.rdb,将数据库状态恢复到上一次做SNAPSHOT时的状态。
解决方法:
1)将每个节点下aof、rdb、nodes.conf本地备份文件删除;
2)192.168.66.128:7000> flushdb #清空当前数据库(可省略)
3)之后再执行脚本,成功执行;
6.2. 再次启动集群
关闭防火墙
6.3. 测试集群
6.4. Jedis连接Redis集群测试
1、使用jedis2.8.0版本的错误信息
2、解决方法:把jedis-2.8.0.jar删除掉,引用jedis-2.9.0.jar,重新运行项目,成功!
数据已经写入到数据库,查看可自行伸缩查看;
6.5. 重启集群
1、通过pkill -9 redis杀死reids 进程之后,重新启动各个节点,集群自动创建成功(杀死之前的集群状态)
2、注意:前提是不要清空nodes.conf文件
清空数据库(根据自己的情况是否情况)
至此,redis4.0.1版本的集群安装及测试完成。