为什么要搭建redis集群?
Redis是一个内存数据库,也就是说存储数据的容量不能超过主机内存大小。普通主机服务器的内存一般几十G,但是我们需要存储大容量的数据(比如上百G的数据)怎么办?
在3.0版本之前,通常的做法是获取某个key的hashcode,然后mod,不过这种做法无法很好的支持动态伸缩性需求,一旦节点的增或者删操作,都会导致key无法在redis中命中。
redis3.0版本以上开始支持cluster【即集群】,采用的是hash slot(hash槽)。他可以把多个redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上。但是该怎么分散呢,一个Key只能被分配到一台机器上,我们在查询数据时,数据可能存在集群中的任意一台机器上,又该怎么查询呢?
通过向节点发送CLUSTER ADDSLOTS命令,可以将一个或多个槽指派给节点负责:
例如
Redis Cluster是一个无中心的结构,每个节点都保存数据和整个集群的状态。每个节点都会保存其它节点的信息,知道其它节点所负责的槽。并且会与其它节点定时的发送心跳信息,能够及时感知集群中异常的节点。
当客户端向集群中任一节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽(CRC16(key) & 16383),并检查这个槽是否指派给了自己:
·如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令。
·如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)至正确的节点,并再次发送之前想要执行的命令。MOVED错误的格式为:
MOVED:
如何搭建redis集群?
搭建redis集群,首先你得先搭建redis集群的节点【至少6个节点】
少于六个节点的问题:
redis集群为什么最少需要6个节点https://blog.csdn.net/zhangbaoxiang/article/details/107379622
这里博主就用1台服务器做操作了【ps:明白原理即可】
前期工作:
下载redis的压缩包
wget http://download.redis.io/releases/redis-6.0.6.tar.gz
进行解压
tar -zxvf redis-6.0.6.tar.gz
安装基本环境
解压过后,我们可以将解压得到的文件夹移动到/opt,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
然后进入该文件夹,我们可以看到redis的配置文件,日后我们可以在这里使用vim修改redis的配置文件。
因为redis是c写的,所以我们需要安装c语言环境
yum install gcc-c++ tcl
然后执行make命令,redis6以上make会出错,要升级gcc版本
Redis6以上需要gcc版本在7以上。
运行下面命令升级gcc
#第一步
sudo yum install centos-release-scl
#第二步
sudo yum install devtoolset-7-gcc*
#第三步
scl enable devtoolset-7 bash
其实不用安装gcc也行,直接make他会帮你安装gcc,然后执行make install命令 |
使用make和make install
cd 进入解压后的redis目录执行 make
cd进入src目录中执行 make install命令
修改redis.conf的配置,几个节点改几次~~~~
vim redis.conf
1.修改port端口号为 6378
2.将cluster-enabled的注释打开
3.将cluster-config的注释打开 ,并且修改使其对于端口号 6378
4.打开 cluster-node-timeout的注释
现在ls 一下,可以看到文件下存在了redis-6378
现在你只是配置了一个节点罢了,保持耐心
我们开始复制节点 6378-6373 并给予其权限: 如下
chmod 777 redis-6373
修改完之后cd进入 redis-6378-redis-6373 中的redis.conf中,按照上面修改配置的流程走一遍,顺便删掉文件下的dump.rdb文件
rm dump.rdb
节点配置完毕
宝们可以通过 ./src/redis-server redis.conf 进行测试,开启redis节点
./src/redis-server redis.conf
例如:
redis默认是前台启动,这样你启动了就无法做别的事情了,如下 |
博主这里比较懒,不想一个个启动节点,因此博主将redis改为后台启动,直接做了一个.sh程序一键启动节点了 |
1.修改redis为后台启动:
打开redis.conf 将 daemonize改为yes
2.在主目录下创建一个 start-all.sh
进入 start-all.sh 后进行编辑
cd redis-6373
./src/redis-server redis.conf
cd ..
cd redis-6374
./src/redis-server redis.conf
cd ..
cd redis-6375
./src/redis-server redis.conf
cd ..
cd redis-6376
./src/redis-server redis.conf
cd ..
cd redis-6377
./src/redis-server redis.conf
cd ..
cd redis-6378
./src/redis-server redis.conf
cd ..
:wq 保存后退出
执行 .sh 文件,一键开启所有节点
./start-all.sh
通过 ps aux | grep redis 查询redis节点的启动状态
ps aux | grep redis
看,6个节点开启完毕,接下来正式开始做集群功能
进入 redis-6378 文件的 src 目录下
执行命令:【ps:如果是多台服务器搭建集群,可能会需要密码 将127.0.0.1改为对应主机域名 如果其服务器redis存在密码 则 在下面集群语句后加上 -a redis密码, 例如: -a 123456】
./redis-cli --cluster create 127.0.0.1:6378 127.0.0.1:6377 127.0.0.1:6376 127.0.0.1:6375 127.0.0.1:6374 127.0.0.1:6373 --cluster-replicas 1
look,(/≧▽≦)/这样就搭建出普通的redis集群了
然后选择 6378 这个端口为主节点
redis-cli -c -p 6378
走一条 set 语句 -> OK
至此,我们简单的完成了redis集群的3主3从的搭建
学到这里,博主不妨多给各位科普下哨兵模式:
主从模式特点
(1)主节点Master可读、可写.
(2)从节点Slave只读。(read-only)
因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。
主从模式的缺陷
当主节点宕机了,整个集群就没有可写的节点了。
由于从节点上备份了主节点的所有数据,那在主节点宕机的情况下,如果能够将从节点变成一个主节点,是不是就可以解决这个问题了呢?
答:是的,这个就是Sentinel哨兵的作用。
哨兵的任务
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会进行选举,将其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
节点的主观下线【偏见,少数】
ps:改图取自
https://blog.csdn.net/qq_32182461/article/details/82556295
节点之间会定期的执行ping/pong消息来证明节点之间的连通性,若节点一向节点二发送ping消息之后收到pong消息,那么节点一将会更新最后一次与节点二的通信时间,若没有收到pong消息,那么节点一与节点二之间的链接将会断开,之后节点一再次执行ping消息,若与节点二之间的最后通信时间超过指定的时间,那么节点二将被节点一标记为主观下线。
节点的客观下线【大群意志,半数票决】
ps:下列图取自
https://blog.csdn.net/See_Csdn_/article/details/115902857
哨兵监听,半数票决,觉得该节点异常了,就让他下线
然后让从节点server2取代成为主节点,而server1进行异常修复处理,处理完之后,重新上线