Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗

一、緩存:緩存是爲了調節速度不一致的兩個或多個不同的物質的速度,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的作用,比如 CPU 的一級、二級緩存是保存了 CPU 最近經常訪問的數據,內存是保存 CPU 經常訪問硬盤的數據,而且硬盤也有大小不一的緩存,甚至是物理服務器的 raid 卡有也緩存,都是爲了起到加速 CPU 訪問硬盤數據的目的一因爲 CPU 的速度太快了,CPU 需要的數據硬盤往往不能在短時間內滿足 CPU 的需求,因此 CPU 緩存、內存、Raid 卡以及硬盤緩存就在一定程度上滿足了 CPU 的數據需求,即 CPU 從緩存讀取數據可以大幅提高 CPU 的工作效率。
buffer:buffer:緩衝也叫寫緩衝,一般用於寫操作,可以將數據先寫入內存在寫入磁盤,buffer 一般用於寫緩衝,用於解決不同介質的速度不一致的緩衝,先將數據臨時寫入到離自己最近的地方,以提高寫入速度,CPU 會把數據線寫到內存的磁盤緩衝區,然後就認爲數據已經寫入完成。當服務器突然斷電就會丟失部分數據。
cache:緩存也叫讀緩存,一般用於讀操作,CPU 讀文件從內存讀,如果內存沒有就先從硬盤讀到內存再讀到 CPU,將需要頻繁讀取的數據放在裏自己最近的緩存區域,下次讀取的時候即可快速讀取。
cache 的特性:
自動過期:給緩存的數據加上有效時間,超出時間後自動過期刪除
過期時間:強制過期,源網站更新圖片後 CDN 是不會更新的,需要強制是圖片緩存過期
命中率:即緩存的讀取命中率。
CDN:內容分發網絡(Content Delivery Network),通過將服務內容分發至全網加速節點,利用全球調度系統使用戶能夠就近獲取,有效降低訪問延遲,提升服務可用性,
優勢:CDN 第一降低機房的使用帶寬,因爲很多資源通過 CDN 就直接返回用戶了,第二解決不同運營商之間的互聯,因爲可以讓聯通的網絡訪問聯通讓電信的網絡訪問電信,起到加速用戶訪問的目的, 第三:解決用戶訪問的地域問題,就近返回用戶資源。

Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗

Redis:官網地址:https://redis.io/

Redis和Memcached是非關係型數據庫也稱爲NoSQL數據庫,MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 數據庫屬於關係型數據(RDBMS, Relational Database Management System).redis是一個開源的、遵循BSD協議的、基於內存的而且目前比較流行的鍵值數據庫(key-value database),是一個非關係型數據庫,redis 提供將內存通過網絡遠程共享的一種服務,提供類似功能的還有memcache,但相比 memcache,redis 還提供了易擴展、高性能、具備數據持久性等功能。Redis 在高併發、低延遲環境要求比較高的環境使用量非常廣泛,目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比較靠前,而且一直是鍵值型存儲類的首位。

redis 典型應用場景:

Session 共享:常見於 web 集羣中的 Tomcat 或者 PHP 中多 web 服務器 session 共享
消息隊列:ELK 的日誌緩存、部分業務的訂閱發佈系統
計數器:訪問排行榜、商品瀏覽數等和次數相關的數值統計場景
緩存:數據查詢、電商網站商品信息、新聞內容
微博/微信社交場合:共同好友、點贊評論等

Redis 安裝及使用:官方下載地址:http://download.redis.io/releases/

準備工作:在172.18.9.150主機編譯安裝:
一、 cd /usr/local/src/ tar xvf redis -4.0.14.tar.gz ll --> total 1708
drwxrwxr-x. 6 root root 4096 Mar 19 00:23 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 2019 redis-4.0.14.tar.gz
二、 cd redis-4.0.14 make PREFIX=/apps/redis install
[root@150 src]#ll /apps/redis/ total 0 drwxr-xr-x. 2 root root 134 Mar 27 21:42 bin
[root@150 redis-4.0.14]#ll /apps/redis/bin/
total 21888
-rwxr-xr-x. 1 root root 2452176 Mar 27 21:42 redis-benchmark redis自帶的壓縮工具,可以模擬併發數
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-aof
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-rdb
-rwxr-xr-x. 1 root root 2618208 Mar 27 21:42 redis-cli
lrwxrwxrwx. 1 root root 12 Mar 27 21:42 redis-sentinel -> redis-server 哨兵機制(軟連接)
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-server
三、[root@150 redis-4.0.14]#ll total 312 -rw-rw-r--. 1 root root 58766 Mar 19 00:23 redis.conf
[root@150 redis-4.0.14]#mkdir /apps/redis/etc
[root@150 redis-4.0.14]#cp redis.conf /apps/redis/etc/ 把redis.conf 拷貝至新建文件做配置文件
四、[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 二進制啓動方式
50475:C 27 Mar 21:58:08.108 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50475:C 27 Mar 21:58:08.108 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50475, just started
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
五、需要修改的配置參數如圖:
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗

[root@150 redis-4.0.14]#vim /etc/sysctl.conf net.core.somaxconn = 512 vm.overcommit_memory = 1
[root@150 redis-4.0.14]#sysctl -p net.core.somaxconn = 512 vm.overcommit_memory = 1
再次重啓:[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
50607:C 27 Mar 22:07:30.778 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50607:C 27 Mar 22:07:30.778 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50607, just started
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
六、開啓大頁內存動態分配,需要關閉讓 redis 負責內存管理:[root@150 redis-4.0.14]#echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
50689:C 27 Mar 22:14:54.060 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50689:C 27 Mar 22:14:54.060 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50689, just started
50689:C 27 Mar 22:14:54.060 # Configuration loaded
50689:M 27 Mar 22:14:54.062 Increased maximum number of open files to 10032 (it was originally set to 1024).
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
七、[root@150 redis-4.0.14]#vim /etc/rc.d/rc.local echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@150 redis-4.0.14]#chmod a+x /etc/rc.d/rc.local 給該文件要加上x權限。
八、[root@150 redis-4.0.14]#reboot 重啓使其生效。
九、[root@centos7 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
7977:C 28 Mar 08:57:56.284 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7977:C 28 Mar 08:57:56.284 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=7977, just started
7977:C 28 Mar 08:57:56.284 # Configuration loaded
7977:M 28 Mar 08:57:56.286
Increased maximum number of open files to 10032 (it was originally set to 1024).
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
十、[root@centos7 ~]#scp /etc/sysctl.conf 172.18.9.100/200/110:/etc/
[root@centos7 ~]#scp /etc/rc.d/rc.local 172.18.9.100/200/110:/etc/rc.d/
[root@centos7 ~]#chmod a+x /etc/rc.d/rc.local (100\110\200\150)
十一、[root@centos7 ~]#mkdir /apps/redis/{logs,data,run} -pv
mkdir: created directory ‘/apps/redis/logs’
mkdir: created directory ‘/apps/redis/data’
mkdir: created directory ‘/apps/redis/run’
十二、[root@centos7 ~]#groupadd -g 1001 redis && useradd -u 1001 -g 1001 redis -s
[root@centos7 ~]#id redis uid=1001(redis) gid=1001(redis) groups=1001(redis)
[root@centos7 ~]#chown redis.redis /apps/redis/ -R 這一步務必完成。
十三、[root@centos7 ~]#su redis
[redis@centos7 root]$ll /apps/ total 0 drwxr-xr-x. 7 redis redis 63 Mar 28 09:20 redis
[redis@centos7 root]$cd /apps/redis/ 此時,我們是以普通用戶身份登錄的redis。
[redis@centos7 redis]$ll
total 0
drwxr-xr-x. 2 redis redis 134 Mar 27 21:42 bin
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 data
drwxr-xr-x. 2 redis redis 24 Mar 27 22:07 etc
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 logs
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 run
十四、我們用普通用戶身份啓動redis,會有6379的端口開啓,繫系統默認行爲。
[redis@centos7 redis]$/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
8676:C 28 Mar 09:41:42.609 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8676:C 28 Mar 09:41:42.609 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=8676, just started
8676:C 28 Mar 09:41:42.609 # Configuration loaded
8676:M 28 Mar 09:41:42.612 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
8676:M 28 Mar 09:41:42.613 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
8676:M 28 Mar 09:41:42.613 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :
十五、設置軟連接,這樣我們就可以全局執行redis命令了:
[root@centos7 ~]#ln -sv /apps/redis/bin/ /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
十六、[redis@centos7 redis]$ vim etc/redis.conf bind 0.0.0.0
[redis@centos7 redis]$ /apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重啓。
[root@centos7 ~]#ss -ntl 6379的端口就會指向任意IP。
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511
:6379 :
十七、[redis@centos7 redis]$ vim etc/redis.conf
one:logfile "/apps/redis/logs/redis-6379.log" 日誌路徑 two:stop-writes-on-bgsave-error no #快照出錯時是否禁止redis寫入操作
/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重啓服務
十八、vim /apps/redis/etc/redis.conf
one:dbfilename redis_6379.rdb two:dir /apps/redis/data 這兩處做修改。(dump文件是6379端口下的文件,數據放/data/下)
十九、重啓:查看端口:
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :

Redis的配置文件

主要配置項:
bind 0.0.0.0 #監聽地址,可以用空格隔開後多個監聽 IP
pidfile /var/run/redis_6379.pid #pid 文件路徑
stop-writes-on-bgsave-error no #快照出錯時是否禁止 redis 寫入操作
dir ./ #快照文件保存路徑  我們定義在dir /apps/redis/data
appendfilename "appendonly.aof" #AOF 文件名
appendfsync everysec #aof 持久化策略的配置,no 表示不執行 fsync,由操作系統保證數據同步到磁盤,always 表示每次寫入都執行 fsync,以保證數據同步到磁盤,everysec 表示每秒執行一次 fsync,可能會導致丟失這 1s 數據。
cluster-require-full-coverage no #集羣槽位覆蓋,如果一個主庫宕機且沒有備庫就會出現集羣槽位不全,那麼 yes 情況下 redis 集羣槽位驗證不全就不再對外提供服務,而 no 則可以繼續使用但是會出現查詢數據查不到的情況(因爲有數據丟失)。
redis 雖然是一個內存級別的緩存程序,即 redis 是使用內存進行數據的緩存的,但是其可以將內存的數據按一定的策略保存到硬盤上,從而實現數據持久保存的目的,redis 支持兩種不同方式的數據持久化保存機制,分別是 RDB 和 AOF
RDB:基於時間的快照,只保留當前最新的一次快照,特點是執行速度比較快,缺點是可能會丟失從上次快照到當前快照未完成之間的數據。RDB 實現的具體過程 Redis 從主進程先 fork 出一個子進程,使用寫時複製機制,子進程將內存的數據保存爲一個臨時文件,比如 dump.rdb.temp,當數據保存完成之後再將上一次保存的 RDB 文件替換掉,然後關閉子進程,這樣可以保存每一次做 RDB 快照的時候保存的數據都是完整的,因爲直接替換 RDB文件的時候可能會出現突然斷電等問題而導致 RDB 文件還沒有保存完整就突然關機停止保存而導致數據丟失的情況,可以手動將每次生成的 RDB 文件進程備份,這樣可以最大化保存歷史數據.
優點:-RDB 快照保存了某個時間點的數據,可以通過腳本執行 bgsave(非阻塞)或者 save(阻塞)命令自定義時間點備份,可以保留多個備份,當出現問題可以恢復到不同時間點的版本。-可以最大化 o 的性能,因爲父進程在保存 RDB 文件的時候唯一要做的是 fork 出一個子進程,然後的操作都會有這個子進程操作,父進程無需任何的 IO 操作,RDB 在大量數據比如幾個 G 的數據,恢復的速度比 AOF 的快。
缺點:-不能時時的保存數據,會丟失自上一次執行 RDB 備份到當前的內存數據。  -數據量非常大的時候,從父進程 fork 的時候需要一點時間,可能是毫秒或者秒。
AOF:按照操作順序依次將操作添加到指定的日誌文件當中,特點是數據安全性相對較高,缺點是即使有些操作是重複的也會全部記錄。
優缺點:1、AOF 的文件大小要大於 RDB 格式的文件     2、根據所使用的 fsync 策略(fsync 是同步內存中 redis 所有已經修改的文件到存儲設備),默認是appendfsync everysec 即每秒執行一次 fsync
redis的數據類型:
1、字符串(string):redis 中所有的 key 的類型都是字符串。
2、列表(list):列表是一個雙向可讀寫的管道,其頭部是左側尾部是右側,一個列表最多可以包含 2^32-1 個元素即4294967295 個元素
3、集合(set):Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據
4、sorted set(有序集合):Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重複的成員,不同的是每個元素都會關聯一個 double(雙精度浮點型)類型的分數,redis 正是通過分數來爲集合中的成員進行從小到大的排序,序集合的成員是唯一的,但分數(score)卻可以重複,集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1), 集合中最大的成員數爲 2^32 - 1 (4294967295, 每個集合可存儲 40 多億個成員)。
5、哈希(hash):hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象,Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40 多億)。
消息隊列:

在生產者消費者(Producer/Consumer)模式下,上層應用接收到的外部請求後開始處理其當前步驟的操作,在執行完成後將已經完成的操作發送至指定的頻道(channel)當中,並由其下層的應用監聽該頻道並繼續下一步的操作,如果其處理完成後沒有下一步的操作就直接返回數據給外部請求,如果還有下一步的操作就再將任務發佈到另外一個頻道,由另外一個消費者繼續監聽和處理生產者消費者模式下,多個消費者同時監聽一個隊裏,但是一個消息只能被最先搶到消息的消費者消費,即消息任務是一次性讀取和處理,此模式在分佈式業務架構中非常常用,比較常用的軟件還有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗

生產者發佈消息:(需要2臺同ip主機,一臺發佈,一臺監聽)

[root@centos7 ~]#redis-cli
127.0.0.1:6379> LPUSH channel1 msg1 生成一個隊列(列表)
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
去監聽:[root@centos7 data]#redis-cli
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1" 此時,3條消息沒有被處理,我們去執行命令,讓消費者把消息拿出來。
127.0.0.1:6379> RPOP channel1
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> RPOP channel1
"msg3"
在發佈者訂閱者模式下,發佈者將消息發佈到指定的 channel 裏面,凡是監聽該 channel 的消費者
都會收到同樣的一份消息,這種模式類似於是收音機模式,即凡是收聽某個頻道的聽衆都會收到主持
人發佈的相同的消息內容。 此模式常用語羣聊天、羣通知、羣公告等場景。
Subscriber:訂閱者 Publisher:發佈者 Channel:頻道
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗

訂閱者監聽頻道:

127.0.0.1:6379> SUBSCRIBE channel1 創建一個頻道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
現在我們去創建2個頻道:
127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 1
在訂閱者監聽頻道即可立即同步:
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel1"
3) "test2"

