關於Redis - 主從關係 及 配置文件參數

 

 

一個銀行櫃檯在一定時間內處理的業務是不能與幾個櫃檯處理的快,壓力也挺大的有點不便時就沒有人服務了。

相關環境版本:

redis 5.0.4  下載傳送門

Linux:Centos7 

 

關於2.6至今5.0.4的複製方式演進:W-D的 這篇演進關係部分

 

目錄

搭建主從關係:

關於日誌警告:

①配置文件中配置了:tcp-backlog  

② Transparent Huge Pages (THP) support enabled 

關於日誌內容初始化信息:

關於配置文件:

① 網絡部分

② 通用部分

③ 快照部分

④  複製部分

⑤ 安全配置

⑥ 客戶端配置

⑦ 內存配置管理

⑧ AOF相關配置

⑨ 慢日誌



 

其實所謂主從關係,簡單說是以主庫爲準,從庫內容異步複製主數據庫,從而達成主從內容基本一致的情況。實際而言,也有從數據庫作主數據庫再次接着從數據庫的操作(這種操作根據個人情況而言使用)

其實搭建主從關係並不難,只是配置上的細節,後面會詳解額外配置及版本更新的配置。

搭建主從關係:

 

搭建主從關係:

採用三個節點配置:

 127.0.0.1 6379

 127.0.0.1 6380

 127.0.0.1 6381

待服務器端編譯過後,拷貝redis.conf:

主要分成: 6379_master.conf 、6380_slave.conf 、6381_slave.conf

#建立三個redis目錄
mkdir -p /opt/redisTemp/{redis6379,redis6380,redis6381} 

#------------------------如果是配置文件放置( 非 )同一目錄下--------------------------------- 
#從源碼中拷貝配置文件,下方rediscode 等同於你的源碼編譯目錄
cp rediscode/redis.conf /opt/redisTemp/redis6379/6379.conf
cp rediscode/redis.conf /opt/redisTemp/redis6380/6380.conf 
cp rediscode/redis.conf /opt/redisTemp/redis6381/6381.conf

#------------------------如果是配置文件放置同一目錄下--------------------------------- 
則下方配置中
# #工作目錄,存放持久化數據的目錄
dir ./   ==> 需要變更爲上述創建的三個目錄 
#主庫基本配置
daemonize yes #守護線程 這裏便於後臺運行

pidfile /var/run/redis_6379.pid #這裏本身就是默認值 ,用於存放執行中配置文件所對應的進程id

port 6379  #對應端口

logfile "./logs/master_6379.log" # 該項可不設置,默認輸出到/dev/null,若沒文件夾需先建立

slave-read-only yes # 表示從庫只讀,如果設置成no,表示從庫也是可以寫入的


dir ./
# 這裏默認值是當前文件夾,一般是啓動程序下
# 請注意,您必須在這裏指定一個目錄,而不是文件名。
# 用於存放rdb文件的位置

從庫配置方式:

 

#從庫基本配置
daemonize yes #守護線程 這裏便於後臺運行

pidfile /var/run/redis_6380.pid #這裏本身就是默認值 ,用於存放執行中配置文件所對應的進程id

port 6380  #對應端口

logfile "./logs/slave_6380.log" # 該項可不設置,默認輸出到/dev/null(如果daemonize yes),若沒#文件夾需先建立

slave-read-only yes # 表示從庫只讀,如果設置成no,表示從庫也是可以寫入的

dir ./
# 這裏默認值是當前文件夾,一般是啓動程序下
# 請注意,您必須在這裏指定一個目錄,而不是文件名。
# 用於存放rdb文件的位置

①直接配置

slaveof 127.0.0.1 6379 #指向主庫服務器IP和端口。
(這裏的127.0.0.1只是示例,實際中填寫自己服務器ip地址,不然項目調用會連接不上)

# masterauth <master-password> #如果主服務器設置了密碼,則需要加入
masterauth "yourpassword" #這裏輸入你的密碼

②連接配置

