Redis 高可用集群模式配置

简介

Redis集群是redis3.0引入的布式存储方案。Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单

  • 高并发:通过横向拓展实现,通过 --cluster add-node 添加新机器到集群 执行 reshard 命令,重新分配slot ,将相对均摊了 slot 的分布,缓冲了 其他机器的并发压力,从而应对 百万,甚至上千万的并发。
  • 复制:每个小集群都是一个主从复制的架构,从而保证了 主节点挂掉的时候,不至于丢失全部数据,当选举产生新的master节点后,继续对外进行服务,在主备切换过程中,部分key会有影响,但是其他分片上的key不会有任何影响,从而保证了高可用的场景。
  • 分片:每个不同的主从架构小集群,数据是不一致的,客户端通过哈希函数,将数据路由到不同的数据节点,从而实现了数据的分片。这样技术内存不够用的时候,只需要添加新的集群节点进来,重新分配一下slot 就可以了。

想搭建一个最简单的Redis集群,那么至少需要6个节点:3个Master和3个Slave。为什么需要3个Master呢?如果你了解过Hadoop/Storm/Zookeeper这些的话,你就会明白一般分布式要求基数个节点,这样便于选举(少数服从多数的原则)。

思路很简单,我将在一台节点上开启6个Redis实例,并且这6个Redis各自有自己的端口。这样的话,相当于模拟出了6台机器了。然后在以这6个实例组建Redis集群就可以了,3主3从。
需要注意下:由于在一台机器(127.0.0.1)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;

安装redis

请参考我以前的文章 redis安装和其他高可用配置

配置

既然是要启动6个Redis实例,自然需要准备各自的配置文件,为这6个实例创建好各自存放的目录

mkdir redis-cluster
cd redis-cluster
mkdir 820{1,2,3,4,5,6}

复制 redis.conf (ubuntu 默认在/etc/redis/redis.conf) 到对应的目录,如果是编译安装,配置文件在redis目录

cp /etc/redis/redis.conf ./8201
cp /etc/redis/redis.conf ./8202
cp /etc/redis/redis.conf ./8203
cp /etc/redis/redis.conf ./8204
cp /etc/redis/redis.conf ./8205
cp /etc/redis/redis.conf ./8206

通常情况需要增加权限

sudo chmod +w ./8201/redis.conf

修改redis.conf

vim ./8201/redis.conf

主要是修改ip和端口(注意不要使用冲突的端口),如下修改(其他六个redis也是一样修改)

appendfilename "appendonly.aof"
appendfsync everysec
appendonly yes

bind 127.0.0.1 # 修改为对应的IP地址,按服务器情况修改

cluster-config-file nodes-8201.conf # 一般以端口设置,需要修改

cluster-enabled yes #开启集群

cluster-node-timeout 5000

daemonize yes # 后台模式,默认为no

dir /home/jam/work/redis-cluster/8201 # 设置文件目录,会生成aof文件,最好修改

pidfile /home/jam/work/redis-cluster/8201/redis-server.pid # pid 文件,需要修改

port 8201 #端口,需要修改

查看配置文件,不看注释

grep -v '^#' 8201/redis.conf | sort -u

配置的时候,可以先把第一个配置文件先配置好,然后复制到其他目录,然后使用替换,把端口号替换即可
vim的替换命令,按Esc 进入命令模式,输入

:%s/8201/8202/g
#s表示替换;%全文替换,不加默认一行;8021,要查找被替换的文本,8022新的文本;g整行替换,不加g只替换行中第一个匹配文本

运行redis

src/redis-server ./8201/redis.conf
src/redis-server ./8202/redis.conf
src/redis-server ./8203/redis.conf
src/redis-server ./8204/redis.conf
src/redis-server ./8205/redis.conf
src/redis-server ./8206/redis.conf

查看进程,堪忧没有对应的redis进程,同时可以看到端口号的,6个进程

ps aux | grep 'redis'

如果需要结束所有的redis-server的进程

kill <code>pgrep redis-server</code>

集群配置

启动集群

用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现,可以参考) 

src/redis-cli --cluster create 127.0.0.1:8201 127.0.0.1:8202 127.0.0.1:8203 127.0.0.1:8204 127.0.0.1:8205 127.0.0.1:8206 --cluster-replicas 1

