04.12 redis集群初体验

redis集群初体验

现在基本上所有公司,无论大大小小的项目基本都会用到redis来进行缓存,或者存储。来提高网站的访问速度和常访问数据的缓存。那么今天咱们就来说一说redis集群架构。

简单介绍一下redis,相信大家也都了解,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,官网redis

下面开始介绍redis的集群方案

关于redis的安装这里不赘述了,非常简单基本就是解压就用。

cluster是在redis3.0以后官方推出的集群方案,架构如下

redis集群初体验

  • 特点

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效.

  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护nodeslotvalue

  • 容错机制

  1. 选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

  2. (cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.

    b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  • 客户端连接

    客户端只要连接整个集群中,任意一个节点即可。程序代码中,应该写上所有节点的ip进行轮训连接。这样可以提供一个负载均衡的伪集群效果。

  • 搭建过程

安装rediswget http://download.redis.io/releases/redis-3.2.1.tar.gztar -zxvf /redis-3.2.1.tar.gzcd redis-3.2.1make && make install#ps:这里咱们就演示伪集群搭建吧cd /usr/local/mkdir redis_cluster #创建集群目录mkdir 70007001700270037004#分别代表三个节点 其对应端口 7000 7001 7002 7003 7004cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7000/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7001/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7002/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7003/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7004/#统一设置配置文件daemonize yes #后台运行pidfile /var/run/redis_7000.pid #pidfile文件对应7000,7001,7002,7003,7004port 7000#端口7000,7001,7002,7003,7004cluster-enabled yes #开启集群 把注释#去掉cluster-config-file nodes_7000.conf #集群的配置 配置文件首次启动自动生成7000,7001,7002,7003,7004#ok 启动所有redisredis-server redis_cluster/7000/redis.confredis-server redis_cluster/7001/redis.confredis-server redis_cluster/7002/redis.confredis-server redis_cluster/7003/redis.confredis-server redis_cluster/7004/redis.conf#好了 ps -ef |grep redis 看一下 是否所有的节点都运行起来了
#配置集群#redis 官方提供了一个工具 redis-trib.rb 由ruby编写,
所以咱们还得安装ruby环境
yum -y install ruby ruby-devel rubygems rpm-build
#然后安装工具gem install redis #这个等候时间很长。。
#ok安装完成
#执行下面的命令创建集群
redis-trib.rb create --replicas 1 10.1.0.5:7000
10.1.0.5:7001
10.1.0.5:7002
10.1.0.5:7003
10.1.0.5:7004
--replicas 1表示自动为每一个master节点分配一个slave节点,咱们有5个节点,
它会自动分配成2个master 3个slave运行中,
提示Can I set the above configuration?(type 'yes' to accept): yes
#输入yes#等待片刻 集群就搭建完成了。非常简单

关于redis-trib.rb 工具的使用,请大家自行百度一下。这里就不做详细讲解了。

重中之重:由于Cluster 集群的结构特性 其实是不建议作为数据持久化存储的,官网上有这样一句话:Redis Cluster is not able to guarantee strong consistency. 自己体会下!

<code>Redis-sentinel/<code>

简单介绍下Redis-sentinel是Redis实例的监控管理、通知和实例失效备援服务,是Redis集群的管理工具。在一般的分布式中心节点数据库中,Redis-sentinel的作用是中心节点的工作,监控各个其他节点的工作情况并且进行故障恢复,来提高集群的高可用性。其实说白了就是主从切换。

redis集群初体验

架构如上图

特点

  • 监控:哨兵不断的检查master和slave是否正常的运行。

  • 通知:当监控的某台Redis实例发生问题时,可以通过API通知系统管理员和其他的应用程序。

  • 自动故障转移:如果一个master不正常运行了,哨兵可以启动一个故障转移进程,将一个slave升级成为master,其他的slave被重新配置使用新的master,并且应用程序使用Redis服务端通知的新地址。

  • 配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址。如果发生故障,哨兵将报告新地址。

    搭建此集群,最少需要主从两个redis节点,2个sentinel节点(官方建议最少3个),当然 可以水平扩展。

  • 客户端连接

    客户端需要访问sentinel,sentinel会返回当前健壮可用的redis master节点ip给客户端,以此达到集群可用状态。这里就表明,此集群只有一个节点提供服务,无法达到负载均衡效果。

  • 搭建过程

#咱们还是搭建一个最简单最基本的集群2个redis节点,哨兵3个
#首先安装redis(略过)
#redis.conf
#配置文件,主从两台保持一致同时增加以下项目bind 0.0.0.0
#监听ipmasterauth foobared
#授权密码,用于两节点互相访问requirepass foobared
#授权密码,用于两节点互相访问#然后从节点添加以下项目slaveof 10.1.2.16379

#设置主节点ip 端口
#sentinel.conf
#这个配置文件保持所有哨兵节点一致即可
bind 0.0.0.0port 26379
sentinel monitor
def_master 10.1.2.1 6379 2
#这里设置主节点ip和上面一致,
后面的2意思是当有两个以上的哨兵确定master挂掉才切换
sentinel auth-pass
def_master foobared #密码 保持一致
sentinel down-after-milliseconds
def_master 30000
sentinel parallel-syncs
def_master 1sentinel
failover-timeout
def_master
900000
#ok 其他保持默认即可,同时关闭防火墙
  • 启动

#以此启动redis master ,redis salves ,哨兵节点无序#启动完成后观察各个节点,以及哨兵的日志 ,会发现哨兵的日志中发现了主从两个节点,
并提示当前主节点ip
#登陆任意一个redis节点 执行info
#从节点info Replication
# Replication role:
slave master_host:10.1.1.2
master_port:6379
master_link_status:up
#集群正常

#kill掉master进程后,观察哨兵的日志
10914:X 31May17:58:26.108
# +sdown master mymaster 10.1.1.2 6379 10914:X 31May17:58:26.242
# +new-epoch 2 10914:X 31May17:58:26.245
# +vote-for-leader 62bb8d23d060c4c445d623e03acf6304ac4a0aea 2 10914:X 31May17:58:27.276
# +odown master mymaster 10.1.1.2 6379
#quorum 2/2 10914:X 31May17:58:27.276
# Next failover delay: I will not start a failover before Tue May 31 18:28:26 2016 .....
#这种类似的日志,说明正在切换主从关系。
#再次登录到从节点
info一下info Replication
# Replication role:master connected_slaves:0
#从已经变成了主,然后再次启动原来的主节点,并执行infoinfo Replication
# Replication role:slave master_host:10.1.1.3master_port:6379master_link_status:up
#原来的主变成了从。切换完成

Sentinel模式的集群就到这里了,非常简单。

以上两种集群方案,均是redis官方提供的集群方案,各有利弊,大家可以选择适合自己的集群方案来进行部署。


分享到:


相關文章: