轉自:http://www.cnblogs.com/fly-piglet/p/9836314.html
目的:
讓看看這篇文章的的人可以知道:軟件架構、軟件的安裝、配置、基本運維的操做、高可用測試、也包含我本身,可以節省對應的時間。html
軟件架構:
生產環境使用三臺服務器搭建redis哨兵集羣,3個redis實例(1主2從)+ 3個哨兵實例。生產環境可以保證在哨兵存活兩臺的狀況下,只有一臺redis可以繼續提供服務(一主兩從三哨兵)web
主虛擬機1 | 從虛擬機2 | 從虛擬機3 |
---|---|---|
172.16.48.129 | 172.16.48.130 | 172.16.48.131 |
軟件安裝:分別在三臺機器上經過yum進行redis的下載和安裝以及開機啓動
# 添加軟件安裝源 yum install epel-release # 安裝redis yum install redis -y # 啓動redis、啓動redis哨兵 systemctl start redis systemctl start redis-sentinel # 容許開機啓動 systemctl enable redis systemctl enable redis-sentinel # 以後進行配置修改:爲哨兵集羣,重啓啓動服務
/etc/redis.conf(主庫配置)
# 修改redis配置文件:/etc/redis.conf # 1. 修改綁定ip爲服務器內網ip地址,作綁定,三臺各自填寫各自的ip地址 bind 172.16.48.129 # 2. 保護模式修改成否,容許遠程鏈接 protected-mode no # 4. 設定密碼 requirepass "123456789" # 5. 設定主庫密碼與當前庫密碼同步,保證從庫可以提高爲主庫 masterauth "123456789" # 6. 打開AOF持久化支持 appendonly yes
/etc/redis.conf(兩個從庫配置)
基本配置和主庫相同,bindip地址各自對應各自的。
須要添加主庫同步配置redis
# 主庫爲主虛擬機1的地址 slaveof 172.16.48.129 6379
/etc/redis-sentinel.conf(哨兵配置)
# 修改redis-sentinel配置文件:/etc/redis-sentinel.conf # 1. 綁定的地址 bind 172.19.131.247 # 2. 保護模式修改成否,容許遠程鏈接 protected-mode no # 3. 設定sentinel myid 每一個都不同,使用yum安裝的時候,直接就生成了 sentinel myid 04d9d3fef5508f60498ac014388571e719188527 # 4. 設定監控地址,爲對應的主redis庫的內網地址 sentinel monitor mymaster 172.16.48.129 6379 2 # 5. 設定5秒內沒有響應,說明服務器掛了,須要將配置放在sentinel monitor master 127.0.0.1 6379 1下面 sentinel down-after-milliseconds mymaster 5000 # 6. 設定15秒內master沒有活起來,就從新選舉主 sentinel failover-timeout mymaster 15000 # 7. 表示若是master從新選出來後,其它slave節點能同時並行重新master同步緩存的臺數有多少個,顯然該值越大,全部slave節點完成同步切換的總體速度越快,但若是此時正好有人在訪問這些slave,可能形成讀取失敗,影響面會更廣。最保定的設置爲1,只同一時間,只能有一臺幹這件事,這樣其它slave還能繼續服務,可是全部slave所有完成緩存更新同步的進程將變慢。 sentinel parallel-syncs mymaster 2 # 8. 主數據庫密碼,須要將配置放在sentinel monitor master 127.0.0.1 6379 1下面 sentinel auth-pass mymaster 123456789
注意:含有mymaster的配置,都必須放置在sentinel monitor mymaster 172.16.48.129 6379 2以後,不然會出現問題算法
3. 從新啓動
# 啓動須要按照Master->Slave->Sentinel的順序進行啓動 # 啓動redis systemctl restart redis # 啓動redis哨兵 systemctl restart redis-sentinel
高可用測試:
1. 鏈接redis腳本
# 主虛擬機1 redis-cli -h 172.16.48.129 -p 6379 -a 123456789 # 從虛擬機2 redis-cli -h 172.16.48.130 -p 6379 -a 123456789 # 從虛擬機3 redis-cli -h 172.16.48.131 -p 6379 -a 123456789
2. 同步狀態查看
# 鏈接完成後輸入命令 info replication # 主庫顯示以下,便可算完成(包含兩個從庫ip地址) # Replication role:master connected_slaves:2 slave0:ip=172.16.48.131,port=6379,state=online,offset=188041,lag=1 slave1:ip=172.16.48.130,port=6379,state=online,offset=188041,lag=1 master_repl_offset:188041 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:188040 # 從庫顯示以下,便可算完成 # Replication role:slave master_host:172.16.48.129 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:174548 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
3. 主庫寫入測試同步
# 主虛擬機1 set b b # 從虛擬機2 keys * get b # 從虛擬機3 keys * get b
4. 從庫只讀測試
# 從虛擬機2 set c c # result : (error) READONLY You can't write against a read only slave. # 從虛擬機3 set c c # result : (error) READONLY You can't write against a read only slave.
5. 成功redis-sentinel日誌
# 查看日誌: tailf /var/log/redis/sentinel.log
成功日誌,+slave slave包含兩臺從庫的地址,+sentinel sentinel包含兩臺哨兵的idspring
57611:X 21 Oct 02:03:27.777 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 57611:X 21 Oct 02:03:27.777 # Sentinel ID is 42975048e2f70d0f4d718f77427930c16bc0b522 57611:X 21 Oct 02:03:27.777 # +monitor master mymaster 172.16.48.129 6379 quorum 2 57611:X 21 Oct 02:03:27.778 * +slave slave 172.16.48.131:6379 172.16.48.131 6379 @ mymaster 172.16.48.129 6379 57611:X 21 Oct 02:03:27.779 * +slave slave 172.16.48.130:6379 172.16.48.130 6379 @ mymaster 172.16.48.129 6379 57611:X 21 Oct 02:03:29.767 * +sentinel sentinel 29222b827e3739b564939c6f20eb610802b48706 172.16.48.130 26379 @ mymaster 172.16.48.129 6379 57611:X 21 Oct 02:03:29.769 * +sentinel sentinel ea3c41804d2840a4393bbdaf0f32dab321267a9c 172.16.48.131 26379 @ mymaster 172.16.48.129 6379
6. 成功sentinel的鏈接狀態
# 主虛擬機1 redis-cli -h 172.16.48.129 -p 26379 INFO Sentinel # result: # 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=172.16.48.129:6379,slaves=2,sentinels= # 從虛擬機2 redis-cli -h 172.16.48.130 -p 26379 INFO Sentinel # 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=172.16.48.129:6379,slaves=2,sentinels=3 # 從虛擬機3 redis-cli -h 172.16.48.131 -p 26379 INFO Sentinel # 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=172.16.48.129:6379,slaves=2,sentinels=3
7. 高可用測試case
哨兵做爲對redis實例的監控,經過選舉算法保證哨兵的魯棒性和高可用,因此哨兵至少要部署3臺,符合半數原則,須要5或者,7,超過一半,不包含一半存活的時候,纔可以選舉出leader,才能進行主從的切換功能。
redis服務,至少須要存活一臺,才能保證服務正常運行sentinel 選擇新 master 的原則是最近可用 且 數據最新 且 優先級最高 且 活躍最久 !
哨兵高可用測試:分別鏈接對應的redis服務端,手動中止哨兵,中止主reids服務,看主從是否切換成功。
三哨兵狀況:redis實例掛掉兩臺,剩下一臺可以成爲主,自動切換數據庫
# 保持三個哨兵進程都存在的狀況下 # 1. 三個終端分別鏈接redis,使用info replication查看當前鏈接狀態: # 主虛擬機1 redis-cli -h 172.16.48.129 -p 6379 -a 123456789 info replication # 從虛擬機2 redis-cli -h 172.16.48.130 -p 6379 -a 123456789 info replication # 從虛擬機3 redis-cli -h 172.16.48.131 -p 6379 -a 123456789 info replication # 2. 中止當前role:master的對應的redis服務,從新檢查狀態看是否切換 systemctl stop redis # 虛擬機1的實例轉換成爲主的redis # 3. 繼續中止剩下兩臺:role:master的對應的redis服務,從新檢查鏈接狀態看是否切換 systemctl stop redis # 虛擬機3的實例轉換成爲了主的redis # 切換順利,實現高可用
兩哨兵狀況:redis實例掛掉兩臺,剩下一臺可以成爲主,自動切換緩存
# 將所有虛擬機的redis + sentinel從新啓動 systemctl start redis systemctl start redis-sentinel # 中止虛擬機1的redis-sentinel,從新執行哨兵的案例測試 systemctl stop redis-sentinel # 分別中止對應master實例的redis,最終剩下一臺實例,成爲了master,可以自動切換
一哨兵狀況:redis實例沒法主從切換bash
# 將所有虛擬機的redis + sentinel從新啓動 systemctl start redis systemctl start redis-sentinel # 中止虛擬機1和2d的redis-sentinel,從新執行哨兵的案例測試 systemctl stop redis-sentinel # 分別中止對應master實例的redis,最終剩下一臺實例,沒法實現主從切換
8. web服務鏈接測試
建立一個web項目,使用項目進行服務器鏈接驗證,暫時不提供。使用spring boot + spring-data-redis進行測試服務器
基本運維操做
基本命令操做
# 啓動 systemctl start redis systemctl start redis-sentinel # 重啓 systemctl restart redis systemctl restart redis-sentinel # 中止 systemctl stop redis systemctl stop redis-sentinel # 開機啓動 systemctl enable redis systemctl enable redis-sentinel # 關閉開機啓動 systemctl disable redis systemctl disable redis-sentinel # 卸載,中止redis服務,sentinel服務以後,關閉開機啓動,進行卸載 yum remove redis -y
配置文件目錄
redis配置文件:/etc/redis.conf
redis-sentinel配置文件:/etc/redis-sentinel.confmarkdown
日誌文件目錄
redis日誌:/var/log/redis/redis.log
redis-sentinel日誌:/var/log/redis/sentinel.log
持久化文件目錄
redis-dump文件:/var/lib/redis/dump.rdb
redis-appendonly文件:/var/lib/redis/appendonly.aof
參考教程
在Centos中yum安裝和卸載軟件的使用方法
Markdown插入表格語法
配置sentinel down-after-milliseconds mymaster 5000報錯,解決方案
Redis 高可用之 Sentinel 部署與原理