#下方 host 、port 分別爲ip地址與端口號,yourpassword 爲主數據庫密碼
#######利用redis-cli 連接客戶端後
#主數據庫沒有密碼 --------------
slaveof {host} {port} 
config rewire


#主數據庫存在密碼密碼  -------------
slaveof {host} {port} 
config rewire
config  set masterauth yourpassword

 

 

Tips:

 如果主庫設置了密碼,而從庫不填入masterauth的話就會出現

而不是目標:

當然,調試直接輸入 redis-cli 就是默認進入6379

      如果存在密碼,先輸入 auth ,之後輸入你的密碼

     127.0.0.1:6379> AUTH yourpassword 

否則:info replication 即可看到關係。


關於日誌警告:

①配置文件中配置了:tcp-backlog  

而所在的服務器somaxconn  參數少於你定義的值時會出現的問題


7730:S 12 Jun 2019 22:01:02.883 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

關於:The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

  主要警告是擔心 somaxconn 參數:

  Linux官方解釋:定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲1024,(而我的只有128,故出現此警告)【大的偵聽隊列對防止拒絕服務 DoS 攻擊也會有所幫助,總得來說是怕處理不過裏來】

 

解決方式:修改Linux內核默認值

#下方number 爲你設置的值
echo  {number} > /proc/sys/net/core/somaxconn

② Transparent Huge Pages (THP) support enabled 

7730:S 12 Jun 2019 22:01:02.883 # 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.

google翻譯:

警告您在內核中啓用了透明大頁面(THP)支持。 這將導致Redis的延遲和內存使用問題。 要解決此問題,請以root身份運行命令'echo never> / sys / kernel / mm / transparent_hugepage / enabled',並將其添加到/etc/rc.local中,以便在重新啓動後保留設置。 禁用THP後必須重新啓動Redis。

從上可得:

 一、若是臨時性處理

echo never > /sys/kernel/mm/transparent_hugepage/enabled

二、一勞永逸

進入/etc/rc.local

...

if 

test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled;

then

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

fi

 

關於日誌內容初始化信息:

1、從庫的日誌

存在密碼

不存在密碼(這裏指正確密碼)

主要分爲如下幾部

①加載硬盤快照數據

②校驗主從關係,利用配置嘗試連接主庫

③嘗試利用socket連接主庫(ping)

    分支一:

        1、建立連接,等待主庫響應(響應後執行下一步)

        2、開始與主庫同步數據發送請求

        3、 保持接收更新數據(保持心跳來等待從庫更新命令)

 

# Slaves send PINGs to server in a predefined interval. It's possible to change
# this interval with the repl_ping_slave_period option. The default value is 10
# seconds.
#
# repl-ping-slave-period 10 默認心跳間隔是10秒

    分支二:驗證密碼失敗,嘗試重連(循環嘗試)

 

 

關於配置文件:

 其實有機會的話這裏面與源碼內的redis.config可以讀一下

 https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf

懂英文還是很舒服的。(當然我也枚舉下常用的幾個配置)【其實文檔還是很有條理的】

① 網絡部分

################################## NETWORK (網絡部分) #####################################
1、tcp-backlog 511 
# Linux官方解釋:定義了系統中每一個端口最大的監聽隊列的長度,上述已經提及[511只是自定義的]

2、timeout 0 
# Close the connection after a client is idle for N seconds (0 to disable)
# 在空閒多少秒後關閉鏈接(0是禁用此功能)

3、tcp-keepalive 300
# 官方推薦300 ,這裏以秒爲單位,上面是默認值。若爲0 ,則爲關閉配置
# 用於發送ack 進行校驗兩端

② 通用部分


################################# GENERAL (通用部分)#####################################

1、daemonize no
# 如果你需要使用,則“yes”。#注意,Redis默認將在/var/run/redis.pid中寫入一個PID文件
# 當然pid 文件位置可以通過 pidfile 來自定義
# 爲yes則是後臺運行

