Redis主從搭建

夢夕林1992發表於2023-01-28

redis安裝相對來說比較簡單,下面為具體安裝步驟。

安裝 Redis 

安裝前準備

下載最新安裝包

 

安裝依賴包

yum install gcc-c++

yum install tcl

 

解壓安裝包

解壓目錄隨機,沒有特別要求。

tar zxf redis-5.0.5.tar.gz

 

安裝Reids

redis 解壓路徑下執行make ,進行安裝

[root@localhost redis]# cd redis-5.0.5

[root@localhost redis-5.0.5]# make

 

執行 make test  命令,檢測redis 的編譯結果

[root@localhost redis-5.0.5]# make test

 

執行 make install  命令,安裝redis

[root@localhost redis-5.0.5]#  make PREFIX=/redis/redis-5.0.5/redis_master install

 

安裝完後,會在redis_master 目錄下安裝並形成bin 目錄

[root@localhost redis-5.0.5]# cd redis_master /

[root@localhost redis_master]# ls

bin  

[root@localhost redis_master]# cd bin/

[root@localhost bin]# ls -rtl

total 54320

-rwxr-xr-x. 1 root root 12277469 Jun 11 14:49 redis-server

-rwxr-xr-x. 1 root root  9202931 Jun 11 14:49 redis-benchmark

-rwxr-xr-x. 1 root root  9580032 Jun 11 14:49 redis-cli

-rwxr-xr-x. 1 root root 12277469 Jun 11 14:49 redis-check-rdb

-rwxr-xr-x. 1 root root 12277469 Jun 11 14:49 redis-check-aof

lrwxrwxrwx. 1 root root       12 Jun 11 14:49 redis-sentinel -> redis-server

至此,redis 安裝完成。

同樣步驟安裝三臺redis 。只是個別目錄用於以後區分可以去不一樣的名字。如:其他兩個從的目錄可以設定為redis/redis-5.0.5/redis_slave1 redis/redis-5.0.5/redis_slave2


配置Reids

配置redis 環境變數

編輯.bash_profile 檔案,新增下面內容:

export REDIS_HOME=/redis/redis-5.0.5/redis_master

export PATH=$PATH:$REDIS_HOME/bin

 

生效環境變數

source .bash_profile

 

修改 redis  配置檔案

複製redis 原始碼包目錄下的 redis.conf  redis_master 目錄下修改名字為redis_6379.conf ,當然直接修改也是可以的,但要養成備份的習慣,複製的檔名為 redis_6379.conf ,這是配置redis 的一種習慣,因為我們啟動redis 服務要用的埠預設為6379 ,假如要在一臺節點上啟動多個服務,那麼每個服務的配置檔案為 redis_${port}.conf ,這樣很清楚的知道每個服務使用的埠號。

[root@localhost redis_master]# cp redis.conf redis_master/redis_6379.conf

 

Redis 配置檔案主要引數解析參考

#redis 程式是否以守護程式的方式執行,yes 為是,no 為否( 不以守護程式的方式執行會佔用一個終端)

daemonize  no  

# 指定redis 程式的PID 檔案存放位置            

pidfile /var/run/redis.pid  

#redis 程式的埠號

port 6379                   

# 繫結的主機地址

bind 127.0.0.1              

# 客戶端閒置多長時間後關閉連線, 預設此引數為0 即關閉此功能

timeout  300                

#redis 日誌級別, 可用的級別有debug.verbose.notice.warning

loglevel verbose            

#log 檔案輸出位置, 如果程式以守護程式的方式執行, 此處又將輸出檔案設定為stdout 的話, 就會將日誌資訊輸出到/dev/null 裡面去了

logfile stdout              

# 設定資料庫的數量, 預設為0 可以使用select <dbid> 命令在連線上指定資料庫id

databases 16                

# 指定在多少時間內重新整理次數達到多少的時候會將資料同步到資料檔案;

save <seconds><changes>   

# 指定儲存至本地資料庫時是否壓縮檔案, 預設為yes 即啟用儲存;

rdbcompression yes          

# 指定本地資料庫檔名

dbfilename dump.db          

# 指定本地資料問就按存放位置;

dir ./                      

# 指定當本機為slave 服務時, 設定master 服務的IP 地址及埠, redis 啟動的時候他會自動跟master 進行資料同步

