物聯網架構成長之路(11)-Redis緩存主從復制


1. 說明

  在我的物聯網平台框架框架中,會用到Redis這個中間件。作為EMQ權限認證的緩存。https://www.cnblogs.com/think-in-java/p/5123884.html 

2. 編譯&運行

1 wget http://download.redis.io/releases/redis-4.0.6.tar.gz
2 make && make test && make PREFIX=/home/user/workspace/redis install

  編譯,測試,安裝

1 cp ./redis.conf /home/user/workspace/redis
2 cd /home/user/workspace/redis
3 ./bin/redis-server
4 ps -c redis-server

3. 主從復制

  一台MASTER(172.16.20.229) 配置,從默認配置拷貝一份,然后修改如下配置項

1 port 6379 #這個根據需要,選擇默認的6379端口即可
2 bind 0.0.0.0 #這個綁定,如果是單機測試那么就不用改,如果是多機測試,這個bind選項要注釋掉,注釋后表示redis監聽所有網卡,或者綁定 0.0.0.0
3 requirepass 123456 #密碼表示所有連接都要進行授權

  另外一台 SLAVE(172.16.20.203) 配置,同樣從默認配置拷貝一份,然后修改如下配置項

1 port 6379  #
2 slaveof 172.16.20.203 6379  #
3 masterauth 123456  #
4 requirepass 123456  #

  配置后,先啟動MASTER然后啟動SLAVE,可以看到MASTER日志信息如下

  然后通過任意客戶端 ./redis-cli -h 172.16.20.229  ./redis-cli -h 172.16.20.203 連接授權后,兩者的操作就都是在操作同一份數據了。這樣就可以簡單的在應用層實現讀寫分離了。

4. HA高可用

  Redis 算是一個比較流行的中間件了。本身提供了上面的主從復制功能,同時也提供了HA高可用功能。Sentinel哨兵進程。對於普通的企業應用來說,這個功能就夠了。

  Redis內置的主從復制和高可用會以來redis.confsentinel.conf 這兩個配置文件,而且還會在系統主從選舉等操作時修改這兩個配置文件

  172.16.20.229 redis.conf MASTER

 1 protected-mode yes
 2 tcp-backlog 511
 3 timeout 0
 4 tcp-keepalive 300
 5 daemonize no
 6 supervised no
 7 pidfile "/var/run/redis_6379.pid"
 8 loglevel notice
 9 logfile ""
10 databases 16
11 always-show-logo yes
12 save 900 1
13 save 300 10
14 save 60 10000
15 stop-writes-on-bgsave-error yes
16 rdbcompression yes
17 rdbchecksum yes
18 dbfilename "dump.rdb"
19 dir "/home/user/workspace/emq/redis/bin"
20 slave-serve-stale-data yes
21 slave-read-only yes
22 repl-diskless-sync no
23 repl-diskless-sync-delay 5
24 repl-disable-tcp-nodelay no
25 slave-priority 100
26 lazyfree-lazy-eviction no
27 lazyfree-lazy-expire no
28 lazyfree-lazy-server-del no
29 slave-lazy-flush no
30 appendonly no
31 appendfilename "appendonly.aof"
32 appendfsync everysec
33 no-appendfsync-on-rewrite no
34 auto-aof-rewrite-percentage 100
35 auto-aof-rewrite-min-size 64mb
36 aof-load-truncated yes
37 aof-use-rdb-preamble no
38 lua-time-limit 5000
39 slowlog-log-slower-than 10000
40 slowlog-max-len 128
41 latency-monitor-threshold 0
42 notify-keyspace-events ""
43 hash-max-ziplist-entries 512
44 hash-max-ziplist-value 64
45 list-max-ziplist-size -2
46 list-compress-depth 0
47 set-max-intset-entries 512
48 zset-max-ziplist-entries 128
49 zset-max-ziplist-value 64
50 hll-sparse-max-bytes 3000
51 activerehashing yes
52 client-output-buffer-limit normal 0 0 0
53 client-output-buffer-limit slave 256mb 64mb 60
54 client-output-buffer-limit pubsub 32mb 8mb 60
55 hz 10
56 aof-rewrite-incremental-fsync yes
57 
58 bind 0.0.0.0
59 port 6379
60 requirepass 123456
61 masterauth 123456

  172.16.23.203 redis.conf SLAVE

 

 1 protected-mode yes
 2 tcp-backlog 511
 3 timeout 0
 4 tcp-keepalive 300
 5 daemonize no
 6 supervised no
 7 pidfile "/var/run/redis_6379.pid"
 8 loglevel notice
 9 logfile ""