2、supervised no 
# 這裏額外提及到一個組件 - supervisor,可以用於替換默認的守護進程(可以瞭解一下)
# 用於監聽你的redis進程行爲
# (1)supervised no  默認模式,不搞這麼多騷操作
# (2)supervised upstart  利用 upstart  來進行管理
# (3)supervised systemd  利用 systemd  來管理
# (4)supervised auto  #based on UPSTART_JOB or NOTIFY_SOCKET environment variables
#  最後一個參數我不是很能理解就不去利用,因爲基本上是我目前不操作的部分。

3、pidfile /var/run/redis_6379.pid
#這是上述第一條內的默認值,因爲默認端口是6379,這個用於存放pid端口,只有 daemonize 爲yes時生效

4、loglevel notice
#日誌級別:相信不用多描述了
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)

5、logfile ""
# 這裏建議自己補充日誌輸出位置及文件名,目前沒有找到直接配置按天分配的方法

6、databases 16
# 設置數據庫的數量。默認的數據庫是DB 0

上述提及內容:upstart的內容      、  systemd的內容

 

③ 快照部分


################################ SNAPSHOTTING(快照)  ################################
1、save <seconds> <changes>
# 如果滿足上面其中一個參數的要求,則將數據保存到磁盤上
# 例如 save 60 2 ,如果達到 2 次修改,則經過 60秒後 將記錄結果並保存到磁盤上
# 刪除儲存點方式: save ""

2、stop-writes-on-bgsave-error yes
# yes 情況下,啓用了RDB快照[(至少有一個保存點],如果最後一次的後臺保存RDB snapshot出錯,redis就會# 拒絕所有寫請求,官方說這是一個報警,如果自己定義了監聽持久化快照的解決方案,可以禁用這個屬性

3、rdbcompression yes
# 啓用後,則使用LZF壓縮算法來對轉儲的.rdb進行壓縮,當然會消耗一些額外的cpu,如果你想節省cpu的話,可# 可以取消,但是這樣做,一旦遇到比較大的數據集,轉儲後的rdb可能會佔用更多的空間

4、rdbchecksum yes
# 5版本的RDB內的CRC64校驗碼和位於文件末尾,抗損壞能力相對強,但是會帶帶大約10%的性能損耗,這意味着
# 你可以選擇禁用它來提高大約百分10的性能


5、dbfilename dump.rdb
# The filename where to dump the DB,相信不需要我解釋了

6、dir ./
# 這裏默認值是當前文件夾,一般是啓動程序下
# 請注意,您必須在這裏指定一個目錄,而不是文件名。

④  複製部分

################################# REPLICATION #################################
1、replicaof <masterip> <masterport>
# 將當前數據庫變成輔數據庫,同步複製主數據庫的內容,對應ip 、端口號
# 連接輔數據庫輸入 REPLICAOF NO ONE ,則重新恢復成主數據庫

2、masterauth <master-password>
# 若主數據庫設置了密鑰,則需要設置對應密鑰才能連接成功

3、replica-serve-stale-data yes
# 當Redis失去了與主Redis的連接,或者主從同步正在進行中時,Redis該如何處理外部發來的訪問請求的方式
# yes: 即使主從斷了,從依然響應客戶端的請求。
# no :主從斷開了,則從會提示客戶端"SYNC with master in progress",但有些指令還可以使用(參考最新 # 所使用的redis.conf文件詳解)

4、replica-read-only yes
# 定義從數據庫是否只讀


5、repl-diskless-sync no
# 用於定義主從同步數據的策略
# 一、磁盤形式,就是先將數據寫到rdb文件裏,然後傳輸rdb文件到從上(以增量方式將文件傳輸到副本)
# 二、socket形式,就是直接通過網絡傳輸變更的數據到從服務器上,不接觸磁盤
# 第二種形式:WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY

6、repl-diskless-sync-delay 5
#  需要 5 開啓了無盤模式(socket)情況下才需要設置
# 如果使用了通過socket的形式傳輸數據,則需要考慮一個主下面有多個從的情況,因爲一旦基於Diskless的# 複製傳送開始, 主就無法顧及新的從的到來。所以,就有了這個延遲的設置,比如延遲5秒,這樣在主從傳 # 輸數據之前,所有的從都能有時間被識別了, 這樣主就可以多開幾個線程來同時給所有的從進行數據傳輸了

