redis-5.0.5集群部署及测试(超详细)
阅读原文时间:2021年04月20日阅读:1

前言

本文非一开始就部署集群,而是部署redis单点,再从单点的基础部署成集群。适合初学者阅读,也欢迎大牛指正!

服务版本说明

服务 版本号 备注
Redis redis-5.0.5

部署环境

系统环境:centos7.6
服务版本:redis-5.0.5
主机名:yhcs_1、yhcs_2
IP:192.168.43.176、192.168.43.177

下载路径

Redis官网:http://redis.io

安装约定并创建目录

安装包存放目录:/data/software/redis
安装目录:/usr/local/redis
节点目录:/usr/local/redis_cluster
设置节点:7000、7001、7002
[root@yhcs_1 ~]# mkdir -p /data/software/redis
[root@yhcs_1 ~]# mkdir -p /usr/local/redis
[root@yhcs_1 ~]# mkdir -p /usr/local/redis_cluster

上传redis-5.0.5.tar.gz

[root@yhcs_1 ~]# cd /data/software/redis/
[root@yhcs_1 redis]# rz -y
[root@yhcs_1 redis]# ls
redis-5.0.5.tar.gz
[root@yhcs_1 redis]# tar -zxvf redis-5.0.5.tar.gz

编译安装

[root@yhcs_1 redis]# cd redis-5.0.5
[root@yhcs_1 redis]# yum install -y gcc
[root@yhcs_1 redis-5.0.5]# make
报错:zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
关于分配器allocator, 如果有MALLOC 这个 环境变量, 会有用这个环境变量的 去建立Redis。而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数
[root@yhcs_1 redis-5.0.5]# make MALLOC=libc
[root@yhcs_1 redis-5.0.5]# cd src
[root@yhcs_1 src]# make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
[root@yhcs_1 src]# yum install -y tcl
[root@yhcs_1 src]# make test
测试make test 成功!
#redis比较特殊,在这一步才指定安装路径
[root@yhcs_1 src]# make install PREFIX=/usr/local/redis
#安装完成后查看安装目录
[root@yhcs_1 src]# cd /usr/local/redis
[root@yhcs_1 redis]# ll
total 0
drwxr-xr-x. 2 root root 134 Oct 17 17:09 bin
[root@yhcs_1 redis]# ls -l bin/
total 12980
-rwxr-xr-x. 1 root root 353824 Oct 17 17:09 redis-benchmark #redis性能测试工具启动,测试redis在你的系统及你的配置下的读写性能
-rwxr-xr-x. 1 root root 4045352 Oct 17 17:09 redis-check-aof #更新aof日志检查
-rwxr-xr-x. 1 root root 4045352 Oct 17 17:09 redis-check-rdb #本地数据库检查
-rwxr-xr-x. 1 root root 794384 Oct 17 17:09 redis-cli #命令行操作工具(即客户端)
lrwxrwxrwx. 1 root root 12 Oct 17 17:09 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 4045352 Oct 17 17:09 redis-server #redis服务器的daemon启动程序

配置环境变量

[root@yhcs_1 redis]# echo ‘export PATH=$PATH:/usr/local/redis/bin’ >> /etc/profile
[root@yhcs_1 redis]# source /etc/profile
[root@yhcs_1 redis]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/redis/bin

查看redis启动方式

[root@yhcs_1 redis]# redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
./redis-server - (read config from stdin)
./redis-server -v or --version
./redis-server -h or --help
./redis-server --test-memory

Examples: #redis服务器的daemon程序如何启动
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --replicaof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose

Sentinel mode:
./redis-server /etc/sentinel.conf --sentinel

拷贝配置文件

#拷贝安装包目录下的配置文件到安装目录的conf目录下
[root@yhcs_1 redis]# cd /data/software/redis/redis-5.0.5
[root@yhcs_1 redis-5.0.5]# mkdir -p /usr/local/redis/conf
[root@yhcs_1 redis-5.0.5]# cp redis.conf /usr/local/redis/conf

