redis單節點,主從,主從加哨兵搭建

一、redis單實例搭建

注:系統安裝後執行了系統初始化優化腳本,故用戶、內核參數以及依賴包均修改已安裝。

#redis版本以及系統版本

Redis version=4.0.6

[root@KDXF-00 setup]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

#把redis包放在指定目錄下並解壓

[root@KDXF-00 setup]# pwd
/data1/setup
[root@KDXF-00 setup]# ls
redis-4.0.6 redis-4.0.6.tar.gz

#創建目錄並複製配置文件

[root@KDXF-00 opt]# mkdir -p redis/log
[root@KDXF-00 opt]# mkdir redis/etc
[root@KDXF-00 opt]#cp /data1/setup/redis-4.0.6/redis.conf /data1/opt/redis/etc

#安裝

[root@KDXF-00 redis-4.0.6]# pwd

/data1/setup/redis-4.0.6

[root@KDXF-00 redis-4.0.6]# less README.md   //查看redis的基本信息及相關操作

[root@KDXF-00 redis-4.0.6]# make MALLOC=jemalloc

[root@KDXF-00 redis-4.0.6]# make PREFIX=/data1/opt/redis install

[root@KDXF-00 redis-4.0.6]# cd ~

[root@KDXF-00 ~]# tree /data1/opt/redis

/data1/opt/redis

├── bin

│   ├── redis-benchmark

│   ├── redis-check-aof

│   ├── redis-check-rdb

│   ├── redis-cli

│   ├── redis-sentinel -> redis-server

│   └── redis-server

├── etc

│   └── redis.conf

└── log

#配置環境變量

[root@KDXF-00 ~]# echo "export PATH=/data1/opt/redis/bin:$PATH">>/etc/profile

[root@KDXF-00 ~]# source /etc/profile

[root@KDXF-00 ~]# which redis-server

/data1/opt/redis/bin/redis-server

#啓動

[root@KDXF-00 ~]# redis-server /data1/opt/redis/etc/redis.conf

注:此處會有報錯

 

此時按ctrl+c退出即可,因爲此時不是後臺執行的命令

修復一:

[root@KDXF-00 ~]# echo "net.core.somaxconn=511">> /etc/sysctl.conf

[root@KDXF-00 ~]# sysctl -p

補充:

net.core.somaxconn是linux中的一個kernel參數,表示socket監聽(listen)的backlog上限。backlog是socket的監聽隊列,當一個請求(request)尚未被處理或建立時,他會進入backlog。而socket server可以一次性處理backlog中的所有請求,處理後的請求不再位於監聽隊列中。當server處理請求較慢,以至於監聽隊列被填滿後,新來的請求會被拒絕。所以說net.core.somaxconn限制了接收新 TCP 連接偵聽隊列的大小。對於一個經常處理新連接的高負載 web服務環境來說,默認的 128 太小,大多數環境這個值建議增加到 1024 或者更多。

修復二:

[root@KDXF-00 ~]# echo "vm.overcommit_memory = 1">> /etc/sysctl.conf

[root@KDXF-00 ~]# sysctl -p

補充:

overcommit_memory:設置內存分配策略。可選值:0、1、2。

0:表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。

1:表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。

2:表示內核允許分配超過所有物理內存和交換空間總和的內存

注意:redis在dump數據的時候,會fork出一個子進程,理論上child進程所佔用的內存和parent是一樣的,比如parent佔用的內存爲8G,這個時候也要同樣分配8G的內存給child,如果內存無法負擔,往往會造成redis服務器的down機或者IO負載過高,效率下降。所以這裏比較優化的內存分配策略應該設置爲 1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何)。

修復三:

