一. 简单描述Redis集群原理:
Redis集群通过一致性哈希算法将16384个slot(槽)均匀分布在每个节点上,每个主节点又至少有一个从节点保证了该主节点的高可用。当将值存入redis时会将该数据进行哈希后分配到对应slot的节点上保存,
-
redis cluster是去中心化的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃。
入下图,有三个主节点Master,每个节点又对应的Slot段(三个节点slot共16384),每个Master节点又对应一个子节点
集群会为每一个分片的主节点,对应一个从节点。 每个节点默认会随机向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
下载后在当前路径下会生成下图压缩包
下载完成后解压后生成对应文件
tar -zxvf redis-4.0.0.tar.gz
切换至程序目录
cd redis-4.0.0
make编译redis
make MALLOC=libc
编译后,会在src目录下生成下图中绿色可执行文件
最后安装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
进入该文件夹
cd redis-cluster
建立个个几点的文件夹(我将把7001,7002,7005节点建立在虚拟机一上),所以建立三个文件夹7001,7002,7005文件夹
mkdir 700{1..2} 7005
再在每个节点文件中创建data 和log 文件夹,用于保存数据和日志使用,例如7001节点如图,每个节点都要创建
cd 7001
mkdir data log
返回redis-4.0.0安装目录,将该目录下redis.conf文件复制到7001节点中文件夹中
cp redis.conf /usr/local/software/redis_cluster/7001
复制后的每节点中结构应该如下图,eg:7001文件夹
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
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
//查看安装版本
安装好ruby,执行以下命令
gem install redis
成功后便可通过集群管理器启动集群
前面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端口
开通端口命令:
虚拟机一:
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分段
4.验证集群是否搭建成功
在虚拟机一上开启7001节点客户端
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.128 -p 7001 -a 123456
可以查看集群信息
cluster info
cluster nodes
在7001节点设置一个key值,然后连接虚拟机二7003节点,查看该值是否存在,如存在表示搭建集群成功
set 7001key 7001vale
连接虚拟机二7003节点,查看7001存入值是否存在
/usr/local/software/redis-4.0.0/src/redis-cli -c -h 192.168.1.129 -p 7003 -a 123456
get 7001key