启动redis

[root@yhcs_1 redis-5.0.5]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
[root@yhcs_1 redis-5.0.5]# echo ‘vm.overcommit_memory=1’ >>/etc/sysctl.conf
[root@yhcs_1 redis-5.0.5]# sysctl -p
vm.overcommit_memory = 1
[root@yhcs_1 redis-5.0.5]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
#警告:
#128太小了
#您的内核中启用了透明的大页面(THP)支持,
#这将创建与ReDIS的延迟和内存使用问题,
#若要修复此问题,请运行命令“EngEng/mS/mL/mM/ExpListNo.HugPoIP/启用”为root,
#并将其添加到您的/etc/rc.local,以便在重新启动后保留设置。在禁用THP之后,必须重新启动redis。

[root@yhcs_1 ~]# echo 511 > /proc/sys/net/core/somaxconn
#这个只是暂时的解决,系统重启后失效。想要永久解决,需执行以下两条命令(大小可根据具体负载需求配置)
#echo -e “net.core.somaxconn=1024” >> /etc/sysctl.conf
#sysctl -p
[root@yhcs_1 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@yhcs_1 ~]# echo -e /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf >> /etc/rc.local #设置开机自启,后面部署集群后需修改,可不执行
[root@yhcs_1 redis-5.0.5]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

测试redis部署

