Redis集群

Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

    自动分割数据到不同的节点上。

    整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

    节点 A 包含 0 到 5500号哈希槽.

    节点 B 包含5501 到 11000 号哈希槽.

    节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

Redis 集群的主从复制模型

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了

不过当B和B1 都失败后,集群是不可用的.

过半master挂掉就会出问题

 

Redis 一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作.

第一个原因是因为集群是用了异步复制. 写操作过程:

    客户端向主节点B写入一条命令.

    主节点B向客户端回复命令状态.

    主节点将写操作复制给他得从节点 B1, B2 和 B3.

主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。 注意:Redis 集群可能会在将来提供同步写的方法。 Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。

举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, A1 、B1 、C1 为A,B,C的从节点, 还有一个客户端 Z1 假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点 A 、C 、A1 、B1 和 C1 ,小部分的一方则包含节点 B 和客户端 Z1 .

 

Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了.

 

注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项

本机原来的redis会自动开机,关闭
[root@server1 ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@server1 ~]# chkconfig redis_6379 off


[root@server1 ~]# cd /usr/local/
[root@server1 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@server1 local]# mkdir cluster
[root@server1 local]# cd cluster/
[root@server1 cluster]# mkdir 7001
[root@server1 cluster]# mkdir 7002
[root@server1 cluster]# mkdir 7003
[root@server1 cluster]# mkdir 7004
[root@server1 cluster]# mkdir 7005
[root@server1 cluster]# mkdir 7006

每个目录添加配置文件如下,注意修改端口和路径
[root@server1 7006]# vim redis.cnf
port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/cluster/7006/redis.pid
logfile /usr/local/cluster/7006/redis.log



[root@server1 ~]# cd redis-4.0.8
[root@server1 redis-4.0.8]# ls
00-RELEASENOTES  deps       README.md        runtest-sentinel  utils
BUGS             INSTALL    redis.conf       sentinel.conf
CONTRIBUTING     Makefile   runtest          src
COPYING          MANIFESTO  runtest-cluster  tests
[root@server1 redis-4.0.8]# cd src/
[root@server1 src]# cp redis-trib.rb /usr/local/bin/
[root@server1 src]# cd /usr/local/bin/
[root@server1 bin]# ls
redis-benchmark  redis-check-rdb  redis-sentinel  redis-trib.rb
redis-check-aof  redis-cli        redis-server
[root@server1 bin]# redis-trib.rb 
/usr/bin/env: ruby: No such file or directory


[root@server1 bin]# yum install -y ruby
[root@server1 ~]# yum install -y rubygems-1.3.7-5.el6.noarch.rpm 

lftp 172.25.28.250:/pub> get redis-4.0.1.gem 
91648 bytes transferred
lftp 172.25.28.250:/pub> ^C[root@server1 ~]# 
[root@server1 ~]# gem list --local

*** LOCAL GEMS ***
(如果连接了互联网,可以直接输入gem install redis-4.0.1.gem  自动下载)
[root@server1 ~]# gem install --local redis-4.0.1.gem 
ERROR:  Error installing redis-4.0.1.gem:
	redis requires Ruby version >= 2.2.2.  之前安装的版本不够
[root@server1 ~]# rpm -q ruby
ruby-1.8.7.352-12.el6_4.x86_64
[root@server1 ~]# yum install -y ruby-2.2.3-1.el6.x86_64.rpm  libyaml-0.1.3-4.el6_6.x86_64.rpm 

[root@server1 ~]# gem install --local redis-4.0.1.gem 
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
[root@server1 ~]# gem list --local

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1)  主要需要这个
test-unit (3.0.8)

启动
[root@server1 7001]# redis-server redis.cnf 
解决Warning
[root@server1 7001]# cat redis.log 
1531:C 12 Aug 10:09:24.843 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1531:C 12 Aug 10:09:24.843 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=1531, just started
1531:C 12 Aug 10:09:24.843 # Configuration loaded
1532:M 12 Aug 10:09:24.845 * Increased maximum number of open files to 10032 (it was originally set to 1024).
1532:M 12 Aug 10:09:24.845 * No cluster configuration found, I'm 85dd3822f8f903df2f5bf0225b6cb4bef1958907
1532:M 12 Aug 10:09:24.893 * Running mode=cluster, port=7001.
1532:M 12 Aug 10:09:24.893 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1532:M 12 Aug 10:09:24.893 # Server initialized
1532:M 12 Aug 10:09:24.893 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1532:M 12 Aug 10:09:24.893 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1532:M 12 Aug 10:09:24.893 * Ready to accept connections
[root@server1 7001]# cat /proc/sys/net/core/somaxconn
128
[root@server1 7001]# echo 511 > /proc/sys/net/core/somaxconn
[root@server1 7001]# sysctl -w  vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@server1 7001]# vim /etc/sysctl.conf 
[root@server1 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled


启动6个
[root@server1 7002]# redis-server redis.cnf 

创建集群
[root@server1 7002]# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster

这个命令在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯

直接查看
[root@server1 7002]# redis-cli -c -p 7001
127.0.0.1:7001> info
(在master上写数据,如果master挂了,对应的slave会去接管,其他的节点上还可以看到数据,数据不会丢失)
检查
[root@server1 7002]# redis-trib.rb check 127.0.0.1:7001

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值