文章目錄
- 1、redis安裝
- 1.1、下載reids.tar.gz
- 1.2、上傳redis到linux服務器的/opt目錄下,並賦予相應權限並解壓。
- 1.3、安裝redis
- 1.4、在根目錄下創建文件夾myredis
- 1.5、修改myredis中的redis.conf配置文件
- 1.6、進入/usr/local/bin目錄下運行redis
- 1.7、redis客戶端連接測試
- 2、模擬三臺redis服務器
- 3、主從複製
- 3.1、什麼是主從複製?
- 3.2、有什麼用?
- 3.3、 怎麼實現主從複製呢?
- 4、總結
1、redis安裝
1.1、下載reids.tar.gz
下載地址:http://download.redis.io/releases/,可以在這裏下載你所需要的linux系統下的redis版本,本次教程實用的是redis-5.0.0
1.2、上傳redis到linux服務器的/opt目錄下,並賦予相應權限並解壓。
文件授權命令:chmod 755 redis-5.0.0.tar.gz
授權是爲了可以讓文件解壓。
解壓命令:tar -zvxf redis-5.0.0.tar.gz
解壓之後可見文件 redis-5.0.0
1.3、安裝redis
進入解壓出來的redis文件夾
命令: cd /opt/redis-5.0.0
使用redis安裝命令
命令:make
make命令執行完,再執行一條安裝命令。
命令:make install
出現一推install,說明安裝成功。
1.4、在根目錄下創建文件夾myredis
此文件創建在哪都行,爲了方便就直接創建在根目錄下
命令:mkdir myredis
將reids-5.0.0下的redis.conf複製一份到myredis
命令:cp /opt/redis-5.0.0/redis.conf /myredis
1.5、修改myredis中的redis.conf配置文件
在myredis目錄下編輯reids.conf
命令: vi redis.conf
需將darmonize 的 no 改爲 yes
1.6、進入/usr/local/bin目錄下運行redis
進入/usr/local/bin可以看到許多redis安裝過的組件
命令:cd /usr/local/bin
利用自己的配置文件進行redis的啓動
執行啓動命令:redis-server /myredis/redis.conf
reids啓動後會佔據本次linux連接使用,從新開啓一個linux連接,可看到啓動後默認端口爲6379,可以記作(63=7*9)。
這裏主要是給大家看一下redis安裝之後會將自己的各個啓動組件都放在/usr/local/bin目錄下,在linux中該目錄下的程序是可以在任意目錄下使用的。
1.7、redis客戶端連接測試
先看服務器是否已啓動redis
命令:ps -ef|grep redis
在/usr/local/bin下使用客戶端連接命令
命令:redis-cli -h 127.0.0.1 -p 6379
連接成功,提示會變爲127.0.0.1:6379>
這時向redis發送 ping 就會得到 pong 迴應
設值test
命令:set k1 xxx
獲值test
命令: get k1
完成以上步驟說明redis已經在你的服務器上跑起來了,下面就開衝。
2、模擬三臺redis服務器
2.1、在myredis文件夾下複製三個redis.conf
命令:
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
2.2、修改三個複製出來的reids配置文件(以redis6379.conf爲例)
2.2.1、daemonize修改
daemonize no -> daemonize yes
2.2.2、pid文件修改
pidfile /var/run/redis.pid -> pidfile /var/run/redis6379.pid
2.2.3、指定端口
port xxxx -> port 6379
2.2.4、log文件名字
logfile “” -> logfile “6379.log”
2.2.5、dump.rdb名字
dbfilename dump.rdb -> dbfilename dump6379.rdb
以上對配置的修改以redis6379.conf爲例,其中redis6380.conf、redis6381.conf的修改依照reids6379.conf的修改,只需將 “6379”->“6380"或"6381”。
2.3、啓動三臺reids服務器
本次是一臺服務器模仿的三臺服務器,所以實質上是三個redis進程在一臺linux上運行。
先查看後臺是否有關於redis的服務進程。
命令:ps -ef|grep redis
若是有關於reids的進程,先將其關閉
命令:kill 9 進程號(本次實驗中爲9763,所以使用 kill 9 9763 可以殺死該reids進程)
依次啓動三個redis服務器(任意目錄下輸入下面命令,即可啓動)
命令:
redis-server /myredis/redis6379.conf
redis-server /myredis/redis6380.conf
redis-server /myredis/redis6381.conf
啓動後查看redis進程,可以看到後臺有三個redis進程。
3、主從複製
3.1、什麼是主從複製?
主從複製是Redis是redis自帶的功能特性,這個特性在其他數據庫也有,比如關係型數據庫mysql,主機是master,從機是slave,若是兩臺主機形成主從關係,則主機負責對客戶端請求寫操作,從機一直在監聽着主機的變化,將主機的數據同步到自己的數據庫上,若是客戶端請求讀,可以請求從機,不用去主機讀。
3.2、有什麼用?
實現主從的讀寫分離,提高了系統的併發性能。
提高容災性。
3.3、 怎麼實現主從複製呢?
總的來說可以有三種一主二僕、中間人模式、反客爲主
3.3.1、 一主二僕
3.3.1.1、首先啓動三臺linux服務器客戶端,目的是啓動三臺redis客戶端。
依次在三個redis客戶端打命令:
redis-cli -p 6379
redis-cli -p 6380
reids-cli -p 6381
3.3.1.2、建立連接後查看各自的身份
依次打命令:info replication
可以看到三臺redis都是獨立的,自己的身份都是master,連接master的slave都是 0
3.3.1.3、使其中兩臺reids服務器作爲一臺的從服務器
這裏我們選用6379端口作爲主服務,6380、6381端口作爲從服務器。
在6380、6381連接客戶端輸入連接reids-master命令:slaveof ip port
命令:slaveof 127.0.0.1 6379
這裏我使用ip地址爲迴環地址127.0.0.1,是因爲是一個linux服務器三個redis進程模擬三臺redis服務器。
之後再次查看三臺redis服務器的地址
可見6379端口號的redis服務器身份仍然爲master,但此時連接的slave爲2
6380、6381端口號的redis服務器身份爲slave,且連接master的套接字爲127.0.0.1:6379
3.3.1.4、讀寫分離與同步test
小結論:master可讀可寫,slave只能讀不能寫。
剛開始主從無值,master開始寫,slave機在默默的同步
之後slave嘗試寫,但失敗。
3.3.2、中間人模式
爲了防止master的資源被過多佔用,中間人模式出現了,將革命的精神薪火相傳,也就說,其中一臺slave直接同步別的slave的數據,不再同步master了。
3.3.2.1、設置中間人
這裏我們選擇6380端口號的slave作爲中間人,使6381端口號的slave直接同步6380端口的slave。
在6381端口號的reids客戶端輸入命令:slave 127.0.0.1 6380
身份分析:
之後再查看各個redis服務器的身份狀態。
可見6379身份仍然爲master,6380、6381身份仍然爲slave。
6379只剩下6380一個slave。
6380雖然爲slave,但是也有一個slave連接了它,而且就是6381。
6381連接的master是6380
3.3.2.1、中間人模式test
從測試結果來看,中間人模式中也是隻有master才能寫,slave只能讀;而且充當中間人的slave也不能寫,它會將自己同步到master的數據同步到連接到它的slave。
3.3.3、反客爲主
有這一個機制是爲防止master宕機,redis集羣處於不可使用狀態–只能讀舊值,不能寫入新值。
這樣就需要從新獨立出一個master。
(以下實驗前,將redis的集羣,配置成主從複製最初模式)
3.3.3.1、模擬master宕機了
在6379端口redis連接客戶端中使用 shutdown ,關閉當前redis服務端。
此次實驗中用6379端口是master,此時相當與redis的主從關係中,已經沒有master了。
這時,從機slave不做任何操作,我們將6379的master重新啓動會怎麼樣呢?
沒錯(??? 怎麼就沒錯了,你啥也沒說啊)!!! 這時我們在對master寫入,可以看到,slave仍然能同步master的最新信息。這也說明, 是slave在監視master,而不是master進行推送。
3.3.3.2、模擬slave宕機了
slave宕機之後,再令其重啓,再查看它的身份已經是master了,而且改重啓的reids服務器,不會再將它之前在master上同步得到的數據再次放回內存。
而且這時對6379這臺master進行設值,可以看到重啓的6380端口的redis是不會同步6379端口的redis的數據更新的。
小結論:slave重啓之後,默認變回master,自己玩去了,不在之前的圈子混了。
若想解決slave重啓仍然在redis分佈系統裏面,可以將配置寫在redis.conf裏面。
3.3.3.2、slave如何上位?
說到 slave上位,也就是一個命令。
在一個slave客戶端輸入命令:slaveof no one
當前環境爲一主二僕,master爲6379,slave爲6380和6381。
6380的slave使用命令:slaveof no one
最後再看大家的身份變化,可見6380成爲一個獨立的中心點了,也就是相當於它宕機後再回來了。
3.3.4、哨兵模式
是不是很多小夥伴直接跳到這裏,但還是要看下一主二僕配置,master爲6379,slave爲6380、6381的結構。
3.3.4.1、新建哨兵配置文件
- 在/myredis文件夾下,直接命令: vi sentinel.conf
- 進入編輯頁面,填入這一段文本:sentinel monitor master6379 127.0.0.1 6379 1
- 保存並退出。
3.3.4.2、啓動哨兵
任意目錄下使用命令:redis-sentinel /myredis/sentinel.conf
這時哨兵已經在監控着6379這臺master和其所在的主從系統。
3.3.4.3、查看現在redis的主從系統。
3.3.4.4、模擬6379master宕機
- 在6379的客戶端使用 shutdown ,表示當前6379這臺master宕機了。
- 等一小會之後,在此查看主從系統中各個redis服務器的狀態,可見此時6381這臺slave變成了master;6380仍然是slave,但是它的master變成了6381。
- 在6381這臺master賦值,再查看系統的所存值,可知,系統之前的值保留,新加的值同步了。
3.3.4.4、模擬之前6379master宕機之後重啓
總結一句:老領導過氣了。
重啓6379這臺redis服務器之後,查看其狀態,可以看到,它自動成了salve,而且它的master就是哨兵系統選出來的6381master。
3.3.4.4、哨兵模式總結
讓系統有了自動化,提高了系統的可用性和可靠性。
4、總結
- redis安裝很簡單,使用也很簡單,但是實質的系統不會是單機的redis,肯定是集羣發佈的,所以我們需掌握其集羣搭建。
- 主從複製的讀寫分離中,對於數據的同步:slave連接master時,第一次是全量複製master
數據,往後就是增量複製master數據。 - 現在一般使用的技術就是哨兵模式。
- 若是跟着本文一步步走不能復現操作,歡迎大家一起交流解決問題哦!!!