天天看點

Redis多執行個體及主從環境搭建

之前的文章《Redis介紹及CentOS 7安裝redis 4.0詳細步驟》介紹了Redis4.0單執行個體的安裝,在實際的生産中,單執行個體存在的非常少,是以下面我們就在上述的基礎上,部署Redis多執行個體及主從複制環境;

一、redis主從複制原理

和MySQL主從複制的原因一樣,Redis雖然讀取寫入的速度都特别快,但是也會産生讀壓力特别大的情況。為了分擔讀壓力,Redis支援主從複制,Redis的主從結構可以采用一主多從或者級聯結構,Redis主從複制可以根據是否是全量分為全量同步和增量同步。下圖為級聯結構

Redis多執行個體及主從環境搭建

1、全量同步

Redis全量複制一般發生在Slave初始化階段,這時Slave需要将Master上的所有資料都複制一份。具體步驟如下:

1)從伺服器連接配接主伺服器,發送SYNC指令;

2)主伺服器接收到SYNC命名後,開始執行BGSAVE指令生成RDB檔案并使用緩沖區記錄此後執行的所有寫指令;

3)主伺服器BGSAVE執行完後,向所有從伺服器發送快照檔案,并在發送期間繼續記錄被執行的寫指令;

4)從伺服器收到快照檔案後丢棄所有舊資料,載入收到的快照;

5)主伺服器快照發送完畢後開始向從伺服器發送緩沖區中的寫指令;

6)從伺服器完成對快照的載入,開始接收指令請求,并執行來自主伺服器緩沖區的寫指令;

Redis多執行個體及主從環境搭建

完成上面幾個步驟後就完成了從伺服器資料初始化的所有操作,從伺服器此時可以接收來自使用者的讀請求。

2、增量同步

Redis增量複制是指Slave初始化後開始正常工作時主伺服器發生的寫操作同步到從伺服器的過程。

增量複制的過程主要是主伺服器每執行一個寫指令就會向從伺服器發送相同的寫指令,從伺服器接收并執行收到的寫指令。

備注:redis2.8之前不支援增量,到2.8之後就支援增量了!

3、Redis主從同步政策

主從剛剛連接配接的時候,進行全量同步;全同步結束後,進行增量同步。當然,如果有需要,slave 在任何時候都可以發起全量同步。redis 政策是,無論如何,首先會嘗試進行增量同步,如不成功,要求從機進行全量同步。

4、注意事項

如果多個Slave斷線了,需要重新開機的時候,因為隻要Slave啟動,就會發送sync請求和主機全量同步,當多個同時出現的時候,可能會導緻Master IO劇增當機。

二、Redis單主機多執行個體部署

前提是之前已經安裝了一個單執行個體的redis,詳細可參考:《Redis介紹及CentOS 7安裝redis 4.0詳細步驟》

1、複制兩份redis配置檔案

[root@VM_2_13_centos ~]# cp /etc/redis/redis.conf /etc/redis/redis6311.conf  
[root@VM_2_13_centos ~]# cp /etc/redis/redis.conf /etc/redis/redis6322.conf   
 
[root@VM_2_13_centos ~]# ll /etc/redis/
total 192
-rw-r--r-- 1 root root 58976 May 29 20:37 redis6311.conf
-rw-r--r-- 1 root root 58976 May 29 20:37 redis6322.conf
-rw-r--r-- 1 root root 58976 May 29 20:33 redis.conf           

複制

2、修改配置檔案redis6311.conf和redis6322.conf

[root@VM_2_13_centos ~]# vim /etc/redis/redis6311.conf 
# 監聽端口号,預設為 6379,如果你設為 0 ,redis 将不在 socket 上監聽任何用戶端連接配接。
port 6311
# 預設情況下 redis 不是作為守護程序運作的,如果你想讓它在背景運作,你就把它改成 yes。
daemonize yes
# 當redis作為守護程序運作的時候,它會把 pid 預設寫到 /var/run/redis.pid 檔案裡面
# 但是你可以在這裡自己制定它的檔案位置。
pidfile /var/run/redis/redis_6311.pid
# 指定日志檔案的位置,不同的執行個體設定不同的日志檔案,便于問題定位
logfile /var/log/redis/redis_6311.log
# 設定dump的檔案名稱,不同的執行個體設定不同的db檔案,便于問題定位
dbfilename dump_6311.rdb
# 工作目錄 # 例如上面的 dbfilename 隻指定了檔案名,但是它會寫入到這個目錄下。 # 這個配置項一定是個目錄,而不能是檔案名。
# 這個配置項預設值為“./”,最好改相對路徑為絕對路徑 
# 如果為相對路徑,redis在哪裡啟動,dump.rdb檔案就會産生在啟動的目錄,這也就是有些人重新開機redis後key值消失的原因
dir /var/lib/redis/6311
#配置密碼
requirepass qXXXXXXXX           

複制

3、啟動端口為6311的redis

[root@VM_2_13_centos ~]# redis-server /etc/redis/redis6311.conf 
[root@VM_2_13_centos ~]# 
[root@VM_2_13_centos ~]# ps -ef | grep redis                    
root      6938     1  0 21:14 ?        00:00:00 redis-server 127.0.0.1:6379
root      7001     1  0 21:15 ?        00:00:00 redis-server 127.0.0.1:6311
root      7009  1905  0 21:15 pts/1    00:00:00 grep --color=auto redis           

複制

4、用戶端登入

[root@VM_2_13_centos ~]# redis-cli -p 6311
127.0.0.1:6311> 
127.0.0.1:6311> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6311> 
127.0.0.1:6311> auth qcloud@2018
OK
127.0.0.1:6311> keys *
(empty list or set)           

複制

按照上面的方式配置6322端口的redis,并啟動

[root@VM_2_13_centos ~]# redis-server /etc/redis/redis6322.conf  
[root@VM_2_13_centos ~]# ps -ef | grep redis
root      6938     1  0 21:14 ?        00:00:00 redis-server 127.0.0.1:6379
root      7001     1  0 21:15 ?        00:00:00 redis-server 127.0.0.1:6311
root      7264     1  0 21:20 ?        00:00:00 redis-server 127.0.0.1:6322
root      7279  1905  0 21:20 pts/1    00:00:00 grep --color=auto redis           

複制

三、redis主從環境搭建

1、修改6311和6322的配置檔案,主redis為6379端口的redis

[root@VM_2_13_centos ~]# vim /etc/redis/redis6311.conf 
slaveof localhost 6379
# masterauth 
masterauth qXXXXXXXX           

複制

注意:如果主執行個體配置了密碼,那麼從執行個體必須配置masterauth,否則同步不成功

2、檢視配置是否成功

主庫:

127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6311,state=online,offset=179,lag=0
slave1:ip=127.0.0.1,port=6322,state=online,offset=179,lag=0
master_replid:d2450e24238b6612630368c6408fd4a9b098da16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:179
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:179           

複制

從庫:

127.0.0.1:6311> info Replication
# Replication
role:slave
master_host:localhost
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:277
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d2450e24238b6612630368c6408fd4a9b098da16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:277
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:277
 
127.0.0.1:6322> info Replication
# Replication
role:slave
master_host:localhost
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:319
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d2450e24238b6612630368c6408fd4a9b098da16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:319
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:319           

複制

3、主從同步測試:

主庫:

127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> 
127.0.0.1:6379> set age 22
OK           

複制

從庫:

[root@VM_2_13_centos ~]# redis-cli -p 6311
127.0.0.1:6311> auth qXXXXXXX
OK
127.0.0.1:6311> keys *
1) "name"
127.0.0.1:6311> get age
"22"
 
[root@VM_2_13_centos ~]# redis-cli -p 6322
127.0.0.1:6322> auth qXXXXXXXX
OK
127.0.0.1:6322> keys *
1) "name"
127.0.0.1:6322> get age
"22"           

複制

至此,redis多執行個體以及主從環境搭建完成了;