首页 > 技术文章 > redis安装集群cluster

forward22222 2018-09-06 22:24 原文

当然在安装过程中会出现一些问题,我这里没有统计,已经修正后安装完了,这期间也是借鉴了网上的一些文章,所以个人感觉遇到问题并不怕,相反还是比较喜欢遇到问题,这样你解决问题后会很有成就感,个人能力也能得到提升。

在这里我将集群装到了6台虚拟机里(相当于6台服务器),然后再启动集群后我又配了两个服务,一个是作为新增的master,一个是作为新增的master,其实你也可以安装到一台机器上,然后把端口号改一下,我这里是想模拟一下真实的情况,所以开的机器比较多

我这里将redis集群安装到了minimal1、minimal2、minimal3、minimal4、mini1和mini3上(默认这几台机器上都没有安装redis)

cluster原理:

架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

redis集群的好处:将数据分散在不同的节点上,降低单个节点的吞吐量,从而提高单个节点的性能。并且单一节点挂掉后从节点可以从slaver升为master,进而提高了redis集群的可靠性。

安装之前需要提前做一些东西:

在每台机器上安装yum -y install ruby、yum -y install rubygems

上传redis的安装压缩包,我这里使用的是redis-3.0.7.tar.gz

解压:

然后在各个服务器上都解压到/usr/local/src/目录下
tar -zxvf redis-3.0.7.tar.gz -C /usr/local/src/

编译和安装:

cd到redis-3.0.7/目录下,进行编译和安装:
在编译安装之前需要安装gcc(对所有的服务器):
yum -y install gcc
安装完之后在redis-3.0.7/下进行make编译:
编译用make 安装用install 然后指定到某个目录下,使用prefix
make PREFIX=/usr/local/redis install

copy配置到bin目录下(其实这并不是必须的,只是为了启动方便):

把redis.conf拷贝到安装/usr/local/redis/bin目录下,这样在启动服务的时候直接在这里启动即可:
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/bin/

修改redis的配置文件:

daemonize yes  #后台启动

如果你在一台机器上安装的话需要修改各自配置文件的端口号,因为我是启动了6台机器,所以这里并没有修改端口号

cluster-enabled yes  #开启集群服务

启动6台机器上的服务端:

./redis-server redis.conf 

查询服务的启动:
ps aux|grep redis

然后安装redis-3.0.0.gem(如果没有的话可以留下邮箱我发给你,可以试一下)

gem install redis-3.0.0.gem

然后拷贝文件到redis安装目录下:

 cp /usr/local/src/redis-3.0.7/src/redis-trib.rb /usr/local/redis

执行rb脚本:

./redis-trib.rb create --replicas 1 192.168.200.131:6379  192.168.200.141:6379 192.168.200.132:6379 192.168.200.133:6379 192.168.200.134:6379 192.168.200.143:6379

命令的意义如下:
· 给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
· 选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
· 之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。
简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
接着, redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中:

结果:

这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

测试:

注意测试时连接哪个都可以的,但需要注意的是一定要在最后加上-c,否则会报这个错误 :

然后各种set key,你就可以看到可能会存到不同的主节点上

使用命令查看集群的状态:

./redis-trib.rb check mini1:6379

你也可以模拟主节点宕机的情况,把一台机器宕掉,./redis-server -h mini1 -p 6379 shutdown,然后可以看到它的从节点变为了master

现在往集群中添加一个新节点:

 ./redis-trib.rb add-node 192.168.200.141:6380 192.168.200.141:6379(6380是我自己又建了个redis服务端,修改了端口号,最后的192.168.200.141:6379可以是集群中的任意一个节点)

连接上集群中的任意一个客户端,查看集群中的cluster nodes:

可以看到我们添加的节点添加到集群后并没有分配槽位,所以需要我们自己分配槽位:

使用命令:

./redis-trib.rb reshard 192.168.200.134:6379(后面的ip是集群中任意一个主节点的ip和端口)

[root@mini1 redis01]# ./redis-trib.rb reshard 192.168.200.134:6379
    >>> Performing Cluster Check (using node 192.168.200.134:6379)
    M: 5d8f8f50976449712fbc8b83201faeb64eea646a 192.168.200.134:6379
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    M: 5739e3ec5a2107182e1c396b3b2ed3b3b21b1638 192.168.200.141:6379
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    M: 9f909c04997d1cdf70a4007bf85dbf3b3006a3c5 192.168.200.143:6379
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: 36805b11bea276c9b520c7d7b0cea2161909beaf 192.168.200.132:6379
       slots: (0 slots) slave
       replicates 5739e3ec5a2107182e1c396b3b2ed3b3b21b1638
    S: 2571a6169814c4b0dba7da24511dd24cda6032f0 192.168.200.131:6379
       slots: (0 slots) slave
       replicates 5d8f8f50976449712fbc8b83201faeb64eea646a
    S: 43d8068bca2c96e920a85b615618ebb60514031e 192.168.200.133:6379
       slots: (0 slots) slave
       replicates 9f909c04997d1cdf70a4007bf85dbf3b3006a3c5
    M: 9ea54467324d15c9bc27392935313d9ad8d54efd 192.168.200.141:6380
       slots: (0 slots) master
       0 additional replica(s)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    How many slots do you want to move (from 1 to 16384)? 4000  //注意这里是自己决定要 分给新添加节点的key的个数

需要从哪些节点上获取key到新添加的节点,我们这里从所有节点上取key,选择all:

输入yes,得到分配后的结果:

现在往集群 中添加一个slaver节点:

新建一个新的redis安装目录redis02,将端口改为6381

首先启动6381redis-server,然后添加到集群中:

./redis-trib.rb add-node 192.168.200.141:6381 192.168.200.141:6379
如果报错的话:
[ERR] Node 192.168.200.141:6381 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

删掉里面的rdb文件和nodes.conf文件等

登陆进入客户端,删掉192.168.200.141:6381里面的数据:
flushdb

重新添加到集群:
./redis-trib.rb add-node 192.168.200.141:6381 192.168.200.141:6379

添加成功后查看:

首先使用6381的cli登录,然后设置主节点:

cluster replicate 节点的uuid号

设置从节点成功

最后可参考其他的集群安装的博文,比如

https://www.2cto.com/kf/201701/586689.html

或者

https://blog.csdn.net/wuliu_forever/article/details/53212233等

有问题或者有错误望指出,我会及时修改

2018-09-06

先搞明白-后熟悉-最后精湛

 

推荐阅读