redis5.0集群搭建

21 篇文章 1 订阅

redis5.0开始,不用ruby就能搭建集群,方便太多。

从零开始吧,我是先学习了单机版redis,分别在centos8.0和ubuntu20.04开了一个单机版,测试都没问题。等到集群时发现哪哪都不顺,所以记录下来。

回顾:

        1.centos下

yum install -y gcc                          #依赖gcc,所以必须安装

wget http://download.redis.io/releases/redis-5.0.5.tar.gz   #下载5.0.5安装包

tar -zxvf redis-5.0.5.tar.gz                #解压

cd redis-5.0.5             
make                                        #进入解压后的根目录下,再编译

make install PREFIX=/usr/local/redis        #安装并指定安装目录为/usr/local/redis

cd /usr/local/redis/bin/ 
./redis-server                              #前台方式启动

cp /usr/local/redis-5.0.5/redis.conf  /usr/local/redis/bin/   #从上面解压文件夹里找到redis.conf这个核心配置文件,并把它复制到redis安装目录bin下,

vi redis.conf 主要改以下几个地方:
# 注释掉bind 127.0.0.1,bind用于限制访问Redis的机器ip,直接关掉,方便后续做集群或其他客户端进行连接
# bind 127.0.0.1
# 修改daemonize no为yes,让Redis可以后台启动
daemonize yes
# 配置日志文件目录logfile ""
logfile "/usr/local/redis/log/redis_log.log"
# 为Redis添加服务密码# requirepass foobared,这里我们将密码设置为123456
requirepass 123456
# 修改rdb文件存储路径,rdb文件是Redis默认的数据持久化到磁盘的文件,默认配置为dir ./,则存储在相对目录
# 即每次运行redis-server的目录,这里我们修改为绝对路径,以便于后续的管理
dir /usr/local/redis/rdb/
#保护模式关闭
protected-mode no

systemctl restart redis.service            #配置文件修改后,重新启动服务


#外部连接还需要关闭防火墙或者将redis的服务端口加入防火墙规则
systemctl stop firewalld                  4++ #关闭firewalld防火墙

systemctl sable firewalld.service           #禁止防火墙开机启动


redis-server                                #此時输入此命令即可以后台方式启动
redis-server  redis.conf                    #也可以带指定的配置文件方式启动

#Redis启动成功后,再执行如下命令进入Redis控制台,其中-a表示Redis登录密码
redis-cli -a 123456

ping                                        #连接成功后,输入ping,服务器响应pong即正常

exit                                        #断开cli客户端连接




vi /etc/systemd/system/redis.service        #设置开机启动第一步,编辑redis.service

#设置开机启动第二步,把下面这些配置粘贴进去,注意:ExecStart配置成自己的redis路径 
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

@设置开机启动第三步
systemctl daemon-reload                    #重新加载系统配置文件
systemctl start redis.service              #开启redis服务
systemctl enable redis.service             #启用redis服务

#以下这几个命令仅供参考
systemctl start redis.service   #启动redis服务
systemctl stop redis.service   #停止redis服务

systemctl restart redis.service   #重新启动服务
systemctl status redis.service   #查看服务当前状态

systemctl enable redis.service   #设置开机自启动
systemctl disable redis.service   #停止开机自启动


redis-cli shutdown                        #停止redis服务


2.ubuntu下,

sudo apt-get install -y redis-server        #以管理员身份执行redis安装,sudo即super user do

 

1.下载

wget https://download.redis.io/releases/redis-6.0.9.tar.gz

#2.解压
tar xzf redis-6.0.9.tar.gz
3.移动到你要安装的目录,我这里安装到了/user/local下
sudo mv ./redis-6.0.9 /usr/local/redis
4.进入你移动的目录
cd /usr/local/redis
5.编译redis
sudo make
6.测试编译是否成功(这一步时间会比较长,测试耗时5分钟左右)
sudo make test
7.安装
sudo make install

redis.conf配置与上面centos一样

 


