Redis 主從切換+Predixy
部署環(huán)境
| 主機(jī)名 | ip |
|---|---|
| redis-zhu | 192.168.244.132 |
| redis-cong | 192.168.244.128 |
1.配置互信
兩臺(tái)主機(jī)都做
通過(guò)ssh-keygen 生成公鑰私鑰對(duì),拷貝到兄弟節(jié)點(diǎn);
ssh-keygen
ssh-copy ip
2.Redis 包安裝及賬號(hào)設(shè)置
安裝Redis 包如低版本,可以直接官網(wǎng)下載rpm 包進(jìn)行安裝,會(huì)直接生成Redis 賬號(hào)及組;
如較新版本需要下載源碼tar.gz,解壓后自行編譯,同時(shí)需要手動(dòng)添加Redis
安裝依賴
yum -y install gcc gcc-c++ tcl
賬號(hào)及組;
groupadd redis
useradd -s /sbin/nologin -g redis redis
Redis 下載到/opt下:
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar -xzf redis-5.0.8.tar.gz
cd redis-5.0.8
make & make install
復(fù)制配置文件到/etc
cp /opt/redis-5.0.8/redix.conf /etc
cp /opt/redis-5.0.8/sentinel.conf /etc
系統(tǒng) 及 Redis參數(shù)配置
系統(tǒng) :
vi /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 4096 > /proc/sys/net/core/somaxconn
vi /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 4096
sysctl -p
ulimit -SHn 100000
vi /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
* soft nproc 64000
* hard nproc 64000
Redis: 參數(shù)配置
vim /etc/redix.conf
requirepass "wxIMtMRWw7104MSLitiowI4QCknkzFMV" #主上配置
masterauth "wxIMtMRWw7104MSLitiowI4QCknkzFMV" #從上配置
bind 0.0.0.0
port 6380
maxmemory 3gb
dir "/redis/data"
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
tcp-backlog 511
timeout 0
tcp-keepalive 300
pidfile "/var/run/redis.pid"
logfile "/var/log/redis/redis.log"
sentinel 配置:
vim /etc/sentinle.conf #主配置
port 26380
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/opt/redis/data/sentinel.log"
dir "/tmp"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.244.132 6380 1
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
protected-mode no
sentinel current-epoch 5
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vim /etc/sentinle.conf #從配置
port 26380
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/opt/redis5/data/sentinel.log"
dir "/tmp"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.244.132 6380 1
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
protected-mode no
sentinel current-epoch 5
4.predixy 安裝
同Redis ,可以直接下載編譯后執(zhí)行文件或是下載源碼編譯;配置文件拷貝到固定目錄;
安裝依賴
yum install libstdc++-static -y
下載predixy
git clone https://github.com/joyieldInc/predixy.git
cd predixy
編譯既可以
make
cp 執(zhí)行文件到bin目錄
cp src/predixy /usr/local/bin/
cp配置文件到/etc/predixy(目錄需要?jiǎng)?chuàng)建)
cp predixy/conf/* /etc/predixy/
5. 配置Predixy
vim /etc/predixy/auth.conf
Authority {
Auth {
Mode write
}
Auth {
Mode admin
}
}
vim /etc/predixy/predixy.conf
Name PredixyExample
WorkerThreads 1
ClientTimeout 300
LogVerbSample 0
LogDebugSample 0
LogInfoSample 10000
LogNoticeSample 1
LogWarnSample 1
LogErrorSample 1
Include auth.conf
Include sentinel.conf
Include latency.conf
vim /etc/predixy/sentinel.conf
SentinelServerPool {
Pssword wxIMtMRWw7104MSLitiowI4QCknkzFMV
Databases 16
Hash crc16
HashTag {}
Distribution modula
MasterReadPriority 60
StaticSlaveReadPriority 50
DynamicSlaveReadPriority 50
RefreshInterval 1
ServerTimeout 1
ServerFailureLimit 1
ServerRetryTimeout 1
KeepAlive 120
Sentinels {
+ 192.168.244.132:26380
+ 192.168.244.128:26380
}
Group mymaster {
+ 192.168.244.132:6380
+ 192.168.244.128:6380
}
}
MasterReadPriority: 讀寫(xiě)分離功能,從redis master節(jié)點(diǎn)執(zhí)行讀請(qǐng)求的優(yōu)先級(jí),為0則禁止讀redis master,不指定的話為50StaticSlaveReadPriority: 讀寫(xiě)分離功能,從靜態(tài)redis slave節(jié)點(diǎn)執(zhí)行讀請(qǐng)求的優(yōu)先級(jí),所謂靜態(tài)節(jié)點(diǎn),是指在本配置文件中顯示列出的redis節(jié)點(diǎn),不指定的話為0
MasterReadPriority,StaticSlaveReadPriority,DynamicSlaveReadPriority這三個(gè)參數(shù)都配成一樣,就相當(dāng)于負(fù)載均衡
ServerFailureLimit: 一個(gè)redis實(shí)例出現(xiàn)多少次才錯(cuò)誤以后將其標(biāo)記為失效,不指定的話為10ServerRetryTimeout: 一個(gè)redis實(shí)例失效后多久后去檢查其是否恢復(fù)正常,不指定的話為1秒
6.keepalived 安裝
可以直接下載rpm,并進(jìn)行安裝;
yum -y install keepalived
7.配置Keepalived
vim /etc/keepalived/keepalived.conf #主上配置
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id redis-zhu
vrrp_mcast_group4 224.0.100.100
}
vrrp_script check_redis_proxy {
script "/usr/bin/check_redis_proxy.sh"
interval 3
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
track_script {
check_redis_proxy
}
virtual_ipaddress {
192.168.244.144/24
}
}
vim /etc/keepalived/keepalived.conf #從上配置
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id redis-zhu
vrrp_mcast_group4 224.0.100.100
}
vrrp_script check_redis_proxy {
script "/usr/bin/check_redis_proxy.sh"
interval 3
weight 2
}
vrrp_instance VI_1 {
state BADKUP
interface ens33
virtual_router_id 6
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
track_script {
check_redis_proxy
}
virtual_ipaddress {
192.168.244.144/24
}
}
8. Keepalived 腳本
vim /usr/bin/check_redis_proxy.sh
#!/bin/bash
PREDIXY_PID=`ps -ef |grep predixy|grep -v 'grep'|wc -l`
ps -ef |grep predixy|grep -v 'grep'|wc -l
if [ "${PREDIXY_PID}" -ge 1 ];then
echo "predixy is Ok"
else
systemctl start predixy
sleep 3;
PREDIXY_PID2=`ps -ef |grep predixy|grep -v 'grep'|wc -l`
if [ "${PREDIXY_PID2}" -eq 0 ];then
systemctl stop keepalived
fi
fi
9. Service 文件供參考
cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis
After=syslog.target nework.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf
ExecStop=/usr/bin/pkill redis-server
TimeoutStopSec=0
Restart=on-failure
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# Virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# stack size
LimitSTACK=1048576
# locked memory
LimitMEMLOCK=infinity
# total threads(user+kernel)
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
cat /usr/lib/systemd/system/redis-sentinel.service
[Unit]
Description=Redis-sentinel
After=syslog.target nework.target
[Service]
Type=forking
ExecStart=/usr/bin/redis-sentinel /etc/sentinel.conf
ExecStop=/usr/bin/pkill redis-sentinel
TimeoutStopSec=0
Restart=on-failure
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
# file sizes
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# stack size
LimitSTACK=1048576
# lcoked memory
LimitMEMLOCK=infinity
# total threads
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
cat /usr/lib/systemd/system/predixy.service
[Unit]
Description=Predixy
After=syslog.target nework.target
[Service]
Type=simple
ExecStart=/usr/local/bin/predixy /etc/predixy/predixy.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
PrivateTmp=true
TimeoutStopSec=0
Restart=on-failure
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectory=0755
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# stack size
LimitSTACK=1048576
# locked memory
LimitMEMLOCK=infinity
# total threads
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
10. 啟動(dòng)服務(wù)
依次啟動(dòng)并確認(rèn)正常后,啟動(dòng)下一個(gè)Redis, Redis-Sentinel, Predixy, Keepalived;
最后確認(rèn)主從狀態(tài),代理狀態(tài),vip;
systemctl start keepalived
systemctl daemon-reload
systemctl enable redis.service predixy.service sentinel.service keepalived.service
systemctl start redis.service predixy.service sentinel.service
注意以上兩臺(tái)主機(jī)都安裝
Predixy 參考文檔:https://github.com/joyieldInc/predixy/blob/master/doc/config_CN.md

浙公網(wǎng)安備 33010602011771號(hào)