Redis学习之路(二)Redis集群搭建

一、Redis集群搭建说明

基于三台虚拟机部署9个节点,一台虚拟机三个节点,创建出4个master、4个slave的Redis集群。

Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),因为我这里有三台虚拟机,因此每台虚拟机部署了3个节点。

1、下载地址:

https://redis.io/download

Redis学习之路(二)Redis集群搭建

2、解压(三个节点,这里仅以master节点为例)

[root@master mnt]# tar -zxvf redis-4.0.2.tar.gz
[root@master mnt]# mv  redis-4.0.2 redis

3、由于我下载的是最新版未编译版本,所以安装之前需要安装c的依赖包(三个节点,这里仅以master节点为例)

[root@master mnt]# yum install -y gcc-c++

4、执行make操作(三个节点,这里仅以master节点为例)

[root@master mnt]# cd redis
[root@master mnt]# make
等待执行完成

5、将 redis-trib.rb 复制到 /usr/local/bin 目录下(三个节点,这里仅以master节点为例)

[root@master redis]# cd src/c
[root@master src] cp redis-trib.rb /usr/local/bin/ 

6、创建Redis节点(三个节点,这里仅以master节点为例)

在master节点:进入redis目录,创建redis_cluster 目录;

[root@master redis]# pwd
/mnt/redis
[root@master redis]# mkdir redis_cluster

在redis_cluster目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这两个目录中

[root@master redis]# cd redis_cluster/
[root@master redis_cluster]# mkdir 7000
[root@master redis_cluster]# mkdir 7001
[root@master redis_cluster]# mkdir 7002
[root@master redis_cluster]# ll 
总用量 0
drwxr-xr-x 2 root root 6 4月 26 11:39 7000
drwxr-xr-x 2 root root 6 4月 26 11:39 7001
drwxr-xr-x 2 root root 6 4月 26 11:39 7002

[root@master redis]# pwd
/mnt/redis
[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7000

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7001

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7002

分别修改这两个配置文件,修改内容如下:

[root@master redis_cluster]# cd 7000
[root@master 7000]# ls
redis.conf

文件配置:
port 7000 //端口7000
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
[root@master 7001]# ls
redis.conf
文件配置:
port 7001 //端口7001
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7001.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

[root@master 7002]# ls
redis.conf
文件配置:
port 7002 //端口7001
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7002.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7002.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

然后在节点slave01、slave02下重复第6步操作,把目录改为7003、7004、7005、7006、7007、7008,相应的配置文件也是如此。

7、第6步配置完成之后,启动各个节点

master节点:
[root@master mnt]# cd /mnt/redis/src/
[root@master src]# redis-server /mnt/redis/redis_cluster/7000/redis.conf
[root@master src]# redis-server /mnt/redis/redis_cluster/7001/redis.conf
[root@master src]# redis-server /mnt/redis/redis_cluster/7002/redis.conf

报错:
[root@master src]# redis-server redis_cluster/7000/redis.conf
-bash: redis-server: 未找到命令
解决:
[root@master src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
[root@slav01 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
[root@slave02 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
slava01节点:
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7003/redis.conf 
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7004/redis.conf
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7005/redis.conf
slave02节点:
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7006/redis.conf 
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7007/redis.conf
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7008/redis.conf

8、检查Redis的启动情况

master节点:
Redis学习之路(二)Redis集群搭建
slave01节点:

Redis学习之路(二)Redis集群搭建

slave02节点:

Redis学习之路(二)Redis集群搭建

9、创建集群

创建集群之前先安装ruby和gem

yum -y install ruby ruby-devel rubygems rpm-build
gem install redis 

说明:在master、slave01、slave02节点执行gem install redis 报错:

redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
解决办法是 先安装rvm,再把ruby版本提升至2.3.3
1.安装curl
sudo yum install curl
2. 安装RVM
curl -L get.rvm.io | bash -s stable
报错:

Redis学习之路(二)Redis集群搭建

解决:分别执行:

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
 curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

再次执行:
curl -L get.rvm.io | bash -s stable 
出现如下情况,说明成功
Redis学习之路(二)Redis集群搭建

3、source /usr/local/rvm/scripts/rvm
4. 查看rvm库中已知的ruby版本
rvm list known
5. 安装一个ruby版本
rvm install 2.3.3
6. 使用一个ruby版本
rvm use 2.3.3
7. 删除默认版本
rvm remove 2.0.0
8. 查看一个已知版本
ruby --version
9. 再安装redis就可以了
gem install redis
10、如下说明安装成功

[root@slave01 7002]# gem install redis
 Fetching: redis-4.1.0.gem (100%)
 Successfully installed redis-4.1.0
 Parsing documentation for redis-4.1.0
 Installing ri documentation for redis-4.1.0
 Done installing documentation for redis after 2 seconds
 1 gem installed

然后再创建集群(因为如下这个是通过ruby工具实现的,所以执行这个之前先安装了ruby):

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第5步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。

redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008

结果:

[root@master ~]# redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008
>>> Creating cluster
>>> Performing hash slots allocation on 8 nodes...
Using 4 masters:
192.168.200.100:7001
192.168.200.101:7003
192.168.200.102:7006
192.168.200.100:7002
Adding replica 192.168.200.101:7004 to 192.168.200.100:7001
Adding replica 192.168.200.102:7007 to 192.168.200.101:7003
Adding replica 192.168.200.101:7005 to 192.168.200.102:7006
Adding replica 192.168.200.102:7008 to 192.168.200.100:7002
M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
slots:0-4095 (4096 slots) master
M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
slots:12288-16383 (4096 slots) master
M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
slots:4096-8191 (4096 slots) master
S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
slots:8192-12287 (4096 slots) master
S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
replicates dbab7ff79b07a7506f7b34da18fb242545476181
S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.......
>>> Performing Cluster Check (using node 192.168.200.100:7001)
M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
slots:0-4095 (4096 slots) master
1 additional replica(s)
M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
slots:12288-16383 (4096 slots) master
1 additional replica(s)
S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
slots: (0 slots) slave
replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
slots: (0 slots) slave
replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
slots:8192-12287 (4096 slots) master
1 additional replica(s)
M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
slots:4096-8191 (4096 slots) master
1 additional replica(s)
S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
slots: (0 slots) slave
replicates dbab7ff79b07a7506f7b34da18fb242545476181
S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
slots: (0 slots) slave
replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试一下,进行集群验证:

  在192.168.200.100节点上连接192.168.200.102节点的7008端口:

[root@master src]# ./redis-cli -h 192.168.200.102 -c -p 7008
192.168.200.102:7008> set hello world
-> Redirected to slot [866] located at 192.168.200.100:7001
OK

创建了一个key为hello,值为world。
查看:
Redis学习之路(二)Redis集群搭建
然后在通过192.168.200.101节点访问该数据:
Redis学习之路(二)Redis集群搭建
说明:上面可以看到进行get和set的时候节点跳转到了7000端口所在的节点(192.168.200.100)。详细请查阅原理如下:

以上说明:Redis集群已经搭建好啦!!!!!!!!!!!!!!!!!!!!!!

查看集群状态:

Redis学习之路(二)Redis集群搭建

二、简单说一下原理

1、Redis clutser在设计的时候,就考虑到了去中心话,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据。

2、Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的。redis cluster默认分配了16384个槽(slot),当我们set一个key时,会采用CRC16算法来取模得到所属的slot,然后将这个key分配到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16834.所以我们在测试的时候可以看到set和get的时候,直接跳转到了7000端口的节点。

3、Redis集群会把数据存在一个master的主节点,然后在这个master和其对应的slave之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

上一篇:python:点赞功能


下一篇:新手redis集群搭建