replicaof <masterip><masterport>    

# master 設定了密碼保護時,slave 服務連線master 的密碼;

masterauth <master-password>       

# 設定redis 連線密碼, 如果配置了連線密碼, 客戶端在連線redis 是需要透過AUTH<password> 命令提供密碼, 預設關閉

requirepass footbared       

# 設定同一時間最大客戶連線數, 預設無限制;redis 可以同時連線的客戶端數為redis 程式可以開啟的最大檔案描述符, 如果設定maxclients 0 ,表示不作限制。當客戶端連線數到達限制時,Redis 會關閉新的連線並向客戶端返回max number of clients reached 錯誤資訊

maxclients 128  

# 指定Redis 最大記憶體限制,Redis 在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis 會先嚐試清除已到期或即將到期的Key ,當此方法處理  後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis 新的vm 機制,會把Key 存放記憶體,Value 會存放在swap           

maxmemory<bytes>    

# 設定記憶體快取策略

5.0 新增allkeys-lfu volatile-lfu

建議使用volatile-ttl ,最近要過期策略   

maxmemory-policy volatile-ttl

# 指定是否在每次更新操作後進行日誌記錄,Redis 在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis 本身同步資料檔案是按上面save 條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no

appendonly no  

# 指定跟新日誌檔名預設為appendonly.aof             

appendfilename appendonly.aof       

#aof 持久化方式,建議採用appendfsync everysec 方式,即5.0 預設的,每秒,always 資料一致性保證了,但是效能太差,no 就更不行了,不開啟。指定更新日誌的條件, 有三個可選引數no :表示等作業系統進行資料快取同步到磁碟( ),always :表示每次更新操作後手動呼叫fsync() 將資料寫到磁碟( 慢,安全), everysec :表示每秒同步一次( 折衷,預設值);

appendfsync everysec   

# 大併發的網際網路公司aof 引數設定很重要,預設是如下圖: 建議把64MB 修改成GB 單位的, 高併發的網際網路公司,至少3GB 以上

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

同時,由於在恢復的時候,如果持久化都是使用的aof rdb, 建議rdb 檔案是15 分鐘備份一次,太頻繁影響效能。

 

編輯redis_6379.conf 檔案,根據需要修改以下內容

服務以守護程式方式啟動

daemonize yes

允許Redis  被遠端訪問

bind 0.0.0.0

啟動服務佔用的埠

port 6379

日誌檔案存放的路徑

logfile /redis/redis-5.0.5/redis_master/redis_6379.log

# pid 檔案存放的路徑

pidfile /redis/redis-5.0.5/redis_master/redis_6379.pid

# 主庫的密碼(本機可以不配置)最好配置因為等下配置哨兵,如果主機掛了重啟之後(等於變成了從機)不能直接連上。(主機會根據哨兵投票決定)

masterauth hzmcdba

持久化檔案的儲存路徑

dir /redis-data/master/6379

# 指定本地資料庫檔名

dbfilename dump-master.rdb

# 設定記憶體快取策略

maxmemory-policy volatile-ttl

#aof 持久化方式

appendfsync everysec

 

依次修改其他兩個從節點的配置檔案。

 

服務啟停

啟動redis 服務

[root@localhost bin]# pwd

/redis/redis-5.0.5/redis_master/bin

[root@localhost bin]# ./redis-server /redis/redis-5.0.5/redis_master/redis_6379.conf

 

檢查redis 程式,已經存在

[root@localhost redis]# ps -ef |grep redis

root     24092     1  0 15:49 ?        00:00:00 ./redis-server 0.0.0.0:6379                                   

root     24122 24102  0 15:49 pts/0    00:00:00 grep redis

 

檢查日誌

[root@localhost redis_master]# tail -100f redis_6379.log 

24091:C 16 Jun 2020 15:49:13.259 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24091:C 16 Jun 2020 15:49:13.259 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=24091, just started
24091:C 16 Jun 2020 15:49:13.259 # Configuration loaded
24092:M 16 Jun 2020 15:49:13.263 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.5 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 24092
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
 
