Redis3.0版本之后支持Cluster,使用ruby方式创建集群;2018年十月Redis发布了5.0版本,新版本放弃了Ruby的集群方式,改为使用C语言编写的redis-cli的方式,使集群的构建方式复杂度大大降低,本文介绍5.0版本集群的搭建。
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效.
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可.
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value.
redis-cluster选举:容错
- 领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
- 什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误.
- 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
- 如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
redis cluster安装部署
使用3台虚拟机模拟6个redis节点,创建出3 master、3 salve 环境。
- 解压redis包到home目录下
tar -zxvf redis-5.0.3.tar.gz -C /home/
- 编译
- 如果没有gcc环境,需要先安装gcc
先通过如下命令检查有无gcc
whereis gcc
如果没有,则先安装gcc
yum install gcc -y
- 进入解压出来的redis目录,编译
cd /home/redis-5.0.3/
make && make PREFIX=/opt/redis install
编译成功后即会在/opt/redis/目录下生成bin文件夹
- 如果编译时报错:#error “Newer version of jemalloc required”,解决办法为:
make MALLOC=libc
- 修改配置文件
- 在node01上创建目录
mkdir -p /home/redis-5.0.3/redis_cluster/7001
mkdir -p /home/redis-5.0.3/redis_cluster/7002
其他node02、node03类似,对应修改文件夹名称即可,然后在创建的文件夹内创建配置文件:
vi /home/redis-5.0.3/redis_cluster/7001/redis.conf
# 绑定服务器IP地址
bind 192.168.33.101
# 绑定端口号,必须修改,以此来区分Redis实例
port 7001
# 后台运行
daemonize yes
# 修改pid进程文件名,以端口号命名
pidfile /var/run/redis-7001.pid
# 修改日志文件名称,以端口号为目录来区分
logfile /home/redis-5.0.3/redis_cluster/7001/redis.log
# 修改数据文件存放地址,以端口号为目录名来区分
dir /home/redis-5.0.3/redis_cluster/7001/
# 启用集群
cluster-enabled yes
# 配置每个节点的配置文件,同样以端口号为名称
cluster-config-file nodes-7001.conf
# 配置集群节点的超时时间,可改可不改
cluster-node-timeout 15000
# 启动AOF增量持久化策略
appendonly yes
# 发生改变就记录日志
appendfsync always
- 然后将node01上的/home/redis-5.0.3及/opt/redis分发到node02和node03的相同目录。
- node02:
mv /home/redis-5.0.3/redis_cluster/7001 /home/redis-5.0.3/redis_cluster/7003
mv /home/redis-5.0.3/redis_cluster/7002 /home/redis-5.0.3/redis_cluster/7004
- node03:
mv /home/redis-5.0.3/redis_cluster/7001 /home/redis-5.0.3/redis_cluster/7005
mv /home/redis-5.0.3/redis_cluster/7002 /home/redis-5.0.3/redis_cluster/7006
并修改各redis.conf文件内对应的ip及端口。
- 配置各节点环境变量
vi /etc/profile
export REDIS_HOME=/opt/redis
export PATH=$REDIS_HOME/bin:$PATH
- 启动各节点
redis-server /home/redis-5.0.3/redis_cluster/7001/redis.conf
redis-server /home/redis-5.0.3/redis_cluster/7002/redis.conf
……
查看节点是否启动
ps -ef | grep redis
- 使用 reids-cli 搭建 Redis集群
redis-cli --cluster create 192.168.33.101:7001 192.168.33.102:7003 192.168.33.103:7005 192.168.33.102:7004 1
92.168.33.103:7006 192.168.33.101:7002 --cluster-replicas 1
- –cluster-replicas 1 命令的意思: 一主一从配置,六个节点就是 三主三从
- 使用如下命令创建集群的状态:
redis-cli --cluster check 192.168.33.101:7001 #填写任意节点即可,会带出所有的
- 测试集群
[root@node03 redis_cluster]# redis-cli -c -h 192.168.33.102 -p 7002
192.168.33.102:7002> set key1 lisi
OK
192.168.33.102:7002> get key1
"lisi"
单机安装
- 创建目录,上传安装包到服务器(安装包见附件)
mkdir -p /home/soft/
# 上传安装包到此目录
- 解压
tar -zxvf /home/soft/redis-5.0.14.tar.gz
cd redis-5.0.14
- 编译安装
make && make install PREFIX=/usr/local/redis
- 从redis源码中复制配置文件到bin目录
cp redis.conf /usr/local/redis/bin
- 修改配置文件,设置后台启动(redis默认端口为 6379,可更改redis.conf文件,修改端口号)
vi /usr/local/redis/bin/redis.conf
# 找到 daemonize 把no 改为 yes
daemonize yes
- 启动
cd /usr/local/redis/bin
./redis-server ./redis.conf
- 关闭
./redis-cli shutdown
- 开机自启
vi /etc/systemd/system/redis.service
# 写入以下内容
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 重载系统服务
systemctl daemon-reload
systemctl start redis.service
systemctl enable redis.service