启动Redis服务可以执行:
service redisd start
 
 
关闭服务
service redisd stop
 
 
重启服务
service redisd restart
 
 
在控制台进入redis客户端
redis-ci

 

第二天,在此基础上搭建redis集群,使用一台centos,一台ubuntu,以6379,8001,8002,6379,8004,8005区分开 六个实例分别是 192.168.0.200:6379 192.168.0.200:8001 192.168.0.200:8002 192.168.0.201:6379 192.168.0.201:8004 192.168.0.201:8005

为什么是六个,因为redis集群有个原则:当一个节点挂掉时,集群中投票机制超过一半的主节点检测失败时才认为该节点已失效,1个主节点服务直接就挂掉了,2个主节点,投票率50%,没超过一半,所以三个主节点是集群必须的最低配,三主三从。

开启6个独立的redis服务器,然后使用redis-cluster命令把它们连接起来,自动帮我们分配好6个节点的主从关系

1.centos中,我随意在用户主目录下新建了个redisCluster文件夹,里面在设置两个小文件夹8001和8002,将/usr/local/redis/bin/redis.conf分别复制到8001和8002文件夹,其中的端口号port分别改为8001和8002,加上/usr/local/redis/bin/redis.conf正好组成3个redis实例,分别在原来单击的基础上,再修改两项 

cluster-enabled yes

cluster-config-file nodes-xxxx.conf

2.ubuntu中,同样新建两个文件夹/usr/local/redisCluster/8004,/usr/local/redisCluster/8005,将/etc/redis/redis.conf分别复制到8004和8005中,并修改其中的端口号port为8004和8005,加上/etc/redis/redis.conf共3个redis.conf也修改这两项

cluster-enabled yes

cluster-config-file nodes-xxxx.conf

注意:如果集群设置密码,则集群里所有的密码要一致,有两个 密码都要一致 

requirepass 123456

masterauth 123456

   

然后分别启动这六个实例(其实两个6379是开机自动启动的,此时需要重启使配置生效),

redis-server /home/zhang/redisCluster/8001/redis.conf

redis-server /home/zhang/redisCluster/8002/redis.conf

systemctl restart redis.service

 

 

redis-server /usr/local/redisCluster/8004/redis.conf
redis-server /usr/local/redisCluster/8005/redis.conf

 

service redis restart

 

查看一下进程没问题的话进行最重要的一步,ps:ubuntu普通用户没权限去执行也不给个提示

查看redis实例是否启动成功

netstat -tunpl | grep redis-server

redis-cli -a 123456 --cluster create 192.168.0.200:6379 192.168.0.200:8001 192.168.0.200:8002 192.168.0.201:6379 192.168.0.201:8004 192.168.0.201:8005 --cluster-replicas 1

-a 123456 是因为我给redis设置了密码所以必须带上,这样子看来所有密码有必要一致, 然后各实例的地址, --cluster-replicas 1 表示每个主节点对应一个从节点

命令完成后显示如下:

中间有个验证,输入yes就可以了。出现上面的报告就是集群成功了。

redis-cli -a 123456 -c -p 8004 cluster nodes

从中可以看出,0-5460哈希槽被分配到200:6379实例上,5461-10922被分到201:6379上面,剩下所有的10923-16383被分到200:8001上面了。其他三个是从节点

redis-cli -a 123456 -c -p 8004  登录8004实例 set一个值,可以从另一个6379实例中拿到这个值,验证成功

  其中 -c表示以集群方式连接redis,-h后面跟指定的ip地址,-p 指定端口,cluster nodes:查询集群节点信息,cluster info:查询集群状态信息

# 创建集群
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>
# 例子
redis-cli --cluster create 192.168.1.108:7000 192.168.1.108:7001 192.168.1.104:7002 192.168.1.104:7003 192.168.1.103:7004 192.168.1.103:7005  --cluster-replicas 1
# 例子说明
host1:port1 ... hostN:portN表示的是要添加的集群的节点IP和端口,
--cluster-replicas <arg>表示的是主从节点比例。
 
 
 
# 查询集群节点信息
redis-cli -c -p 7000 cluster nodes  [| grep master]      
 
 
c30a1e009b6233cad0885395eec6432658a4ac28 192.168.1.108:7000@17000 master - 0 1590723132224 1 connected 0-5460
1c4488b3ac1a19ba2c40d0ed60e531fb023a888e 192.168.1.108:7001@17001 slave 4df9ed9a6655e330866453defbf77bf6b83529c3 0 1590723133233 5 connected
635b646988ac044a41cf7a4d0c0053c64fa40e14 192.168.1.104:7003@17003 myself,slave c30a1e009b6233cad0885395eec6432658a4ac28 0 1590723131000 4 connected
4df9ed9a6655e330866453defbf77bf6b83529c3 192.168.1.103:7004@17004 master - 0 1590723131213 5 connected 10923-16383
ba9f42b32523fc376c1e13261b36d7a5c64e3f61 192.168.1.104:7002@17002 master - 0 1590723133030 3 connected 5461-10922
75f7e0409f1d50a1f761aa71db63727ad2e71be3 192.168.1.103:7005@17005 slave ba9f42b32523fc376c1e13261b36d7a5c64e3f61 0 1590723131000 6 connected
127.0.0.1:7003>
 
 
########################说明:以下的操作均是以上面这个为参数示例
 
# 给集群添加一个新主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
 
# 例子-首先需要启动新的redis 7006服务,我们假设放到108这台机器上),这里最后一个master是对应在7004
 
redis-cli --cluster add-node 192.168.1.108:7006  192.168.1.103:7004 --cluster-master-id 4df9ed9a6655e330866453defbf77bf6b83529c3
 
# 例子说明
new_host:new_port为要新添加的主节点IP和端口,此处是192.168.1.108:7006
existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个可以从上述的节点信息中查看到,根据slots槽数,7004端口对应的节点槽数是10923-16383,16383表示的是最后的槽数
--cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
 
# 再次查看集群信息 会发现7006端口对应的节点已经加入到集群中,是主节点,但是没有从节点,也没有分配槽数
 
# 给新添加的主节点分配slots槽数
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots 500 --cluster-yes
 
# 例子
redis-cli --cluster reshard 192.168.1.108:7006 --cluster-from c30a1e009b6233cad0885395eec6432658a4ac28 --cluster-to fd09b958448307f9b584e81b0b69727db25dafff  --cluster-slots 500 
 
# 例子说明
host:port表示的是新添加的那个主节点IP和端口,此处表示的是192.168.1.108:7006
--cluster-from node_id表示的是集群第一个主节点的节点id,这个可以现有集群的slots槽数分配看出,此处表示的是7000端口对应的节点
--cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id,此处表示的是7006端口对应的节点
--cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
--cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
 
# 再次查看集群信息
fd09b958448307f9b584e81b0b69727db25dafff 192.168.1.108:7006@17006 master - 0 1590723788952 7 connected 0-499
c30a1e009b6233cad0885395eec6432658a4ac28 192.168.1.108:7000@17000 master - 0 1590723788551 1 connected 500-5460
1c4488b3ac1a19ba2c40d0ed60e531fb023a888e 192.168.1.108:7001@17001 slave 4df9ed9a6655e330866453defbf77bf6b83529c3 0 1590723789000 5 connected
635b646988ac044a41cf7a4d0c0053c64fa40e14 192.168.1.104:7003@17003 myself,slave c30a1e009b6233cad0885395eec6432658a4ac28 0 1590723788000 4 connected
4df9ed9a6655e330866453defbf77bf6b83529c3 192.168.1.103:7004@17004 master - 0 1590723788000 5 connected 10923-16383
ba9f42b32523fc376c1e13261b36d7a5c64e3f61 192.168.1.104:7002@17002 master - 0 1590723788000 3 connected 5461-10922
75f7e0409f1d50a1f761aa71db63727ad2e71be3 192.168.1.103:7005@17005 slave ba9f42b32523fc376c1e13261b36d7a5c64e3f61 0 1590723789960 6 connected
# 会发现7006端口对应的主节点已经有slots槽数了,并且是从0开始的
 
 
# 给集群中某个主节点再添加一个从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
 
# 例子---这里我们给7006端口master添加slave 7007,且7007我们安排到103服务器上
redis-cli --cluster add-node 192.168.1.103:7007 192.168.1.108:7006   --cluster-slave --cluster-master-id fd09b958448307f9b584e81b0b69727db25dafff
# 例子说明
new_host:new_port表示的是要添加的那个从节点的IP和端口,此处表示的是192.168.1.103:7007
existing_host:existing_port表示的是要给哪个主节点添加从节点,此处表示的是192.168.1.108:7006
--cluster-slave表示的是要添加从节点,否则则是添加主节点了
--cluster-master-id node_id表示要给哪个主节点添加从节点的该主节点节点id
 
# 再次查看集群信息
fd09b958448307f9b584e81b0b69727db25dafff 192.168.1.108:7006@17006 master - 0 1590724626650 7 connected 0-499
c30a1e009b6233cad0885395eec6432658a4ac28 192.168.1.108:7000@17000 master - 0 1590724628165 1 connected 500-5460
1c4488b3ac1a19ba2c40d0ed60e531fb023a888e 192.168.1.108:7001@17001 slave 4df9ed9a6655e330866453defbf77bf6b83529c3 0 1590724627055 5 connected
635b646988ac044a41cf7a4d0c0053c64fa40e14 192.168.1.104:7003@17003 myself,slave c30a1e009b6233cad0885395eec6432658a4ac28 0 1590724626000 4 connected
5175ecb11b0cb8cbba6b2090ea8889f8d844bb63 192.168.1.103:7007@17007 slave fd09b958448307f9b584e81b0b69727db25dafff 0 1590724627156 7 connected
4df9ed9a6655e330866453defbf77bf6b83529c3 192.168.1.103:7004@17004 master - 0 1590724626144 5 connected 10923-16383
ba9f42b32523fc376c1e13261b36d7a5c64e3f61 192.168.1.104:7002@17002 master - 0 1590724626044 3 connected 5461-10922
75f7e0409f1d50a1f761aa71db63727ad2e71be3 192.168.1.103:7005@17005 slave ba9f42b32523fc376c1e13261b36d7a5c64e3f61 0 1590724627000 6 connected
127.0.0.1:7003>
# 会发现7007端口对应的节点已经是7007端口对应的从节点
 
 
 
# 从集群中删除一个从节点
redis-cli --cluster  del-node host:port node_id
# 例子--删除掉7007端口
redis-cli --cluster del-node 192.168.1.103:7007  5175ecb11b0cb8cbba6b2090ea8889f8d844bb63
# 例子说明
host:port表示的是要删除的那个节点的IP和端口,此处是192.168.1.103:7007 
node_id表示的是删除的那个节点的节点id
 
# 删除一个主节点(如果有从节点,需要转移、或者删除;如果有slot需要转移给他们master,然后在删除)
redis-cli --cluster reshard 192.168.1.108:7006
 
>>> Performing Cluster Check (using node 192.168.1.108:7006)
M: fd09b958448307f9b584e81b0b69727db25dafff 192.168.1.108:7006
   slots:[0-499] (500 slots) master
S: 75f7e0409f1d50a1f761aa71db63727ad2e71be3 192.168.1.103:7005
   slots: (0 slots) slave
   replicates ba9f42b32523fc376c1e13261b36d7a5c64e3f61
M: c30a1e009b6233cad0885395eec6432658a4ac28 192.168.1.108:7000
   slots:[500-5460] (4961 slots) master
   1 additional replica(s)
M: 4df9ed9a6655e330866453defbf77bf6b83529c3 192.168.1.103:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 635b646988ac044a41cf7a4d0c0053c64fa40e14 192.168.1.104:7003
   slots: (0 slots) slave
   replicates c30a1e009b6233cad0885395eec6432658a4ac28
M: ba9f42b32523fc376c1e13261b36d7a5c64e3f61 192.168.1.104:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 1c4488b3ac1a19ba2c40d0ed60e531fb023a888e 192.168.1.108:7001
   slots: (0 slots) slave
   replicates 4df9ed9a6655e330866453defbf77bf6b83529c3
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 500
What is the receiving node ID? c30a1e009b6233cad0885395eec6432658a4ac28
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: fd09b958448307f9b584e81b0b69727db25dafff    #从哪个节点移除哈希槽的节点id
Source node #2: done
 
再看下集群,  7006没有slot了  可以直接删掉了
127.0.0.1:7003> cluster nodes
fd09b958448307f9b584e81b0b69727db25dafff 192.168.1.108:7006@17006 master - 0 1590725767092 7 connected
c30a1e009b6233cad0885395eec6432658a4ac28 192.168.1.108:7000@17000 master - 0 1590725769000 8 connected 0-5460
1c4488b3ac1a19ba2c40d0ed60e531fb023a888e 192.168.1.108:7001@17001 slave 4df9ed9a6655e330866453defbf77bf6b83529c3 0 1590725769509 5 connected
635b646988ac044a41cf7a4d0c0053c64fa40e14 192.168.1.104:7003@17003 myself,slave c30a1e009b6233cad0885395eec6432658a4ac28 0 1590725768000 4 connected
4df9ed9a6655e330866453defbf77bf6b83529c3 192.168.1.103:7004@17004 master - 0 1590725769107 5 connected 10923-16383
ba9f42b32523fc376c1e13261b36d7a5c64e3f61 192.168.1.104:7002@17002 master - 0 1590725768503 3 connected 5461-10922
75f7e0409f1d50a1f761aa71db63727ad2e71be3 192.168.1.103:7005@17005 slave ba9f42b32523fc376c1e13261b36d7a5c64e3f61 0 1590725769509 6 connected
127.0.0.1:7003> 
 
redis-cli --cluster del-node 192.168.1.108:7006  fd09b958448307f9b584e81b0b69727db25dafff

可以把所有实例的启动命令放在一个统一的脚本文件中,一次执行即可启动所有

 

关闭集群也可以是一个脚本

#!/bin/bash
cd /usr/local/redis-5.0.0/;
redis-cli -c -h 192.168.0.200 -p 6379 shutdown;
redis-cli -c -h 192.168.0.200 -p 8001 shutdown;
redis-cli -c -h 192.168.0.200 -p 8002 shutdown;
redis-cli -c -h 192.168.1.201 -p 7003 shutdown;
redis-cli -c -h 192.168.1.201 -p 8004 shutdown;
redis-cli -c -h 192.168.1.201 -p 7005 shutdown;

以后关闭重启都不影响集群配置了

 

我的集群经常挂掉:刚才执行的操作是

发现8003挂机了,停掉8003的redis服务,然后清除node-8003.conf,8003.rdb

重启redis-8003,添加从节点8003(8001是已经存在的主节点):redis-cli -a 123456 --cluster add-node 192.168.1.200:8003 192.168.1.200:8001

出现这个警告,其实是没成功,此时执行任何关于节点的操作都不能成功,大概意思是741哈希槽在迁移时是打开状态,需要先修复这个741哈希槽状态,由提示可知是在8001节点上

redis-cli -a 123456 --cluster fix 192.168.1.200:8001

 

fix修复成功,继续执行  redis-cli -a 123456 --cluster add-node 192.168.1.200:8003 192.168.1.200:8001

由于这一步没有直接指定8003是哪个主节点的从节点,所以第二步来指定8003为8001的从节点

登录8003节点,执行cluster replicate af40bb4ce7a4d623a812b716246c30df49b9db08(8001节点id)

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值