天天看點

redis三主三從叢集搭建

主機 端口1 端口2
192.168.15.231 7001 7002
192.168.15.232 7001 7002
192.168.15.233 7001 7002

1、下載下傳redis最新穩定版(redis-5.0.4.tar.gz)

wget http://download.redis.io/releases/redis-5.0.4.tar.gz           

2、解壓,建立相關目錄

tar zxvf redis-5.0.4.tar.gz
mv redis-5.0.4 redis
cd redis && mkdir {bin,conf,data,log}           

3、在conf下建立配置檔案(啟動時候指定即可)

[lakala@master1 conf]$ cat redis-common.conf 
#GENERAL  
daemonize yes  
tcp-backlog 100  
timeout 0  
tcp-keepalive 0  
#log級别 notice  info  warning  error
loglevel warning  
databases 16  
save 900 1
save 300 10
save 60 10000
#最大可用記憶體 根據實際修改
maxmemory 2048m 
dir /home/lakala/redis/data
loglevel warning 
slave-serve-stale-data yes  
#slave隻讀  
slave-read-only yes  
#not use default  
repl-disable-tcp-nodelay yes  
slave-priority 100  
#打開aof持久化  
appendonly yes  
#每秒一次aof寫  
appendfsync everysec  
#關閉在aof rewrite的時候對新的寫操作進行fsync  
no-appendfsync-on-rewrite yes  
auto-aof-rewrite-min-size 64mb  
lua-time-limit 5000  
#打開redis叢集  
cluster-enabled yes  
#節點互連逾時的閥值  
cluster-node-timeout 15000  
cluster-migration-barrier 1  
slowlog-log-slower-than 10000  
slowlog-max-len 128  
notify-keyspace-events ""  
hash-max-ziplist-entries 512  
hash-max-ziplist-value 64  
list-max-ziplist-entries 512  
list-max-ziplist-value 64  
set-max-intset-entries 512  
zset-max-ziplist-entries 128  
zset-max-ziplist-value 64  
activerehashing yes  
client-output-buffer-limit normal 0 0 0  
client-output-buffer-limit slave 256mb 64mb 60  
client-output-buffer-limit pubsub 32mb 8mb 60  
hz 10  
aof-rewrite-incremental-fsync yes           
[lakala@master1 conf]$ cat redis-7001.conf 
#包含通用配置  
include /home/lakala/redis/conf/redis-common.conf

#監聽tcp端口  
bind 192.168.15.231
port 7001  
logfile "/home/lakala/redis/log/redis-7001.log" 
#記憶體耗盡時采用的淘汰政策:  
# volatile-lru -> remove the key with an expire set using an LRU algorithm  
# allkeys-lru -> remove any key accordingly to the LRU algorithm  
# volatile-random -> remove a random key with an expire set  
# allkeys-random -> remove a random key, any key  
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)  
# noeviction -> don't expire at all, just return an error on write operations  
maxmemory-policy allkeys-lru  
#aof存儲檔案  
appendfilename "appendonly-7001.aof"  
#不開啟rdb存儲,隻用于添加slave過程  
dbfilename dump-7001.rdb  
#cluster配置檔案(啟動自動生成)  
cluster-config-file nodes-7001.conf  
#部署在同一機器的redis執行個體,把auto-aof-rewrite搓開,因為cluster環境下記憶體占用基本一緻.  
#防止同意機器下瞬間fork所有redis程序做aof rewrite,占用大量記憶體(ps:cluster必須開啟aof)  
auto-aof-rewrite-percentage  80-100           
[lakala@master1 conf]$ cat redis-7002.conf 
#包含通用配置  
include /home/lakala/redis/conf/redis-common.conf

