Redis 高級部分
一、主從復制
image.pngRdis 的主從復制特點
image.png1. 配置主從
實現方式同樣有兩種: 命令方式和配置文件方式
命令方式
只需要在從服務器上執行如下命令即可
slaveof 主服務器的IP 端口號
slaveof
命令是異步的,不阻塞。
並且此時,從服務器現有的數據會先被清空,之後再同步主服務器的數據。
停止一臺從服務器的復制操作,在此臺服務器上執行如下命令
slaveof no one
配置文件的方式如下
只需要在從服務器上配置即可
修改配置文件
172.16.153.178
端口是:
6379
# slaveof <masterip> <masterport>
slaveof 172.16.153.178 6379
// 配置此服務器只提供讀取操作
slave-read-only yes
之後重啟從主機的 Redis 服務
查看主從信息
127.0.0.1:6379> info replication
二、主從 + Sentinel
哨兵模式
Redis Sentinel是Redis官方的高可用性解決方案。
Redis 的 Sentinel 系統用於管理多個 Redis 服務器(instance), 該系統執行以下三個任務:
-
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
-
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
-
自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 並讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。
Redis Sentinel 是一個分布式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從服務器作為新的主服務器。
雖然 Redis Sentinel 釋出為一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器。
此種模式下,客戶端要訪問的 服務 IP 不是主節點,而是 sentiner
服務器的 IP。
架構圖
image.pngRedis Sentinel 故障轉移
image.png架構的擴展應用
image.png1. 配置主從
a. 快速生成主節點的配置文件
編譯全新文件 /etc/redis/redis-6380.conf
, 添加如下內容
port 6380
daemonize yes
protected-mode no
pidfile /var/run/redis-6380.pid
logfile /var/log/redis-6380.log
dir /redis/data/
假如是多個主機實現的,就需要更改為
protected-mode yes
,
並且添加bind 0.0.0.0
b. 快速生成從節點的配置文件
[[email protected] ~]# sed ‘s/6380/6381/g‘ /etc/redis/redis-6380.conf > /etc/redis/redis-6381.conf
[[email protected] ~]# sed ‘s/6380/6382/g‘ /etc/redis/redis-6380.conf > /etc/redis/redis-6382.conf
查看配置文件內容,檢驗配置結果
[[email protected] ~]# cat /etc/redis/redis-6381.conf
port 6381
daemonize yes
pidfile /var/run/redis-6381.pid
logfile /var/log/redis-6381.log
dir /redis/data/
[[email protected] ~]# cat /etc/redis/redis-6382.conf
port 6382
daemonize yes
pidfile /var/run/redis-6382.pid
logfile /var/log/redis-6382.log
dir /redis/data/
[[email protected] ~]#
c. 配置主從關系
[[email protected] ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6381.conf
[[email protected] ~]# echo "slaveof 172.16.153.178 6380" >> /etc/redis/redis-6382.conf
[[email protected] ~]#
d. 啟動服務,並驗證進程
[[email protected] ~]# /usr/local/bin/redis-server /etc/redis/redis-6380.conf
[[email protected] ~]# /usr/local/bin/redis-server /etc/redis/redis-6381.conf
[[email protected] ~]# /usr/local/bin/redis-server /etc/redis/redis-6382.conf
[[email protected] ~]# ps -ef |grep redis
root 4335 1 0 19:30 ? 00:00:03 /usr/local/bin/redis-server *:6380
root 4490 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6381
root 4495 1 0 20:17 ? 00:00:00 /usr/local/bin/redis-server *:6382
root 4500 3755 0 20:17 pts/0 00:00:00 grep --color=auto redis
[[email protected] ~]#
假如日誌中出現如下警告信息
4668:S 17 Feb 20:28:42.107 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4668:S 17 Feb 20:28:42.107 # Server initialized
4668:S 17 Feb 20:28:42.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1‘ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1‘ for this to take effect.
4668:S 17 Feb 20:28:42.108 * DB loaded from disk: 0.000 seconds
4668:S 17 Feb 20:28:42.110 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
解決辦法
The TCP backlog...
方法1: 臨時設置生效:
shell> sysctl -w net.core.somaxconn=1024
方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行
net.core.somaxconn=1024
然後執行命令
sysctl -p
WARNING overcommit_memory ...
方法1: 臨時設置生效:
shell> sysctl -w vm.overcommit_memory=1
方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行
vm.overcommit_memory=1
然後執行命令
sysctl -p
e. 查看主從復制信息
image.png2. 配置 sentinel
獲取程序
Sentinel 程序可以在編譯後的 src 文檔中發現, 它是一個命名為 redis-sentinel 的程序。
運行一個 Sentinel 所需的最少配置如下所示:
Redis 源碼中包含了一個名為 sentinel.conf
的文件, 這個文件是一個帶有詳細註釋的 Sentinel 配置文件示例。
運行一個 Sentinel 所需的最少配置如下所示:
// 監控一個 Redis 服務器
// 名稱為 mymaster ,IP 為 127.0.0.1 端口為 6380
// 最後的 2 是指最少有 2 給 Sentinel 實例同意一臺 redis 服務器宕機,才會認為 客觀下線。
// sentinel monitor 自定義的主節點名稱 主節點的 IP 主節點端口 票數
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
// 180 秒後開始故障自動裝換
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
各個選項的功能如下:
down-after-milliseconds 選項指定了 Sentinel 認為服務器已經斷線所需的毫秒數。
如果服務器在給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回復, 或者返回一個錯誤, 那麽 Sentinel 將這個服務器標記為主觀下線(subjectively down,簡稱 SDOWN )。不過只有一個 Sentinel 將服務器標記為主觀下線並不一定會引起服務器的自動故障遷移: 只有在足夠數量的 Sentinel 都將一個服務器標記為主觀下線之後, 服務器才會被標記為客觀下線(objectively down, 簡稱 ODOWN ), 這時自動故障遷移才會執行。
將服務器標記為客觀下線所需的 Sentinel 數量由對主服務器的配置決定。
parallel-syncs
選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。
最終的配置文件
sentinel-27000.cn
daemonize yes
port 27000
dir "/tmp"
logfile "27000.log"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
哨兵的領導者選舉
票數和領導者選舉有關系
領導者選舉的事件發生,必須滿足下面的條件
max(票數, (哨兵的個數 / 2) + 1 )
個哨兵參加選舉
才可以選舉出領導者,從而完成故障轉移。
比如有 5 個哨兵, 配置的票數是 4
max(4, (5 / 2) + 1)
max(4, 3.5)
4 最大
結果就是需要 4 個哨兵參與選舉才可以。
a. 獲取並修改配置文件
快速創建三個 sentinel 配置文件
進入到 Redis 源碼的目錄下,執行如下命令
image.png
修改監聽端口
image.png之後在每個 sentinel
配置文件中添加守護進程方式運行,
並修改dir
配置項的目錄,
daemonize yes
dir /redis/data/
logfile "sentinel-${port}.log"
最後別忘了修改監控的主服務器的 IP 和端口正確的 6380
最終其中一個的配置文件應該是這樣的
image.png
b. 啟動服務並驗證
啟動服務的語法:
shell> redis-sentinel sentinel的配置文件
image.png
image.png
可以使用以下命令查看哨兵的信息
[[email protected] ~]# redis-cli -p 27001 info
...略...
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[[email protected] ~]#
4. 故障演練
停止 Master 節點的服務
[[email protected] ~]# redis-cli -p 6380 shutdown
不斷的刷新其中一個 Sentinel 節點的信息,觀察最後一行信息的變化
[[email protected] ~]# redis-cli -p 27001 info
...略...
master0:name=mymaster,status=ok,address=127.0.0.1:6382,slaves=2,sentinels=3
鏈接:https://www.jianshu.com/p/7c43cdb6bfc7
Redis 高級部分