一、簡介
Redis支持將數據同步到多台slave上,這種特性對提高讀取性能非常有益
1)master可以有多台slave
2) 除了多個slave連到相同master外,slave也可以連接到其它slave形成圖狀結構
3)主從復制不會阻塞master,也就是說當一個或多個slave與master連接進行復制時,master可以繼續處理客戶端發來的請求,相反slave在初次同步數據時則會阻塞,不能處理客戶端請求
4)主從復制可以用來提高系統的伸縮性,我們可以用多個slave專門負責客戶端的讀請求,可以做數據冗余
5)可以在master禁用數據持久化,只需要注釋掉master配置文件redis.conf的save配置,然后只在slave配置持久化
二、Demo
博主這里就沒裝多台機器,本來可以用三台虛擬機建一個局域網,來實現redis的主從復制,在這里偷下懶,利用啟動多個配置文件來取代,這里一共有三個redis.conf文件,如下:
[jacky@jacky ~]$ su 密碼: [root@jacky jacky]# cd /etc/redis [root@jacky redis]# ls -l 總用量 176 -rw-r--r--. 1 root root 41576 11月 3 22:03 redis6379.conf -rw-r--r--. 1 root root 41560 11月 3 20:08 redis6380.conf -rw-r--r--. 1 root root 41560 11月 3 20:08 redis6381.conf
2.1、主要修改配置文件的以下信息,例如修改redis8381.conf,同理,redis6379.conf和redis6380.conf也一樣
daemonize yes pidfile /var/run/redis6381.pid port 6381 logfile "6381.log" dbfilename dump6381.rdb
2.2、一主二從
在這里博主設置79為master;80和81為slave,配置redis主從復制的時候只需要配置從機不需要配置主機(配主補配從)
6380 配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
6381 配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
就這樣,一主二從配置就完畢了,哈哈,很簡單吧,79原來的數據和新的數據都會同步到80和81上,如下
6379
127.0.0.1:6379> set k1 v1 #沒配置主從之前插入的 OK 127.0.0.1:6379> set k2 v2 #沒配置主從之前插入的 OK 127.0.0.1:6379> set k3 v3 #沒配置主從之前插入的 OK 127.0.0.1:6379> set k4 v4 #配置主從之后插入的 OK
6380
k1和k4都能拿到
127.0.0.1:6380> get k4 "v4" 127.0.0.1:6380> get k1 "v1"
6381
k3和k4都能拿到
127.0.0.1:6381> get k4 "v4" 127.0.0.1:6381> get k3 "v3"
到這里,一主二從配置成功,但是在生產時,master和slave都有可能突然之間死機,
1)如果主機死掉了,默認情況下,主機重新啟動,角色還是主機
2)如果從機死掉了,默認情況下,從機重新啟動,角色變成沒有獨立主機了,需要重新配置,除非從機在redis.conf文件里配置了,否則從機不會
重新連接主機
3)讀寫分離,是指redis從機只能負責讀,不能寫,主機能夠寫能夠讀
2.3、新火相傳
新火相傳的意思其實就是去中心化,現在只有80和81兩台slave連接master,假如,有100台slave的話,那么master就壓力很大了,所以redis又推出了新火相傳的解決方案,上一台slave,可以下一台slave的master.
79和80不改變,在81上配置如下:
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK
這樣就在79上插入一個值,也可以同步到81
2.4、反客為主
上面提到了,當master死機的時候,重寫啟動還是master,現在時,我是想當master死機的時候,讓某一台從機變成主機,這里是,讓80變成主機,
只要當master死機器的時候,手動在80執行如下命令:
127.0.0.1:6380> SLAVEOF no one
同時,81也要重新配置,配置80為主機
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK
2.5、哨兵模式
簡單的說,哨兵模式,就是反客為主的自動版,通過監控主機,當主機掛掉的時候,就幾台從機中透過投票選出新的主機
2.5.1 在 /etc/redis/目錄下新建一個sentinel.conf文件
里面的內容為
sentinel monitor host6379 127.0.0.1 6379 1
host6379為監控的主機名詞,自定義的,后面的“1”表示,當主機掛掉的時候,從機自動進行投票,誰的票數首先超過“1”,誰就為主機
2.5.2 啟動sentinel.conf 文件
[root@jacky bin]# ./redis-sentinel /etc/redis/sentinel.conf 15482:X 05 Nov 17:44:31.958 * Increased maximum number of open files to 10032 (it was originally set to 1024). 15482:X 05 Nov 17:44:31.960 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now. _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.6 (00000000/0) 32 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 15482 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 15482:X 05 Nov 17:44:31.966 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 15482:X 05 Nov 17:44:31.966 # Sentinel runid is 7cb8075de28bb16320934364995643e41ac24f67 15482:X 05 Nov 17:44:31.966 # +monitor master host6379 127.0.0.1 6379 quorum 1 15482:X 05 Nov 17:45:01.982 # +sdown master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.982 # +odown master host6379 127.0.0.1 6379 #quorum 1/1 15482:X 05 Nov 17:45:01.982 # +new-epoch 1 15482:X 05 Nov 17:45:01.982 # +try-failover master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.997 # +vote-for-leader 7cb8075de28bb16320934364995643e41ac24f67 1 15482:X 05 Nov 17:45:01.997 # +elected-leader master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:01.997 # +failover-state-select-slave master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:02.060 # -failover-abort-no-good-slave master host6379 127.0.0.1 6379 15482:X 05 Nov 17:45:02.129 # Next failover delay: I will not start a failover before Sat Nov 5 17:51:02 2016
這樣就算完成了
注意:就是當原來的master回來后,不是做獨立的mater,而是做新主機的slave