暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis Cluster介绍与安装

运维特工 2018-06-24
426

一、Redis Cluster集群介绍

1.Redis Cluster介绍

Redis Cluster 是一个可以在多个节点之间共享数据的基础应用;Redis Cluster通过分区来提供一定的可用性,即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

Redis Cluster提供了哪些好处?

  • 将数据自动切片到多个节点的能力;

  • 当集群中的一部分节点失效或者无法通讯时,仍然可以继续处理命令请求的能力。

2.Redis Cluster TCP ports

每个Redis Cluster node 需要打开两个TCP端口。Redis一个TCP端口为clients提供服务,例如这个端口为6379,那么该端口增加10000就是Cluster的node之间数据端口,例如16379

端口16379是Redis Cluster 的node-to-node使用二进制协议通信的端口。

因此,Redis Cluster 每个node都必须打开两个TCP端口,否则整个Redis Cluster是无法正常工作的。

3.Redis Cluster data sharding

Redis Cluster 不使用一致性hash,而是使用hash slot实现数据分片。Redis Cluster中总共有16384个hash slots。Redis Cluster中的每个node只负责一部分hash slots。例如我们有A,B,C 3个节点的话,hash slots是这样分配的:

  • Node A contains hash slots from 0 to 5500

  • Node B contains hash slots from 5501 to 11000

  • Node C contains hash slots from 11001 to 16383

4.Redis Cluster master-slave model

为了达到可用性,当一个master是宕机或者无法与集群中的大多数节点通讯,Redis Cluster 使用master-slave模式,每个hash slot都有一个master节点和N个slave节点。 例如我们A,B, C 3个节点中,如果B节点故障,那么整个集群也无法继续提供服务了,因为B节点上的5501 -- 11000 这些hash slots无法提供服务了。

因此,我们在Redis Cluster 创建的时候都会为每个master创建至少一个slave节点,这样B节点故障的话,B节点的slave 节点B1就会提升为集群中的新的master节点,来代替B节点继续提供服务,这样才能保证整个集群可用。如果极端情况下,B和B1节点同时故障了,那么整个集群也是无法继续提供服务的。

5.Redis Cluster consistency guarantees

Redis Cluster是无法保证强一致性的。这也意味着,在特定条件下,Redis Cluster可能会丢失已经执行过的写命令。

为什么Redis Cluster会丢失写命令呢? 其中一个原因是,因为Redis Cluster 是使用的异步复制。 例如下面的例子:

  • 客户端向master B发送写命令;

  • master B给客户端响应OK;

  • master B会把这个写命令发送到它的slaves B1,B2,B3等等。

正如我们看到的一样,master在给client回复确认之前并没有等到B1,B2,B3的ack信息。如果master B回复给client之后,还没有把写命令发送到它的全部slaves 节点,这时master B故障了,恰好这个没有收到写命令的slave被提升为了新的master,那么这个写命令就会丢失了。

二、Redis安装配置

1.环境介绍

名称介绍
系统版本CentOS Linux release 7.2.1511 (Core)
Redis版本4.0.9
Ruby版本2.4.1
数据目录/data/redis/{7000,7001}/
安装位置/work/setup/
日志目录/data/redis/{7000,7001}/
端口Master 7000 Slave 7001

主机信息:

主机名称IPMaster实例Slave实例
db-node1192.168.199.230M1S2
db-node2192.168.199.231M2S3
db-node3192.168.199.131M3S1

主从对应关系:

MasterSlave
db-node1:7000db-node2:7001
db-node2:7000db-node3:7001
db-node3:7000db-node1:7001

2.创建redis数据目录

  1. # mkdir -pv /data/redis/{7000,7001}

3.安装ruby及redis模块

安装rvm:

  1. # gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB


  2. # \curl -sSL https://get.rvm.io | bash -s stable

  3. # source /usr/local/rvm/bin/ruby-rvm-env

  4. # source /etc/profile.d/rvm.sh

参考:http://rvm.io/ 查看rvm库中已知的ruby版本:

  1. # rvm list known

安装一个最新ruby版本:

  1. # rvm install 2.4

安装redis模块:

  1. # gem install redis

4.安装redis

  1. # wget -P /usr/local/ http://download.redis.io/releases/redis-4.0.9.tar.gz

  2. # cd /usr/local/redis-4.0.9/

  3. # make && make install

  4. # cd utils/

  5. # ./install_server.sh

  6. Welcome to the redis service installer

  7. This script will help you easily set up a running redis server


  8. Please select the redis port for this instance: [6379] 7000  #输入

  9. Please select the redis config file name [/etc/redis/7000.conf]

  10. Selected default - /etc/redis/7000.conf

  11. Please select the redis log file name [/var/log/redis_7000.log] /data/redis/7000/redis_7000.log  #输入

  12. Please select the data directory for this instance [/var/lib/redis/7000] /data/redis/7000/ #输入

  13. Please select the redis executable path [/usr/local/bin/redis-server]

  14. Selected config:

  15. Port           : 7000

  16. Config file    : /etc/redis/7000.conf

  17. Log file       : /data/redis/7000/redis_7000.log

  18. Data dir       : /data/redis/7000/

  19. Executable     : /usr/local/bin/redis-server

  20. Cli Executable : /usr/local/bin/redis-cli

  21. Is this ok? Then press ENTER to go on or Ctrl-C to abort.

  22. Copied /tmp/7000.conf => /etc/init.d/redis_7000

  23. Installing service...

  24. Successfully added to chkconfig!

  25. Successfully added to runlevels 345!

  26. Starting Redis server...

  27. Installation successful!

发现Redis自动启动了,我们先停止实例,下面需要修改配置文件。

  1. # /etc/init.d/redis_7000 stop

5.修改配置文件

  1. bind db-node1  # 我这里监听到内网IP

  2. appendonly  yes  # 修改为yes,启用aof

  3. cluster-enabled yes # 改为yes,启用集群模式

  4. cluster-config-file /data/redis/7000/nodes-7000.conf  #修该为我们指定的目录和文件

  5. cluster-node-timeout 15000 #先使用默认的时间,单位是毫秒

  6. cluster-slave-validity-factor 10 #控制slavemaster失联多久后就无法提升为master。如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。假设cluster-node-timeout=5cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。


  7. cluster-migration-barrier 1  #主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移。

  8. cluster-require-full-coverage no #在部分key所在的节点不可用时,如果此参数设置为"yes"(默认值), 则整个集群停止接受操作;如果此参数设置为”no”,则集群依然为可达节点上的key提供读操作。

配置文件我就修改了上面的内容,大家可以根据自己的情况进行调优。

6.创建redis 多实例

我们在服务器节点上都会创建一个master实例和一个slave实例,slave实例做master的备节点。master使用端口:7000,slave使用端口:7001。下面我们创建一个slave实例。

  1. # cp /etc/redis/7000.conf /etc/redis/7001.conf

  2. # sed -i 's#7000#7001#g' /etc/redis/7001.conf

  3. # cp /etc/init.d/redis_7000 /etc/init.d/redis_7001

  4. # sed -i 's#7000#7001#g' /etc/init.d/redis_7001

7.启动redis

  1. # /etc/init.d/redis_7000 start

  2. # /etc/init.d/redis_7001 start

检查:

  1. # ps aux|grep redis            

  2. root     50339  0.0  0.2 149436  9844 ?        Ssl  Apr21   0:01 /usr/local/bin/redis-server 127.0.0.1:7000 [cluster]

  3. root     50654  0.0  0.2 149436  9844 ?        Ssl  00:17   0:00 /usr/local/bin/redis-server 127.0.0.1:7001 [cluster]

步骤2-7,需要在3个节点都要操作。

三、Redis cluster 集群操作

1.初始化redis cluster 集群

首先执行cp /usr/loca/redis-4.0.9/src/redis-trib.rb /usr/local/bin/

  1. # redis-trib.rb create --replicas 1 192.168.199.230:7000 192.168.199.231:7000 192.168.199.131:7000 192.168.199.230:7001 192.168.199.231:7001 192.168.199.131:7001

执行过程:

  1. >>> Creating cluster

  2. >>> Performing hash slots allocation on 6 nodes...

  3. Using 3 masters:

  4. 192.168.199.230:7000

  5. 192.168.199.231:7000

  6. 192.168.199.131:7000

  7. Adding replica 192.168.199.231:7001 to 192.168.199.230:7000

  8. Adding replica 192.168.199.131:7001 to 192.168.199.231:7000

  9. Adding replica 192.168.199.230:7001 to 192.168.199.131:7000

  10. M: eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e 192.168.199.230:7000

  11.   slots:0-5460 (5461 slots) master

  12. M: 295a917007d91cd746386785b41e977a5b01af81 192.168.199.231:7000

  13.   slots:5461-10922 (5462 slots) master

  14. M: fcf663c9e648650cd54cde9c78ced649f7fd8174 192.168.199.131:7000

  15.   slots:10923-16383 (5461 slots) master

  16. S: 4259a4b1d5832a85dbf045438a8c220fe0619063 192.168.199.230:7001

  17.   replicates fcf663c9e648650cd54cde9c78ced649f7fd8174

  18. S: 0c8a410d32bb8af24d4c3d0d194194ce932c8abf 192.168.199.231:7001

  19.   replicates eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e

  20. S: 6b4acafaadde8caa64ec1af9f9432d64027a3943 192.168.199.131:7001

  21.   replicates 295a917007d91cd746386785b41e977a5b01af81

  22. Can I set the above configuration? (type 'yes' to accept): yes

  23. >>> Nodes configuration updated

  24. >>> Assign a different config epoch to each node

  25. >>> Sending CLUSTER MEET messages to join the cluster

  26. Waiting for the cluster to join...

  27. >>> Performing Cluster Check (using node 192.168.199.230:7000)

  28. M: eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e 192.168.199.230:7000

  29.   slots:0-5460 (5461 slots) master

  30.   1 additional replica(s)

  31. S: 0c8a410d32bb8af24d4c3d0d194194ce932c8abf 192.168.199.231:7001

  32.   slots: (0 slots) slave

  33.   replicates eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e

  34. S: 6b4acafaadde8caa64ec1af9f9432d64027a3943 192.168.199.131:7001

  35.   slots: (0 slots) slave

  36.   replicates 295a917007d91cd746386785b41e977a5b01af81

  37. S: 4259a4b1d5832a85dbf045438a8c220fe0619063 192.168.199.230:7001

  38.   slots: (0 slots) slave

  39.   replicates fcf663c9e648650cd54cde9c78ced649f7fd8174

  40. M: fcf663c9e648650cd54cde9c78ced649f7fd8174 192.168.199.131:7000

  41.   slots:10923-16383 (5461 slots) master

  42.   1 additional replica(s)

  43. M: 295a917007d91cd746386785b41e977a5b01af81 192.168.199.231:7000

  44.   slots:5461-10922 (5462 slots) master

  45.   1 additional replica(s)

  46. [OK] All nodes agree about slots configuration.

  47. >>> Check for open slots...

  48. >>> Check slots coverage...

  49. [OK] All 16384 slots covered.

