天天看点

去中心化redis集群搭建

之前学redis时,都是在单实例节点上进行操作,而作为一个可灵活横向拓展的键值数据库,分布式搭建成服务集群能更好的体验出其魅力所在。之前一直没时间去进行实际的分布式搭建,主要是觉得它简单,但最近进行集群搭建的实践操作时却出现了一些错误,故而进行记录学习。

实验环境:

centos6.8、redis3.2.5

虚拟机配置了DNS:chdp01

单节点配置多实例redis服务伪分布式,多机器节点搭建是一样的原理。

首先需要进行常规的redis编译安装,在此略过。

详见这篇博客:https://blog.csdn.net/qq_34901049/article/details/98936715

3.redis安装

因为redis是c写的,官网下载的源码需要进行比编译安装。

yum install -y gcc :首先需要安装gcc

tar -zxvf redis3.tar.gz -C REDIS_HOME :解压相应tar包到自己想放的目录下

make PREFIX=/usr/SFT/redis3.2 install :进入到解压后redis下的src目录执行编译安装到制定目录PREFIX=你想要安装的目录。

cp redis.conf …/redis3.5/将解压包下的redis.conf文件拷贝到安装目录下

bin/redis-server redis.conf 指定配置文件启动redis服务端(默认前台启动),也可以加上个 &启动为后台进程(ctrl +c 后依旧存活)。

bin/redis-cli :启动本地客户端连接到服务端。

备注

搭建去中心化redis集群至少需要三个redis运行实例,想要搭建成高可用(个人认为这里是弱高可用,真正的高可用需要借助zookeeper或相关分布式协同工具实现)则至少需要6个节点。在此进行简单高可用模拟搭建;创建6个运行实例,因为是在单台虚拟机节点上搭建出的伪分布式集群,故而在此创建6个配置文件即可。为了批量启动服务实例,在此写了个简单脚本进行启动。

6个配置文件绑定端口为7000-7005,对应配置文件名为[port].conf

1 环境准备

首先要有ruby、ruby-gem环境,在虚拟机联网或有局域网yum源情况下使用yum工具安装,相关工具安装命令:

yum install ruby
 yum install -y rubygems
 # redis-3.2.0.gem文件需要自己在网上下一个,csdn一搜一大把,版本最好与自己的redis对应
 gem install --local redis-3.2.0.gem 
           

我的机器已经安装好了

去中心化redis集群搭建

2 配置文件

在继承基本配置文件基础上,进行如下配置。

在此列出几个主要配置

REDIS_HOME/redis.conf (后面所有redis实例配置继承此配置文件):

#绑定本地ip,若配置了DNS直接写域名也ok
bind chdp01  
#关闭保护模式,方便远程连接
protected-mode no
#设置为后台启动redis服务
daemonize yes
#指定后台启动打印日志文件路径(根据自己实际情况来),以便在出错时查看。
#若不设置默认将日志信息打印到前台(前台启动),或者答打印到黑洞也就是直接丢失(后台启动)
logfile "/usr/SFT/redis3.2/clusterT/daemonLog.log"
           

各个启动实例的配置文件撰写,以7000.conf为例

#引入上述的父配置文件
include /usr/SFT/redis3.2/redis.conf
#设置绑定端口
port 7000
#设置本服务实例日志文件路径
logfile "/usr/SFT/redis3.2/clusterT/logs/7000-log.log"
#数据库文件
dbfilename "7000-rdb.rdb"
#后台启动下需要配置pid
pidfile /usr/SFT/redis3.2/clusterT/pidfiles/7000-pid
#本地数据库存放路径
dir "/usr/SFT/redis3.2/clusterT/data"
 #  开启集群模式
cluster-enabled yes
 # 设定本实例节点配置文件名
cluster-config-file  nodes-7000.conf
  # 设定节点最大失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 15000

           

复制7000.conf到相同路径下改名为7001.conf,修改7001.conf配置文件(替换7000为7001)

vim命令模式下输入 %s/7001/7000
           

剩下操作与上面同理

完成后有如下几个配置文件:

去中心化redis集群搭建

