学习淘淘商城第三十一课(Redis集群搭建)

首先说一下,为何要搭建Redis集群。Redis是在内存中保存数据,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据。适合存储大数据的是Hadoop生态系统的HBase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。

        我们来看一下集群图,如下图所示。可以看到Redis集群是没有统一入口的,客户端连集群中的哪台设备都行,集群中各个设备之间都定时进行交互,以便知道节点是否还正常工作。

        那么假如某个节点挂掉了怎么办?Redis集群是有容错投票机制的,如下图所示。浅黄色的那个节点向红色的那个节点发出ping命令,红色节点没有回应,这时浅黄色节点便认为这个节点可能挂掉了,它会投上一票,不过这时只是疑问,所以浅黄色节点画了一个"?",然后浅黄色节点告诉别的节点说这个红色的节点可能挂掉了,第二个节点去尝试和这个红色节点联系,发现也ping不同,于是第二个节点也认为这个红色节点挂掉了,第二个节点也投上一票,接着第三个节点去和红色节点联系,也联系不上,于是也投上一票,这样便三票了。Redis的容错投票机制是集群中过半数的节点认为某个节点挂了,那么就认定这个节点挂了。这时要看这个红色节点还有没有备用节点,如果没有备用节点了,那么整个集群将停止对外提供服务,如果有备份节点,那么会将备份节点扶正,继续对外提供服务。

         那么为什么一个节点挂掉(并且没有备用节点)的话,整个集群都不能提供服务了呢?其实这跟Redis集群的存储机制有关,Redis集群内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希映射到不同的节点。我们以下图为例,我们把这16384个哈希槽分配到三个Server上,假如Server1上卡槽是0-5000,Server2上卡槽是5001-10000,Server3上卡槽是10001-16383。假如我们要保存字符串"hello",而"hello"经过crc16算法再对16384求余后是500,很显然应该存到Server1上,假如要存储的字符串"hello2"经过crc16算法再对16384求余后是11500,那么很显然应该存到Server3上,同理,"hello3"、"hello1"被分别存到Server2和Server1上了。也就是说每个Server其实存储的内容是不一样的,这也就是为何某个节点挂掉后如果没有备用节点的话,整个集群都会挂掉,因为数据不全了啊。另外,关于每个服务器上卡槽的分布数量可以根据服务器的性能来定,性能好的可以多分配些卡槽,这样在它上面存储的内容也就多了。

   

        下面我们来搭建Redis集群,由于集群的容错机制是超过半数的节点认为某节点挂掉就确认挂掉,因此我们搭建的集群最好是奇数台(>=3)。又由于为了高可用性,每个节点需要有备份节点,因此我们搭建Redis集群至少要有6台虚拟机。下面说下步骤:

第一步:新建6台虚拟机

         大家可以参考http://blog.csdn.net/u012453843/article/details/68947589这篇博客进行搭建

第二步:为每台虚拟机安装redis

         大家可以参考学习淘淘商城第二十九课(Redis的安装)这篇博客进行安装

第三步:修改配置文件

        首先将解压包中的redis.conf文件复制到/usr/local/redis/bin目录下

[root@itcast02 redis-4.0.10]# cp redis.conf /usr/local/redis/bin/
[root@itcast02 redis-4.0.10]# cd /usr/local/redis/bin/
[root@itcast02 bin]# ll
total 35540
-rwxr-xr-x 1 root root 5597990 Jul 31 20:57 redis-benchmark
-rwxr-xr-x 1 root root 8329965 Jul 31 20:57 redis-check-aof
-rwxr-xr-x 1 root root 8329965 Jul 31 20:57 redis-check-rdb
-rwxr-xr-x 1 root root 5738338 Jul 31 20:57 redis-cli
-rw-r--r-- 1 root root   58762 Jul 31 20:57 redis.conf
lrwxrwxrwx 1 root root      12 Jul 31 20:57 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 8329965 Jul 31 20:57 redis-server
[root@itcast02 bin]# 

         接着修改redis.conf文件,需要修改两处地方,第一处是要开启后台运行功能,点击Xshell工具的"编辑"菜单,在下拉菜单中点击"查找",在查找对话框中输入"daemonize"即可搜索到相关配置,该配置原来默认值是"no",我们现在把它改为"yes"。

 

       第二处修改是开启集群,在搜索框中输入"cluster-enabled"便可找到这项配置,该配置原来是被注释掉的,我们把前面的那个注释符"#"去掉,如下图所示。

         第三处修改是开启集群,在搜索框中输入"protected-mode"便可找到这项配置,我们把yes  改为no,如下图所示

 这样第一台虚拟机便配置好了,由于六台虚拟机的这两项配置都一样,因此我们把刚修改好的这份配置文件复制到其它5台虚拟机上。

[root@itcast02 bin]# redis.conf itcast03:/usr/local/redis/bin/
[root@itcast02 bin]# redis.conf itcast04:/usr/local/redis/bin/
[root@itcast02 bin]# redis.conf itcast05:/usr/local/redis/bin/
[root@itcast02 bin]# redis.conf itcast06:/usr/local/redis/bin/
[root@itcast02 bin]# redis.conf itcast07:/usr/local/redis/bin/


第四步:设置开机自启动
        为了避免以后集群所有设备都手工启动redis,可以为这6台设备设置开机自启动,在/etc/rc.d/rc.local文件当中添加/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf这一行命令。     

[root@itcast02 bin]# vim /etc/rc.d/rc.local

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf


第五步:启动六台设备的redis。

        以其中一台设备为例,如下所示。