#检查redis服务是否启动成功
#如果想查看进程里面有没有redis服务,可以用pstree命令查看进程:
#默认的情况下,redis服务的端口号是6379
#redis 服务的端口号在主配置文件/usr/local/redis/conf/redis.conf 中修改
#netstat -lntup|grep redis
#ps -ef |grep redis
#lsof -i:6379
查不到进程
[root@yhcs_1 ~]# ps -ef |grep redis
root 12289 12255 0 20:51 pts/1 00:00:00 grep --color=auto redis
redis放在后台运行
#默认情况,Redis不是在后台运行,我们需要把redis放在后台运行
#将/etc/redis.conf打开文件找到daemonize no 为 daemonize yes ,这样就可以默认启动就后台运行
[root@yhcs_1 ~]# sed -i ‘s/daemonize no/daemonize yes/g’ /usr/local/redis/conf/redis.conf
#测试
[root@yhcs_1 ~]# netstat -lntup |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 12323/redis-server
[root@yhcs_1 ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> set name yhcs
OK
127.0.0.1:6379> get name
“yhcs”
127.0.0.1:6379> quit

关闭redis的正确方法(停止redis实例)

#/usr/local/redis/bin/redis-cli shutdown
#pkill redis-server

集群部署

#上面是redis的简单部署,下面进入redis的集群部署
#根据以上部署,先关闭redis,再进行部署
[root@yhcs_1 ~]# /usr/local/redis/bin/redis-cli shutdown
或者
[root@yhcs_1 ~]# pkill redis-server

创建 Redis 节点

在/usr/local/redis_cluster目录下,创建各节点的目录为7000、7001、7002
[root@yhcs_1 ~]# cd /usr/local/redis_cluster/
[root@yhcs_1 redis_cluster]# mkdir 7000 7001 7002

拷贝配置文件

[root@yhcs_1 redis_cluster]# cp /data/software/redis/redis-5.0.5/redis.conf /usr/local/redis_cluster/7000
[root@yhcs_1 redis_cluster]# cp /data/software/redis/redis-5.0.5/redis.conf /usr/local/redis_cluster/7001
[root@yhcs_1 redis_cluster]# cp /data/software/redis/redis-5.0.5/redis.conf /usr/local/redis_cluster/7002

修改配置

port 6379 #修改端口为7000、7001、7002
bind 127.0.0.1 #改为其他节点机器可访问的ip,本机ip
daemonize no #设置为yes,使redis在后台运行
pidfile /var/run/redis_6379.pid #修改端口为7000、7001、7002
#cluster-enabled yes #开启集群 把注释#去掉
#cluster-config-file nodes-6379.conf #集群的配置,把注释#去掉,并改为对应的7000,7001,7002
cluster-node-timeout 15000 #请求超时,默认15秒,可自行设置
appendonly no #aof日志开启 ,有需要就开启,它会每次写操作都记录一条日志

sed -i ‘s/port 6379/port 7000/g’ /usr/local/redis_cluster/7000/redis.conf
sed -i ‘s/bind 127.0.0.1/bind 192.168.43.176/g’ /usr/local/redis_cluster/7000/redis.conf
sed -i ‘s/dir .//dir /usr/local/redis_cluster/7000//g’ /usr/local/redis_cluster/7000/redis.conf #redis dump.rdb appendonly.aof 文件路径修改
sed -i ‘s/daemonize no/daemonize yes/g’ /usr/local/redis_cluster/7000/redis.conf
sed -i ‘s/pidfile /var/run/redis_6379.pid/pidfile /var/run/redis_7000.pid/g’ /usr/local/redis_cluster/7000/redis.conf
sed -i ‘s/# cluster-config-file nodes-6379.conf/cluster-config-file /usr/local/redis_cluster/7000/nodes-7000.conf/g’ /usr/local/redis_cluster/7000/redis.conf
sed -i ‘s/# cluster-enabled yes/cluster-enabled yes/g’ /usr/local/redis_cluster/7000/redis.conf

#其他节点直接把7000修改成对应的节点号,IP部署哪台就改成哪台的IP即可

启动各个节点

[root@yhcs_1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis_cluster/7000/redis.conf
12478:C 17 Oct 2019 22:15:41.209 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12478:C 17 Oct 2019 22:15:41.209 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12478, just started
12478:C 17 Oct 2019 22:15:41.209 # Configuration loaded
[root@yhcs_1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis_cluster/7001/redis.conf
[root@yhcs_1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis_cluster/7002/redis.conf

[root@yhcs_1 redis_cluster]# ps -ef | grep redis
root 12479 1 0 22:15 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.176:7000 [cluster]
root 12484 1 0 22:15 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.176:7001 [cluster]
root 12503 1 0 22:19 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.176:7002 [cluster]

#根据以上步骤同样部署yhcs_2,然后启动各个节点
[root@yhcs_2 redis_cluster]# ps -ef |grep redis
root 23225 1 0 22:43 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.177:7000 [cluster]
root 23230 1 0 22:43 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.177:7001 [cluster]
root 23235 1 0 22:43 ? 00:00:00 /usr/local/redis/bin/redis-server 192.168.43.177:7002 [cluster]
root 23240 18761 0 22:43 pts/2 00:00:00 grep --color=auto redis

创建集群

------------------------虚线部分供参考,不需操作--------------------------
#Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。
#先将 redis-trib.rb 复制到 /usr/local/bin 目录下

redis-trib.rb create --replicas 1 192.168.43.176:7000 192.168.43.176:7001 192.168.43.176:7002 192.168.43.177:7000 192.168.43.177:7001 192.168.43.177:7002

#其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。
[root@yhcs_1 redis_cluster]# redis-trib.rb create --replicas 1 192.168.43.176:7000 192.168.43.176:7001 192.168.43.176:7002 192.168.43.177:7000 192.168.43.177:7001 192.168.43.177:7002
/usr/bin/env: ruby: No such file or directory

[root@yhcs_1 redis_cluster]# yum -y install ruby ruby-devel rubygems rpm-build

[root@yhcs_1 redis_cluster]# redis-trib.rb create --replicas 1 192.168.43.176:7000 192.168.43.176:7001 192.168.43.176:7002 192.168.43.177:7000 192.168.43.177:7001 192.168.43.177:7002
WARNING: redis-trib.rb is not longer available!
#原因是因为redis5.0使用redis-cli作为创建集群的命令,使用c语言实现,不再使用ruby语言

#以上命令也许会因为yum源的问题,安装的版本会比较低,还是达不到要求,那就得移除重新安装(本次没有遇到,可忽略重装ruby)
redis-trib.rb:6: odd number list for Hash
white: 29, ^
redis-trib.rb:6: syntax error, unexpected ‘:’, expecting ‘}’
white: 29, ^
redis-trib.rb:7: syntax error, unexpected ‘,’, expecting kEND
[root@yhcs_1 bin]# yum remove -y ruby
[root@yhcs_1 bin]# yum remove -y rubygems
#本次ruby是在www.ruby-lang.org/en/downloads/下载ruby-2.6.3.tar.gz
[root@yhcs_1 ruby]# cd /data/software/ruby
[root@yhcs_1 ruby]# rz –E
rz waiting to receive.
[root@yhcs_1 ruby]# tar -xzf ruby-2.6.3.tar.gz
[root@yhcs_1 ruby]# cd ruby-2.6.3
[root@yhcs_1 ruby-2.6.3]# ./configure
[root@yhcs_1 ruby-2.6.3]# make
[root@yhcs_1 ruby-2.6.3]# make install
[root@yhcs_1 ruby-2.6.3]# ruby –v
-bash: /usr/bin/ruby: No such file or directory
[root@yhcs_1 ruby-2.6.3]# /usr/local/bin/ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
#说明ruby被装到了该目录下,而非系统认为的 /usr/bin/ruby
[root@yhcs_1 ruby-2.6.3]# ln -s /usr/local/bin/ruby /usr/bin/ruby
[root@yhcs_1 ruby-2.6.3]# ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

--------------------------------虚线内容结束------------------------------------

#进到/usr/local/redis/bin执行以下命令,且已在前面启动了各个节点
[root@yhcs_1 redis_cluster]# cd /usr/local/redis/bin/
[root@yhcs_1 bin]# ./redis-cli --cluster create 192.168.43.176:7000 192.168.43.176:7001 192.168.43.176:7002 192.168.43.177:7000 192.168.43.177:7001 192.168.43.177:7002 --cluster-replicas 1
Could not connect to Redis at 192.168.43.177:7000: No route to host
#需关闭防火墙或者给防火墙配置对应的端口权限
[root@yhcs_1 ~]# systemctl stop firewalld
[root@yhcs_2 ~]# systemctl stop firewalld
#以下创建集群如报错Node is not empty
1)pkill redis-server #关闭redis
2)将每个节点下dump.rdb、nodes-***.conf、appendonly.aof(本次未开启.aof)文件删除;
3)172.168.43.176:7000> flushdb #清空当前数据库(可省略)
4)之后再执行脚本,成功执行;