多頻道監聽:

127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel2 test2
(integer) 1
127.0.0.1:6379> PUBLISH channel3 test3
(integer) 0
此時去訂閱者頻道查看:由於沒有監聽channel3,所以3的消息收不到:
[root@centos7 data]#redis-cli
127.0.0.1:6379> SUBSCRIBE channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel2"
3) "test2"

redis 其他命令:

:CONFIG:config 命令用於查看當前 redis 配置、以及不重啓更改 redis 配置等
127.0.0.1:6379> CONFIG set maxmemory 8589934592 更改最大內存
OK
127.0.0.1:6379> CONFIG get maxmemory
1) "maxmemory"
2) "8589934592"
127.0.0.1:6379> CONFIG set timeout 600 更改超時時長
OK
127.0.0.1:6379> CONFIG get timeout
1) "timeout"
2) "600"

配置 reids 主從:

Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
Redis Slave 也要開啓持久化並設置和 master 同樣的連接密碼,因爲後期 slave 會有提升爲 master 的可能,Slave 端切換 master 同步後會丟失之前的所有數據。
一旦某個 Slave 成爲一個 master 的 slave,Redis Slave 服務會清空當前 redis 服務器上的所有數據並將master 的數據導入到自己的內存,但是斷開同步關係後不會刪除當前已經同步過的數據。

實驗:配置redis主從:

準備環境:2臺主機必須統一版本:200:master,150:slave
一、將150主機編譯好的redisscp到200主機,統一版本:[root@150 src]#ll
total 1708
drwxrwxr-x. 6 root root    4096 Mar 27 22:17 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 08:04 redis-4.0.14.tar.gz
[root@150 src]#scp redis-4.0.14.tar.gz 172.18.9.200:/usr/local/src/
[email protected]'s password:
redis-4.0.14.tar.gz                                                    100% 1700KB
二、在200主機:[root@200 apps]#make PREFIX=/apps/redis install  make編譯安裝
[root@200 redis-4.0.14]#cd /apps/
[root@200 apps]#ll
total 0
drwxr-xr-x. 3 root root 17 Mar 28 16:10 redis
[root@200 apps]#rm -rf redis/  將生成的redis刪除,把150主機的拷貝過來:
三、將150主機安裝編譯好的redis打包拷貝至200:[root@150 src]#cd /apps/
[root@150 apps]#ll
total 0
drwxr-xr-x. 7 redis redis 79 Mar 28 10:08 redis
[root@150 apps]#tar czf redis.tar.gz ./*

[root@150 apps]#scp redis.tar.gz 172.18.9.200:/apps/
[email protected]'s password:
redis.tar.gz                                                                    100% 7645KB  26.2MB/s   00:00  

四、200主機接收到做處理:[root@200 apps]#tar xf redis.tar.gz
[root@200 apps]#ll
total 7648
drwxr-xr-x. 7 1001 1001      79 Mar 28 10:08 redis
-rw-r--r--. 1 root root 7828073 Mar 28 16:17 redis.tar.gz

在200主機創建軟連接:[root@200 apps]#ln -sv /apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’

vim /apps/redis/etc/redis.conf         bind   0.0.0.0 (讓它監聽所有的IP)
[root@200 apps]#ps -ef |grep redis
root       8720   7748  0 17:18 pts/1    00:00:04 /apps/redis/bin/redis-server *:6379
root       9161   7748  0 17:56 pts/1    00:00:00 redis-cli -h 172.18.9.200
root       9180   7288  0 17:58 pts/0    00:00:00 grep --color=auto redis
[root@200 apps]#kill -9 8720
五、修改配置文件bind,並重啓:[root@200 apps]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@200 apps]#ss -ntl
State      Recv-Q Send-Q                          Local Address:Port                                         Peer Address:Port              
LISTEN     0      511                                         *:6379                                                    *:*                  
在200master上加上密碼:
172.18.9.200:6379> CONFIG SET requirepass 123gxy
OK
[root@200 src]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>

六、在150主機slave上修改配置文件:[root@150 ~]#vim /apps/redis/etc/redis.conf
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@150 ~]#ps -ef |grep redis
root      13830      1  0 19:42 ?        00:00:02 /apps/redis/bin/redis-server 0.0.0.0:6379
root      13896  13679  0 19:48 pts/0    00:00:00 redis-cli -h 172.18.9.200 -a 123gxy
root      13970  13730  0 19:54 pts/1    00:00:00 grep --color=auto redis
[root@150 ~]#kill -9 13830
七、重啓redis並查看:[root@150 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@150 ~]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>info
#Replication
role:master
connected_slaves:1
slave0:ip=172.18.9.150,port=6379,state=online,offset=728,lag=1   此時,說明主從已經成功。
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  這是正在連接的master的ID.
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:728
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:728

我們也可以在172.18.9.150slave上查看信息:
[root@150 ~]#redis-cli -h 172.18.9.150
172.18.9.150:6379> info
#Replication
role:slave
master_host:172.18.9.200
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1106
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79     此ID就是masterID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1106
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1106
本實驗結束。
主從複製過程:
Redis 支持主從複製分爲全量同步和增量同步,首次同步是全量同步,主從同步可以讓從服務器從主服務器備份數據,而且從服務器還可與有從服務器,即另外一臺 redis 服務器可以從一臺從服務器進行數據同步,redis 的主從同步是非阻塞的,其收到從服務器的 sync(2.8 版本之前是 PSYNC)命令會fork 一個子進程在後臺執行 bgsave 命令,並將新寫入的數據寫入到一個緩衝區裏面,bgsave 執行完成之後並生成的將 RDB 文件發送給客戶端,客戶端將收到後的 RDB 文件載入自己的內存,然後主 redis將緩衝區的內容在全部發送給從 redis,之後的同步從服務器會發送一個 offset 的位置(等同於 MySQL的 binlog 的位置)給主服務器,主服務器檢查後位置沒有錯誤將此位置之後的數據包括寫在緩衝區的積壓數據發送給 redis 從服務器,從服務器將主服務器發送的擠壓數據寫入內存,這樣一次完整的數據同步,再之後再同步的時候從服務器只要發送當前的 offset 位 置給主服務器,然後主服務器根據響應的位置將之後的數據發送給從服務器保存到其內存即可。Redis 全量複製一般發生在 Slave 初始化階段,這時 Slave 需要將 Master 上的所有數據都複製一份。
具體步驟如下:
1)從服務器連接主服務器,發送 SYNC 命令;
2)主服務器接收到 SYNC 命名後,開始執行 BGSAVE 命令生成 RDB 快照文件並使用緩衝區記錄此後執行的所有寫命令;
3)主服務器 BGSAVE 執行完後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
4)從服務器收到快照文件後丟棄所有舊數據,載入收到的快照;
5)主服務器快照發送完畢後開始向從服務器發送緩衝區中的寫命令;
6)從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩衝區的寫命令;
7)後期同步會先發送自己 slave_repl_offset 位置,只同步新增加的數據,不再全量同步。

Sentinel(哨兵):

Sentinel 進程是用於監控 redis 集羣中 Master 主服務器工作的狀態,在 Master 主服務器發生故障的
時候,可以實現 Master 和 Slave 服務器的切換,保證系統的高可用,其已經被集成在 redis2.6+的版本
中,Redis 的哨兵模式到了 2.8 版本之後就穩定了下來。一般在生產環境也建議使用 Redis 的 2.8 版本
的以後版本。哨兵(Sentinel) 是一個分佈式系統,你可以在一個架構中運行多個哨兵(sentinel) 進程,
這些進程使用流言協議(gossipprotocols)來接收關於 Master 主服務器是否下線的信息,並使用投票協
議(Agreement Protocols)來決定是否執行自動故障遷移,以及選擇哪個 Slave 作爲新的 Master。每個哨兵
(Sentinel)進程會向其它哨兵(Sentinel)、Master、Slave 定時發送消息,以確認對方是否”活”着,如果
發現對方在指定配置時間(可配置的)內未得到迴應,則暫時認爲對方已掉線,也就是所謂的”主觀認
爲宕機” ,英文名稱:Subjective Down,簡稱 SDOWN。有主觀宕機,肯定就有客觀宕機。當“哨兵
羣”中的多數 Sentinel 進程在對 Master 主服務器做出 SDOWN 的判斷,並且通過 SENTINEL is-masterdown-by-addr 命令互相交流之後,得出的 Master Server 下線判斷,這種方式就是“客觀宕機”,英文
名稱是:Objectively Down, 簡稱 ODOWN。通過一定的 vote 算法,從剩下的 slave 從服務器節點中,
選一臺提升爲 Master 服務器節點,然後自動修改相關配置,並開啓故障轉移(failover)。
Sentinel 機制可以解決 master 和 slave 角色的切換問題.

使用三臺服務器部署一主兩從,並基於sentinel實現redis 主從自動切換
準備環境:200做master,100/150做slave,好處:1、保證當slav發生宕機,還會有一個可用,2、當200宕機時,slave中還有主有從。
一、在100主機配置redis:
vim  /apps/redis/etc/redis.conf
bind 0.0.0.0
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@100 redis]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@100 redis]#ss -ntl
State       Recv-Q Send-Q                       Local Address:Port                             Peer Address:Port              
LISTEN      0      128                                     *:6379                                   *:*                           
[root@100 redis]#ln -sv /apps/redis/bin/* /usr/bin/  創建軟連接:
/apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
二、開啓200/150主機,並查看端口,此時在200master上查看info:
127.0.0.1:6379>info
# Replication
role:master
connected_slaves:2  2個slave:100/150.
slave0:ip=172.18.9.150,port=6379,state=online,offset=8316,lag=0
slave1:ip=172.18.9.100,port=6379,state=online,offset=8316,lag=1
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  200master主機的ID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:8316
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:8316
三、編輯配置文件sentinel.conf: 哨兵可以不和redis服務器部署在一起:這是模板:[root@150 redis-4.0.14]#grep -v "#" /usr/local/src/redis-4.0.14/sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

