Redis Cluster集群的搭建

Python016

Redis Cluster集群的搭建,第1张

搭建集群工作需要以下三个步骤:

1)准备节点

2)节点握手。

3)分配槽。

Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置cluster-enabled yes,让Redis运行在集群模式下。建议为集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把6个节点配置统一放在conf目录下,集群相关配置如下:

其他配置和单机模式一致即可,配置文件命名规则redis-{port}.conf,准备好配置后启动所有节点。

Cluster集群启动过程如下图:

每个节点目前只能识别出自己的节点信息,可以执行cluster nodes命令获取集群节点状

态。

节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步,由客户端发起命令:cluster meet{ip}{port}

cluster meet命令是一个异步命令,执行之后立刻返回。内部发起与目标节点进行握手通信,握手通信过程:

1)节点6379本地创建6380节点信息对象,并发送meet消息。

2)节点6380接受到meet消息后,保存6379节点信息并回复pong消息。

3)之后节点6379和6380彼此定期通过ping/pong消息进行正常的节点通

信。

分别执行meet命令让其他节点加入到集群中,

最后执行cluster nodes命令确认6个节点都彼此感知并组成集群。

节点建立握手之后集群还不能正常工作,这时集群处于下线状态,所有的数据读写都被禁止,通过cluster info命令可以获取集群当前状态。

Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过cluster addslots命令为节点分配槽。这里利用bash特性批量设置槽(slots),命令如下:

执行cluster info查看集群状态,如下所示:

当前集群状态是OK,集群进入在线状态。所有的槽都已经分配给节点,执行cluster nodes命令可以看到节点和槽的分配关系:

集群模式下,Reids节点角色分为主节点和从节点。首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据。使用cluster replicate{nodeId}命令让一个节点成为从节点。其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID,命令如下:

Redis集群模式下的主从复制使用了之前介绍的Redis复制流程,依然支持全量和部分复制。复制(replication)完成后,整个集群的结构如图:

集群搭建需要很多步骤当集群节点众多时,必然会加大搭建集群的复杂度和运维成本。因此Redis官方提供了redis-trib.rb工具方便我们快速搭建集群。

redis-trib.rb是采用Ruby实现的Redis集群管理工具。内部通过Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装Ruby依赖环境。

1、安装Ruby:

2、安装rubygem redis依赖:

3、安装redis-trib.rb:

4、安装完Ruby环境后,执行redis-trib.rb命令确认环境是否正确,输出如

下:

首先我们跟之前内容一样准备好节点配置并启动:

启动好6个节点之后,使用redis-trib.rb create命令完成节点握手和槽分配过程,命令如下:

--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。

如果部署节点使用不同的IP地址,redis-trib.rb会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配操作。

集群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作,命令如下:

安装redis集群需要版本号在3.0以上redis-cluster安装前需要安装ruby环境搭建集群需要使用到官方提供的ruby脚本。需要安装ruby的环境。yum-yinstallrubyyum-yinstallrubygemsredis集群管理工具redis-trib.rb[root@bogon~]#cdredis-3.0.0[[email protected]]#cdsrc[root@bogonsrc]#ll*.rb-rwxrwxr-x.1rootroot48141Apr107:01redis-trib.rb脚本需要的ruby包:redis-3.0.0.gem安装geminstallredis-3.0.0.gem[root@bogon~]#geminstallredis-3.0.0.gemSuccessfullyinstalledredis-3.0.01geminstalledInstallingridocumentationforredis-3.0.0InstallingRDocdocumentationforredis-3.0.0集群的搭建需求,创建6台redis服务器,虚拟机模拟端口号为7001-7006第二步:修改redis的配置文件1、修改端口号第三步:把创建集群的ruby脚本复制到redis-cluster目录下。第四步:启动6个redis实例第五步:创建集群。

一、目录

1、工具

2、安装tcl

3、安装单机版redis

4、把redis设置为daemon进程,每次系统启动,redis进程一起启动

5、安装redis cluster

二、工具

2.1、tcl8.6.1-src.tar.gz

2.2、ruby-2.3.1.tar.gz

2.3、redis-4.1.1.gem

2.4、redis-3.2.8.tar.gz

2.5、openssl-1.0.2r.tar.gz

三、安装tcl(安装redis必须先要安装tcl)

3.1、把tcl8.6.1-src.tar.gz通过WinSCP上传到虚拟机中的/usr/local目录下

四、安装单机版redis

4.1、把redis-3.2.8.tar.gz通过WinSCP上传到虚拟机中的/usr/local目录下

4.2、依次运行如下命令:

tar -zxvf redis-3.2.8.tar.gz 解压文件

cd redis-3.2.8

make &&make test &&make install

五、把redis设置为daemon进程,每次系统启动,redis进程一起启动

5.1、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/init.d目录中,将redis_init_script重命名为redis_6379,6379是我们希望这个redis实例监听的端口号

5.2、修改redis_6379脚本的第6行的REDISPORT,设置为相同的端口号(默认就是6379)

protected-mode no 取消保护模式,保护模式只能127.0.0.1访问

daemonize yes 让redis以daemon进程运行

pidfile /var/run/redis_6379.pid 设置redis的pid文件位置

bind192.168.3.110

port6379设置redis的监听端口号

dir /var/redis/6379 设置持久化文件的存储位置

logfile /var/log/redis/6379.log设置日志文件位置

5.6、启动redis,依次执行:

cd /etc/init.d,

chmod 777 redis_6379,赋读写执行的权限(chmod -R 777 * 是递归把该目录下的所有文件和其子文件全部赋权限)

./redis_6379 start 启动

5.7、确认redis进程是否启动,ps -ef | grep redis

5.8、让redis跟随系统启动自动启动

5.9、重启系统,不手动启动redis,直接连接redis,可以连接上,表示配置成功

此时一个单机版的redis的生产环境已经搭建好了,每次服务器重启,redis都会自动的启动

六、安装redis cluster

(redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,3个master,3个slave)

6.1、前提,我在其它机器上启动了六个redis(安装步骤都如下)

2.2、创建三个目录:

mkdir -p /etc/redis-cluster 存放集群配置信息,自动生成配置

mkdir -p /var/log/redis redis日志

mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件

6.3、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/init.d目录中,将redis_init_script重命名为redis_7001,7001是我们希望这个redis实例监听的端口号,并修改redis_7001配置文件中的REDISPORT=7001

6.4、修改/etc/redis/7001.conf中的部分配置为生产环境

6.5、完成了一个redis环境的配置,依次再配置其余五个,分别为7002、7003、7004、7005、7006,每个启动脚本内,都修改对应的端口号

6.6、启动6个redis实例

6.7、创建集群(需要安装ruby、rubygems)

上述命令在部分机器上是可以直接运行完成,成功安装的,但在部分机器上运行第三条命令时会提示ruby版本太低、openssl找不到的问题,下面依次解决这两个问题:

6.8、再次运行gem install redis命令,报出两个错误

6.9、再次运行gem install redis命令,报出一个错误

6.10、再次运行gem install redis命令,报出一个错误

6.11、再次运行gem install redis命令

[root@ceshi01 local]# gem install redis

Successfully installed redis-4.1.1

Parsing documentation for redis-4.1.1

Done installing documentation for redis after 1 seconds

WARNING: Unable to pull data from ' https://rubygems.org/' : SSL_connect returned=1 errno=0 state=error: certificate verify failed ( https://api.rubygems.org/specs.4.8.gz )

1 gem installed

运行成功

此时Redis安装好,此三个工具也安装好了,这时我们来做一个Redis集群测试,在一台服务器中创建了6个Redis实例,开启6个Redis服务

redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006

[root@eshop-cache02 init.d]# redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006

此时一个redis集群环境就已经搭建好了,可以通过redis-trib.rb check 192.168.3.105:7003命令查看集群几点的信息

[root@eshop-cache02 init.d]# redis-trib.rb check 192.168.3.105:7004

redis cluster的优点:读写分离+高可用+多master

读写分离:每个master都有一个slave

高可用:master宕机,slave自动被切换过去

多master:横向扩容支持更大数据量