基于CentOS7搭建Redis集群

一. 简单描述Redis集群原理:

  • Redis集群通过一致性哈希算法将16384个slot(槽)均匀分布在每个节点上,每个主节点又至少有一个从节点保证了该主节点的高可用。当将值存入redis时会将该数据进行哈希后分配到对应slot的节点上保存,

  • redis cluster是去中心化的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃。
    入下图,有三个主节点Master,每个节点又对应的Slot段(三个节点slot共16384),每个Master节点又对应一个子节点


    image.png
  • 集群会为每一个分片的主节点,对应一个从节点。 每个节点默认会随机向5个节点发送ping消息,默认每秒10次,收到ping消息后返回pong消息做回复,最后通过这种随机的消息交换,最终每个节点将获得所有信息实现slaveof功能,同时当主节点down,实现sentinel哨兵的自动failover切换功能,当某个主节点挂掉,从节点会接管主节点的工作,并告知其他节点自己变为主节点,

二. 搭建redis对于ruby的依赖:

如果选择搭建的Redis版本是5以下(本文redis为4.0.0)是需要安装ruby作为依赖的,因为redis5以下版本的集群管理器redis-trib.rb 是根据ruby语言编写,但在redis5以后集群管理改用了C语言。注:不同版本redis对于ruby版本也有限制,入本文使用redis4.0.0要求ruby版本在2.3.0以上!

三. 开始搭建redis集群:

1.linux环境下载并安装redis

安装wget :wget用于linux地址下载redis安装包
yum -y install wget

安装gcc编辑器
yum -y install gcc automake autoconf libtool make

选择路径下载redis,下载地址可能自行找,本文使用redis4.0.0
cd /usr/local/software
wget http://download.redis.io/releases/redis-4.0.0.tar.gz
下载后在当前路径下会生成下图压缩包

image.png

下载完成后解压后生成对应文件
tar -zxvf redis-4.0.0.tar.gz

image.png

切换至程序目录
cd redis-4.0.0

make编译redis
make MALLOC=libc

编译后,会在src目录下生成下图中绿色可执行文件


image.png

最后安装Redis:
make install

2.redis环境有了,开始准备各个集群文件夹

将要模拟搭建redis集群6节点(端口7001-7006),3个主节点,3个从节点,因为我在两个虚拟机上搭建redis,每个虚拟机上分布3个几点,所以两台虚拟机都需要安装redis,也就是上述操作,保证虚拟机中可以正常运行redis
eg:虚拟机一地址为:192.168.1.128 虚拟机二地址为:192.168.1.129 两台虚拟机需用能够相互访问,需要可以ping通哈


下操作在虚拟机一中执行,二与相同请自行模仿
在redis安装目录下,新建redis-cluster文件夹
mkdir redis-cluster

image.png

进入该文件夹
cd redis-cluster
建立个个几点的文件夹(我将把7001,7002,7005节点建立在虚拟机一上),所以建立三个文件夹7001,7002,7005文件夹
mkdir 700{1..2} 7005
image.png

再在每个节点文件中创建data 和log 文件夹,用于保存数据和日志使用,例如7001节点如图,每个节点都要创建
cd 7001
mkdir data log
image.png

返回redis-4.0.0安装目录,将该目录下redis.conf文件复制到7001节点中文件夹中

image.png

cp redis.conf /usr/local/software/redis_cluster/7001

复制后的每节点中结构应该如下图,eg:7001文件夹


image.png
3.修改7001节点中redis.conf配置文件值

vi redis.conf 进入修改模式后,如何修改自行百度吧
修改内容如下:

#端口号
port 7001 
#默认ip为127.0.0.1 需要改为其他节点机器可访问的ip(本机ip) 否则创建集群时无法访问对应的端口,无法创建集群 
#eg:本机虚拟机一ip为192.168.1.128,所以需绑定该值
bind 192.168.1.128
#数据文件存放位置
dir /usr/local/software/redis-cluster/7001/data/
#日志文件存放位置
logfile /usr/local/software/redis-cluster/7001/log/redis.log
#redis后台运行 
daemonize yes
#为保证集群管理器redis-trib.rb工具的正常运行,需要设置为no,完成后可以改回yes,但每次使用redis-trib.rb都需要改回为no
protected-mode no
#pidfile文件 
pidfile /var/run/redis_7001.pid 
#开启集群 
cluster-enabled yes 
#集群的配置 配置文件首次启动自动生成
cluster-config-file nodes_7001.conf 
#请求超时 默认15秒,可自行设置 
cluster-node-timeout 15000 
#rdb文件名
dbfilename dump-7001.rdb
#aof日志开启 有需要就开启,它会每次写操作都记录一条日志,比较耗性能
appendonly yes 
#aof文件名 
appendfilename "appendonly-7001.aof"
#设置密码 如果设置密码,所有节点密码必须相同
masterauth 123456
requirepass 123456

将修改后的redis.conf文件复制到其他各个节点中
cp redis.conf /usr/local/software/redis-cluster/7002
cp redis.conf /usr/local/software/redis-cluster/7005
修改复制后的配置文件,使用替换命令,将配置文件中7001替换700X即可
sed -i 's#7001#7002#g' /usr/local/software/redis-cluster/7002/redis.conf
sed -i 's#7001#7005#g' /usr/local/software/redis-cluster/7005/redis.conf
修改后使用cat命令,查看是否修改成功
vi /usr/local/software/redis-cluster/7002/redis.conf
虚拟机二环境同上配置,参考上文

3.启动redis所有节点,包括虚拟机一二

虚拟机一
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7001/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7002/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7005/redis.conf
虚拟机二
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7003/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7004/redis.conf
/usr/local/software/redis-4.0.0/src/redis-server /usr/local/software/redis-cluster/7006/redis.conf
通过查看几点是否启动正常
ps -ef|grep redis

image.png

3.通过集群管理器启动先安装ruby
yum install centos-release-scl-rh //会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源

yum install rh-ruby23 -y //直接yum安装即可

scl enable rh-ruby23 bash //必要一步

ruby -v //查看安装版本

image

安装好ruby,执行以下命令
gem install redis

image

成功后便可通过集群管理器启动集群
前面3个地址为主节点,后面随机分配从节点
/usr/local/software/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.1.128:7001 192.168.1.128:7002 192.168.1.128:7005 192.168.1.129:7003 192.168.1.129:7004 192.168.1.129:7006

  • 节点设置密码之后如果需要使用redis-trib.rb的各种命令
    则会报错 Sorry, can’t connect to node

  • 解决方法:找到client.rb 然后修改默认password为上面设置的密码
    client.rb路径可以通过find命令查找:
    find / -name 'client.rb'
    类似/usr/local/rvm/gems/ruby-2.5.5/gems/redis-4.1.2/lib/redis/client.rb

  • 如果执行是一直卡在,需要开启redeis集群总线对应节点
    搭建的redis集群中端口号是从 7001 ~ 7006的,需开启端口号+10000端口,如7001需开通17001端口

    image.png

    开通端口命令:
    虚拟机一:
    firewall-cmd --zone=public --add-port=7001/tcp --permanent
    firewall-cmd --zone=public --add-port=7002/tcp --permanent
    firewall-cmd --zone=public --add-port=7005/tcp --permanent
    firewall-cmd --zone=public --add-port=17001/tcp --permanent
    firewall-cmd --zone=public --add-port=17002/tcp --permanent
    firewall-cmd --zone=public --add-port=17005/tcp --permanent
    firewall-cmd --reload
    虚拟机一:
    firewall-cmd --zone=public --add-port=7003/tcp --permanent
    firewall-cmd --zone=public --add-port=7004/tcp --permanent
    firewall-cmd --zone=public --add-port=7006/tcp --permanent
    firewall-cmd --zone=public --add-port=17003/tcp --permanent
    firewall-cmd --zone=public --add-port=17004/tcp --permanent
    firewall-cmd --zone=public --add-port=17006/tcp --permanent
    firewall-cmd --reload

配置好后,将所有节点关闭并删除对应节点data文件夹中所有文件后从新启动集群,启动中会让输入yes(必须输入yes,y不行),启动成功入图,我们可以清楚的看出集群的主节点和从节点与各个节点负责的slot分段


image.png

4.验证集群是否搭建成功

在虚拟机一上开启7001节点客户端
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.128 -p 7001 -a 123456

image.png

可以查看集群信息
cluster info
image.png

cluster nodes

image.png

在7001节点设置一个key值,然后连接虚拟机二7003节点,查看该值是否存在,如存在表示搭建集群成功
set 7001key 7001vale

image.png

连接虚拟机二7003节点,查看7001存入值是否存在
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.129 -p 7003 -a 123456
get 7001key
image.png