[root@yhcs_1 bin]# ./redis-cli --cluster create 192.168.43.176:7000 192.168.43.176:7001 192.168.43.176:7002 192.168.43.177:7000 192.168.43.177:7001 192.168.43.177:7002 --cluster-replicas 1>>> Performing hash slots allocation on 6 nodes…
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.43.177:7002 to 192.168.43.176:7000
Adding replica 192.168.43.176:7002 to 192.168.43.177:7000
Adding replica 192.168.43.177:7001 to 192.168.43.176:7001
M: 8a823f513575f4b456f9700896ab67c0741ef2ce 192.168.43.176:7000
slots:[0-5460] (5461 slots) master
M: 80a9947f618f46ed5223411f015a47cda2dbbc8a 192.168.43.176:7001
slots:[10923-16383] (5461 slots) master
S: 5e096821ea062f8ecb0e7817e5e104ac92df766d 192.168.43.176:7002
replicates b9bcbf6376d2f957d0ee1bfb5cf6976caa6b788e
M: b9bcbf6376d2f957d0ee1bfb5cf6976caa6b788e 192.168.43.177:7000
slots:[5461-10922] (5462 slots) master
S: 6b79af71c9d0c35f455d9958f55ab58eabad546c 192.168.43.177:7001
replicates 80a9947f618f46ed5223411f015a47cda2dbbc8a
S: 6449a6b2d132f5ea036288e6dda2d2e3414e7557 192.168.43.177:7002
replicates 8a823f513575f4b456f9700896ab67c0741ef2ce
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.43.176:7000)
M: 8a823f513575f4b456f9700896ab67c0741ef2ce 192.168.43.176:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b9bcbf6376d2f957d0ee1bfb5cf6976caa6b788e 192.168.43.177:7000
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 6b79af71c9d0c35f455d9958f55ab58eabad546c 192.168.43.177:7001
slots: (0 slots) slave
replicates 80a9947f618f46ed5223411f015a47cda2dbbc8a
M: 80a9947f618f46ed5223411f015a47cda2dbbc8a 192.168.43.176:7001
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 5e096821ea062f8ecb0e7817e5e104ac92df766d 192.168.43.176:7002
slots: (0 slots) slave
replicates b9bcbf6376d2f957d0ee1bfb5cf6976caa6b788e
S: 6449a6b2d132f5ea036288e6dda2d2e3414e7557 192.168.43.177:7002
slots: (0 slots) slave
replicates 8a823f513575f4b456f9700896ab67c0741ef2ce
[OK] All nodes agree about slots configuration.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.