7、repl-ping-replica-period 10
#複製副本以預定義的間隔向服務器發送ping ,相當於心跳檢測時間,單位(秒)

8、repl-timeout 60
# 超時時間,包括從master看slave,從slave看master,要大於上邊的repl-ping-slave-period


9、repl-disable-tcp-nodelay no
# 默認:SYNC完畢後,在slave的socket裏關閉TCP_NODELAY。
# 如果是yes,reids發送少量的TCP包給slave,但可能導致最高40ms的數據延遲。
# 如果是no,那可能在複製的時候,會消耗 少量帶寬。
# 默認我們是爲了低延遲優化而設置成no,如果主從之間有很多網絡跳躍。那設置成yes吧。
# 額外: 關於tcp_nodelay有個nagle算法,可以瞭解一下


10、repl-backlog-size 1mb
# 這裏的backlog是主上的一個內存緩衝區,它存儲的數據是當主和從斷開連接時,主無法將數據傳給從了,這# 時候主先將更新的數據 暫時存放在緩存去裏。如果主從再次連接時,就不需要重新傳輸所有數據,而是隻需要# 傳輸緩衝區的這一部分即可。

11、repl-backlog-ttl 3600
# 與上方 10 的設置的同源的
# 如果主Redis等了一段時間之後,還是無法連接到從Redis,那麼緩衝隊列中的數據將被清理掉。我們可以設# 置主Redis要等待的時間長度。 如果設置爲0,則表示永遠不清理。默認是1個小時。


12、replica-priority 100 
# 設置redis的優先級,僅能在 10, 100, 25 之間,若爲0 則永遠也不會選擇它升級
# 在主Redis持續工作不正常的情況,優先級高的從Redis將會升級爲主Redis。而編號越小,優先級越高

 

⑤ 安全配置

################################## SECURITY(安全) ###################################

1、requirepass foobared
# 訪問redis時設置的密碼

2、rename-command CONFIG ""
# 可以禁用一些關鍵字,比如上述的CONFIG,相當於禁用CONFIG

⑥ 客戶端配置

maxclients 10000

# 此限制設置爲10000個客戶端,但是,如果Redis服務器無法將進程文件限制配置爲允許指定的限制,
# 則允許客戶端的最大數# # 量設置爲當前文件限制#減去32(因爲Redis保留了幾個文件描述符供內部使用)
# 一旦達到限制,Redis將關閉所有新連接,並返回:max number of clients reached 錯誤

⑦ 內存配置管理

############################## MEMORY MANAGEMENT ################################

1、maxmemory <bytes>
# 如果redis用內存超過了設置的限制,第一,開始用maxmemory-policy配置的策略往外刪數據,如果配置成了 # noeviction。所有write都會拒絕,比如set,lpush等。所有讀請求可以接受。
# 主要用在把redis用在LRU緩存,或者用在一個內存喫緊又不能刪除的策略上。
# 如果你有slave,你應該把最大內存別設置的太大,留一些系統內存給slave output buffers(如果是noeviction策略,就無需這樣設置了)


2、maxmemory-policy volatile-lru
# 內存策略。(上面是默認值)
# 一、volatile-lru ->用LRU刪除設置了ttl的key
# 二、allkeys-lru ->用LRU刪除任何key
# 三、volatile-random ->隨機刪除有ttl的key
# 四、allkeys-random ->隨機刪除任何key
# 五、volatile-ttl ->刪除即將ttl到期的key
# 六、noeviction ->不刪,有write的時候報錯。

# 如下操作會返回錯誤
 #       set setnx setex append
 #       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
 #       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
 #       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
 #       getset mset msetnx exec sort

3、maxmemory-samples 3
# LRU、LFU和最小TTL算法不是精確的算法,而是近似的算法(以節省內存),因此您可以根據速度或精度對其進行 # 調整;
# 默認的5會產生足夠好的結果。10非常接近真正的LRU算法,但花費更多的CPU。3更快,但不太準確。

⑧ AOF相關配置

