一、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)查看哨兵信息,可以看出從庫已切換成主庫: