Redis中的集群部署

今天来学习redis中的集群部署,防止一台master宕机后,就全盘皆输的局面。

集群的作用

1: 主从备份 防止主机宕机
2: 读写分离,分担master的任务(master写,slave读)
3: 任务分离,如从服务器分担备份工作与计算工作

redis中的集群

通常有两种集群的搭建方式:

1)星型

2) 链式

第2种方式的好处:

master宕机后 , 可以直接切换到 slave1 。

redis中主从的通信过程

首先,slave向master发出同步的命令,master会将dump文件发给slave,在dump的过程中向master发出的命令再使用aof文件来同步到slave中。之后就使用replicationFeedSlaves来同步。

redis集群的配置

Master配置:
1:关闭rdb快照(备份工作交给slave)
2:可以开启aof

slave配置:
1: 声明slave-of
2: 配置密码[如果master有密码]
3: [某1个] slave 打开 rdb快照功能
4: 配置是否只读[slave-read-only]


下面开始,真正的操作过程。

redis中简单的主从复制配置

准备搭 :1个master + 2个slave的redis集群。

这里是模拟集群,可以使用多个配置文件来模拟多个redis服务器。启动一个配置文件,就是一个redis服务器。

master的配置文件:关闭rdb,开启aof。

第一个slave服务器:开启rdb,关闭aof,开启slave只读。

第二个slave服务器:rdb、aof都不关闭,开启slave只读。


将当前目录下的redis.conf文件,复制两份,改个名字。

修改master的redis.conf配置文件:


修改第一个slave的redis6780.conf的配置文件





修改第二个slave的redis6781.conf的配置文件






分别启动这个三个redis服务器:

启动之前先删除之前的rdb与aof文件,避免形成干扰。




发现,我们往master中插入name数据后,在两个slave服务器中,根本就没有name数据。

这是为啥呢?这是因为redis版本更新后,在slave中配置master的ip时候,不能使用localhost !!!必须是ip地址,即要写成127.0.0.1

将两个slave中的:replicaof 127.0.0.1 6379 这样写就可以了。

下面是三个redis配置文件中的详细信息:

master:redis.conf

bind 127.0.0.1   # 实际生产中,添加自己的ip地址。
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
#save 900 1                     # master:关闭rdb,留给slave来完成
#save 300 10
#save 60 10000
dbfilename dump6379.rdb
dir /var/rdb
appendonly yes                  # master:开启aof。
appendfilename "appendonly6379.aof"

slave:redis6780.conf

bind 127.0.0.1   # 实际生产中,添加自己的ip地址。
port 6780
daemonize yes
pidfile /var/run/redis_6780.pid
save 900 1                     # 6780的slave开启:rdb
save 300 10
save 60 10000
dbfilename dump6780.rdb
dir /var/rdb
appendonly no                  # 关闭aof功能,因为master已经开启了
appendfilename "appendonly6780.aof"

#配置主从复制
replicaof 127.0.0.1 6379  # 配置master的ip地址和端口号。注意这里不能写localhost!!!
replica-read-only yes     # slave只读。

slave:redis6781.conf

bind 127.0.0.1   # 实际生产中,添加自己的ip地址。
port 6781
daemonize yes
pidfile /var/run/redis_6781.pid
#save 900 1                     # 关闭rdb功能
#save 300 10
#save 60 10000
dbfilename dump6781.rdb
dir /var/rdb
appendonly no                  # 关闭aof功能
appendfilename "appendonly6781.aof"

#配置主从复制
replicaof 127.0.0.1 6379  # 配置master的ip地址和端口号。注意这里不能写localhost!!!
replica-read-only yes     # slave只读。

这样:分别启动三个redis客户端来验证,数据就一致了。

注意:高版本的redis主从复制中配置文件中,是:replicaof 、replica-read-only;低版本中是:slaveof、slave-read-only。


下面,来演示redis-2版本之上的版本集群搭建方式:

redis中的集群搭建

上面,我们演示了redis中的,简单主从复制的搭建,比较简单。其实slave就是将master中的数据拷贝了一份。
而redis中的集群的话,就不是那么简单了,当我们访问其中一个redis服务器时,首先会使用hash算法,定位到具体要使用哪个redis服务器,详细理论知识请看官网。

下面开始redis的搭建过程。

Redis的集群部署需要在每台集群部署的机器上安装Redis,然后修改配置以集群的方式启动。

这里演示的话,就是使用多个redis.conf配置文件来模拟redis集群。

搭建redis集群

1)现在搭建redis集群,最小集群模式需要三个master实例,一般建议起六个实例,即三主三从。因此我们创建6个以端口号命名的目录存放实例的配置文件和其他信息。

mkdir redis-cluster
cd redis-cluster
mkdir 7000 7001 7002 7003 7004 7005

在对应端口号的目录中复制一份redis.conf的文件。每个配置文件中的端口号port参数改为对应目录的端口号。

目录结构可参考:

redis-cluster/
├── 7000
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7000.conf
│   └── redis.conf
├── 7001
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7001.conf
│   └── redis.conf
├── 7002
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7002.conf
│   └── redis.conf
├── 7003
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7003.conf
│   └── redis.conf
├── 7004
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7004.conf
│   └── redis.conf
├── 7005
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── nodes-7005.conf
│   └── redis.conf


每个redis.conf配置文件的大致需要配置的内容:

#可选操作,该项设置后台方式运行,
daemonize yes                       # 开启后台运行

bind 127.0.0.1                      # 如果是实际中,填写每个机器的ip地址
port 7000                           # 对应每个文件夹的名字,设置不同的端口号
pidfile /var/run/redis_7000.pid     # 设置pid文件,对应每个端口号
cluster-enabled yes                 # 开启redis的集群
cluster-config-file nodes-7000.conf # redis集群节点信息文件
cluster-node-timeout 5000           # redis集群节点连接超时的设置
appendonly yes                      # 开启aof持久化

以7000为例:









7003:
只是开启rdb持久化。7000-7002:master,关闭rdb;7003-7005:slaver,开启rdb。
其他的配置类似于7000。

启动redis服务器

2)启动六个redis服务器


如果是使用前台的方式启动redis服务器的话,会出现:

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

每个实例都会生成一个Node ID,类似97a3a64667477371c4479320d683e4c8db5858b1,用来作为Redis实例在集群中的唯一标识,而不是通过IP和Port,IP和Port可能会改变,该Node ID不会改变。

使用redis-trib创建集群

3)使用redis-trib创建集群

redis的实例全部运行之后,还需要redis-trib.rb工具来完成集群的创建,redis-trib.rb二进制文件在Redis包主目录下的src目录中,运行该工具依赖 ruby环境 和 gem,因此需要提前安装。

安装:ruby

安装:ruby

yum -y install ruby rubygems

查看ruby的版本:
ruby --version

由于centos系统默认支持Ruby版本为2.0.0,因此执行 gem install redis 命令时会报以下错误。

gem install redis

解决方法是先安装 rvm,再升级ruby版本。

安装:rvm

安装rvm

curl -L get.rvm.io | bash -s stable

如果出现以下错误:

则执行报错中的:gpg2 --keyserver ····· 命令。

gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

再次执行命令curl -L get.rvm.io | bash -s stable。例如:

以上表示执行成功,然后执行以下命令。

source /usr/local/rvm/scripts/rvm

查看rvm库中已知的ruby版本

rvm list known

升级:ruby

升级Ruby:

#安装ruby
rvm install 2.5.0
#使用新版本
rvm use  2.5.0
#移除旧版本
rvm remove 2.0.0
#查看当前版本
ruby --version

例如:


安装:gem

安装:gem

gem install redis


redis-trib.rb

以上前提工具终于安装好了,可以开始执行:redis-trib.rb 命令

在redis的src源码下,存在:redis-trib.rb 命令。

在src目录下:执行
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

参数create表示创建一个新的集群,--replicas 1 :表示为每个master创建一个slave。

如果创建成功会显示以下信息

[OK] All 16384 slots covered

./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

执行成功后会停止在:

Can I set the above configuration? (type ‘yes’ to accept):

输入:yes 即可。


部署结果验证

4) 部署结果验证

1、客户端验证

使用客户端redis-cli二进制访问某个实例,执行set和get的测试。

注意: -h:填写实际中的ip地址,-p:端口号,-c:代表连接的是redis集群(一定要带上-c)


2、集群状态

使用 cluster info 命令查看集群状态。

3、节点状态

使用cluster nodes命令查看节点状态。

配置master密码

一般,我们搭建redis集群是在内网中,所以,不需要设置master密码,也不许要配置防火墙,这样会加快redis的访问速度。

如果,你一定要为了安全性,要配置master的密码的话。

首先退出redis集群,杀死六个redis服务器进程。

方法一

修改所有redis集群中的redis.conf文件


注意所有节点的密码都必须一致,masterauth也要加的。

方法二

通过指令找到安装的redis在ruby环境中的配置client.rb

find / -name "client.rb"

编辑该文件:

vim /usr/local/rvm/gems/ruby-2.5.0/gems/redis-4.1.0/lib/redis/client.rb


修改其中的密码配置:pass

之后重启Redis,即可。





现在,必须使用带密码的参数来连接redis服务器才有权限



  目录