#集群部署成功,接下来需要验证功能了

集群验证

[root@yhcs_1 bin]# redis-cli -h 192.168.43.176 -c -p 7000
192.168.43.176:7000> set key1 key1
-> Redirected to slot [9189] located at 192.168.43.177:7000
OK
192.168.43.177:7000> set key2 key2
-> Redirected to slot [4998] located at 192.168.43.176:7000
OK
192.168.43.176:7000> set key3 key3
OK
192.168.43.176:7000> set key4 key4
-> Redirected to slot [13120] located at 192.168.43.176:7001
OK
192.168.43.176:7001> set key5 key5
-> Redirected to slot [9057] located at 192.168.43.177:7000
OK
192.168.43.177:7000> set key6 key6
-> Redirected to slot [4866] located at 192.168.43.176:7000
OK
192.168.43.176:7000>

[root@yhcs_2 ~]# redis-cli -h 192.168.43.177 -c -p 7002
192.168.43.177:7002> get key1
-> Redirected to slot [9189] located at 192.168.43.177:7000
“key1”
192.168.43.177:7000> get key2
-> Redirected to slot [4998] located at 192.168.43.176:7000
“key2”
192.168.43.176:7000> get key3
“key3”
192.168.43.176:7000> get key4
-> Redirected to slot [13120] located at 192.168.43.176:7001
“key4”
192.168.43.176:7001> get key5
-> Redirected to slot [9057] located at 192.168.43.177:7000
“key5”
192.168.43.177:7000> get key6
-> Redirected to slot [4866] located at 192.168.43.176:7000
“key6”
192.168.43.176:7000>

#在第一台机器上连接集群的192.168.43.176:7000端口的节点,在另外一台连接192.168.43.177:7002节点,连接方式为 redis-cli -h 192.168.43.176 -c -p 7000 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。

#以上说明集群运作正常,到此集群部署完成
#开机自启脚本有些繁琐,本次不输出
#节点的关闭重启,有需要可以自己写个for循环

验证原理

(以下解释来源于网络)
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

注意项
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

参考文档

学习途中查寻的资料太多了,仅能列出部分,致敬!
redis集群报错Node is not empty :https://www.jianshu.com/p/338bc2a74300
redis-trib.rb命令详解:https://www.cnblogs.com/ivictor/p/9768010.html
Redis集群搭建与简单使用:https://www.cnblogs.com/wuxl360/p/5920330.html

心不死,土不埋,学无止境

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章