但行好事
莫论前程❤

Redis学习教程(1)—-集群搭建

安装环境:CentOS7 64位 MINI版,当前Redis最新版本为3.2,所以本文以3.2为例担建Redis集群。

Redis服务器说明

2台虚拟机(192.168.0.201和192.168.0.202),各安装3个Redis实例。分别为3个master和3个slave,模拟6台机器担建一个Redis集群。

192.168.0.201:6379 
192.168.0.201:6380 
192.168.0.201:6381
192.168.0.202:6382 
192.168.0.202:6383 
192.168.0.202:6384

2、安装Redis集群节点实例

单实例安装请参考《 Redis单实例安装与配置》
编译Redis源码前先检查系统是否安装了gcc,没安装的话执行yum install -y gcc安装。

安装Redis

shell> wget http://download.redis.io/releases/redis-3.2.0.tar.gz
shell> tar -zxvf redis-3.2.0.tar.gz
shell> cd redis-3.2.0
shell> make && make install
shell> ln -s /usr/local/bin/redis* /usr/bin/
shell> cp src/redis-trib.rb /usr/bin/

创建Redis节点

shell> ./utils/install_server.sh

安装Redis服务

在两台虚拟机上依次执行install_server.sh脚本分别各安装3个redis实例。在安装提示时输入上面约定的端口(如:6380),改变端口后同时配置文件、日志文件和数据存储目录名会自动加上端口号,以和其它实例区别。如果对安装路径没有特殊要求的话,在安装时只需改变端口号,其它都保持默认即可。默认配置文件如下:

  • 配置文件:/etc/redis/port.conf
  • 日志文件:/etc/log/redis_port.log
  • 数据存储目录(aof文件、rdb文件、集群节点配置文件):/var/lib/redis/port

注意:port为你设置的端口

make时如果遇到zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory错误,用make MALLOC=libc && make install重新安装。

Redis服务安装完成之后,服务会同时启动,且会自动加入到系统服务中,并设为开机启动。

修改Redis实例的集群配置

修改绑定IP

Redis默认绑定的是127.0.0.0地址,需要将其修改为本机IP或0.0.0.0,集群中的各个节点才能互相通信。

# 192.168.0.201节点
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6379.conf
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6380.conf
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6381.conf  
# 192.168.0.202节点
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16379.conf
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16380.conf
shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16381.conf

修改端口

安装完redis服务后,配置文件中集群的相关端口配置默认为6379,需要将其它几个非6379的端口修改过来。

# 192.168.0.201节点
shell> sed -i 's/6379/6380/g' /etc/redis/6380.conf
shell> sed -i 's/6379/6381/g' /etc/redis/6381.conf
# 192.168.0.202节点
shell> sed -i 's/6379/16379/g' /etc/redis/16379.conf
shell> sed -i 's/6379/16380/g' /etc/redis/16380.conf
shell> sed -i 's/6379/16381/g' /etc/redis/16381.conf

检查修改结果:

shell> cat /etc/redis/6380.conf | awk '{if($0 !~ /^$/ && $0 !~ /#/) {print $0}}' | grep 6380

port 6380
pidfile /var/run/redis_6380.pid
logfile /var/log/redis_6380.log
dir /var/lib/redis/6380
cluster-config-file nodes-6380.conf

有5处修改端口的地方,修改成功!

修改集群配置

cluster-enabled yes  
cluster-config-file nodes-6379.conf  
cluster-node-timeout 5000  
appendonly yes
  • cluster-enabled:开启集群模式
  • cluster-config-file:保存节点的配置信息,如集群中所有节点的IP、端口、状态、节点类型(master/slave)、节点ID、slots等
  • cluster-node-timeout:节点心跳超时时长 
  • appendonly:开启aof文件存储

依次将每个实例配置文件中的以上注释打开,并修改成对应的值。

重新启动所有redis服务:

shell> service redis_portN restart

此时通过PS命令查看redis进程,和普通进程不同的是在进程名后边加了一个[cluster]标识。192.168.0.201节点如下图所示: 

img

但它们现在都还是独立的实例,还没有分配到一个集群当中。没有master和slave关系。

查看服务详情及配置文件信息:

服务详情

创建Redis集群

安装ruby环境

创建集群要用到ruby的一个脚本,在创建集群前,先安装ruby的运行环境和ruby的redis客户端。

shell> yum -y install ruby rubygems
shell> gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/  # 配置taobao的源
shell> gem install redis --version 3.2.0

创建集群

shell> redis-trib.rb create --replicas 1 192.168.0.201:6379 192.168.0.201:6380 192.168.0.201:6381 192.168.0.202:16379 192.168.0.202:16380 192.168.0.202:16381

参数说明:

  • redis-trib.rb脚本默认安装在$REDIS_SRC_HOME/src目录下,在安装redis服务时,已将其拷贝到/usr/bin目录下
  • create:创建集群参数
  • –replicas 1:每个master有1个slave节点  根据节点顺序确定master与slave节点,前边的优先选择做为master节点,后边优先选择做为slave节点。由脚本自动分配,但master和slave绝对不会分配在同一台机器上。

检查Redis集群状态

shell> redis-trib.rb check 192.168.0.201:6379

Redis集群状态
从上图可以看出,192.168.0.201:6379、192.168.0.201:6380、192.168.0.201:6381被选为了master节点。192.168.0.202:16379被选为192.168.0.201:6381的slave节点,192.168.0.202:16380被选为192.168.0.201:6379的slave节点,192.168.0.202:16381被选为192.168.0.201:6380的slave节点。

到这儿Redis的集群就配置成功了!

验证Redis集群

数据存储测试

# 连接到201的6379节点
shell> redis-cli -c -h 192.168.0.201 -p 6379
192.168.0.201:6379> set foo abc
-> Redirected to slot [12182] located at 192.168.0.201:6380
OK
192.168.0.201:6380>

set foo abc本想在201的6379节点保存foo这个key,但201的6379节点并没有存,而是将请求转发给了201的6380节点存储。而且客户端自动切换到了6380节点。这是神马情况?这其实是redis集群数据存储的机制,通过crc16算法计算key的hash值,然后对16384取模,得到一个0~16384以内的slot值来决定由哪个节点存储,而每一个节点在创建集群的时候,都会均匀的分配相应的slot数量。有关数据存储的机制,请参考后面的文章。

自动选主测试

从上边的集群状态中得知,192.168.0.202:16381被选为192.168.0.201:6380的slave节点,现在把6380 master节点kill掉,看redis会不会将16381选主为master节点,并将刚刚保存的foo这个key有没有复制到16381节点中。如下图所示: 

自动选主测试结果

从上图测试结果可以看出,当master节点挂掉之后,slave节点自动选举成了master节点,并且之前保存在master节点的数据foo也成功复制给了slave节点。

赞(0) 打赏
未经允许不得转载:刘鹏博客 » Redis学习教程(1)—-集群搭建
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