1. 程式人生 > >Redis 主從+哨兵+監控 (centos7.2 + redis 3.2.9 )

Redis 主從+哨兵+監控 (centos7.2 + redis 3.2.9 )

hist 超過 pass 其它 pidfile 未能 多少 個數 yum

環境準備:

192.168.0.2 redis01 主

192.168.0.3 redis02 從

192.168.0.4 redis03 從

Redis 主從搭建

一:下載並安裝redis軟件(以192.168.0.2為例)

192.168.0.2:

1.安裝依賴包:yum install -y wget gcc make tcl

2.進入src目錄並下載redis軟件

cd /usr/local/src

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

3.解壓並安裝

tar -zxvf redis-3.2.9.tar.gz

cd redis-3.2.9

make && make install

4.目錄配置

mkdir -p /usr/local/redis
mkdir -p /usr/local/redis/data
mkdir -p /usr/local/redis/conf
mkdir -p /usr/local/redis/bin

5.配置目錄文件

cp /data/redis-3.2.9/src/redis* bin/
cd bin/
rm -f *.c
rm -f *.o
rm -f *.h
cp /data/redis-3.2.9/redis.conf /usr/local/redis/conf/6379.conf

另外兩個服務器下載安裝一致,不再重復

二:配置conf文件:

master庫 6379.conf:

bind 192.168.0.2          ##主庫地址

protected-mode no          ##一般均為內網,可以關閉保護模式

port 6379          ##端口

timeout 30          ##超時時間限制

daemonize yes          ##後臺運行

pidfile "/usr/local/redis/redis_6379.pid" ## 執行PID文件的路徑

logfile "/usr/local/redis/redis.log" ## 指定log日誌的路徑

dir "/usr/local/redis/data" ## 指定數據文件的目錄

masterauth "redis" ## 指定認證密碼

slave-serve-stale-data yes ## 設置成 NO 如果slave 無法與master 同步,設置成slave不可讀,方便監控腳本發現問題;此處設置為yes 繼續提供查詢服務

slave-read-only yes ## 指定從庫只讀

requirepass "redis" ## 指定登錄密碼

appendonly yes ## 指定aof增量持久化

appendfsync always ## 指定增量同步

slave庫 6379.conf:

bind 192.168.0.3          ##主庫地址

protected-mode no          ##一般均為內網,可以關閉保護模式

port 6379          ##端口

timeout 30          ##超時時間限制

daemonize yes          ##後臺運行

pidfile "/usr/local/redis/redis_6379.pid" ## 執行PID文件的路徑

logfile "/usr/local/redis/redis.log" ## 指定log日誌的路徑

dir "/usr/local/redis/data" ## 指定數據文件的目錄

masterauth "redis" ## 指定認證密碼

slave-serve-stale-data yes ##

slave-read-only yes ## 指定從庫只讀

requirepass "redis" ## 指定登錄密碼

appendonly yes ## 指定aof增量持久化

appendfsync always ## 指定增量同步

slaveof 192.168.0.2 6379 ## 指定主庫的IP 端口

192.168.0.4從庫的conf文件配置與192.168.0.3的配置除了bind不一樣,其它完全一致

三、啟動服務

啟動主庫:

[root@redis01 /]# redis-server /usr/local/redis/conf/6379.conf
[root@redis01 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:48 ? 00:00:00 /usr/sbin/init
root 17 1 0 00:48 ? 00:00:00 /usr/lib/systemd/systemd-journald
root 28 1 0 00:48 ? 00:00:00 /usr/lib/systemd/systemd-udevd
dbus 57 1 0 00:48 ? 00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 58 1 0 00:48 ? 00:00:00 /usr/lib/systemd/systemd-logind
root 77 0 0 00:48 ? 00:00:00 bash
root 253 0 0 03:06 ? 00:00:00 redis-server 192.168.0.2:6379
root 256 77 0 03:06 ? 00:00:00 ps -ef

啟動從庫:

[root@redis02 conf]# redis-server /usr/local/redis/conf/6379.conf
[root@redis02 conf]# ps -ef | grep redis
root 535 0 0 00:54 ? 00:00:00 redis-server 192.168.0.3:6379
root 540 113 0 00:54 ? 00:00:00 grep --color=auto redis

[root@redis03 conf]# redis-server /usr/local/redis/conf/6379.conf

[root@redis03 conf]# ps -ef | grep redis
root 457 0 0 00:55 ? 00:00:04 redis-server 192.168.0.4:6379
root 496 78 0 02:40 ? 00:00:00 grep --color=auto redis

四、查看info信息

登錄主庫:

[root@redis01 /]# redis-cli -h 192.168.0.2 -p 6379 -a redis
192.168.0.2:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.4,port=6379,state=online,offset=2648162,lag=1
slave1:ip=192.168.0.3,port=6379,state=online,offset=2648162,lag=1
master_repl_offset:2648162
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1599587
repl_backlog_histlen:1048576

登錄從庫:

[root@redis02 redis]# redis-cli -h 192.168.0.3 -p 6379 -a redis
192.168.0.3:6379> info replication
# Replication
role:slave
master_host:192.168.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2658326
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

至此redis的一主兩從已經搭建完畢

哨兵集群搭建

分別在三個節點啟動哨兵

一:哨兵sentinel.conf文件的配置:

bind 192.168.0.2 ## 綁定IP

protected-mode no ## 關閉保護模式

port 26379 ## 端口

dir "/usr/local/redis/data" ## 配置工作目錄

logfile "/usr/local/redis/sentinel.log" ## 指定log日誌的地址

sentinel monitor mymaster 192.168.0.2 6379 2 ## mymaster 為集群名稱; 192.168.0.2為主庫IP 從庫自動獲取 無需配置 ;數字2,是指當有兩個及以上的sentinel服務檢測到master宕機,才會去執行主從切換的功能。

sentinel auth-pass mymaster redis ## 設置master和slaves驗證密碼

sentinel down-after-milliseconds redis1 10000 ## master或slave多長時間(默認30秒)不能使用後標記為s_down狀態。

sentinel failover-timeout redis1 60000 ## 若sentinel在該配置值內未能完成failover操作(即故障時master/slave自動切換),則認為本次failover失敗。

sentinel can-failover mymaster yes ## 在sentinel檢測到O_DOWN後,是否對這臺redis啟動failover機制 ,設置為NO 時 只有仲裁權 沒有當選權

sentinel parallel-syncs mymaster 1 ## 執行故障轉移時,最多可以有多少個從服務器同時對新的主服務器進行同步,這個數字越小,完成故障轉移所需的時間就越長,但越大就意味著越多的從服務器因為復制而不可用。可以通過將這個值設為 1 來保證每次只有一個從服務器處於不能處理命令請求的狀態。

sentinel notification-script master1/data/scripts/send_mail.sh ##當sentinel觸發時,切換主從狀態時,需要執行的腳本。當主down的時候可以通知當事人,

註意:

1.應用程序連接到哨兵端口,通過指定不同的master名稱連接到具體的主副本。

2.哨兵配置文件中只需要配置主從復制中的主副本ip和端口即可,當主從進行切換時哨兵會自動修改哨兵配置文件中的主副本ip為新在主副本ip。

3.一個哨兵配置文件中可以同時配置監控多個主從復制。

4.單個哨兵就可以用來進行主從故障監控,但是如果只有一個sentinel進程,如果這個進程運行出錯,或者是網絡堵塞,那麽將無法實現redis集群的主備切換(單點問題);<quorum>這個2代表投票數,當2個sentinel認為一個master已經不可用了以後,將會觸發failover,才能真正認為該master已經不可用了。(sentinel集群中各個sentinel也有互相通信,通過gossip協議);所以合理的配置應該是同時啟動多個哨兵進程,並且最好是在不同的服務器中啟動。

5.註意mymaster的需要在整個網絡環境都是唯一的,哨兵之間會自動通過mastername去建立關聯關系只要網絡環境是相通的。

另外兩臺配置基本一致(bind地址根據實際填寫)

二、啟動哨兵進程

[root@redis01 /]# redis-sentinel /usr/local/redis/conf/sentinel.conf
_._
_.-``__ ‘‘-._
_.-`` `. `_. ‘‘-._ Redis 3.2.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ‘‘-._
( ‘ , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|‘` _.-‘| Port: 26379
| `-._ `._ / _.-‘ | PID: 247
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘

247:X 10 Sep 02:52:37.578 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
247:X 10 Sep 02:52:37.578 # Sentinel ID is 71b6ecdcc24ecdac45b6a9473716f67fc654f331
247:X 10 Sep 02:52:37.578 # +monitor master mymaster 192.168.0.2 6379 quorum 2
247:X 10 Sep 02:52:37.578 * +slave slave 192.168.0.3:6379 192.168.0.3 6379 @ mymaster 192.168.0.2 6379
247:X 10 Sep 02:54:25.135 * +sentinel sentinel f6d139040d2ec105d721b5aa738ba7ef4c9d3ab0 192.168.0.3 26379 @ mymaster 192.168.0.2 6379
247:X 10 Sep 02:58:35.764 * +sentinel sentinel 6e565fad2dab08a0df9bc74e06eebfc901c9b20a 192.168.0.4 26379 @ mymaster 192.168.0.2 6379

[root@redis02 redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf
_._
_.-``__ ‘‘-._
_.-`` `. `_. ‘‘-._ Redis 3.2.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ‘‘-._
( ‘ , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|‘` _.-‘| Port: 26379
| `-._ `._ / _.-‘ | PID: 627
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘

627:X 10 Sep 03:21:26.126 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
627:X 10 Sep 03:21:26.126 # Sentinel ID is f6d139040d2ec105d721b5aa738ba7ef4c9d3ab0
627:X 10 Sep 03:21:26.126 # +monitor master mymaster 192.168.0.3 6379 quorum 2
627:X 10 Sep 03:21:26.126 * +slave slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.3 6379
627:X 10 Sep 03:21:26.127 * +slave slave 192.168.0.4:6379 192.168.0.4 6379 @ mymaster 192.168.0.3 6379
627:X 10 Sep 03:21:27.966 * +sentinel sentinel 71b6ecdcc24ecdac45b6a9473716f67fc654f331 192.168.0.2 26379 @ mymaster 192.168.0.3 6379

三、查看info信息

四、模擬主庫宕機,驗證哨兵是否自動切換

手動kill 主庫192.168.0.2 redis進程

[root@redis02 redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf
_._
_.-``__ ‘‘-._
_.-`` `. `_. ‘‘-._ Redis 3.2.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ‘‘-._
( ‘ , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|‘` _.-‘| Port: 26379
| `-._ `._ / _.-‘ | PID: 583
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘

583:X 10 Sep 01:38:17.492 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
583:X 10 Sep 01:38:17.493 # Sentinel ID is f6d139040d2ec105d721b5aa738ba7ef4c9d3ab0
583:X 10 Sep 01:38:17.493 # +monitor master mymaster 192.168.0.2 6379 quorum 2
583:X 10 Sep 01:38:17.493 * +slave slave 192.168.0.3:6379 192.168.0.3 6379 @ mymaster 192.168.0.2 6379
583:X 10 Sep 01:38:17.493 * +slave slave 192.168.0.4:6379 192.168.0.4 6379 @ mymaster 192.168.0.2 6379
583:X 10 Sep 01:38:18.216 * +sentinel sentinel 71b6ecdcc24ecdac45b6a9473716f67fc654f331 192.168.0.2 26379 @ mymaster 192.168.0.2 6379
583:X 10 Sep 01:41:52.390 # +sdown master mymaster 192.168.0.2 6379
583:X 10 Sep 01:41:52.481 # +new-epoch 1
583:X 10 Sep 01:41:52.482 # +vote-for-leader 71b6ecdcc24ecdac45b6a9473716f67fc654f331 1
583:X 10 Sep 01:41:52.893 # +config-update-from sentinel 71b6ecdcc24ecdac45b6a9473716f67fc654f331 192.168.0.2 26379 @ mymaster 192.168.0.2 6379
583:X 10 Sep 01:41:52.893 # +switch-master mymaster 192.168.0.2 6379 192.168.0.4 6379
583:X 10 Sep 01:41:52.893 * +slave slave 192.168.0.3:6379 192.168.0.3 6379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:41:52.893 * +slave slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:42:22.905 # +sdown slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:46:12.219 # -sdown slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:46:22.170 * +convert-to-slave slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:57:31.160 # +sdown sentinel 71b6ecdcc24ecdac45b6a9473716f67fc654f331 192.168.0.2 26379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 01:58:45.313 # -sdown sentinel 71b6ecdcc24ecdac45b6a9473716f67fc654f331 192.168.0.2 26379 @ mymaster 192.168.0.4 6379
583:X 10 Sep 02:21:19.500 * +convert-to-slave slave 192.168.0.2:6379 192.168.0.2 6379 @ mymaster 192.168.0.4 6379

自動選舉 192.168.0.4 作為主庫並且在192.168.0.2恢復後 自動加入並設置為slave

五、sentinel一些命令介紹

[root@idxs21-108 redis]# redis-cli -h 192.168.0.2 -p 26379
①INFO sentinel的基本狀態信息
②SENTINEL masters 列出所有被監視的主服務器,以及這些主服務器的當前狀態
③SENTINEL slaves 列出給定主服務器的所有從服務器,以及這些從服務器的當前狀態
④SENTINEL get-master-addr-by-name 返回給定名字的主服務器的 IP 地址和端口號
⑤SENTINEL reset 重置所有名字和給定模式 pattern 相匹配的主服務器。重置操作清除主服務器目前的所有狀態, 包括正在執行中的故障轉移, 並移除目前已經發現和關聯的, 主服務器的所有從服務器和 Sentinel 。
⑥SENTINEL failover 當主服務器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移,但是它會給其他sentinel發送一個最新的配置,其他sentinel會根據這個配置進行更新

Sentinel的工作方式:

1):每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令
2):如果一個實例(instance)距離最後一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。
3):如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
4):當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
6):當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀下線狀態就會被移除。

至此 哨兵集群搭建完畢

redis監控平臺搭建

GITHUB開源:https://github.com/LittlePeng/redis-monitor

下載軟件:https://codeload.github.com/LittlePeng/redis-monitor/zip/master

mv master redis-monitor-master.zip

一、安裝(pip)

首先安裝epel擴展源:

yum -y install epel-release

更新完成之後,就可安裝pip:

yum -y install python-pip

安裝完成之後清除cache:

yum clean all

二、安裝依賴包

cd redis-monitor-master

pip install -r requirements.txt

三、配置redis_live.conf

{

"master_slave_sms": "1,1",
"RedisStatsServer": {
"port": 6379,
"server": "192.168.0.2",
"password": "redis"
},
"sms_alert": "192.168.110.207:9999",
"DataStoreType": "redis",
"RedisServers": [{
"instance": "Master1",
"group": "Test1",
"port": 6379,
"server": "192.168.0.2",
"password" : "redis"
}, {
"instance": "Slave1",
"group": "Test1",
"port": 6379,
"server": "192.168.0.3",
"password": "redis"
}, {
"instance": "Slave2",
"group": "Test1",
"port": 6379,
"server": "192.168.0.4",
"password": "redis"
}]
}

四、啟動進程

python src/redis_monitor_daemon.py

python src/redis_live_daemon.py

前端訪問地址:http://10.1.12.123:8888/index.html#

參考來源:

https://www.cnblogs.com/chenmh/p/5578376.html

https://blog.csdn.net/lifupingcn/article/details/68942133

https://segmentfault.com/a/1190000002680804 Redis Sentinel機制與用法(一)

https://segmentfault.com/a/1190000002685515 Redis Sentinel機制與用法(二)

https://www.linuxidc.com/Linux/2017-08/146375.htm

https://blog.csdn.net/dc_726/article/details/47699739

Redis 主從+哨兵+監控 (centos7.2 + redis 3.2.9 )