#監聽tcp端口  
bind 192.168.15.231
port 7002  
logfile "/home/lakala/redis/log/redis-7002.log" 
#記憶體耗盡時采用的淘汰政策:  
# volatile-lru -> remove the key with an expire set using an LRU algorithm  
# allkeys-lru -> remove any key accordingly to the LRU algorithm  
# volatile-random -> remove a random key with an expire set  
# allkeys-random -> remove a random key, any key  
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)  
# noeviction -> don't expire at all, just return an error on write operations  
maxmemory-policy allkeys-lru  
#aof存儲檔案  
appendfilename "appendonly-7002.aof"  
#不開啟rdb存儲,隻用于添加slave過程  
dbfilename dump-7002.rdb  
#cluster配置檔案(啟動自動生成)  
cluster-config-file nodes-7002.conf  
#部署在同一機器的redis執行個體,把auto-aof-rewrite搓開,因為cluster環境下記憶體占用基本一緻.  
#防止同意機器下瞬間fork所有redis程序做aof rewrite,占用大量記憶體(ps:cluster必須開啟aof)  
auto-aof-rewrite-percentage  80-100           

4、在bin目錄下建立啟停腳本

[lakala@master1 bin]$ cat start-redis.sh 
#!/bin/bash

/home/lakala/redis/src/redis-server /home/lakala/redis/conf/redis-7001.conf
/home/lakala/redis/src/redis-server /home/lakala/redis/conf/redis-7002.conf           
[lakala@master1 bin]$ cat stop-redis.sh 
#!/bin/bash

ps -ef |grep redis |grep -v grep |awk '{print $2}' |xargs kill           

5、以上步驟在另外兩台機器上面重複做一遍,注意修改ip即可,最後把redis都啟動起來

6、在其中一台機器上啟動redis叢集

/home/lakala/redis/src/redis-cli --cluster create 192.168.15.231:7001 192.168.15.232:7001 192.168.15.233:7001 192.168.15.231:7002 192.168.15.232:7002 192.168.15.233:7002 --cluster-replicas 1           

7、檢視叢集情況

[lakala@master1 redis]$ ./src/redis-cli -c -h 192.168.15.231 -p 7001
192.168.15.231:7001> 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:18
cluster_my_epoch:18
cluster_stats_messages_ping_sent:1263
cluster_stats_messages_pong_sent:1277
cluster_stats_messages_sent:2540
cluster_stats_messages_ping_received:1277
cluster_stats_messages_pong_received:1262
cluster_stats_messages_received:2539
192.168.15.231:7001> cluster nodes
5857256d73532aaf02a3788c80332f6d38563807 192.168.15.231:7001@17001 myself,slave eaf36b2c8e1618cd6abbd2ca87ec38e0552f386c 0 1555406223000 9 connected
1dd073577ae8b27e43555345c3706e6e3e1cf54d 192.168.15.231:7002@17002 slave b2878a4d06b38580e107f5b04b1561620c8af175 0 1555406221000 16 connected
3a98f61b8a9c92ccb819cf4883576f1bea16638b 192.168.15.233:7002@17002 slave 4419323fa73993873ad0212f3645cc6b77632683 0 1555406224781 15 connected
b2878a4d06b38580e107f5b04b1561620c8af175 192.168.15.233:7001@17001 master - 0 1555406223779 16 connected 10923-16383
eaf36b2c8e1618cd6abbd2ca87ec38e0552f386c 192.168.15.232:7002@17002 master - 0 1555406222775 18 connected 0-5460
4419323fa73993873ad0212f3645cc6b77632683 192.168.15.232:7001@17001 master - 0 1555406224000 15 connected 5461-10922           

8、輸入和擷取鍵值對

192.168.15.231:7001> set hello world
-> Redirected to slot [866] located at 192.168.15.232:7002
OK
192.168.15.232:7002> get hello
"world"           

9、叢集故障轉移測試