在200master主機配置哨兵文件:[root@200 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy
在150slave的哨兵文件:[root@150 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.150
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy在100slave的哨兵文件:[root@100 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.100   監聽地址
port 26379          監聽端口
daemonize yes       以守護進程運行
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2  此行最重要
sentinel auth-pass mymaster 123gxy四、在三臺主機啥那個啓動該文件服務:[root@200 ~]#redis-sentinel  /apps/redis/etc/sentinel.conf查看三臺主機的日誌:  [root@200 ~]#tail -f /apps/redis/logs/sentinel_26379.log
14161:X 28 Mar 21:58:03.456 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=14161, just started
14161:X 28 Mar 21:58:03.456 # Configuration loaded
14162:X 28 Mar 21:58:03.460 * Increased maximum number of open files to 10032 (it was originally set to 1024).
14162:X 28 Mar 21:58:03.463 * Running mode=sentinel, port=26379.
14162:X 28 Mar 21:58:03.466 # Sentinel ID is ed67a02807302d0cb768cd214f10e87b85a1428f
14162:X 28 Mar 21:58:03.466 # +monitor master mymaster 172.18.9.200 6379 quorum 2
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.150:6379 172.18.9.150 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.100:6379 172.18.9.100 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.081 * +sentinel sentinel b86489b5bf21cec43fcca110c6b84c0ee5cf95eb 172.18.9.100 26379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.095 * +sentinel sentinel f08c40b048f632b0f70f84d30c5f82ddcbeca5a9 172.18.9.150 26379 @ mymaster 172.18.9.200 6379
上述文字清楚的闡述了三臺master/slave的關係。五、把200master主機強行宕機:[root@200 src]#ps -ef |grep redis
root      12583      1  0 19:41 ?        00:00:19 /apps/redis/bin/redis-server 0.0.0.0:6379
root      14162      1  0 21:58 ?        00:00:03 redis-sentinel 172.18.9.200:26379 [sentinel]
root      14242  12483  0 22:01 pts/1    00:00:00 tail -f /apps/redis/logs/sentinel_26379.log
root      14291  12430  0 22:06 pts/0    00:00:00 grep --color=auto redis
[root@200 src]#kill -9 12583
六、去新master150主機看info信息:
# Replication
role:master
connected_slaves:1
slave:ip=172.18.9.100,port=6379,state=online,offset=728,lag=1   此時新的slave爲172.18.9.100主機,自動生成。
master_replid:69ae79e2ceba8aa9523996c216a946aaa3767808
master_replid2:5c575544ee6d8fb74eed78df0645e16640705e79
master_repl_offset:177021
second_repl_offset:126083
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:177021
七、再次看200主機的日誌:[root@200 src]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir "/apps/redis/data"                                                                                     
sentinel myid ed67a02807302d0cb768cd214f10e87b85a1428f
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.100 6379 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster 123gxy
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 3
sentinel known-slave mymaster 172.18.9.150 6379
sentinel known-slave mymaster 172.18.9.200 6379
sentinel known-sentinel mymaster 172.18.9.150 26379 f08c40b048f632b0f70f84d30c5f82ddcbeca5a9
sentinel known-sentinel mymaster 172.18.9.100 26379 b86489b5bf21cec43fcca110c6b84c0ee5cf95eb
sentinel current-epoch 3   標註內容爲日誌自動生成的信息。
以上實驗就是基於哨兵機制完成的,當master宕機,其中一臺從服務器會自動提升爲master主機.

我們從現在開始所有的實驗均在OpenStack公有云平臺創建的虛擬機操作,實例信息如下:
Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
此時我重新制作了redis主從,環境是基於redis軟件包均來自於其他已經編譯安裝好的主機拷貝而來的源碼包,軟件包等素材:
redis主從同步:
準備環境:172.20.102.99做master,172.20.102.213做slave;
一、先從別的主機把編譯安裝好的redis打包拷貝過來:
[root@150 apps]#ll
total 0 drwxr-xr-x. 7 redis redis 79 Mar 28 10:08 redis
[root@150 apps]#tar czf redis.tar.gz ./
[root@150 apps]#scp redis.tar.gz 172.20.102.99:/apps/
[email protected]'s password:
redis.tar.gz 100% 7645KB 26.2MB/s 00:00
99主機接收到做處理:[root@99 apps]#tar xf redis.tar.gz
[root@99 apps]#ll
total 7648
drwxr-xr-x. 7 1001 1001 79 Mar 28 10:08 redis
-rw-r--r--. 1 root root 7828073 Mar 28 16:17 redis.tar.gz
在99主機創建軟連接:[root@99 apps]#ln -sv /apps/redis/bin/
/usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
[root@99 apps]#ps -ef |grep redis
root 8720 7748 0 17:18 pts/1 00:00:04 /apps/redis/bin/redis-server :6379
root 9161 7748 0 17:56 pts/1 00:00:00 redis-cli -h 172.18.9.200
root 9180 7288 0 17:58 pts/0 00:00:00 grep --color=auto redis
[root@99 apps]#kill -9 8720
二、修改配置文件bind,並重啓:
vim /apps/redis/etc/redis.conf
bind 0.0.0.0 (讓它監聽所有的IP)
################################## SECURITY ###################################
requirepass 123gxy 給99master加上密碼
[root@99 apps]#redis-server /apps/redis/etc/redis.conf
[root@99 apps]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511
:6379 : [root@99 apps]#redis-cli -h 172.20.102.99 -a 123gxy
172.20.102.99:6379>
三、172.20.102.213slave主機同理完成上述步驟。
四、可以在master/slave主機分別查看info信息:
172.20.102.99:6379> info
#Replication
role:master
connected_slaves:1
slave0:ip=172.20.102.213,port=6379,state=online,offset=2604,lag=1
master_replid:9c5a2ea94b2bb360996ff027d91e84b9c8e0a8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2604
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2604
172.20.102.213:6379> info
#Replication
role:slave
master_host:172.20.102.99
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:2772
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9c5a2ea94b2bb360996ff027d91e84b9c8e0a8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2772
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2772
到此,主從同步已實現。

實驗:實現6節點的redis cluster集羣,並測試實現master宕機後 slave角色切換爲master成功

Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換、redis集羣實驗
準備環境:共使用2臺主機,1、每個redis 弄得節點採用相同的硬件配置,相同的密碼,
2、每個節點必須開啓的參數cluster-enabled yes #必須開啓集羣狀態,開啓後redis進程會有cluster顯示;cluster-config-file nodes-6380.conf #此文件有redis cluster 集羣自動創建和維護,不需要任何手動操作,
3、所有redis服務器必須沒有任何數據,
4、先啓動爲單機redis且沒有任何key value
在做實驗之前,99主機時master狀態:
一、mkdir /apps/redis/{logs,data,run} -pv
[root@99 data]#cd /apps/redis/etc/
[root@99 etc]#ll
total 184
-rw-r--r-- 1 root root 58842 Apr 2 15:44 redis_6379.conf
-rw-r--r-- 1 root root 58843 Apr 2 15:15 redis_6380.conf
-rw-r--r-- 1 root root 58843 Apr 2 15:23 redis_6381.conf
把上述三個文件的端口及(準備環境2)統一配置,並將[root@99 etc]#redis-cli -h 172.20.102.99 -a 123gxy
172.20.102.99:6379> keys
(empty list or set)
[root@99 data]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128
:6379 :
LISTEN 0 128 :6380 :
LISTEN 0 128
:6381 :
LISTEN 0 128 :111 :
LISTEN 0 128
:22 :
LISTEN 0 128 :16379 :
LISTEN 0 128
:16380 :
LISTEN 0 128 :16381 :
LISTEN 0 128 :::111 ::

LISTEN 0 128 :::22 :::
[root@99 data]#ps -ef |grep redis
root 12572 1 2 15:36 ? 00:00:12 redis-server 0.0.0.0:6380 [cluster]
root 12577 1 2 15:36 ? 00:00:12 redis-server 0.0.0.0:6381 [cluster]
root 12600 1 3 15:44 ? 00:00:00 redis-server 0.0.0.0:6379 [cluster]
root 12606 12455 0 15:45 pts/1 00:00:00 grep --color=auto redis
此時,99主機的集羣已建好。
二、172.20.102.213主機同理修改配置,ss -ntl 的效果同上。
三、Redis 3 和 4 版本:需要使用到集羣管理工具 redis-trib.rb,這個工具是 redis 官方推出的管理 redis 集羣的工具,集成在redis 的源碼 src 目錄下,是基於 redis 提供的集羣命令封裝成簡單、便捷、實用的操作工具,需要先搭建ruby環境,默認yum安裝版本較低,需編譯安裝ruby 注意:我們使用兩臺主機做實驗,但是隻在一臺主機上編譯安裝ruby即可。
1、wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.6.tar.gz
2、tar xf ruby-2.2.6.tar.gz / cd ruby-2.2.6/
3、./configure / make -j 4 / make install
4、ln -sv /usr/local/src/ruby-2.2.6/bin/gem /usr/bin/
ln -sv /usr/local/src/ruby-2.2.6/ruby /usr/bin/
5、yum install rubygems / 6、 gem install redis
我要在150主機上:[root@centos7 src]#scp /usr/local/src/redis-4.0.14.tar.gz 172.20.102.99:/usr/local/src 才能在99主機顯示出源碼包
7、[root@host-172-20-102-99 src]#ln -s /usr/local/src/redis-4.0.14/src/redis-trib.rb /usr/bin/
四、創建集羣 Cluster:
8、[root@host-172-20-102-99 ~]#redis-trib.rb create --replicas 1 172.20.102.99:6379 172.20.102.99:6380 172.20.102.99:6381 172.20.102.106:6379 172.20.102.106:6380 172.20.102.106:6381

Creating cluster
[ERR] Sorry, can't connect to node 172.20.102.99:6379
這時,把下面的刪除ruby/gem 包刪除,root@host-172-20-102-99 src]#find / -name ruby
/usr/bin/ruby
/usr/lib/gems/ruby
/usr/lib64/ruby
/usr/lib64/gems/ruby
/usr/share/ruby
/usr/local/bin/ruby
/usr/local/include/ruby-2.2.0/ruby
/usr/local/include/ruby-2.2.0/x86_64-linux/ruby
/usr/local/lib/ruby
/usr/local/share/doc/ruby
/usr/local/src/ruby-2.2.6/include/ruby
/usr/local/src/ruby-2.2.6/test/ruby
/usr/local/src/ruby-2.2.6/.ext/include/x86_64-linux/ruby
/usr/local/src/ruby-2.2.6/.ext/include/ruby
/usr/local/src/ruby-2.2.6/ruby
[root@host-172-20-102-99 src]#rm -fr /usr/local/bin/ruby
[root@host-172-20-102-99 src]#rm -fr /usr/local/bin/gem
我們去官網下載2.5.4版本:官網:https://cache.ruby-lang.org/pub/ruby/
./configure / make -j 4 / make install 操作步驟同上。
我在把編譯好的redis包拷貝過來時沒有及時清除數據,導致一直創建失敗,我們先把進程kill掉,再把/apps/redis/data/ 下的數據rm rf *清除,再開啓redis服務,即可create集羣,如下:

8、[root@host-172-20-102-99 data]#redis-trib.rb create --replicas 1 172.20.102.99:6379 172.20.102.99:6380 172.20.102.99:6381 172.20.102.106:6379 172.20.102.106:6380 172.20.102.106:6381

Creating cluster
Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.20.102.99:6379
172.20.102.106:6379
172.20.102.99:6380
Adding replica 172.20.102.106:6381 to 172.20.102.99:6379
Adding replica 172.20.102.99:6381 to 172.20.102.106:6379
Adding replica 172.20.102.106:6380 to 172.20.102.99:6380
M: 8725a9685bf6c52dd3263194f4ad7da6c6c24baa 172.20.102.99:6379
slots:0-5460 (5461 slots) master
M: 7042631de5447102acca741fc2b59ee6d9cca515 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
S: 3c8b10b610cdceead21ec7595577553e2c91f9a1 172.20.102.99:6381
replicates 26591095c161256cba647303f1e670a7235a681e
M: 26591095c161256cba647303f1e670a7235a681e 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
S: b3ae2163ef2768a9e30849c5489b3f1b472a7c9a 172.20.102.106:6380
replicates 7042631de5447102acca741fc2b59ee6d9cca515
S: 748b5de0c7a29232e533e589cdc9667013d50f56 172.20.102.106:6381
replicates 8725a9685bf6c52dd3263194f4ad7da6c6c24baa
Can I set the above configuration? (type 'yes' to accept): yes
Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
Performing Cluster Check (using node 172.20.102.99:6379)
M: 8725a9685bf6c52dd3263194f4ad7da6c6c24baa 172.20.102.99:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 3c8b10b610cdceead21ec7595577553e2c91f9a1 172.20.102.99:6381
slots: (0 slots) slave
replicates 26591095c161256cba647303f1e670a7235a681e
S: b3ae2163ef2768a9e30849c5489b3f1b472a7c9a 172.20.102.106:6380
slots: (0 slots) slave
replicates 7042631de5447102acca741fc2b59ee6d9cca515
S: 748b5de0c7a29232e533e589cdc9667013d50f56 172.20.102.106:6381
slots: (0 slots) slave
replicates 8725a9685bf6c52dd3263194f4ad7da6c6c24baa
M: 7042631de5447102acca741fc2b59ee6d9cca515 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 26591095c161256cba647303f1e670a7235a681e 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.

9、[root@host-172-20-102-99 ~]#redis-trib.rb check 172.20.102.99:6379

Performing Cluster Check (using node 172.20.102.99:6379)
M: f76c3a3c86715300192d41cf581e3923be041d80 172.20.102.99:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 8c51f6eba48c2e89b97b7f89b09130dfa157c25b 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 62926b03972c5fd04dc9ef26e61219abdfc806f9 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: fa9c3ca0053bbb6ecf932caf672ab92e3a0c4e1a 172.20.102.99:6381
slots: (0 slots) slave
replicates 62926b03972c5fd04dc9ef26e61219abdfc806f9
S: 865f310d0cf5e085e04fb45cfa03f036d58dd6cc 172.20.102.106:6380
slots: (0 slots) slave
replicates 8c51f6eba48c2e89b97b7f89b09130dfa157c25b
S: 22f1ec81b6286d371ab0a4b80296dd3595b64b0a 172.20.102.106:6381
slots: (0 slots) slave
replicates f76c3a3c86715300192d41cf581e3923be041d80
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.

10、[root@host-172-20-102-99 ~]#redis-trib.rb info 172.20.102.99:6379
172.20.102.99:6379 (f76c3a3c...) -> 0 keys | 5461 slots | 1 slaves.
172.20.102.99:6380 (8c51f6eb...) -> 0 keys | 5461 slots | 1 slaves.
172.20.102.106:6379 (62926b03...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

11、由於未設置 masterauth 認證密碼, 所以主從未建立起來, 但是集羣已經運行,所以需要在每個 slave控制檯使用 config set 設置 masterauth 密碼,或者寫在每個 redis 配置文件中,最好是在控制點設置密碼之後再寫入配置文件當中
[root@host-172-20-102-99 data]#redis-cli -h 172.20.102.99 -p 6381 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.99:6381> CONFIG SET masterauth 123gxy
OK
[root@host-172-20-102-106 ~]#redis-cli -h 172.20.102.106 -p 6380 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.106:6380> CONFIG SET masterauth 123gxy
OK
[root@host-172-20-102-99 data]#redis-cli -h 172.20.102.99 -p 6380 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.99:6380> CONFIG SET masterauth 123gxy
OK
在此處,我出現的問題是,主從一直無法實現連接,這時,要把三主三從的redis.conf文件中的“requirepass”打開!才能實現主從連接。
12、我們去查看slave主機的info信息:
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.99 -p 6381 -a 123gxy
#Replication
role:slave
master_host:172.20.102.106
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:154
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c0970c4698e60710fc9c0b98da3e354b328b5b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6381 -a 123gxy
#Replication
role:slave
master_host:172.20.102.99
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:770
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f0add08804cda3e766b8a9cb83c5b2491403db94
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:770
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:225
repl_backlog_histlen:546
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6380 -a 123gxy
#Replication
#Replication
role:slave
master_host:172.20.102.99
master_port:6380
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:840
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1cf7e013cf37d0e97f1f9c0e59bf3581ad864746
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:840
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:211
repl_backlog_histlen:630

13、驗證集羣狀態:[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.99 -p 6379 -a 123gxy
172.20.102.99:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3214
cluster_stats_messages_pong_sent:964
cluster_stats_messages_fail_sent:4
cluster_stats_messages_sent:4182
cluster_stats_messages_ping_received:964
cluster_stats_messages_pong_received:939
cluster_stats_messages_fail_received:3
cluster_stats_messages_received:1906
14、集羣維護之模擬master宕機:A: 測試在 master 寫入數據,並在其對應的 slave 驗證數據:
[root@host-172-20-102-99 etc]#redis-cli -h 172.20.102.99 -p 6379 -a 123gxy
172.20.102.99:6379> SET key2 value2
OK
172.20.102.99:6379> get key2
"value2"
SLAVE驗證數據:
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6381 -a 123gxy
172.20.102.106:6381> keys *
1) "key2"
15、redis 的mastr被kill後,slave自動升爲master,原master在重新啓動後變爲slave。不需要手動干預
至此,redis集羣實驗全部劇終。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章