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.conf和sentinel.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
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
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,其他的再說。
