大家好,又见面了,我是你们的朋友全栈君。
Redis 集群搭建
前言
最近通过看视频学习了一下 Redis,前天使用 CentOS 7 配置了一下 Redis 4.0.9 单机版(相关链接:CentOS 7 配置 Redis 4.0.9),今天则通过之前的笔记,视频以及 redis 官网上集群搭建的教程(https://redis.io/topics/cluster-tutorial) 的资料来搭建一下 Redis 集群。 本次则是在上次 CentOS 7 配置 Redis 4.0.9 的环境下继续搭建集群
配置运行在集群模式的 Redis 实例
最少选项的集群的配置文件:
代码语言:javascript复制# 端口号
port 7000
# 开启集群模式
cluster-enabled yes
# 设置保存节点配置文件的路径,默认值为 nodes.conf。节点配置文件无须人为修改
cluster-config-file nodes.conf
# 设置节点超时时间
cluster-node-timeout 5000
# 设置是否开启 aof 模式,对数据库完整性要求比较高可以开启
appendonly no
代码语言:javascript复制为了外部访问,需要配置一下 IP 地址以及关闭防火墙。例如
bind 192.168.229.162
来绑定 IP 地址。这里我以我运行 Redis 实例的虚拟机的 IP 地址为例。CentOS 7 停止防火墙:systemctl stop firewalld.service
;禁止防火墙开机启动:systemctl disable firewalld.service
Redis 持久化方案有两种,默认开启的是 rdb 模式,定期把内存中的数据保存到磁盘;另一种则是 aof 模式,会频繁进行保存,会影响性能。自己练手时,推荐使用 rdb 模式即可。 顺带记得设置一下后端启动,代码如下:
# 设置为后端启动
daemonize yes
代码语言:javascript复制我的配置如下:
# IP
bind 192.168.229.162
# 端口号
port 7001
# 开启集群模式
cluster-enabled yes
# 设置保存节点配置文件的路径,默认值为 nodes.conf。节点配置文件无须人为修改
cluster-config-file nodes.conf
# 设置节点超时时间
cluster-node-timeout 5000
# 设置是否开启 aof 模式,对数据库完整性要求比较高可以开启
appendonly no
# 设置为后端启动
daemonize yes
配置集群前期准备
代码语言:javascript复制集群正常运行至少需要 3个节点,不过刚开始使用集群功能时,推荐使用 6个节点:3个主节点,3个从节点。 集群正常运行至少需要 3个节点,是因为 Redis 集群有个投票机制(容错机制),来判断某个节点是否挂了,当超过半数认为该节点挂了,则认定该节点挂了,此时则切换到该节点的从节点。 如上,若一个节点挂了,找不到从节点,无法切换,则数据不完整,则整个 Redis 集群就挂了。故为了实现高可用,每个节点至少配置一个从节点。 在 /usr/local 下创建文件夹 redis-cluster-test。使用命令:
mkdir redis-cluster-test
。然后在 redis-cluster-test 下创建六个以端口号为名字的子目录
cd redis-cluster-test
mkdir 7000 7001 7002 7003 7004 7005
代码语言:javascript复制在这六个子目录之中,各创建一个 redis.conf 配置文件,配置内容为上面最少选项的集群的配置文件,端口改为对应的目录名字。或者是从 Redis 源码里面拷贝一份 redis.conf 配置文件出来并修改对应的参数。 将编译好的 redis-server(从上回配置单机版 redis 的文件夹下拷贝,路径为 /usr/local/redis/bin 下) 可执行文件复制到 redis-cluster-test 文件夹下,使用以下命令,分别开启实例:
cd 7000
../redis-server ./redis.conf
代码语言:javascript复制因为 nodes.conf 文件不存在, 所以每个节点都为它自身指定了一个新的 ID 当然,我们可以写一个脚本文件,来一键开启 6个 Redis 实例。在 redis-cluster-test 文件夹下,运行命令:
vi start-all.sh
,会自动在 redis-cluster-test 文件夹下生成一个 start-all.sh 文件,在里面输入以下代码:
cd 7000
../redis-server ./redis.conf
cd ..
cd 7001
../redis-server ./redis.conf
cd ..
cd 7002
../redis-server ./redis.conf
cd ..
cd 7003
../redis-server ./redis.conf
cd ..
cd 7004
../redis-server ./redis.conf
cd ..
cd 7005
../redis-server ./redis.conf
cd ..
然后保存退出即可(按 ESC 键后,输入:wq
,回车即可),保存后对该脚本文件进行授权:chmod u x start-all.sh
。(同理,我们也可以配置一个关闭 redis 服务的脚本,先从之前的 /usr/local/redis/bin 中拷贝 redis-cli 来关闭,参考之前配置单机版 redis 的文章)
运行命令:
./start-all.sh
,此时,我们通过查看进程(命令:ps aux|grep redis
),可以看到运行着 6个 Redis 实例。
搭建集群
Ruby 环境
官方默认提供了 Redis 集群命令行工具 redis-trib.rb。redis-trib.rb 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。 为了方便之后的使用,我们可以使用命令将它复制到 redis-cluster-test 文件夹之中。进入 Redis (之前,我们是将源码从本地上传到虚拟机中的 root 目录下,路径为 /root/redis-4.0.9)源码的 src 文件夹后,使用命令:
cp redis-trib.rb /usr/local/redis-cluster-test
因为这是个 Ruby 程序,所以我们需要先配置一下 Ruby 环境和 redis-trib.rb 脚本运行使用的包(redis-X.X.X.gem,官方地址:https://rubygems.org/gems/redis) 。这之间走了一些弯路,这里就不细讲了。
进入 /usr/local/redis-cluster-test,通过命令配置 Redis 集群:
代码语言:javascript复制./redis-trib.rb create --replicas 1 192.168.229.162:7000 192.168.229.162:7001 192.168.229.162:7002 192.168.229.162:7003 192.168.229.162:7004 192.168.229.162:7005
注:参数 –replicas 1 表示为集群中的每个主节点创建一个从节点,之后跟着是这个集群实例的地址列表,先是主节点,然后是从节点。
其中会让你确认配置是否有问题,输入 yes 即可。redis-trib.rb 就会配置好一切,让各个节点之间相互通信。
测试集群
可以使用 redis 默认提供的客户端 —— redis-cli 来进行测试(先从之前的 /usr/local/redis/bin 中拷贝 redis-cli)。 连接集群:
./redis-cli -c -h 192.168.229.162 -p 7000
注:这与平时直接连接 redis 实例有所不同,需要加上-c
这个参数,代表连接的是 Redis 集群 连接成功后,试着往里面添加一些数据,如下图:
如上图,在添加数据的时候,会对每个 key 进行 CRC16 校验后对 16384 取模来决定放在哪个哈希槽,然后存储到对应的节点上。到此 Redis 集群就搭建完成了。
后记
目前 Redis 集群的客户端使用最多的是 Java 客户端 —— Jedis。之后也会对 Jedis 的使用做一些笔记。 在实践中学习。 HochenChong 2018-04-27
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126136.html原文链接:https://javaforall.cn