分塊 (區間加法,尋找區間比k小的數的個數
阿新 • • 發佈:2020-08-08
1.環境準備
節點 | IP | 埠 |
---|---|---|
節點1 | 172.16.1.51 | 6379,6380 |
節點2 | 172.16.1.52 | 6379,6380 |
節點3 | 172.16.1.53 | 6379,6380 |
2.搭建redis
# 刪除以前的redis資料 [root@db01 ~]# rm -rf /service/redis/* ###這一步是懶得新搭建了### # 建立多例項目錄 [root@db01 ~]# mkdir /service/redis/{6379,6380} [root@db02 ~]# mkdir /service/redis/{6379,6380} [root@db03 ~]# mkdir /service/redis/{6379,6380} # 配置所有redis [root@db01 ~]# vim /service/redis/6379/redis.conf bind 172.16.1.51 127.0.0.1 port 6379 daemonize yes pidfile /service/redis/6379/redis.pid loglevel notice logfile /service/redis/6379/redis.log dbfilename dump.rdb dir /service/redis/6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 [root@db01 ~]# vim /service/redis/6380/redis.conf bind 172.16.1.51 127.0.0.1 port 6380 daemonize yes pidfile /service/redis/6380/redis.pid loglevel notice logfile /service/redis/6380/redis.log dbfilename dump.rdb dir /service/redis/6380 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000
3.啟動所有redis
root@db01 ~]# redis-server /service/redis/6379/redis.conf [root@db01 ~]# redis-server /service/redis/6380/redis.conf [root@db02 ~]# redis-server /service/redis/6379/redis.conf [root@db02 ~]# redis-server /service/redis/6380/redis.conf [root@db03 ~]# redis-server /service/redis/6379/redis.conf [root@db03 ~]# redis-server /service/redis/6380/redis.conf
4.關聯所有redis節點
1.登入所有節點
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379 [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6380 [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6379 [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6380 [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6379 [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6380
2.檢視叢集節點
####檢視叢集節點,每一各節點只能看到自己####
172.16.1.51:6379> CLUSTER NODES
28faba09f4c0ec8cdb90d92e09636796427b7143 :6379 myself,master - 0 0 0 connected
3.關聯所有節點
172.16.1.51:6379> CLUSTER MEET 172.16.1.51 6380
OK
172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6379
OK
172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6380
OK
172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6379
OK
172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6380
OK
# 檢視叢集狀態,所有節點
172.16.1.51:6379> CLUSTER NODES
aee9f4e6e09a452fd44bca7639be442b5138f141 172.16.1.52:6380 master - 0 1596687131655 4 connected
777412c8d6554e3390e1083bf1f55002be08cf62 172.16.1.51:6380 master - 0 1596687131352 2 connected
ef18ab5bab6d8bc06917a0cf2dc9bffa8b431087 172.16.1.52:6379 master - 0 1596687132362 3 connected
f2747c92813ea06b25c3e9c8d5232b46b3cf9d3d 172.16.1.53:6379 master - 0 1596687131856 0 connected
25f735f08ac62b2f758c1e2c21e178cc46279087 172.16.1.53:6380 master - 0 1596687131251 5 connected
28faba09f4c0ec8cdb90d92e09636796427b7143 172.16.1.51:6379 myself,master - 0 0 1 connected
5.分配槽位
# 檢視叢集狀態
172.16.1.51:6379> CLUSTER INFO
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:1168
cluster_stats_messages_received:1168
# 槽位規劃
db01: 5462 個槽位 (0-5461)
db02: 5461 個槽位 (5462-10922)
db03: 5461 個槽位 (10923-16383)
# 分配槽位
[root@db01 ~]# redis-cli -p 6379 -h 172.16.1.51 CLUSTER ADDSLOTS {0..5461}
OK
[root@db02 ~]# redis-cli -p 6379 -h 172.16.1.52 CLUSTER ADDSLOTS {5462..10922}
OK
[root@db02 ~]# redis-cli -p 6379 -h 172.16.1.53 CLUSTER ADDSLOTS {10923..16383}
6.插入資料測試叢集
# 插入一條資料
172.16.1.51:6379> set k1 v1
(error) MOVED 12706 172.16.1.53:6379
# 報錯,該key的值只能插入到12706這個槽位
[root@db03 ~]# redis-cli -h 172.16.1.53
172.16.1.53:6379> set k1 v1
OK
# ASK協議,自動切換將資料新增到指定槽位
[root@db03 ~]# redis-cli -h 172.16.1.53
172.16.1.53:6379> set k2 v2
(error) MOVED 449 172.16.1.51:6379
172.16.1.53:6379> quit
[root@db03 ~]# redis-cli -c -h 172.16.1.53
172.16.1.53:6379> set k2 v2
-> Redirected to slot [449] located at 172.16.1.51:6379
OK
# 指令碼插入資料測試
[root@db03 ~]# vim data.sh
#!/bin/bash
for i in {1..1000};do
redis-cli -c -p 6379 -h 172.16.1.51 set k${i} v${i}
done
# 檢視資料分配
172.16.1.51:6379> DBSIZE
(integer) 341
172.16.1.52:6379> DBSIZE
(integer) 332
172.16.1.53:6379> DBSIZE
(integer) 327
7.新增副本節點
1.檢視節點
172.16.1.51:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 master - 0 1596763193422 4 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763192412 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 master - 0 1596763192512 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763191908 0 connected 10923-16383
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763193925 2 connected
2.配置主從
# db01的6380做db02的6379的從庫
172.16.1.51:6380> CLUSTER REPLICATE 5eb9e5356534ff4acda736d13f0dc9fc3d40049b
OK
# db02的6380做db03的6379的從庫
172.16.1.52:6380> CLUSTER REPLICATE acc3a4d0e6e43fc74630c1f0714865fdcbdaf677
OK
# db03的6380做db01的6379的從庫
172.16.1.53:6380> CLUSTER REPLICATE 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a
OK
3.再次檢視節點資訊
172.16.1.51:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763362696 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763363202 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596763362192 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763363203 0 connected 10923-16383
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 slave acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 0 1596763364211 2 connected
8.故障演示
# 停掉一臺節點
[root@db03 ~]# reboot
# 到另一臺機器檢視叢集狀態,發現叢集是正常的
172.16.1.51:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:327031
cluster_stats_messages_received:326973
# 檢視節點資訊,副本被提升為主庫
172.16.1.51:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763771309 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763771310 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave,fail 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 1596763736458 1596763734245 3 disconnected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master,fail - 1596763736458 1596763735246 0 disconnected
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763772319 6 connected 10923-16383
9.節點恢復
# 修復機器
[root@db03 ~]# redis-server /service/redis/6379/redis.conf
[root@db03 ~]# redis-server /service/redis/6380/redis.conf
# 再次檢視節點資訊
172.16.1.51:6379> CLUSTER NODES
5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596764061287 5 connected
5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596764060781 5 connected 5462-10922
50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596764059770 3 connected
acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 slave 381b54584572e8013becdae2eeaff48bf6eb5450 0 1596764062094 6 connected
2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596764061789 6 connected 10923-16383
####原主節點修復後變為從節點####