四时宝库

程序员的知识宝库

超详细的Redis4.0.1集群安装以及测试总结


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版本的集群安装及测试完成。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接