目录
2、使用官方redsi-trib.rb或redis-cli启动集群
Redis集群搭建
一、节点
一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群
1. 启动节点
2 . 数据结构
clusterNode:保存节点当前状态信息
clusterState:这个结构记录了在当前节点的视角下,集群目前所处的状态
3. Cluster Meet命令实现
通过向节点A发送CLUSTER MEET命令,客户端可以让接收命令的节点A将另一个节点B添加到节点A当前所在的集群里面,之后,节点A会将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点也与节点B进行握手,最终,经过一段时间之后,节点B会被集群中的所有节点认识
CLUSTER MEET <ip> <port>
二、槽指派
Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽
当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)
槽指派:CLUSTER ADDSLOTS <slot> [slots...]
1、节点槽指派信息记录
clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽
slots属性是一个二进制位数组(bit array),这个数组的长度为16384/8=2048个字节,共包含16384个二进制位。Redis以0为起始索引,16383为终止索引,对slots数组中的16384个二进制位进行编号,并根据索引i上的二进制位的值来判断节点是否负责处理槽i
2、节点槽指派信息传播
集群中的每个节点都会将自己的slots数组通过消息发送给集群中的其他节点,并且每个接收到slots数组的节点都会将数组保存到保存到clusterState.nodes字典中相应节点的clusterNode结构里
1. 复制与故障转移
故障检测:集群中的每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记为疑似下线(probable fail,PFAIL)
clusterState.nodes字典中对应的疑似下线节点的flags属性中打开REDIS_NODE_PFAIL标识
节点下线:如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点x报告为疑似下线,那么这个主节点x将被标记为已下线(FAIL),将主节点x标记为已下线的节点会向集群广播一条关于主节点x的FAIL消息,所有收到这条FAIL消息的节点都会立即将主节点x标记为已下线
故障转移:当一个从节点发现自己正在复制的主节点进入了已下线状态时,从节点将开始对下线主节点进行故障转移
- 复制下线主节点的所有从节点里面,会有一个从节点被选中
- 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点
- 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己
- 新的主节点向集群广播一条PONG消息,这条PONG消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且这个主节点已经接管了原本由已下线节点负责处理的
2. 消息
消息类型
- MEET消息:当消息发送者接收到客户端发送的CLUSTER MEET命令时,发送者会向接收者发送MEET消息,请求接收者加入到发送者当前的集群中
- PING消息:集群里的每个节点默认每隔一秒钟就会从已知节点列表中随机选出五个节点,然后对这五个节点中最长时间没有发送过PING消息的节点发送PING消息,以此来检测被选中的节点是否在线
- PONG消息:
- FAIL消息:
- PFAIL消息:
三、 集群搭建
1、下载安装redis
1、获取redis安装包
$ wget http://download.redis.io/releases/redis-6.0.0.tar.gz2、解压安装包
$ tar -xzvf redis-6.0.0.tar.gz3、编译redis
$ make4、## 编译报错 /bin/sh: cc: 未找到命令
$ yum install gcc-c++ -y ## 安装gcc5、## 编译报错 make[1]: *** [server.o] 错误 1
## gcc版本过低 gcc -v 查看版本 4.8.5 升级版本
$ yum -y install centos-release-scl
$ yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
#这句是临时的
$ scl enable devtoolset-9 bash
#修改环境变量
$ echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
$ gcc -v6、重新编译
$ make7、指定目录安装redis
$ make PREFIX=/usr/local/yjx/redis/redis-6.0.0
2、单机配置
1、允许所有ip访问redis服务
注释掉 bind 127.0.0.12、Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no3、保护模式,关闭保护模式,否则外部ip无法连接
protected-mode no4、设置redis密码(如果不设置密码,同一台服务器上的客户端操作没问题,其他服务器上的客户端操作会报错,所有需要设置密码)
1、命令行方式(服务重启失效)
config get requirepass
2、修改配置文件(永久有效)
requirepass pwd5、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3、集群配置
1、创建rediscluster集群目录
mkdir -p /usr/local/yjx/redis/redis-cluster/{conf,data,log,src,scripts}
2、将配置文件放到新建conf目录下,并重命名redis-<port>.conf
3、修改配置文件
#修改启动端口 port 7000
#配置后台启动 daemonize yes
#修改数据文件存储路径 dir "/usr/local/yjx/redis-cluster/data"
#日志文件存储路径 logfile "/usr/local/yjx/redis-cluster/log"
# 快照文件 dbfilename "dump-7000.rdb"
pidfile /usr/local/yjx/redis/redis-cluster/data/redis-7000.pid
# 开启aof命令追加 appendonly yes
#修改区分集群aof文件appendfilename "appendonly-7000.aof"
#以集群方式启动 cluster-enabled yes
# 设置redis访问密码 requirepass Redis123
# 设置集群节点间访问密码,跟上面一致 masterauth Redis123
# 节点信息文件 cluster-config-file nodes-7000.conf
# 是否需要每个节点都可用,集群才算真可用 cluster-require-full-coverage no
4、复制配置文件
##方式一:复制一份配置文件进行批量修改
$ cp redis-7000.conf redis-7001.conf
$ vim redis-7001.conf
$ :%s/源字符串/目标字符串/g
$ :wq!
##方式二直接复制并修改
$ sed "s/源字符串/目标字符串/g" redis-7000.conf redis-7001.conf
4.集群间文件同步
1、集群各节点上安装rsync
$ yum -y install rsync
#启动rsync服务
$ systemctl start rsyncd.service
$ systemctl enable rsyncd.service
#检查是否已经成功启动
$ netstat -lnp |grep 8732、在/usr/bin目录下编写脚本
#!/bin/bash
[ $# -lt 1 ] && { echo Not Enough Arguement!; exit 1; }# nodes must can login without password
nodes=(192.168.43.127 192.168.43.130)echo -n "Action Executing ON HOSTS: ${nodes[@]}, [yes/no] "
read input
[ "$input" == "yes" ] || exit 1
for host in "${nodes[@]}"
do
echo ==================== sync to $host ====================
for file in $@
do
if [ -e $file ]; then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -apz $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done3、设置权限
$ sudo chmod +x /usr/bin/xsync3、执行文件传输
$ sudo xsync /path
四、集群启动
1、手动启动集群
1. 查看每台服务器上的防火墙是否关闭
$ firewall-cmd --state #查看防火墙状态$ systemctl stop firewalld #关闭防火墙
$ systemctl enable firewalld #关闭防火墙开机自启
2. 启动所有服务器上的redis
$ ./redis-server ../conf/redis-7000.conf
$ ./redis-server ../conf/redis-7001.conf
$ ./redis-server ../conf/redis-7000.conf
$ ./redis-server ../conf/redis-7001.conf
$ ./redis-server ../conf/redis-7000.conf
$ ./redis-server ../conf/redis-7001.conf3. 将所有redis节点拉到一个集群中
#连接上任意一个节点
$ ./redis-cli -h 192.168.43.127 -p 7000 -c -a Redis123
#使用cluster meet命令使节点握手,让目标节点将入当前节点集群中
$ cluster meet <ip> <poort>4. 查看集群信息
$ cluster info
#查看节点信息
$ cluster nodes
#查看槽分配信息
$ cluster slots5. 主节点进行槽指派
## 此处若出现(error) ERR Invalid or out of range slot报错,则需要quit出来,在系统环境执行槽分配命令
第一,不能登录后,用cluster addslots 加,需要quit出来以后,在系统下加。
第二,{0...1000},这个是三个点,不行,改成两个点 {0..1000}
第三,如果你开启了密码,必须加上:-a 你的密码。比如:redis-cli -h 127.0.0.1 -p 6379 -a 123456 cluster addslots {1000..2000}
$ ./redis-cli -h 192.168.43.128 -p 7000 -c -a yjx cluster addslots {0..5461}
$ ./redis-cli -h 192.168.43.127 -p 7000 -c -a yjx cluster addslots {5462..10922}
$ ./redis-cli -h 192.168.43.130 -p 7000 -c -a yjx cluster addslots {10923..16383}#使用客户端连接redis,执行命令让接收命令的节点成为node_id所指定节点的从节点,并开始对主节点进行复制
$ cluster replicate <nodeid>
1. 查看每台服务器上的防火墙是否关闭
$ firewall-cmd --state
1. 查看集群信息
$ cluster info
2. 查看节点信息
$ cluster nodes
3. 使节点握手,让目标节点将入当前节点集群中
$ cluster meet ip port
#让接收命令的节点成为node_id所指定节点的从节点,并开始对主节点进行复制
1.cluster replicate <nodeid>
2、使用官方redsi-trib.rb或redis-cli启动集群
一、redis低版本使用redis-trib.rb启动集群 (5.0.0版本以下使用)
1.安装ruby,执行命令
$ yum install ruby rubygems -y
2.安装redis与ruby的连接包,执行命令
$ gem install redis
## 如果提示ruby版本过低,需要升级ruby版本,需要安装rvm(命令行工具,提供ruby环境管理和版本切换),安装rvm前需要安装curl(文件传输工具),执行命令
$ yum install curl -y
3、使用curl安装rvm,执行命令
$ curl -L get.rvm.io | bash -s stable
4、安装会报错,并产生一串公钥,执行命令
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys (这里跟上上面的公钥)
# 再次执行命令,一次不行多执行几次
$ curl -sSL https://get.rvm.io | bash -s stable
5、安装完成后会在/user/local目录下发现rvm目录,将命令放入shell,执行命令
$ source /usr/local/rvm/scripts/rvm
6、查看rvm管理的ruby版本,执行命令
$ rvm list known
7、安装新版本,可以参照安装连接包时提示的最低版本安装,我这里安装2.5.7版本,执行命令
$ rvm install ruby-2.5.8
8、等待ruby安装完成,查看已安装的版本,
$ rvm list
9、使用此版本
$ rvm use ruby-2.5.7
10、检查一下当前使用的版本,
$ ruby -v
11、最后再次执行命令
$ gem install redis
#################环境安装完成!!#########
集群启动:
$ redis-trb.rb create --replicas 1 -a yjx 192.168.43.128:7000 192.168.43.127:7000 192.168.43.130:7000 192.168.43.128:7001 192.168.43.127:7001 192.168.43.130:7001
## replicas 1 主节点/副节点=1 -a password
## WARNING: redis-trib.rb is not longer available!
原因一:redis版本高
原因二:不是从源码包中获取redis-trib.rb,二、redis高版本启动集群直接 redis-cli
redis-cli --cluster create --cluster-replicas 1 -a yjx 192.168.43.128:7000 192.168.43.127:7000 192.168.43.130:7000 192.168.43.128:7001 192.168.43.127:7001 192.168.43.130:7001报错1:[ERR] Node 192.168.43.128:7000 NOAUTH Authentication required.
提示节点密码要配置: -a password报错2: [ERR] Node 192.168.43.128:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
一、redis低版本使用redis-trib.rb启动集群 (5.0.0版本以下使用)
1.安装ruby,执行命令
$ yum install ruby rubygems -y
2.安装redis与ruby的连接包,执行命令
$ gem install redis
## 如果提示ruby版本过低,需要升级ruby版本,需要安装rvm(命令行工具,提供ruby环境管理和版本切换),安装rvm前需要安装curl(文件传输工具),执行命令
$ yum install curl -y
3、使用curl安装rvm,执行命令
$ curl -L get.rvm.io | bash -s stable
4、安装会报错,并产生一串公钥,执行命令
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys (这里跟上上面的公钥)
# 再次执行命令,一次不行多执行几次
$ curl -sSL https://get.rvm.io | bash -s stable
5、安装完成后会在/user/local目录下发现rvm目录,将命令放入shell,执行命令
$ source /usr/local/rvm/scripts/rvm
6、查看rvm管理的ruby版本,执行命令
$ rvm list known
7、安装新版本,可以参照安装连接包时提示的最低版本安装,我这里安装2.5.7版本,执行命令
$ rvm install ruby-2.5.8
8、等待ruby安装完成,查看已安装的版本,
$ rvm list
9、使用此版本
$ rvm use ruby-2.5.7
10、检查一下当前使用的版本,
$ ruby -v
11、最后再次执行命令
$ gem install redis
#################环境安装完成!!#########
集群启动:
$ redis-trb.rb create --replicas 1 -a yjx 192.168.43.128:7000 192.168.43.127:7000 192.168.43.130:7000 192.168.43.128:7001 192.168.43.127:7001 192.168.43.130:7001
## replicas 1 主节点/副节点=1 -a password
## WARNING: redis-trib.rb is not longer available!
原因一:redis版本高
原因二:不是从源码包中获取redis-trib.rb,
二、redis高版本启动集群直接 redis-cli
redis-cli --cluster create --cluster-replicas 1 -a yjx 192.168.43.128:7000 192.168.43.127:7000 192.168.43.130:7000 192.168.43.128:7001 192.168.43.127:7001 192.168.43.130:7001
报错1:[ERR] Node 192.168.43.128:7000 NOAUTH Authentication required.
提示节点密码要配置: -a password
报错2: [ERR] Node 192.168.43.128:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.