[root@itcast02 bin]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
[root@itcast02 bin]# ps aux|grep redis
root       3507  0.1  0.6 145960  9164 ?        Ssl  Jul31   0:22 /usr/local/redis/bin/redis-server *:6379 [cluster]               
root      40185  0.0  0.0 103324   888 pts/0    S+   02:28   0:00 grep redis
[root@itcast02 bin]# 


第六步:安装ruby环境
        集群的搭建需要用到ruby环境,因此我们需要安装ruby环境,由于六台设备都需要安装ruby环境,因此我们直接在XShell工具的下面的输入框中输入安装命令(要确认当前 作用的窗口是所有窗口,就是左边的图标是多窗口图标,如果不是多窗口可以点击输入框右边的"三条横线"图标切换窗口)回车即可在六个窗口同时运行

[root@itcast02 bin]# yum install centos-release-scl-rh
[root@itcast02 bin]# yum install rh-ruby23  -y
[root@itcast02 bin]# scl  enable  rh-ruby23 bash
[root@itcast02 bin]# ruby -v
[root@itcast02 bin]# yum install rubygems

 

   

 

        安装完ruby之后,我们需要安装ruby脚本运行所需要的一个包redis-4.0.1.gem。redis-4.0.1.gem这个地址进行下载,下载完后上传到每台 设备的/usr/local/software目录下,如下所示。

[root@itcast02 software]# ll
total 16544
-rw-r--r--  1 root root     91648 Sep 28  2017 redis-4.0.1.gem
drwxr-xr-x 25 1001 wheel     4096 Mar 28 09:47 ruby-2.5.1
-rw-r--r--  1 root root  15923244 Aug  1 01:12 ruby-2.5.1.tar.gz
[root@itcast02 software]# 

       下面来安装这个第三方包,在下面的那个输入框中输入gem install redis-4.0.1.gem然后回车,在六个窗口同时进行安装,其中一台的安装信息如下。

[root@itcast02 software]# gem install redis-4.0.1.gem 


第七步:安装集群
        上面做了那么多准备其实是为一个脚本文件(redis-trib.rb)服务的,这个脚本的位置在/usr/local/redis-4.0.1/src目录下,如下所示

[root@itcast02 src]# pwd
/usr/local/redis-4.0.10/src
[root@itcast02 src]# ll *.rb
-rwxr-xr-x 1 root root 65991 Jul 31 20:46 redis-trib.rb
[root@itcast02 src]# 

         为方便管理,我们把这个脚本复制到/usr/local/redis/bin目录下,如下所示

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

         下面正式搭建集群,命令中--replicas是指定每个节点备份的节点的数量,我们现在是每个节点备份一个,因此输入1。如下所示,可以看到从主节点是随机组成的,主节点是192.168.117.101 192.168.117.102 192.168.117.103这三台设备,192.168.117.104192.168.117.105192.168.117.106这三台是备用节点。Adding replica 192.168.117.105:6379 to 192.168.117.101:6379的意思是192.168.117.105作为192.168.117.101的从节点,同理,192.168.117.106作为了192.168.117.102的从节点,192.168.117.104作为了192.168.117.103的从节点。这样我们的集群便搭建完了。

[root@itcast02 bin]# ./redis-trib.rb create --replicas 1 192.168.117.101:6379 192.168.117.102:6379 192.168.117.103:6379 192.168.117.104:6379 192.168.117.105:6379 192.168.117.106:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.117.101:6379
192.168.117.102:6379
192.168.117.103:6379
Adding replica 192.168.117.105:6379 to 192.168.117.101:6379
Adding replica 192.168.117.106:6379 to 192.168.117.102:6379
Adding replica 192.168.117.104:6379 to 192.168.117.103:6379
M: fc107841c17adfb02fbcaf3a90b079e7ce291349 192.168.117.101:6379
   slots:0-5460 (5461 slots) master
M: 63075ca167daae59e728c570ca69abeee6bf9c13 192.168.117.102:6379
   slots:5461-10922 (5462 slots) master
M: 315113656cbca3b2ea155fae230764f88e038a5e 192.168.117.103:6379
   slots:10923-16383 (5461 slots) master
S: 82fbbf7ead1257183d7788fd151195296de3759c 192.168.117.104:6379
   replicates 315113656cbca3b2ea155fae230764f88e038a5e
S: 7fe6f43f9041f52b9cda6f570640f5ff3e9087fd 192.168.117.105:6379
   replicates fc107841c17adfb02fbcaf3a90b079e7ce291349
S: 22fc4a4dcf76f82dd64059d55f5ca81f56c86aa4 192.168.117.106:6379
   replicates 63075ca167daae59e728c570ca69abeee6bf9c13
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.117.101:6379)
M: fc107841c17adfb02fbcaf3a90b079e7ce291349 192.168.117.101:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 22fc4a4dcf76f82dd64059d55f5ca81f56c86aa4 192.168.117.106:6379
   slots:15098 (1 slots) master
   0 additional replica(s)
S: 82fbbf7ead1257183d7788fd151195296de3759c 192.168.117.104:6379
   slots: (0 slots) slave
   replicates 315113656cbca3b2ea155fae230764f88e038a5e
M: 315113656cbca3b2ea155fae230764f88e038a5e 192.168.117.103:6379
   slots:10923-15097,15099-16383 (5460 slots) master
   1 additional replica(s)
M: 63075ca167daae59e728c570ca69abeee6bf9c13 192.168.117.102:6379
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
S: 7fe6f43f9041f52b9cda6f570640f5ff3e9087fd 192.168.117.105:6379
   slots: (0 slots) slave
   replicates fc107841c17adfb02fbcaf3a90b079e7ce291349
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值