从上面的内容可以看出分配主从实例对应关系: 主从对应关系和slot信息:

MasterSlaveslots
db-node1:7000db-node2:70010-5460 (5461 slots)
db-node2:7000db-node3:70015461-10922 (5462 slots)
db-node3:7000db-node1:700110923-16383 (5461 slots)

2.查看集群信息

查看cluster nodes信息:

  1. # redis-cli -c -h db-node1 -p 7000

  2. db-node1:7000> cluster nodes

  3. eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e 192.168.199.230:7000@17000 myself,master - 0 1524362133000 1 connected 0-5460

  4. 0c8a410d32bb8af24d4c3d0d194194ce932c8abf 192.168.199.231:7001@17001 slave eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e 0 1524362131000 5 connected

  5. 6b4acafaadde8caa64ec1af9f9432d64027a3943 192.168.199.131:7001@17001 slave 295a917007d91cd746386785b41e977a5b01af81 0 1524362131935 6 connected

  6. 4259a4b1d5832a85dbf045438a8c220fe0619063 192.168.199.230:7001@17001 slave fcf663c9e648650cd54cde9c78ced649f7fd8174 0 1524362133937 4 connected

  7. fcf663c9e648650cd54cde9c78ced649f7fd8174 192.168.199.131:7000@17000 master - 0 1524362132938 3 connected 10923-16383

  8. 295a917007d91cd746386785b41e977a5b01af81 192.168.199.231:7000@17000 master - 0 1524362131000 2 connected 5461-10922

查看cluster slots信息:

  1. db-node1:7000> cluster slots

  2. 1) 1) (integer) 0

  3.   2) (integer) 5460

  4.   3) 1) "192.168.199.230"

  5.      2) (integer) 7000

  6.      3) "eca260c5e7b01d09924f9f8e63f5fa1dc6e8479e"

  7.   4) 1) "192.168.199.231"

  8.      2) (integer) 7001

  9.      3) "0c8a410d32bb8af24d4c3d0d194194ce932c8abf"

  10. 2) 1) (integer) 10923

  11.   2) (integer) 16383

  12.   3) 1) "192.168.199.131"

  13.      2) (integer) 7000

  14.      3) "fcf663c9e648650cd54cde9c78ced649f7fd8174"

  15.   4) 1) "192.168.199.230"

  16.      2) (integer) 7001

  17.      3) "4259a4b1d5832a85dbf045438a8c220fe0619063"

  18. 3) 1) (integer) 5461

  19.   2) (integer) 10922

  20.   3) 1) "192.168.199.231"

  21.      2) (integer) 7000

  22.      3) "295a917007d91cd746386785b41e977a5b01af81"

  23.   4) 1) "192.168.199.131"

  24.      2) (integer) 7001

  25.      3) "6b4acafaadde8caa64ec1af9f9432d64027a3943"

3.测试集群

连接集群的时候需要使用 -c
参数

  1. # redis-cli -c -h db-node1 -p 7000

  2. db-node1:7000> set myblog "unixfbi.com"

  3. -> Redirected to slot [14660] located at 192.168.199.131:7000

  4. OK

  5. 192.168.199.131:7000>

直接给MOVED到db-node3节点上了,14660槽位上。 查看一下刚才创建的key:

  1. # redis-cli -c -h db-node2 -p 7000

  2. db-node2:7000> get myblog

  3. -> Redirected to slot [14660] located at 192.168.199.131:7000

  4. "unixfbi.com"

  5. 192.168.199.131:7000>

参考文档

https://redis.io/topics/cluster-tutorial

http://doc.redisfans.com/topic/cluster-tutorial.html

https://blog.csdn.net/mysqldba23/article/details/67640478

http://blog.sina.com.cn/s/blog_48c95a190101dhe9.html

https://blog.csdn.net/robertohuang/article/details/70833231


文章转载自运维特工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论