本文共 5130 字,大约阅读时间需要 17 分钟。
就为了一个redis集群,整整浪费了我五天的时间。搞的我几近崩溃了……说道这里,突然想到一个笑话:
我问大师:“我是搞IT的,每天压力很大,吃也吃不好,睡也睡不好,又不能顾家,还挣不着多少钱,每天还要面对各种问题,别人都有时间休假,而我却不行。” 禅师右手捂左胸,不语。 我追问大师:“您是说不要抱怨,要问心无愧,要对得起心中梦想,对吗?” 禅师摇了摇头说:“你离我远点,我出家以前就是搞IT的!今天听你又说这些,心里堵得慌!” 真的是说出了我当时的心情。Redis集群的搭建
简介
Redis 集群是一个提供在多个Redis节点间共享数据的程序集。
Redis 集群通过分区来提供一定程度的高可用性,在实际环境中,当某个节点宕机或者不可达的情况下能够继续提供服务; Redis 集群的优势:
1、自动分割数据到不同的节点上。 2、在整个集群的部分节点宕机或者不可达的情况下能够继续处理命令对外提供服务。一、集群搭建条件(重点)
如果为redis5.0版本,就无需往下看。如果是5.0以下的,接着往下看。
配置Ruby环境来作为温床承载集群。
因为在redis/src中有一个文件叫做redis-trib.rb,这个文件就是作者用Ruby写的,用来搭建redis集群(redis3.0版本时才开始支持dao集群),redis-trib.rb的后缀就是Ruby的简写,所以想要搭建redis集群需要有一个能执行.rb这种文件的运行环境,这个环境就是Ruby。
如果未安装Rudy会出现如下问题
建立集群的时候,出现 can not load such file ---openssl(LoadError),说明ruby的版本有问题,必须用2.0.0以上的
ruby安装步骤:
第一步:下载ruby2.0以上的版本;
第二步:解压安装;
$ tar -xvzf ruby-2.2.3.tgz
$ cd ruby-2.2.3
第三步:,make install会出现 can not load such file ---openssl(LoadError)
$ ./configure
$ make
$ sudo make install
问题解决:
cannot load such file -- openssl 问题解决
原因
- 未安装openssl-devel 2.缺少ruby-openssl
解决
- (未安装openssl时)下载安装openssl
-
- 下载软件包
https://www.openssl.org/source/openssl-1.0.2t.tar.gz
- 解压缩软件包
tar -zxvf openssl-1.0.2t.tar.gz
- 进入目录
cd openssl-1.0.2t
./config shared zlib
make depend
make
make install
- 验证是否安装成功(显示版本信息)
/usr/local/ssl/bin/openssl version -a
- 下载软件包
-
- 安装ruby-openssl
- Ruby源码提供了该源码,直接找到对应目录安装
cd /root/ruby-2.6.5/ext/openssl
ruby ./extconf.rb
- (未链接刚安装的openssl可能)报错 checking for openssl.h... no 或 checking for deflateReset() in -openssl... no
- 则
ruby ./extconf.rb --with-openssl-dir=/usr/local/ssl
make
- 如果报错 make: *** No rule to make target
/include/ruby.h', needed by
zlib.o'. Stop.根据日志得知 zlib.o: $(top_srcdir)/include/ruby.h 去查看源码的确不存在变量值的话,处理方式同安装ruby-zlib。(也就是查看cannot load such file -- zlib 问题的解决)- 在Makefile文档第一行,设置变量top_srcdir的路径
- (我采用)用绝对/相对路径替换$(top_srcdir)
- 建议先备份Makefile
vim Makefile
: %s/$(top_srcdir)/..\/../g
此处是在
Makefile
文件中输入这一行命令
: wq
- 如果报错 make: *** No rule to make target
- 如果上一步make报错,在修改后再次
make
make install
- Ruby源码提供了该源码,直接找到对应目录安装
cannot load such file -- zlib 问题解决
原因
- 缺少zlib函式库
- 缺少ruby-zlib
解决
- (未安装zlib时)下载安装zlib
- 我是使用源码安装,由是默认安装到/usr/local/lib,我选择使用root用户操作
- 安装版本zlib-1.2.11
- 下载软件包
http://www.zlib.net/zlib-1.2.11.tar.gz
- 解压缩软件包
tar -zxvf zlib-1.2.11.tar.gz
- 进入zlib源码目录
cd zlib-1.2.11/
- 配置
./configure
- make
make
- 检查
make check
- 安装
make install
- 查看是否成功(目录中存在libz.a)
find /usr/local/lib -name libz.a
- 下载软件包
- 安装 ruby-zlib
- Ruby源码提供了该源码,直接找到对应目录安装
cd /root/ruby-2.6.5/ext/zlib
ruby ./extconf.rb
- 如果报错 checking for zlib.h... no 或 checking for deflateReset() in -lzlib... no
- 则
ruby ./extconf.rb --with-zlib-dir =/usr/local/zlib
make
- 如果报错 make: *** No rule to make target
/include/ruby.h', needed by
zlib.o'. Stop. - 根据日志得知 zlib.o: $(top_srcdir)/include/ruby.h 去查看源码的确不存在变量值的话
- 在Makefile文档第一行,设置变量top_srcdir的路径
- (我采用)用绝对/相对路径替换$(top_srcdir)
- 建议先备份Makefile
vim Makefile
: %s/$(top_srcdir)/..\/../g
:
wq
- 如果报错 make: *** No rule to make target
- 如果上一步make报错,在修改后再次
make
make install
- Ruby源码提供了该源码,直接找到对应目录安装
二、集群的数据分片
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念。
Redis 集群有16384个哈希槽,每个key通过CRC16算法校验后对16384取模来决定放置在哪个槽。公式为 CRC16(Key) % 16384 , 集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5500号哈希槽;
- 节点 B 包含5501 到 11000 号哈希槽;
- 节点 C 包含11001 到 16384号哈希槽;
Redis 集群的主从复制模型
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。
不过当B和B1 都失败后,集群是不可用的。
集群的创建:
为了方便管理,我们创建一个集群目录,进入到local目录
cd /usr/local
mkdir redis-cluster
cd cluster
# 官网端口从7001~7006
mkdir 7001 7002 7003 7004 7005 7006
拷贝并修改配置文件
将redis目录下的redix.conf文件拷贝到7001~7006目录中并修改配置文件中的如下内容
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应 7000,7002,7003等
port 7000 //端口7001,7002,7003等
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次 启动自动生成 7000,7001,7002等
cluster-node-timeout 5000 //请求超时 设置5秒够了
appendonly yes //aof日志开启 有需要就开 启,它会每次写操作都记录一条日志
bind 192.168.100.110 绑定ip
protected-mode 改为no
requirepass 注释掉
开启防火墙并进行端口监控
systemctl status firewalld;
然后,依次开放7001-7006监听端口
1 #查看指定端口是否开放,执行结果为no就为未开放
2 firewall-cmd --query-port=7001/tcp
3 #开放指定端口,执行结果为success,开放成功
4 firewall-cmd --add-port=7001/tcp
启动六个redis
进入到redis-3.2.9的src的文件中,依次进行redis的启动
cd /usr/local/redis-cluster/redis-3.2.9/src
./redis-server ../../redsi7001/redis.conf
./redis-server ../../redsi7002/redis.conf
./redis-server ../../redsi7003/redis.conf
./redis-server ../../redsi7004/redis.conf
./redis-server ../../redsi7005/redis.conf
./redis-server ../../redsi7006/redis.conf
查看redis启动情况
ps -ef | grep redis | grep -v grep
启动六个redis
建立集群
./redis-trib.rb cr 192.168.100.110:7001 create –replicas 1 192.168.100.110:7001 192.168.100.110:7003 192.168.100.110:7005 192.168.100.110:7002 192.168.100.110:7004 192.168.100.110:7006
这里我们有必要说一下redis-trib.lb命令;
这个命令在这里用于创建一个新的集群,- 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
- 之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave。
redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到相应的主从节点信息。
输入yes,redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯。
转载地址:https://blog.csdn.net/qq_42000661/article/details/109029229 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!