[root@KDXF-00 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@KDXF-00 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

[root@KDXF-00 ~]# vim /etc/rc.local

插入:never > /sys/kernel/mm/transparent_hugepage/enabled

補充:使用透明大頁,可能導致redis延遲和內存使用問題。

再次啓動成功:

 

#查看進程

[root@KDXF-00 ~]# lsof -i:6379

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

redis-ser 7586 root    6u  IPv4  25719      0t0  TCP localhost:6379 (LISTEN)

#指定用戶並啓動服務(前提是root啓動的redis已進程關閉)

[root@KDXF-00 opt]# redis-cli shutdown

[root@KDXF-00 opt]# pwd

/data1/opt

[root@KDXF-00 opt]# chown -R iflyer:iflyer redis/

[root@KDXF-00 opt]# ll

total 0

drwxr-xr-x. 5 iflyer iflyer 39 Sep 30 01:42 redis

[root@KDXF-00 redis]# su iflyer

[iflyer@KDXF-00 redis]$ redis-server /data1/opt/redis/etc/redis.conf

#修改配置文件
設置redis後臺啓動

daemonize yes

指定PID文件

pidfile /data1/opt/redis/redis.pid

指定redis運行的端口

port 6379

設置日誌級別以及日誌文件

loglevel notice

logfile /data1/opt/redis/log/redis.log

 

二、redis主從搭建

注:安裝過程見單實例章節

主服務器:192.168.213.23

從服務器:192.168.213.24

master操作:

#配置文件修改

設置可以連接的網段

bind 0.0.0.0

設置redis後臺啓動

daemonize yes

指定PID文件

pidfile /data1/opt/redis/redis.pid

指定redis運行的端口

port 6379

設置日誌級別以及日誌文件

loglevel notice

logfile /data1/opt/redis/log/redis.log

 

slave操作:

#配置文件修改

設置可以連接的網段

bind 0.0.0.0

設置redis後臺啓動

daemonize yes

指定master

slaveof 192.168.213.23 6379

指定PID文件

pidfile /data1/opt/redis/redis.pid

指定redis運行的端口

port 6379

設置日誌級別以及日誌文件

loglevel notice

logfile /data1/opt/redis/log/redis.log

 

#分別啓動主從服務器查看日誌文件:

[iflyer@KDXF-00 redis]$ redis-server /data1/opt/redis/etc/redis.conf

 

 

測試主從同步:

Master:

[root@KDXF-00 redis]# redis-cli -p 6379

127.0.0.1:6379>  keys *

(empty list or set)

127.0.0.1:6379> set name lily

OK

127.0.0.1:6379> get name

"lily"

127.0.0.1:6379>  keys *

1) "name"

Slave:

[root@KDXF-01 redis]# redis-cli -p 6379

127.0.0.1:6379> keys *

1) "name"

127.0.0.1:6379> get name

"lily"

 

三、一主一從三哨兵

注:安裝過程見上文,此段主要配置sentinel(哨兵)

master操作:

#創建目錄:

[iflyer@KDXF-00 redis]$ pwd

/data1/opt/redis

[iflyer@KDXF-00 redis]$ cp /data1/setup/redis-4.0.6/sentinel.conf /data1/opt/redis/etc/

[iflyer@KDXF-00 redis]$ mkdir sentinel_work

[iflyer@KDXF-00 redis]$ mkdir redisdata

#修改redis.conf配置文件:

daemonize yes

pidfile "/data1/opt/redis/redis.pid"

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 60

loglevel notice

logfile /data1/opt/redis/log/redis.log

databases 16

stop-writes-on-bgsave-error no

rdbcompression yes

rdbchecksum no

dbfilename "dump.rdb"

dir /data1/opt/redis/redisdata

masterauth test123

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

repl-backlog-size 512mb

slave-priority 100

requirepass test123

maxmemory 64gb

maxmemory-policy volatile-lru

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite yes

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-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

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 5gb 5gb 600

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

#修改sentinel.conf配置文件:

port 26379

daemonize yes

logfile /data1/opt/redis/log/sentinel.log

dir /data1/opt/redis/sentinel_work

protected-mode no

