Redis高性能内存数据库(六)Redis的集群

Redis主从复制集群:有多个Redis实例

1.集群的作用

主从备份 防止主机宕机

读写分离,分担master的任务

任务分离,如从服分别分担备份工作与计算工作

   作用说明:

(1)主从备份,防止主节点down机

主节点写入数据,从节点读取数据。

(2)任务分离,分摊主节点压力。

换句话说就是读写分离。

不同系统,读写压力不同。

比如说微博、朋友圈就是读的压力>写的压力

(3)读写分离:主节点写数据,从节点读取数据。

搭建:

./bin/redis-cli shutdown
 ps -ef | grep redis
  ll
  cd conf/
  ll
  cp redis.conf redis6379.conf
  cp redis.conf redis6380.conf
  cp redis.conf redis6381.conf

主节点:

147 #save 900 1
148 #save 300 10
149 #save 60 10000
509 appendonly no

从节点:

50 port 6380
 182 dbfilename dump6380.rdb
192.168.109.133
 514 appendfilename "appendonly6380.aof"
 ./redis-cli -p 6380
set tom 1000
(error) READONLY You can't write against a read only slave.

注意:一次启动从节点的个数不要太多,因为如果有太多从节点,会给主节点增加很多同步压力。

2.Redis集群的两种部署方式

主从复制架构:星型模型、线性模型

1)优缺点:

(1)星型结构

优点:效率高,两个slave地位一样,可以直接从主节点读取数据

缺点:实现HA比较困难。主节点挂了,把一个slave变成主,其他的slave再去连他。

提供哨兵机制来解决这个问题。

(2)线性模型

优点:HA简单。

缺点:效率不如星型模型高。

生产使用星型模型多。

2)星型结构-搭建

先停掉redis-server:

[root@bigdata111 redis]# ./bin/redis-cli shutdown
[root@bigdata111 redis]# ps -ef | grep redis
root       5294   2400  0 15:47 pts/0    00:00:00 vi redis.conf
root       5447   2505  0 16:41 pts/1    00:00:00 grep --color=auto redis
-------------------------------------------------------------------------------------------

接着拷贝redis.conf文件到不同端口:

[root@bigdata111 redis]# cp ./conf/redis.conf ./conf/redis6379.conf 
[root@bigdata111 redis]# cp ./conf/redis.conf ./conf/redis6380.conf
[root@bigdata111 redis]# cp ./conf/redis.conf ./conf/redis6381.conf

redis 集群内存配置没有配置会使用多少内存_Redis

(1)主节点:
[root@bigdata111 conf]# vi redis6379.conf
:set number
为了方便起见,将RDB和AOF都关掉:
147 #save 900 1
148 #save 300 10
149 #save 60 10000
509 appendonly no
(2)从节点:

50 port 6380

182 dbfilename dump6380.rdb
211 slaveof 192.168.212.111
513 appendfilename "appendonly6380.aof"
  同理,另外的节点也要改:
6381
182 dbfilename dump6381.rdb
211 slaveof 192.168.212.111 6379
513 appendfilename "appendonly6381.aof"

接着启动redis-server:

[root@bigdata111 redis]# ./bin/redis-server ./conf/redis6379.conf
[root@bigdata111 redis]# ./bin/redis-server ./conf/redis6380.conf 
[root@bigdata111 redis]# ./bin/redis-server ./conf/redis6381.conf
[root@bigdata111 redis]# ps -ef | grep redis
root       5515      1  1 18:32 ?        00:00:00 ./bin/redis-server *:6379
root       5519      1  1 18:32 ?        00:00:00 ./bin/redis-server *:6380
root       5525      1  1 18:32 ?        00:00:00 ./bin/redis-server *:6381
root       5529   2505  0 18:33 pts/1    00:00:00 grep --color=auto redis

然后进入Redis客户端开始写数据:

 

redis 集群内存配置没有配置会使用多少内存_Redis_02

./redis-cli -p 6380
127.0.0.1:6380> set tom 1000
(error) READONLY You can't write against a read only slave.
注意:一次启动从节点的个数不要太多,因为如果有太多从节点,会给主节点增加很多同步压力。
           如果需要同时启动很多分界点,那就得分集群了。

3.Redis主从服务的通信原理

redis 集群内存配置没有配置会使用多少内存_redis_03

4.Redis 哨兵--Redis集群的高可用性

 单点故障。

 Redis 2.4之后,有哨兵--解决的就是星型结构的单点故障问题

 正常情况下,哨兵就是监控master状态。接收master心跳。

 如果接收不到心跳,认为master死掉。进行HA切换。

 redis-sentinel 哨兵

 

redis 集群内存配置没有配置会使用多少内存_Redis_04

 从安装目录下拷贝sentinel配置文件

cp ./sentinel.conf ../redis/conf/

      现在编辑修改此文件:     

vi sentinel.conf  

53 sentinel monitor mymaster 192.168.212.111 6379 1

  1代表一个哨兵

  mymaster:一个别名而已,可随意修改

 关于此配置文件中某些行作用的解释:

 

redis 集群内存配置没有配置会使用多少内存_redis_05

现在可以启动哨兵:

./bin/redis-sentinel conf/sentinel.conf

      然后杀掉Master:

      

redis 集群内存配置没有配置会使用多少内存_redis_06

+try-failover master mymaster
      检测到主节点挂了
 +selected-slave slave 192.168.212.111:6380 192.168.212.111 6380
      从从节点中选出一个slave作为主节点替换挂掉的Master
 +switch-master mymaster 192.168.212.111 6379 192.168.212.111 6380
      然后将选出的slave节点变成Master节点
 +slave slave 192.168.212.111:6381 192.168.212.111 6381 @ mymaster 192.168.212.111 6380
      最后是把其他的slave节点连到新的Master节点上

5.实现Redis的代理分片

Twemproxy是一种代理分片机制,由Twitter开源。

Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。

 

redis 集群内存配置没有配置会使用多少内存_redis_07

 

 安装

./configure --prefix=/root/training/proxy
make
make install

配置文件 

 

redis 集群内存配置没有配置会使用多少内存_配置文件_08

 

 检查配置文件是否正确

./nutcracker -t conf/nutcracker.yml

启动代理服务器

./nutcracker -d -c conf/nutcracker.yml