==========================APPEND ONLY MODE ====================================
1、appendonly no
# 默認redis異步的dump數據到disk。但如果斷電了,那麼就會導致幾分鐘的寫操作丟失(根據save的配置);
# AOF提供更好模式。如用默認的AOF,redis只丟失最近一秒的數據(斷電情況),或者最後一個write操作#(redis自身錯誤,os正常)。每個write操作寫一次AOF;
#   當AOF文件太大了,redis會自動重寫一個aof文件出來。
#   AOF和RDB持久化可以同時啓用。redis會優先讀AOF恢復數據。
# https://redis.io/topics/persistence 裏面存在描述AOF、RDB的內容

2、appendfilename "appendonly.aof"
# AOF的文件名,上述屬於默認值

3、appendfsync everysec
# Redis支持三種不同的寫入模式(主要是fsync函數)[上述是默認值]
# no:不調用fsync()。而是讓操作系統自行決定sync的時間。這種模式下,Redis的性能會最快。
# always:在每次寫請求後都調用fsync()。這種模式下,Redis會相對較慢,但數據最安全。
# everysec:每秒鐘調用一次fsync()。這是性能和安全的折衷。

4、no-appendfsync-on-rewrite no
# 當fsync方式設置爲always或everysec時,存在:
# 如果後臺持久化進程需要執行一個很大的磁盤IO操作,那麼Redis可能會在fsync()調用時卡住。 目前尚未修 # 復這個問題,即使在另一個新的線程中去執行fsync(),也會阻塞住同步寫調用;
#
# 爲“yes” 時,當BGSAVE或BGWRITEAOF運行時,fsync()在主進程中的調用會被阻止。 這意味着當另一路進程 # 正在對AOF文件進行重構時,Redis的持久化功能就失效了
#
# 如果Redis有時延問題,那麼可以將該選項設置爲yes。否則請保持no,這是保證數據完整性的最安全的選擇


5、auto-aof-rewrite-percentage 100
6、auto-aof-rewrite-min-size 64mb
# 我們允許Redis自動重寫aof。當aof增長到一定規模時,Redis會隱式調用BGREWRITEAOF來重寫log文件, # 以縮減文件體積。
#
# Redis是這樣工作的:Redis會記錄上次重寫時的aof大小。
# 假如Redis自啓動至今還沒有進行過重寫,那麼啓動時aof文件的大小會被作爲基準值。 這個基準值會和當前 # 的aof大小進行比較。如果當前aof大小超出所設置的增長比例,則會觸發重寫。
# 【另外還需要設置一個最小大小,是爲了防止在aof很小時就觸發重寫。】
#
# 如果設置auto-aof-rewrite-percentage爲0,則會關閉此重寫功能。


7、aof-load-truncated yes
# 由於某種原因(aof文件損壞)有可能導致利用aof文件恢復redis數據時發生異常,該參數決定redis服務接  # 下來的行爲。
#
#一、 如果設置爲yes,則aof文件會被加載(但數據一定不全),並且會記錄日誌說明情況。
#二、 如果設置爲no,則redis服務根本就啓動不起來。【同時用戶要求 在重新啓動 服務器之前使用          # “redis-check-aof”實用程序修復AOF文件
# 執行:redis-check-aof --fix appendonly.aof(爲當前redis的aof文件) 



8、aof-use-rdb-preamble yes
#  [RDB file][AOF tail] -> RDB-AOF 混合持久化
# 這種持久化能夠通過 AOF 重寫操作創建出一個同時包含RDB數據和AOF數據的AOF文件;
# 正如示例解釋中的擺放:
# 其中RDB數據位於AOF文件的開頭, 它們儲存了服務器開始執行重寫操作時的數據庫狀態:至於那些在重寫操# 作執行之後執行的Redis命令,則會繼續以AOF格式追加到AOF文件的末尾,也即是RDB數據之後

 

⑨ 慢日誌

1、latency-monitor-threshold 0
#  只記錄大於等於下邊設置的值的操作。
# 0的話,就是關閉監視。可以動態開啓。
# 直接運行CONFIG SET latency-#monitor-threshold <milliseconds> 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章