我们来看一下创建集群命令中 --replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。
如果确认无误输入yes就可以创建,主从关系也可以在输出看到

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:8205 to 127.0.0.1:8201
Adding replica 127.0.0.1:8206 to 127.0.0.1:8202
Adding replica 127.0.0.1:8204 to 127.0.0.1:8203
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: c7a92921c238f85d2fee4d99bb93a19d47452223 127.0.0.1:8201
   slots:[0-5460] (5461 slots) master
M: 6f0e490703f329f974becf77e897b53ad1e576a0 127.0.0.1:8202
   slots:[5461-10922] (5462 slots) master
M: 873ed6ee22e4bb0f6b7c1fc1a5764c5c78d4eb19 127.0.0.1:8203
   slots:[10923-16383] (5461 slots) master
S: 84498131f3effb1cf414402fb277efd42bcc3c95 127.0.0.1:8204
   replicates c7a92921c238f85d2fee4d99bb93a19d47452223
S: 04e4ba05fcfa356fd53902e864927b6db9b46949 127.0.0.1:8205
   replicates 6f0e490703f329f974becf77e897b53ad1e576a0
S: aca25c7d1841fd1246652dee7fc88a605834c3df 127.0.0.1:8206
   replicates 873ed6ee22e4bb0f6b7c1fc1a5764c5c78d4eb19
Can I set the above configuration? (type 'yes' to accept): yes

使用ruby启动集群集群

redis5以前是使用ruby脚本启动集群的,因此我们需要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。
ubuntu

sudo apt install ruby
sudo gem install redis 

centOS

sudo yum install ruby
sudo gem install redis 

如果出现ruby版本不符合要求的情况,那就需要重新安装ruby

ERROR: Error installing redis-4.0.0.gem: 
redis requires Ruby version >= 2.2.2.

解决方法

yum install curl
curl -L get.rvm.io | bash -s stable
# 下面这句要看具体是哪个文件,也可能是在用户目录的
source /usr/local/rvm/scripts/rvm
# 查看rvm库中已知的ruby版本
rvm list known
# 安装一个ruby版本
rvm install 2.6.3
#使用一个ruby版本
rvm use 2.6.3
#卸载一个已知版本
rvm remove 2.0.0
#查看版本
ruby --version
# 安装redis就可以了
gem install redis

下载集群管理脚本redis-trib.rb。redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。redis-trib.rb是redis作者用ruby完成的。

wget http://download.redis.io/redis-stable/src/redis-trib.rb

确保了redis服务可以了,就开始使用脚本创建集群了。一般检查完毕需要输入 yes 确认,输入之后就可以安装完毕。

sudo ./redis-trib.rb create --replicas 1 127.0.0.1:8201 127.0.0.1:8202 127.0.0.1:8203 127.0.0.1:8204 127.0.0.1:8205 127.0.0.1:8206

我们来看一下创建集群命令中 --replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。

slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。

验证redis集群

redis-cli -c -h 127.0.0.1 -p 8201

连接成功后可以进入redis命令模式

127.0.0.1:8201>ping
返回pong

输入查看集群信息的命令,会有对应的信息。

cluster nodes

127.0.0.1:8201> cluster nodes

a7cfbaee7af907e4d2a51ae3f4f28a8df2d3858f 127.0.0.1:8204 slave a88057ab04c7fd7d10d83c5c313b24eaaa65541d 0 1509004191221 4 connected

68c45609c72927cabb5c73e453865427df563852 127.0.0.1:8206 slave 3377888e3c9ae0a45cab0895aa16d9f77bf5509d 0 1509004192243 6 connected

1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 127.0.0.1:8202 master - 0 1509004190204 2 connected 5461-10922

3377888e3c9ae0a45cab0895aa16d9f77bf5509d 127.0.0.1:8203 master - 0 1509004191735 3 connected 10923-16383

c109bf48f2bd3eca1c6cded7932bc218ade7a727 127.0.0.1:8205 slave 1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 0 1509004191732 5 connected

a88057ab04c7fd7d10d83c5c313b24eaaa65541d 127.0.0.1:8201 myself,master - 0 0 1 connected 0-5460

cluster info

127.0.0.1:8201> cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:6

cluster_my_epoch:1

cluster_stats_messages_sent:10810

cluster_stats_messages_received:10810

参考: http://www.jianshu.com/p/dbc62ed27f03

欢迎关注我的公众号

发表回复

您的电子邮箱地址不会被公开。

粤ICP备17041560号-2