启动6个redis服务实例,在此写了个批量启动脚本(redis-clu-start.sh),chmod赋予运行权限后即可直接执行(或用sh命令执行亦可),将脚本目录加入到系统路径。(开发人员应该要有一个文件存放自己写的脚本以执行各种批量或其他组合任务,这样会很大程度上提高工作效率)

NO=0
TOTAL=5
for((;NO<=TOTAL;NO=NO+1 ))
do
	#启动redis实例并打印日志到指定路径
        /usr/SFT/redis3.2/bin/redis-server /usr/SFT/redis3.2/clusterT/700${NO}.conf >> /usr/SFT/redis3.2/clusterT/clusterRunning.log
done

           

可能会有小伙伴对上述代码有疑问,为什么配置了后台启动时的日志输出路径还要打印日志文件呢?

先来看一下打印的日志文件,发现输出了一个错误:没有找到7006.conf日志文件。这里启动的是7000到7005,并没有7006,而我之前写的是

TOTAL=6

于是就在这里进行错误打印了。不打印日志直接输出到前台不行吗?当然行,但如果相关的更复杂的任务部署到服务器上,一下刷出一大堆你怎么搞。嗯,还是个人观点。一不小心自我yy了一波嘻嘻。

去中心化redis集群搭建

启动后查看:

ps -ef |grep redis

去中心化redis集群搭建

此时已经启动6个服务节点了,但他们是相互独立的,这时前面安装的gem工具就派上用场了。

来到redis解压目录的src文件夹下发现有个redis-trib.rb文件,为了方便直接复制一份到集群工作文件夹下。

执行集群搭建命令:

/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 192.168.11.11:7000 192.168.11.11:7001  192.168.11.11:7002 192.168.11.11:7003 192.168.11.11:7004 192.168.11.11:7005
           

结果如下:

去中心化redis集群搭建

中间会有个输入交互,输入yes继续,在等一下下就OK了

去中心化redis集群搭建

连接测试

在此是去中心化服务集群搭建模式,连接到任意一台服务实例端口皆可获得数据服务。

/usr/SFT/redis3.2/bin/redis-cli -c -h chdp01 -p 7000
           
去中心化redis集群搭建

关闭其中一个服务实例(7001)

去中心化redis集群搭建

打开7001对应从节点7004的日志文件,发现其自动进行了角色切换。

去中心化redis集群搭建
去中心化redis集群搭建

此时依旧可以对外提供服务(7004已经切换为master主节点)

去中心化redis集群搭建

继续关闭7004节点

#查看集群节点连接情况
cluster nodes
           
去中心化redis集群搭建

此时依旧可以提供对外数据访问服务,若加上以下配置将停止集群数据服务。根据实际需求进行调整。

cluster-require-full-coverage yes
           

查看集群信息

info
           
去中心化redis集群搭建

关闭集群

注意不能使用kill -9暴力结束进程,很容易导致数据丢失。

这里写了个脚本进行批量关闭。

NO=0
TOTAL=5
for((;NO<=TOTAL;NO=NO+1 ))
do
		#保存数据后关闭该节点,因为是集群,需要批量关闭每个节点
        /usr/SFT/redis3.2/bin/redis-cli -h chdp01 -p 700${NO} shutdown save
done
           

问题与解决

1 ERR Invalid node address specified: chdp01:7000

去中心化redis集群搭建

之前用的是域名创建集群:

/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 chdp01:7000 chdp01:7001 chdp01:7002 chdp01:7003 chdp01:7004 chdp01:7005
           

改成ip创建即可解决

/usr/SFT/redis3.2/clusterT/redis-trib.rb create --replicas 1 192.168.11.11:7000 192.168.11.11:7001  192.168.11.11:70002 192.168.11.11:70003 192.168.11.11:7004 192.168.11.11:7005
           

2 ERR Slot 4648 is already busy

去中心化redis集群搭建

由于之前创建集群失败留下了残留数据导致,将集群运行实例停止后删除cluster-config-file文件(看前面的配置文件),重新创建集群即可解决问题.

继续阅读