如何深入解析 Redis 的三种集群部署策略?
- 内容介绍
- 文章标签
- 相关推荐
本文共计4714个文字,预计阅读时间需要19分钟。
Redis 是单线程的,但作为缓存使用时非常高效,因为它读取和写入速度极快。官方的一个简单测试是:完成50个并发执行,处理100000个请求。设置和获取的值是一个256字节的节。
redis
redis是单线程的,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。 官方的一个简单测试: 测试完成了50个并发执行100000个请求。 设置和获取的值是一个256字节字符串。 结果:读的速度是110000次/s,写的速度是81000次/s 但对于访问量特别大的服务来说,还是稍有不足。那么,如何提升redis的性能呢?搭建集群。
redis主要提供三种集群策略:
一、主从复制
在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。
1.1 主从复制有如下特点:
1.2 工作机制
1.3 主从配置
redis默认是主数据,所以master无需配置,我们只需要修改slave的配置即可。 设置需要连接的master的ip端口: slaveof 192.168.0.107 6379 如果master设置了密码。需要配置: masterauth master-password 连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息: info replication
1.3 优点
1.4 缺点
二、哨兵
该模式是从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来,无论是主从模式,还是哨兵模式,这两个模式都有一个问题,不能水平扩容,并且这两个模式的高可用特性都会受到Master主节点内存的限制。
2.1 哨兵的作用是监控 redis系统的运行状况,功能如下
2.2 哨兵工作机制
这三个操作的意义非常重大,发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。所以说哨兵只需要配置master数据库信息就可以自动发现其slave信息。获取到slave信息后,哨兵也会与slave建立俩条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等。
2.3 哨兵配置
哨兵配置的配置文件为sentinel.conf,设置主机名称,地址,端口,以及选举票数即恢复时最少需要几个哨兵节点同意。只要配置需要监控的master就可以了,哨兵会监控连接该master的slave。
sentinel monitor mymaster 192.168.0.107 6379 1启动哨兵节点:
redis-server sentinel.conf --sentinel &出现以下类似信息即启动哨兵成功
3072:X 12 Apr 22:40:02.554 ### Sentinel runid is e510bd95d4deba3261de72272130322b2ba650e73072:X 12 Apr 22:40:02.554 ### +monitor master mymaster 192.168.0.107 6379 quorum 1
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.108:6379 192.168.0.108 6379 @ mymaster 192.168.0.107 6379
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.109:6379 192.168.0.109 6379 @ mymaster 192.168.0.107 6379
可以在任何一台服务器上查看指定哨兵节点信息:
bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel 控制台输出哨兵信息 redis-cli -h 192.168.0.110 -p 26379 info Sentinel
### Sentinelsentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=192.168.0.107:6379,slaves=2,sentinels=1
三、集群
3.1 特点
3.0版本之前的redis是不支持集群的,我们的徐子睿老师说,那个时候,我们的redis如果想要集群的话,就需要一个中间件,然后这个中间件负责将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中。在取值的时候,同样先将key进行计算,得到对应的值,然后就去找对应的redis节点,从对应的节点中取出对应的值。这样做有很多不好的地方,比如说我们的这些计算都需要在系统中去进行,所以会增加系统的负担。还有就是这种集群模式下,某个节点挂掉,其他的节点无法知道。而且也不容易对每个节点进行负载均衡。
从redis 3.0版本开始支持redis-cluster集群,redis-cluster采用无中心结构,每一个节点都保存有这个集群所有主节点以及从节点的信息,及集群状态,每个节点都和其他节点连接。所以redis-cluster是一种服务端分片技术。
3.2 配置
1.redis集群依赖ruby,需安装ruby环境,ruby版本需高于2.2
yum install rubyyum install rubygems
gem install redis
2.修改配置文件
### 配置端口
port 6380
### 配置快照保存路径,6个节点配置不同路径
dir /usr/local/redis-cluster/6380/
### 开启集群
cluster-enabled yes
### 为节点设置不同的工作目录,6个节点配置不同目录
cluster-config-file nodes-6380.conf
### 集群失效时间
cluster-node-timeout 15000
3.开启集群中的所有节点
redis-service …/6380/redis.confredis-service …/6381/redis.conf
redis-service …/6382/redis.conf
redis-service …/6383/redis.conf
redis-service …/6384/redis.conf
redis-service …/6385/redis.conf
4.将节点加入集群中,中途需要输入yes确定创建集群 redis-trib.rb create --replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385
5.进入集群中任何一个节点 redis-cli -c -h 192.168.0.107 -p 6381
6.查看集群中的节点 cluster nodes
[root@buke107 src]### redis-cli -c -h 192.168.0.107 -p 6381192.168.0.107:6381> cluster nodes
868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 master - 0 1523609792598 3 connected 10923-16383
d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 slave 868456121fa4e6c8e7abe235a88b51d354a944b5 0 1523609795616 6 connected
5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 master - 0 1523609794610 1 connected 0-5460
b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 slave 5cd3ed3a84ead41a765abd3781b98950d452c958 0 1523609797629 1 connected
68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 slave 90b4b326d579f9b5e181e3df95578bceba29b204 0 1523609796622 5 connected
90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 myself,master - 0 0 2 connected 5461-10922
如上所示,三主三从节点已创建成功
7.增加集群节点 cluster meet ip port
其他集群实现方式
中间件
一、twemproxy
二、codis
codis是一个分布式的Redis解决方案,由豌豆荚开源,对于上层的应用来说,连接codis proxy和连接原生的redis server没什么明显的区别,上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。
客户端分片
分区的逻辑在客户端实现,由客户端自己选择请求到哪个节点。方案可参考一致性哈希,这种方案通常适用于用户对客户端的行为有完全控制能力的场景。
一、Jedis sharding集群
Redis Sharding可以说是在Redis cluster出来之前业界普遍的采用方式,其主要思想是采用hash算法将存储数据的key进行hash散列,这样特定的key会被定为到特定的节点上。
庆幸的是,Java Redis客户端驱动Jedis已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool
Jedis的Redis Sharding实现具有如下特点:
本文共计4714个文字,预计阅读时间需要19分钟。
Redis 是单线程的,但作为缓存使用时非常高效,因为它读取和写入速度极快。官方的一个简单测试是:完成50个并发执行,处理100000个请求。设置和获取的值是一个256字节的节。
redis
redis是单线程的,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。 官方的一个简单测试: 测试完成了50个并发执行100000个请求。 设置和获取的值是一个256字节字符串。 结果:读的速度是110000次/s,写的速度是81000次/s 但对于访问量特别大的服务来说,还是稍有不足。那么,如何提升redis的性能呢?搭建集群。
redis主要提供三种集群策略:
一、主从复制
在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。
1.1 主从复制有如下特点:
1.2 工作机制
1.3 主从配置
redis默认是主数据,所以master无需配置,我们只需要修改slave的配置即可。 设置需要连接的master的ip端口: slaveof 192.168.0.107 6379 如果master设置了密码。需要配置: masterauth master-password 连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息: info replication
1.3 优点
1.4 缺点
二、哨兵
该模式是从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来,无论是主从模式,还是哨兵模式,这两个模式都有一个问题,不能水平扩容,并且这两个模式的高可用特性都会受到Master主节点内存的限制。
2.1 哨兵的作用是监控 redis系统的运行状况,功能如下
2.2 哨兵工作机制
这三个操作的意义非常重大,发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。所以说哨兵只需要配置master数据库信息就可以自动发现其slave信息。获取到slave信息后,哨兵也会与slave建立俩条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等。
2.3 哨兵配置
哨兵配置的配置文件为sentinel.conf,设置主机名称,地址,端口,以及选举票数即恢复时最少需要几个哨兵节点同意。只要配置需要监控的master就可以了,哨兵会监控连接该master的slave。
sentinel monitor mymaster 192.168.0.107 6379 1启动哨兵节点:
redis-server sentinel.conf --sentinel &出现以下类似信息即启动哨兵成功
3072:X 12 Apr 22:40:02.554 ### Sentinel runid is e510bd95d4deba3261de72272130322b2ba650e73072:X 12 Apr 22:40:02.554 ### +monitor master mymaster 192.168.0.107 6379 quorum 1
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.108:6379 192.168.0.108 6379 @ mymaster 192.168.0.107 6379
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.109:6379 192.168.0.109 6379 @ mymaster 192.168.0.107 6379
可以在任何一台服务器上查看指定哨兵节点信息:
bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel 控制台输出哨兵信息 redis-cli -h 192.168.0.110 -p 26379 info Sentinel
### Sentinelsentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=192.168.0.107:6379,slaves=2,sentinels=1
三、集群
3.1 特点
3.0版本之前的redis是不支持集群的,我们的徐子睿老师说,那个时候,我们的redis如果想要集群的话,就需要一个中间件,然后这个中间件负责将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中。在取值的时候,同样先将key进行计算,得到对应的值,然后就去找对应的redis节点,从对应的节点中取出对应的值。这样做有很多不好的地方,比如说我们的这些计算都需要在系统中去进行,所以会增加系统的负担。还有就是这种集群模式下,某个节点挂掉,其他的节点无法知道。而且也不容易对每个节点进行负载均衡。
从redis 3.0版本开始支持redis-cluster集群,redis-cluster采用无中心结构,每一个节点都保存有这个集群所有主节点以及从节点的信息,及集群状态,每个节点都和其他节点连接。所以redis-cluster是一种服务端分片技术。
3.2 配置
1.redis集群依赖ruby,需安装ruby环境,ruby版本需高于2.2
yum install rubyyum install rubygems
gem install redis
2.修改配置文件
### 配置端口
port 6380
### 配置快照保存路径,6个节点配置不同路径
dir /usr/local/redis-cluster/6380/
### 开启集群
cluster-enabled yes
### 为节点设置不同的工作目录,6个节点配置不同目录
cluster-config-file nodes-6380.conf
### 集群失效时间
cluster-node-timeout 15000
3.开启集群中的所有节点
redis-service …/6380/redis.confredis-service …/6381/redis.conf
redis-service …/6382/redis.conf
redis-service …/6383/redis.conf
redis-service …/6384/redis.conf
redis-service …/6385/redis.conf
4.将节点加入集群中,中途需要输入yes确定创建集群 redis-trib.rb create --replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385
5.进入集群中任何一个节点 redis-cli -c -h 192.168.0.107 -p 6381
6.查看集群中的节点 cluster nodes
[root@buke107 src]### redis-cli -c -h 192.168.0.107 -p 6381192.168.0.107:6381> cluster nodes
868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 master - 0 1523609792598 3 connected 10923-16383
d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 slave 868456121fa4e6c8e7abe235a88b51d354a944b5 0 1523609795616 6 connected
5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 master - 0 1523609794610 1 connected 0-5460
b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 slave 5cd3ed3a84ead41a765abd3781b98950d452c958 0 1523609797629 1 connected
68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 slave 90b4b326d579f9b5e181e3df95578bceba29b204 0 1523609796622 5 connected
90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 myself,master - 0 0 2 connected 5461-10922
如上所示,三主三从节点已创建成功
7.增加集群节点 cluster meet ip port
其他集群实现方式
中间件
一、twemproxy
二、codis
codis是一个分布式的Redis解决方案,由豌豆荚开源,对于上层的应用来说,连接codis proxy和连接原生的redis server没什么明显的区别,上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。
客户端分片
分区的逻辑在客户端实现,由客户端自己选择请求到哪个节点。方案可参考一致性哈希,这种方案通常适用于用户对客户端的行为有完全控制能力的场景。
一、Jedis sharding集群
Redis Sharding可以说是在Redis cluster出来之前业界普遍的采用方式,其主要思想是采用hash算法将存储数据的key进行hash散列,这样特定的key会被定为到特定的节点上。
庆幸的是,Java Redis客户端驱动Jedis已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool
Jedis的Redis Sharding实现具有如下特点:

