简单搭建redis集群(redis复制、哨兵、集群的实现(三 集群))

0.涉及命令一览

redis.conf中

命令解释
cluster-enabled yes打开集群功能
cluster-require-full-coverage yes所有插槽都能使用,否则集群下线

批量修改字符串为另一个

[root@localhost 8004]# sed -i 's/8003/8004/g' redis.conf

使用redis-cli搭建集群,3主3从

[root@localhost myCluster]# redis-cli --cluster create 127.0.0.1:8005 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 --cluster-replicas 1

查看集群状态

[root@localhost myCluster]# redis-cli --cluster check 127.0.0.1:8005
127.0.0.1:8000> cluster SLOTS

redis-cli连接任一集群内节点,使用cluster meet ip port

插槽之前没被分配过,分配给指定节点命令

cluster add slot s

cluster nodes获取集群中的主节点运行ID,cluster getkeysinslot 插槽号 要返回键的数量去获取要移动的插槽中有没有键

127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"

如果没有键,使用 cluster setslot 插槽号 node 新节点运行ID移动插槽到指定数据库

127.0.0.1:8000> cluster setslot 5461 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK

不下线把12182号插槽从127.0.0.1:8001迁移到127.0.0.1:8000,需要5步

(1)在127.0.0.1:8000执行cluster setslot 12182 importing 127.0.0.1:8001的运行ID

(2)在127.0.0.1:8001执行cluster setslot 12182 migrating 127.0.0.1:8000的运行ID

(3)获取12182号插槽的键列表:cluster getkeysinslot 12182 10

(4)对第3步获取的每个键执行migrate命令,将其从127.0.0.1:8001迁移到127.0.0.1:8000

(5)执行cluster slot 12182 node 127.0.0.1:8000的运行ID来完成迁移

127.0.0.1:8000> cluster setslot 12182 importing 6eea8395cc4f8ba4dd1885a7f4b2a05b8cf3948c
OK
127.0.0.1:8001> cluster setslot 12182 migrating 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
127.0.0.1:8001> migrate 127.0.0.1 8000 foo 0 15999 replace
OK
127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000
127.0.0.1:8000> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> get foo8
"bar"

启动命令行客户端时添加-c可以自动重定向

[root@localhost ~]# redis-cli -c -p 8000
127.0.0.1:8000> set a a
-> Redirected to slot [15495] located at 127.0.0.1:8001
OK

1.客户端分片与集群比较

客户端分片:

  1. 维护成本高
  2. 增加、移除节点较繁琐

集群:

  1. 有和单机实例同样的性能
  2. 网络分区后能够提供一定的可访问性
  3. 主数据库故障分配的支持

2. 配置集群

新建一个myClusters文件夹,集群需要至少3个主数据库,所以要有6个节点,选取8000-8005端口,在myClusters文件夹新建这几个文件夹。

[root@localhost redis-5.0.0]# mkdir myCluster
[root@localhost redis-5.0.0]# cd myCluster
[root@localhost myCluster]# mkdir 8000

把redis.conf 复制一份到8000,改下几个配置参数

参数解释
daemonizeyes后台运行
cluster-enabledyes启用cluster功能
port自己的端口
dir具体的子目录

批量修改字符串为另一个

[root@localhost 8004]# sed -i 's/8003/8004/g' redis.conf

进入目录下,启动redis

[root@localhost 8005]# redis-server redis.conf 
2467:C 12 Apr 2020 15:24:38.396 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2467:C 12 Apr 2020 15:24:38.396 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=2467, just started
2467:C 12 Apr 2020 15:24:38.396 # Configuration loaded

全部启动完毕后查看下

[root@localhost 8004]# ps -ef|grep redis
\root       2468      1  0 15:24 ?        00:00:00 redis-server 127.0.0.1:8005 [cluster]
root       2489      1  0 15:25 ?        00:00:00 redis-server 127.0.0.1:8000 [cluster]
root       2494      1  0 15:25 ?        00:00:00 redis-server 127.0.0.1:8001 [cluster]
root       2499      1  0 15:26 ?        00:00:00 redis-server 127.0.0.1:8002 [cluster]
root       2504      1  0 15:26 ?        00:00:00 redis-server 127.0.0.1:8003 [cluster]
root       2509      1  0 15:26 ?        00:00:00 redis-server 127.0.0.1:8004 [cluster]
root       2514   2148  0 15:26 pts/0    00:00:00 grep --color=auto redis

