由於業務需要,今天配置了6台伺服器的redis, 4台作為master, 2台作為slave. 一主一從, master-slave 結構.
根據業務的劃分, 不同機器掛載的redis服務數量也不同, 分布如下.
| 代碼如下 |
複製代碼 |
#master 10.0.8.4 10.0.8.5 10.0.8.6 10.0.8.7 #master 服務連接埠 A服務 2001 B服務 2002 C服務 2003 #redis服務分布 10.0.8.4:2001 10.0.8.4:2002 10.0.8.5:2002 10.0.8.6:2002 10.0.8.7:2002 10.0.8.4:2003 10.0.8.5:2003 10.0.8.6:2003 10.0.8.7:2003 #slave 10.0.8.2 10.0.8.3 #slave分布 10.0.8.2:3001 10.0.8.2:3002 10.0.8.2:3003 10.0.8.2:3004 10.0.8.2:3005 10.0.8.3:3006 10.0.8.3:3007 10.0.8.3:3008 10.0.8.3:3009 #salve:port -> master:port (服務) 對照 10.0.8.2:3001 -> 10.0.8.4:2001 (A服務) 10.0.8.2:3002 -> 10.0.8.4:2002 (B服務) 10.0.8.2:3003 -> 10.0.8.5:2002 (B服務) 10.0.8.2:3004 -> 10.0.8.6:2002 (B服務) 10.0.8.2:3005 -> 10.0.8.7:2002 (B服務) 10.0.8.3:3006 -> 10.0.8.4:2003 (C服務) 10.0.8.3:3007 -> 10.0.8.5:2003 (C服務) 10.0.8.3:3008 -> 10.0.8.6:2003 (C服務) 10.0.8.3:3009 -> 10.0.8.7:2003 (C服務) |
常規部署&啟動
1. 從redis官網下載源碼包 .我用的是redis-2.6.3.tar.gz.
2. 解壓 tar zxvf redis-2.6.3.tar.gz
3. 編譯 make & make install
4. 啟動 redis-server redis.conf (redis.conf 可在下載的源碼包中找到)
預設redis啟動模式為非daemon, 啟動後為master
master修改配置
| 代碼如下 |
複製代碼 |
######Master config ###General 配置 daemonize yes #使用daemon 方式運行程式,預設為非daemon方式運行 pidfile /tmp/redis.pid #pid檔案位置 port 2001 #根據服務規定的連接埠填寫 (預設6379) timeout 30 # client 端空閑中斷連線的時間 loglevel warning #日誌記錄層級,預設是notice,我這邊使用warning,是為了監控日誌方便。使用warning後,只有發生警示才會產生日誌,這對於通過判斷記錄檔是否為空白來監控警示非常方便。 logfile /opt/logs/redis/redis.log #日誌產生的位置 databases 16 #預設是0,也就是只用1 個db,我這邊設定成16,方便多個應用使用同一個redis server。使用select n 命令可以確認使用的redis db ,這樣不同的應用即使使用相同的key也不會有問題。 ###下面是SNAPSHOTTING持久化方式的策略。為了保證資料相對安全,在下面的設定中,更改越頻繁,SNAPSHOTTING越頻繁,也就是說,壓力越大,反而花在持久化上的資源會越多。所以我選擇了master-slave模式,並在master關掉了SNAPSHOTTING。 #save 900 1 #在900秒之內,redis至少發生1次修改則redis抓快照到磁碟 #save 300 100 #在300秒之內,redis至少發生100次修改則redis抓快照到磁碟 #save 60 10000 #在60秒之內,redis至少發生10000次修改則redis抓快照到磁碟 rdbcompression yes #使用壓縮 dbfilename dump.rdb #SNAPSHOTTING的檔案名稱 dir /opt/data/redis/ #SNAPSHOTTING檔案的路徑 ###REPLICATION 設定, #slaveof #如果這台機器是台redis slave,可以開啟這個設定。如果使用master-slave模式,我就會在master上把SNAPSHOTTING關了,這樣可以不用在master上做持久化,而是在slave上做,這樣可以大大提高master 記憶體使用量率和系統效能。 #slave-serve-stale-data yes #如果slave 無法與master 同步,是否還可以讀 ### SECURITY 設定 #requirepass aaaaaaaaa #redis效能太好,用個passwd 意義不大 #rename-command FLUSHALL "" #可以用這種方式關掉非常危險的命令,如FLUSHALL這個命令,它清空整個 Redis 伺服器的資料,而且不用確認且從不會失敗 ###LIMIT 設定 maxclients 0 #無client串連數量限制 maxmemory 14gb #redis最大可使用的記憶體量,我的伺服器記憶體是16G,如果使用redis SNAPSHOTTING的copy-on-write的持久會寫方式,會額外的使用記憶體,為了使持久會操作不會使用系統VM,使redis伺服器效能下降,建議保留redis最大使用記憶體的一半8G來留給持久化使用,我個人覺得非常浪費。我沒有在master上不做持久化,使用主從方式 maxmemory-policy volatile-lru #使用LRU演算法刪除設定了到期時間的key,但如果程式寫的時間沒有寫key的到期時間,建議使用allkeys-lru,這樣至少保證redis不會不可寫入。 ###APPEND ONLY MODE 設定 appendonly no #不使用AOF,AOF是另一種持久化方式,我沒有使用的原因是這種方式並不能在伺服器或磁碟損壞的情況下,保證資料可用性。 appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb ###SLOW LOG 設定 slowlog-log-slower-than 10000 #如果操作時間大於0.001秒,記錄slow log,這個log是記錄在記憶體中的,可以用redis-cli slowlog get 命令查看 slowlog-max-len 1024 #slow log 的最大長度 ###VIRTUAL MEMORY 設定 vm-enabled no #不使用虛擬記憶體,在redis 2.4版本,作者已經非常不建議使用VM。 vm-swap-file /tmp/redis.swap vm-max-memory 0 vm-page-size 32 vm-pages 134217728 vm-max-threads 4 ###ADVANCED CONFIG 設定,下面的設定主要是用來節省記憶體的,我沒有對它們做修改 hash-max-zipmap-entries 512 hash-max-zipmap-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes ###INCLUDES 設定 ,使用下面的配置,可以配置一些個另其它的設定,如slave的配置 #include /path/to/local.conf #include /path/to/other.conf #include /opt/redis/etc/slave.conf 如果是slave server,把這個注釋開啟 |
一台redis master服務搞定後, 按照相同的步驟部署到其餘的master中, 根據服務不同copy多份redis.conf, 修改對應的port即可
為了方便管理設定檔名稱為
| 代碼如下 |
複製代碼 |
master-redis-2001.conf master-redis-2002.conf master-redis-2003.conf |
然後根據服務的分布, 將相關環境搭建好, 在以下伺服器跑各自相關業務即可
| 代碼如下 |
複製代碼 |
#10.0.8.4 redis-server /redis/config/master-redis-2001.conf redis-server /redis/config/master-redis-2002.conf redis-server /redis/config/master-redis-2003.conf #10.0.8.5 , 10.0.8.6 , 10.0.8.7 redis-server /redis/config/master-redis-2002.conf redis-server /redis/config/master-redis-2003.conf |
測試master伺服器
| 代碼如下 |
複製代碼 |
redis-cli -p 2001 redis 10.0.8.4:2001> set testredis 4-2001 OK redis 10.0.8.4:2001> get testredis "4-2001" redis 10.0.8.4:2001> del testredis (integer) 1 redis 10.0.8.4:2001> get testredis (nil) redis 10.0.8.4:6489> exit |
像部署master一樣, 部署slave, 將主伺服器的設定檔copy一份到從伺服器,修改port以及以下設定
| 代碼如下 |
複製代碼 |
######slave config ###REPLICATION slaveof 10.0.8.2 3001 slave-serve-stale-data no #如果slave無法與master同步,slave不可讀 ###APPEND ONLY MODE 設定 appendonly yes #在slave上使用了AOF,以保證資料可用性。 |
slave設定檔命名
| 代碼如下 |
複製代碼 |
slave-redis-3001.conf slave-redis-3002.conf slave-redis-3003.conf slave-redis-3004.conf slave-redis-3005.conf slave-redis-3006.conf slave-redis-3007.conf slave-redis-3008.conf slave-redis-3009.conf [/bash] |
啟動slave.
| 代碼如下 |
複製代碼 |
1 #10.0.8.2 redis-server /redis/config/master-redis-3001.conf redis-server /redis/config/master-redis-3002.conf redis-server /redis/config/master-redis-3003.conf redis-server /redis/config/master-redis-3004.conf redis-server /redis/config/master-redis-3005.conf #10.0.8.3 redis-server /redis/config/master-redis-3006.conf redis-server /redis/config/master-redis-3007.conf redis-server /redis/config/master-redis-3008.conf redis-server /redis/config/master-redis-3009.conf |
啟動slave之後, 在slave相對應的master設定一個值, slave能擷取到ok了