sentinel monitor mymaster 192.168.213.23 6379 1

sentinel auth-pass mymaster test123

sentinel down-after-milliseconds mymaster 3000

sentinel failover-timeout mymaster 10000

sentinel config-epoch mymaster 7

sentinel leader-epoch mymaster 7

sentinel current-epoch 7

slave操作:

#創建目錄:

[iflyer@KDXF-00 redis]$ pwd

/data1/opt/redis

[iflyer@KDXF-00 redis]$ cp /data1/setup/redis-4.0.6/sentinel.conf /data1/opt/redis/etc/

[iflyer@KDXF-00 redis]$ mkdir sentinel_work

[iflyer@KDXF-00 redis]$ mkdir redisdata

#修改redis.conf配置文件:

daemonize yes

pidfile "/data1/opt/redis/redis.pid"

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 60

loglevel notice

logfile /data1/opt/redis/log/redis.log

databases 16

stop-writes-on-bgsave-error no

rdbcompression yes

rdbchecksum no

dbfilename "dump.rdb"

dir /data1/opt/redis/redisdata

masterauth test123

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

repl-backlog-size 512mb

slave-priority 100

requirepass test123

maxmemory 64gb

maxmemory-policy volatile-lru

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite yes

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-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

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 5gb 5gb 600

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

slaveof 192.168.213.23 6379

#修改sentinel.conf配置文件:

port 26379

daemonize yes

logfile /data1/opt/redis/log/sentinel.log

dir /data1/opt/redis/sentinel_work

protected-mode no

sentinel monitor mymaster 192.168.213.23 6379 1

sentinel auth-pass mymaster test123

sentinel down-after-milliseconds mymaster 3000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 10000

sentinel config-epoch mymaster 7

sentinel leader-epoch mymaster 5

sentinel current-epoch 7

#另搭建一個redis:192.168.213.25,sentinel.conf配置文件如下:

port 26379

daemonize yes

logfile /data1/opt/redis/log/sentinel.log

dir /data1/opt/redis/sentinel_work

protected-mode no

sentinel monitor mymaster 192.168.213.23 6379 1

sentinel auth-pass mymaster test123

sentinel down-after-milliseconds mymaster 3000

sentinel failover-timeout mymaster 10000

sentinel config-epoch mymaster 7

sentinel leader-epoch mymaster 7

sentinel current-epoch 7

 

#啓動主從redis以及3個哨兵:

[iflyer@KDXF-00 bin]$ redis-server /data1/opt/redis/etc/redis.conf

[iflyer@KDXF-00 bin]$ pwd

/data1/opt/redis/bin

[iflyer@KDXF-00 bin]$ nohup ./redis-sentinel ../etc/sentinel.conf --sentinel &

#查看3個sentinel.conf:

 

 

 

 

#查看sentinel信息:

[iflyer@KDXF-01 bin]$ ./redis-cli -a test123 -p 26379 info sentinel

 

#查看主從信息:

[iflyer@KDXF-02 bin]$ ./redis-cli -p 6379 -h 192.168.213.23 -a test123 info replication

[iflyer@KDXF-02 bin]$ ./redis-cli -p 6379 -h 192.168.213.24 -a test123 info replication

 

 

驗證:

#關閉主庫:

[iflyer@KDXF-00 bin]$  redis-cli -p 6379 -a test123  shutdown

[iflyer@KDXF-00 bin]$ ps -ef | grep redis

iflyer    1670     1  0 Oct07 ?        00:01:41 ./redis-sentinel *:26379 [sentinel]

iflyer    1885  1484  0 05:02 pts/1    00:00:00 grep --color=auto redis

#查看sentinel信息:

[iflyer@KDXF-02 bin]$ ./redis-cli -a test123 -p 26379 info sentinel

 

#等待指定時間後(down-after-milliseconds)查看哨兵信息,可以看出從庫已切換成主庫:

 

 

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