24092:M 16 Jun 2020 15:49:13.269 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
24092:M 16 Jun 2020 15:49:13.269 # Server initialized
24092:M 16 Jun 2020 15:49:13.269 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
24092:M 16 Jun 2020 15:49:13.270 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
24092:M 16 Jun 2020 15:49:13.270 * Ready to accept connections


可以看到redis 已經正常啟動

 

停止redis 服務

[root@localhost bin]# ./redis-cli shutdown

檢視日誌

24092:M 16 Jun 2020 16:12:14.935 # User requested shutdown...
24092:M 16 Jun 2020 16:12:14.935 * Saving the final RDB snapshot before exiting.
24092:M 16 Jun 2020 16:12:14.954 * DB saved on disk
24092:M 16 Jun 2020 16:12:14.954 * Removing the pid file.
24092:M 16 Jun 2020 16:12:14.955 # Redis is now ready to exit, bye bye...


 

設定redis 服務開機自啟動

 redis-4.0.12/utils  目錄下的 redis_init_script  指令碼複製為 redis_6379 ,並移動到 /etc/init.d  目錄下

[root@localhost utils]# cp redis_init_script /etc/init.d/redis_6379

修改以下配置資訊,使其與redis_6379.conf 保持一致: 

#!/bin/sh

# chkconfig:   2345 90 10

# description:  Redis is a persistent key-value database

# Simple Redis init.d script conceived to work on Linux systems

# as it does use of the /proc filesystem.

 

### BEGIN INIT INFO

# Provides:     redis_6379

# Default-Start:        2 3 4 5

# Default-Stop:         0 1 6

# Short-Description:    Redis data structure server

# Description:          Redis data structure server. See

### END INIT INFO

 

REDISPORT=6379

EXEC=/redis/redis-5.0.5/redis_master/bin/redis-server

CLIEXEC=/redis/redis-5.0.5/redis_master/bin/redis-cli

 

PIDFILE=/redis/redis-5.0.5/redis_master/redis_6379.pid

CONF="/redis/redis-5.0.5/redis_master/redis_6379.conf"

 

修改redis_6379 指令碼的許可權為777

chmod 777 /etc/init.d/redis_6379

 

設定redis 開機自啟動

sudo chkconfig redis_6379 on

 


 

驗證redis 是否安裝成功以及是否可以開機自啟動

 

重啟伺服器

[root@localhost init.d]# reboot

 

查詢redis 服務是否啟動

[root@localhost ~]# ps -ef |grep redis

root      1960     1  0 16:29 ?        00:00:00 /redis/redis-5.0.5/redis_master/bin/redis-server 0.0.0.0:6379                                   

 

進行一組簡單的操作

[root@localhost bin]# ./redis-cli 

127.0.0.1:6379> set name tom

OK

127.0.0.1:6379> get name

"tom"

127.0.0.1:6379>

 

驗證redis 安裝成功且自啟動配置成功。

依次配置並驗證其他兩個從節點。

 

 

主從配置

因為前面已經再其他兩個節點安裝好redis ,且已經將主節點的配置檔案複製到兩個從節點,所有我們直接修改兩個從節點的配置檔案後,起來就可以。

 

修改Slave1

[root@localhost ~]# cd /redis/redis-5.0.5/redis_slave1

[root@localhost redis_slave1]# ls -rtl

total 68

drwxr-xr-x. 2 root root  4096 Jun 16 15:36 bin

-rw-r--r--. 1 root root 61797 Jun 16 15:38 redis_6380.conf

 

[root@localhost redis_slave1]# vi redis_6380.conf

編輯redis_6380.conf 檔案,根據需要修改以下內容

 

服務以守護程式方式啟動

daemonize yes

允許Redis  被遠端訪問

bind 0.0.0.0

啟動服務佔用的埠

port 6380

日誌檔案存放的路徑

logfile "/redis/redis-5.0.5/redis_slave1/redis_6380.log" 

# pid 檔案存放的路徑

pidfile /redis/redis-5.0.5/redis_slave1/redis_6380.pid

# 主庫的密碼(本機可以不配置)最好配置因為等下配置哨兵,如果主機掛了重啟之後(等於變成了從機)不能直接連上。(主機會根據哨兵投票決定)

masterauth hzmcdba

持久化檔案的儲存路徑

dir /redis-data/slave1/6380

# 指定本地資料庫檔名

dbfilename dump-slave1.rdb

# 設定記憶體快取策略

maxmemory-policy volatile-ttl

#aof 持久化方式

appendfsync everysec

# 指定當本機為slave 服務時, 設定master 服務的IP 地址及埠, redis 啟動的時候他會自動跟master 進行資料同步

replicaof 192.168.242.70 6379

 

修改Slave2

[root@localhost ~]# cd /redis/redis-5.0.5/redis_slave2

[root@localhost redis_slave2]# ls -rtl

total 68

drwxr-xr-x. 2 root root  4096 Jun 16 15:37 bin

-rw-r--r--. 1 root root 61972 Jun 24 16:07 redis_6381.conf

 

[root@localhost redis_slave2]# vi redis_6381.conf

編輯redis_6380.conf 檔案,根據需要修改以下內容

服務以守護程式方式啟動

daemonize yes

允許Redis  被遠端訪問

bind 0.0.0.0

啟動服務佔用的埠

port 6381

日誌檔案存放的路徑

logfile "/redis/redis-5.0.5/redis_slave2/redis_6381.log" 

# pid 檔案存放的路徑

pidfile /redis/redis-5.0.5/redis_slave2/redis_6381.pid

# 主庫的密碼(本機可以不配置)最好配置因為等下配置哨兵,如果主機掛了重啟之後(等於變成了從機)不能直接連上。(主機會根據哨兵投票決定)

masterauth hzmcdba

持久化檔案的儲存路徑

dir /redis-data/slave2/6381

# 指定本地資料庫檔名

dbfilename dump-slave2.rdb

# 設定記憶體快取策略

maxmemory-policy volatile-ttl

#aof 持久化方式

appendfsync everysec

# 指定當本機為slave 服務時, 設定master 服務的IP 地址及埠, redis 啟動的時候他會自動跟master 進行資料同步

replicaof 192.168.242.70 6379

 

 

啟動兩個從節點

[root@localhost redis_slave1]# redis-server /redis/redis-5.0.5/redis_slave1/redis_6380.conf

[root@localhost redis_slave2]# redis-server /redis/redis-5.0.5/redis_slave2/redis_6381.conf


由於引數已經修改完了,後面修改密碼:

config set requirepass "hzmcdba"


並且寫入配置檔案: 

例如關閉提示需要密碼就說明修改成功。

同理修改下面兩臺伺服器:

 

檢查主從複製情況  

Master

[root@localhost redis_master]# redis-cli 

127.0.0.1:6379> info replication

NOAUTH Authentication required.

127.0.0.1:6379> auth hzmcdba

OK

127.0.0.1:6379> info replication

# Replication

role: master

connected_slaves: 2

slave0:ip=192.168.242.71,port=6380,state=online,offset=84,lag=1

slave1:ip=192.168.242.72,port=6381,state=online,offset=84,lag=1

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:84

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:84

 

 

從機1

[root@localhost redis_slave1]# redis-cli -h 192.168.242.71 -p 6380

192.168.242.71:6380> info replication

NOAUTH Authentication required.

192.168.242.71:6380> auth hzmcdba

OK

192.168.242.71:6380> info replication

# Replication

role: slave

master_host:192.168.242.70

master_port:6379

master_link_status:up

master_last_io_seconds_ago:9

master_sync_in_progress:0

slave_repl_offset:266

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:266

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:266

 

 

從節點2

[root@localhost redis_slave2]# redis-cli -h 192.168.242.72 -p 6381

192.168.242.72:6381> auth hzmcdba

OK

192.168.242.72:6381> info replication

# Replication

role: slave

master_host:192.168.242.70

master_port:6379

master_link_status:up

master_last_io_seconds_ago:5

master_sync_in_progress:0

slave_repl_offset:882

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:8b90010b378c34aaf89c39a9002684363de31b40

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:882

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:882

 

 

同步情況:

主節點:

127.0.0.1:6379> set k1 1

OK

127.0.0.1:6379> get k1

"1"

 

從節點1

192.168.242.71:6380> get k1

"1"

 

從節點2

192.168.242.72:6381> get k1

"1"

 

可以看到同步狀態正常,當然在相應的日誌中也可以看到。


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29956245/viewspace-2933097/,如需轉載,請註明出處,否則將追究法律責任。

相關文章