先斷掉叢集中的一台master節點,可以看到叢集依舊是正常,且會自動将這故障master對應的slave節點頂替上,變為master
192.168.15.232:7001> cluster nodes
4419323fa73993873ad0212f3645cc6b77632683 192.168.15.232:7001@17001 myself,master - 0 1555406865000 15 connected 5461-10922
5857256d73532aaf02a3788c80332f6d38563807 192.168.15.231:7001@17001 slave eaf36b2c8e1618cd6abbd2ca87ec38e0552f386c 0 1555406863000 18 connected
1dd073577ae8b27e43555345c3706e6e3e1cf54d 192.168.15.231:7002@17002 slave b2878a4d06b38580e107f5b04b1561620c8af175 0 1555406865647 16 connected
b2878a4d06b38580e107f5b04b1561620c8af175 192.168.15.233:7001@17001 master - 0 1555406864645 16 connected 10923-16383
3a98f61b8a9c92ccb819cf4883576f1bea16638b 192.168.15.233:7002@17002 slave 4419323fa73993873ad0212f3645cc6b77632683 0 1555406864000 15 connected
eaf36b2c8e1618cd6abbd2ca87ec38e0552f386c 192.168.15.232:7002@17002 master - 0 1555406862637 18 connected 0-5460
192.168.15.232:7001> 
[lakala@master2 redis]$ ps aux | grep redis
lakala    8143  0.3  0.1 164636 15164 ?        Ssl  15:17   0:27 /home/lakala/redis/src/redis-server 192.168.15.232:7001 [cluster]
lakala    8148  0.3  0.1 161052 14260 ?        Ssl  15:17   0:27 /home/lakala/redis/src/redis-server 192.168.15.232:7002 [cluster]
lakala   16709  0.0  0.0 112708   980 pts/0    S+   17:27   0:00 grep --color=auto redis
[lakala@master2 redis]$ kill 8148
[lakala@master2 redis]$ ./src/redis-cli -c -h 192.168.15.232 -p 7001
192.168.15.232:7001> 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:19
cluster_my_epoch:15
cluster_stats_messages_ping_sent:78503
cluster_stats_messages_pong_sent:6919
cluster_stats_messages_fail_sent:15
cluster_stats_messages_auth-req_sent:5
cluster_stats_messages_auth-ack_sent:3
cluster_stats_messages_update_sent:2
cluster_stats_messages_sent:85447
cluster_stats_messages_ping_received:6916
cluster_stats_messages_pong_received:7559
cluster_stats_messages_fail_received:10
cluster_stats_messages_auth-req_received:4
cluster_stats_messages_auth-ack_received:2
cluster_stats_messages_received:14491
192.168.15.232:7001> cluster nodes
4419323fa73993873ad0212f3645cc6b77632683 192.168.15.232:7001@17001 myself,master - 0 1555406915000 15 connected 5461-10922
5857256d73532aaf02a3788c80332f6d38563807 192.168.15.231:7001@17001 master - 0 1555406915825 19 connected 0-5460
1dd073577ae8b27e43555345c3706e6e3e1cf54d 192.168.15.231:7002@17002 slave b2878a4d06b38580e107f5b04b1561620c8af175 0 1555406915000 16 connected
b2878a4d06b38580e107f5b04b1561620c8af175 192.168.15.233:7001@17001 master - 0 1555406916829 16 connected 10923-16383
3a98f61b8a9c92ccb819cf4883576f1bea16638b 192.168.15.233:7002@17002 slave 4419323fa73993873ad0212f3645cc6b77632683 0 1555406914000 15 connected
eaf36b2c8e1618cd6abbd2ca87ec38e0552f386c 192.168.15.232:7002@17002 master,fail - 1555406892929 1555406892000 18 disconnected           
測試一台機器上面斷掉某個master節點後,在此節點上的資料有無丢失,從下面可以看出master節點斷掉後,從叢集中讀取該節點下的資料會自動切換到該master節點的slave節點下,而slave節點已經替代原master節點成為新的master節點
192.168.15.231:7001> keys *
1) "b"
2) "f"
3) "hello"
[lakala@master1 redis]$ ps aux | grep redis
lakala    7834  0.2  0.1 168732 15024 ?        Ssl  Apr16   2:09 /home/lakala/redis/src/redis-server 192.168.15.231:7001 [cluster]
lakala    7839  0.2  0.1 161052 14208 ?        Ssl  Apr16   2:05 /home/lakala/redis/src/redis-server 192.168.15.231:7002 [cluster]
lakala   11289  0.0  0.0 112708   980 pts/0    S+   09:30   0:00 grep --color=auto redis
[lakala@master1 redis]$ kill 7834
[lakala@master1 redis]$ ./src/redis-cli -c -h 192.168.15.231 -p 7002
192.168.15.231:7002> get b
-> Redirected to slot [3300] located at 192.168.15.232:7002
"wei"
192.168.15.232:7002> get f
"ling"
192.168.15.232:7002> get hello
"world"