使用redis-cli搭建集群,3主3从

[root@localhost myCluster]# redis-cli --cluster create 127.0.0.1:8005 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 --cluster-replicas 1

查看集群状态

[root@localhost myCluster]# redis-cli --cluster check 127.0.0.1:8005
127.0.0.1:8000> cluster SLOTS

3.增加节点

redis-cli连接任一集群内节点,使用cluster meet ip port

4. 插槽的分配

  1. 一个集群有16384个插槽,使用命令大概是平均分给主数据库
  2. 键与插槽关系:键的有效部分{}之间,或全部使用CRC16算法算出散列值,然后取16384的余数
  3. 插槽之前没被分配过,分配给指定节点命令
    cluster add slot s
  4. 插槽被分配过,首先获取该插槽有没有键,首先cluster nodes获取集群中的主节点运行ID,cluster getkeysinslot 插槽号 要返回键的数量去获取要移动的插槽中有没有键
127.0.0.1:8000> set foo bar
(error) MOVED 12182 127.0.0.1:8001
[root@localhost ~]# redis-cli -p 8001
127.0.0.1:8001> keys *
(empty list or set)
127.0.0.1:8001> set foo bar
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
  1. 如果没有键,使用 cluster setslot 插槽号 node 新节点运行ID移动插槽到指定数据库
127.0.0.1:8000> cluster setslot 6000 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> cluster setslot 5461 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
  1. 如果插槽有键,集群下线后可以对每个键使用migrate 目标节点地址 目标节点接口 键名 数据库号码(集群模式只能使用0号数据库) 超时时间 [copy] [replace],copy表示不将键从当前数据库删除,replace表示如果目标节点存在同名键,则覆盖。已知foo键在12182插槽
127.0.0.1:8001> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
(error) ERR Can't assign hashslot 12182 to a different node while I still hold keys for this hash slot.
  1. 不下线把12182号插槽从127.0.0.1:8001迁移到127.0.0.1:8000,需要5步
    (1)在127.0.0.1:8000执行cluster setslot 12182 importing 127.0.0.1:8001的运行ID
    (2)在127.0.0.1:8001执行cluster setslot 12182 migrating 127.0.0.1:8000的运行ID
    (3)获取12182号插槽的键列表:cluster getkeysinslot 12182 10
    (4)对第3步获取的每个键执行migrate命令,将其从127.0.0.1:8001迁移到127.0.0.1:8000
    (5)执行cluster slot 12182 node 127.0.0.1:8000的运行ID来完成迁移
127.0.0.1:8000> cluster setslot 12182 importing 6eea8395cc4f8ba4dd1885a7f4b2a05b8cf3948c
OK

第四步之后,第五步之前

127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000
127.0.0.1:8000> get foo
(error) MOVED 12182 127.0.0.1:8001

在8001端口迁移原来8001端口持有的12182插槽不管用

127.0.0.1:8001> cluster setslot 12182 migrating 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8001> cluster getkeysinslot 12182 10
1) "foo"
127.0.0.1:8001> migrate 127.0.0.1 8000 foo 0 15999 replace
OK
127.0.0.1:8001> get foo
(error) ASK 12182 127.0.0.1:8000

要在8000端口操作

127.0.0.1:8000> cluster setslot 12182 node 97c5c4e7608f8e1e52b26558594dd5a6a3b5e198
OK
127.0.0.1:8000> get foo8
"bar"

4. 获取插槽对应节点

正常用命令行客户端进有提示信息

127.0.0.1:8000> set a a
(error) MOVED 15495 127.0.0.1:8001

启动命令行客户端时添加-c可以自动重定向

[root@localhost ~]# redis-cli -c -p 8000
127.0.0.1:8000> set a a
-> Redirected to slot [15495] located at 127.0.0.1:8001
OK

5. 故障恢复

和哨兵类似
如果一个至少负责一个插槽的主数据库下线且没有相应的从数据库可以进行故障恢复,则整个集群下线且无法正常工作。如果这时想让集群正常工作,修改cluster-require-full-coverage no.
主库下线后从数据库升级为主数据库,主数据库要使用redis-server redis.conf的方式重启会自动成为原来它从库的从数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值