前言
在上一篇部落格《 CentOS6下編譯、安裝Redis源碼》中,我介紹了如何在CentOS下編譯最新的穩定版本的Redis源碼,并成功啟動了一個Redis單執行個體。本文的目标是要部署Master-Slave架構,為了友善觀察,本文将部署一個Master,多個Slave的架構,還包含一些簡單的主從管理指令的使用。
部署架構
配置檔案
為了友善,我們可以建立一個目錄做這個事情,建立目錄:
[[email protected] redis]#mkdir /opt/redis/mss
master的配置檔案
[[email protected] redis]#cp /opt/redis/redis-stable/redis.conf /opt/redis/mss/master_6379.conf
[[email protected] redis]#vim /opt/redis/mss/master_6379.conf
打開這個檔案後,編輯如下内容:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
logfile “/opt/redis/log/master_6379.log” # 該項可不設定,預設輸出到/dev/null
slave-read-only yes # 表示從庫隻讀,如果設定成no,表示從庫也是可以寫入的
slave1的配置檔案
[[email protected] redis]#cp /opt/redis/redis-stable/redis.conf /opt/redis/mss/slave_6380.conf
[[email protected] redis]#vim /opt/redis/mss/slave_6380.conf
打開這個檔案後,編輯如下内容:
daemonize yes
pidfile /var/run/redis_6380.pid
port 6380
logfile “/opt/redis/log/slave_6380.log” # 該項可不設定,預設輸出到/dev/null
slave-read-only yes # 表示從庫隻讀,如果設定成no,表示從庫也是可以寫入的
slaveof 127.0.0.1 6379
slave2的配置檔案
[[email protected] redis]#cp /opt/redis/redis-stable/redis.conf /opt/redis/mss/slave_6381.conf
[[email protected] redis]#vim /opt/redis/mss/slave_6381.conf
打開這個檔案後,編輯如下内容:
daemonize yes
pidfile /var/run/redis_6381.pid
port 6381
logfile “/opt/redis/log/slave_6381.log” # 該項可不設定,預設輸出到/dev/null
slave-read-only yes # 表示從庫隻讀,如果設定成no,表示從庫也是可以寫入的
slaveof 127.0.0.1 6379
slave3的配置檔案
[[email protected] redis]#cp /opt/redis/redis-stable/redis.conf /opt/redis/mss/slave_6383.conf
[[email protected] redis]#vim /opt/redis/mss/slave_6383.conf
打開這個檔案後,編輯如下内容:
daemonize yes
pidfile /var/run/redis_6383.pid
port 6383
logfile “/opt/redis/log/slave_6383.log” # 該項可不設定,預設輸出到/dev/null
slave-read-only yes # 表示從庫隻讀,如果設定成no,表示從庫也是可以寫入的
slaveof 127.0.0.1 6380
啟動Redis
啟動Master
[[email protected] ~]# mkdir /opt/redis/log
[[email protected] ~]# redis-server /opt/redis/mss/master_6379.conf
[[email protected] ~]# ps -ef | grep redis
root 1401 1 0 07:08 ? 00:00:00 redis-server *:6379
root 1405 1333 0 07:09 pts/1 00:00:00 grep redis
檢視日志:
[[email protected] ~]# tail -f /opt/redis/log/master_6379.log
啟動Slave
[[email protected] ~]# redis-server /opt/redis/mss/slave_6380.conf
[[email protected] ~]# redis-server /opt/redis/mss/slave_6381.conf
[[email protected] ~]# redis-server /opt/redis/mss/slave_6383.conf
[[email protected] ~]# ps -ef | grep redis
root 1401 1 0 07:08 ? 00:00:00 redis-server *:6379
root 1409 1 0 07:11 ? 00:00:00 redis-server *:6380
root 1414 1 0 07:11 ? 00:00:00 redis-server *:6381
root 1419 1 0 07:11 ? 00:00:00 redis-server *:6383
root 1424 1333 0 07:11 pts/1 00:00:00 grep redis
[[email protected] ~]#
從上面可以看到,三個都啟動成功了。
檢視主從結構
登入master檢視并設定Key
[[email protected] ~]# redis-cli -p 6379
127.0.0.1:6379> info Replication
#
Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=113,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=113,lag=1
master_repl_offset:113
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:112
127.0.0.1:6379> set hi hello
OK
127.0.0.1:6379> get hi
“hello”
127.0.0.1:6379>
在上面的操作中,我們檢視了主從指派的情況,可以看到,master擁有兩個 slave, 分别是監聽了6380和6381端口的,然後我們設定了一個key為hi值為hello的鍵值對,我們發現,這和我們預期的部署是一樣的。
登入slave1并檢視主從資訊和設定的key
[[email protected] ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:532
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6383,state=online,offset=532,lag=1
master_repl_offset:532
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:531
127.0.0.1:6380> get hi
“hello”
127.0.0.1:6380>
我們發現,該slave的主是127.0.0.1:6379,并且還有一個Slave3【127.0.0.1:6383】,這都是符合我們預期的結果,最後擷取了hi這個key的值,結果發現已經通過過來了,一切正常。
登入slave2并檢視主從資訊和設定的key
[[email protected] ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:812
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
127.0.0.1:6381> get hi
“hello”
127.0.0.1:6381>
登入slave3并檢視主從資訊和設定的key
[[email protected] ~]# redis-cli -p 6383
127.0.0.1:6383> info replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:924
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
127.0.0.1:6383> get hi
“hello”
127.0.0.1:6383>
我們發現,key為hi的鍵值對也同步過來了,并且slave3的主是【127.0.0.1:6380】,即slave1。
主從切換、調整
在上一小節中我們實作了主從結構的部署,現實中我們可能會遇到某個主伺服器或是從伺服器當機的情況,可能需要手動切換主從伺服器,那麼我們可以使用簡單的slaveof指令來實作主從關系的維護。
slaveof no one: 該指令表示,斷開和主的關系,自己成為master
slaveof [ip] [port]: 表示把自己設定成 ip:port 的從Redis
模拟slave1當機,将slave3的主設定為slave2
[[email protected] ~]# redis-cli -p 6380 shutdown # 模拟slave1當機
[[email protected] ~]# redis-cli -p 6383
127.0.0.1:6383> info Replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:down # slave1 已經當機了
127.0.0.1:6383> slaveof 127.0.0.1 6381 # 重新設定slave2為自己的主
OK
127.0.0.1:6383> info Replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up
上面的操作過程主要是,關閉slave1,然後将slave2作為slave3的master,可以看到我們成功進行了切換。
模拟slave2當機,slave3更新為獨立master
[[email protected] ~]# redis-cli -p 6381 shutdown # 模拟slave2當機
[[email protected] ~]# redis-cli -p 6383
127.0.0.1:6383> info Replication
#
Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:down # slave2 也當機了
master_last_io_seconds_ago:-1
127.0.0.1:6383> slaveof no one
OK
127.0.0.1:6383> info Replication
·#· Replication
role:master # 更新成為了master
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
127.0.0.1:6383>
本節完~