10 databases 16
11 always-show-logo yes
12 save 900 1
13 save 300 10
14 save 60 10000
15 stop-writes-on-bgsave-error yes
16 rdbcompression yes
17 rdbchecksum yes
18 dbfilename "dump.rdb"
19 dir "/root/workspace/emq/redis/bin"
20 slave-serve-stale-data yes
21 slave-read-only yes
22 repl-diskless-sync no
23 repl-diskless-sync-delay 5
24 repl-disable-tcp-nodelay no
25 slave-priority 100
26 lazyfree-lazy-eviction no
27 lazyfree-lazy-expire no
28 lazyfree-lazy-server-del no
29 slave-lazy-flush no
30 appendonly no
31 appendfilename "appendonly.aof"
32 appendfsync everysec
33 no-appendfsync-on-rewrite no
34 auto-aof-rewrite-percentage 100
35 auto-aof-rewrite-min-size 64mb
36 aof-load-truncated yes
37 aof-use-rdb-preamble no
38 lua-time-limit 5000
39 slowlog-log-slower-than 10000
40 slowlog-max-len 128
41 latency-monitor-threshold 0
42 notify-keyspace-events ""
43 hash-max-ziplist-entries 512
44 hash-max-ziplist-value 64
45 list-max-ziplist-size -2
46 list-compress-depth 0
47 set-max-intset-entries 512
48 zset-max-ziplist-entries 128
49 zset-max-ziplist-value 64
50 hll-sparse-max-bytes 3000
51 activerehashing yes
52 client-output-buffer-limit normal 0 0 0
53 client-output-buffer-limit slave 256mb 64mb 60
54 client-output-buffer-limit pubsub 32mb 8mb 60
55 hz 10
56 aof-rewrite-incremental-fsync yes
57 
58 bind 0.0.0.0
59 port 6379
60 slaveof 172.16.20.229 6379
61 masterauth 123456
62 requirepass 123456
View Code

  172.16.23.205 redis.conf SLAVE

 1 protected-mode yes
 2 tcp-backlog 511
 3 timeout 0
 4 tcp-keepalive 300
 5 daemonize no
 6 supervised no
 7 pidfile "/var/run/redis_6379.pid"
 8 loglevel notice
 9 logfile ""
10 databases 16
11 always-show-logo yes
12 save 900 1
13 save 300 10
14 save 60 10000
15 stop-writes-on-bgsave-error yes
16 rdbcompression yes
17 rdbchecksum yes
18 dbfilename "dump.rdb"
19 dir "/root/workspace/emq/redis/bin"
20 slave-serve-stale-data yes
21 slave-read-only yes
22 repl-diskless-sync no
23 repl-diskless-sync-delay 5
24 repl-disable-tcp-nodelay no
25 slave-priority 100
26 lazyfree-lazy-eviction no
27 lazyfree-lazy-expire no
28 lazyfree-lazy-server-del no
29 slave-lazy-flush no
30 appendonly no
31 appendfilename "appendonly.aof"
32 appendfsync everysec
33 no-appendfsync-on-rewrite no
34 auto-aof-rewrite-percentage 100
35 auto-aof-rewrite-min-size 64mb
36 aof-load-truncated yes
37 aof-use-rdb-preamble no
38 lua-time-limit 5000
39 slowlog-log-slower-than 10000
40 slowlog-max-len 128
41 latency-monitor-threshold 0
42 notify-keyspace-events ""
43 hash-max-ziplist-entries 512
44 hash-max-ziplist-value 64
45 list-max-ziplist-size -2
46 list-compress-depth 0
47 set-max-intset-entries 512
48 zset-max-ziplist-entries 128
49 zset-max-ziplist-value 64
50 hll-sparse-max-bytes 3000
51 activerehashing yes
52 client-output-buffer-limit normal 0 0 0
53 client-output-buffer-limit slave 256mb 64mb 60
54 client-output-buffer-limit pubsub 32mb 8mb 60
55 hz 10
56 aof-rewrite-incremental-fsync yes
57 
58 bind 0.0.0.0
59 port 6379
60 slaveof 172.16.20.229 6379
61 masterauth 123456
62 requirepass 123456
View Code

  172.16.20.229 sentinel.conf SENTINEL1

 

1 port 26379
2 
3 sentinel monitor mymaster 172.16.20.229 6379 1
4 sentinel auth-pass mymaster 123456
5 sentinel down-after-milliseconds mymaster 11000
6 sentinel failover-timeout mymaster 10000

  172.16.23.204 sentinel.conf SENTINEL2

1 port 26379
2 
3 sentinel monitor mymaster 172.16.20.229 6379 1
4 sentinel auth-pass mymaster 123456

  創建一個MASTER兩個SLAVE兩個SENTINEL

5. 實際測試

  (1) 啟動 172.16.20.229 redis.conf MASTER

  (2) 啟動 172.16.23.203 redis.conf SLAVE

  (3) 啟動 172.16.23.205 redis.conf SLAVE

  (4) 啟動 172.16.23.204 sentinel.conf SENTINEL

  (5) 啟動 172.16.20.229 sentinel.conf SENTINEL

  (6) 上面所有服務都啟動后,各個服務的日志信息

  172.16.20.229 redis master

  172.16.23.203 redis slave

  172.16.23.205 redis slave

  172.16.23.204 sentinel

  172.16.23.229 sentinel

  (7) 查看狀態 ./redis-cli -p 26379

  (8) 然后可以模擬各種故障情況,看一下效果,一頓操作過后,所有服務都關閉了。再去看各個服務下的配置文件,都會發現,每個服務conf配置文件最下面都會增加一些節點信息。

  (9) 例如關閉172.16.23.229 redis Master ,這個時候

6. 關於HA說明

  好像這個sentinel模式可以做到簡單的主從恢復,和主從切換。但是對於HA來說,好像不是那么回事,該掛的節點,還是掛了,對於客戶端來說,不是很透明。

  有些人的做法是通過DNS進行解決。這個問題先放着,我覺得還是要等到后面Spring Cloud 學了之后,弄個全局配置中心,來動態獲取這些數據,只對配置中心和Nginx負載均衡器做HA,其他的再說。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM