1.關閉防火墻
[root@xag182 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@xag182 ~]# systemctl stop firewalld.service
[root@xag182 ~]# systemctl disable firewalld.service
[root@xag182 ~]# systemctl stop iptables.service
2.下載& 解壓安裝
[root@xag182 redis-3.2.3]# yum install tcl gcc -y
[root@xag182 ~]# cd /usr/local/src
[root@xag182 src]# wget https://download.redis.io/releases/redis-3.2.3.tar.gz
[root@xag182 src]# tar -zxf redis-3.2.3.tar.gz
[root@xag182 src]# cd redis-3.2.3
[root@xag182 redis-3.2.3]# make
[root@xag182 redis-3.2.3]# make test
--------------------------------------------------------------------------
...
\o/ All tests passed without errors!
Cleanup: may take some time... OK
make[1]: Leaving directory `/usr/local/src/redis-3.2.3/src'
------------------------------------------------------------------------------
[root@xag182 redis-3.2.3]# make install PREFIX=/usr/local/redis
#創建目錄
mkdir -p /usr/local/redis/run
mkdir -p /usr/local/redis/log
mkdir -p /usr/local/redis/data/7000
mkdir -p /usr/local/redis/data/7001
mkdir -p /usr/local/redis/data/7002
mkdir -p /usr/local/redis/conf
chown -R root:root /usr/local/redis
3.配置redis环境变量
# vim /etc/profile
增加如下内容
---------------------------------------------
### redis environment ###
export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin
# source /etc/profile
#檢查版本
[root@xag182 redis-3.2.3]# redis-cli -v
redis-cli 3.2.3
[root@xag182 redis-3.2.3]# ll /usr/local/redis/bin/*
-rwxr-xr-x 1 root root 2432984 Dec 3 12:31 /usr/local/redis/bin/redis-benchmark
-rwxr-xr-x 1 root root 25088 Dec 3 12:31 /usr/local/redis/bin/redis-check-aof
-rwxr-xr-x 1 root root 5178608 Dec 3 12:31 /usr/local/redis/bin/redis-check-rdb
-rwxr-xr-x 1 root root 2585632 Dec 3 12:31 /usr/local/redis/bin/redis-cli
lrwxrwxrwx 1 root root 12 Dec 3 12:31 /usr/local/redis/bin/redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 5178608 Dec 3 12:31 /usr/local/redis/bin/redis-server
4.修改配置文件
mv /usr/local/src/redis-3.2.3/redis.conf /usr/local/redis/conf/redis_7000.conf
cd /usr/local/redis/conf/
#将 127.0.0.1 替换成 本身的物理IP(192.168.40.182)
sed -i 's/127.0.0.1/192.168.40.182/g' redis_7000.conf
sed -i 's/daemonize no/daemonize yes/g' redis_7000.conf
sed -i 's/port 6379/port 7000/g' redis_7000.conf
#编辑redis_7000.conf文件
[root@localhost redis-5.0.7]# vim redis_7000.conf
----------------------------------------------------------------
pidfile /usr/local/redis/run/redis_7000.pid
logfile /usr/local/redis/log/redis_7000.log
dir /usr/local/redis/data/7000
OR 如下命令
sed -i 's/\/var\/run\/redis_6379.pid/\/usr\/local\/redis\/run\/redis_7000.pid/g' redis_7000.conf
sed -i 's/logfile ""/logfile \/usr\/local\/redis\/log\/redis_7000.log/g' redis_7000.conf
sed -i 's/dir .\//dir \/usr\/local\/redis\/data\/7000/g' redis_7000.conf
5.啟動
[root@xag182 conf]# which redis-server
/usr/local/redis/bin/redis-server
[root@xag182 conf]# which redis-cli
/usr/local/redis/bin/redis-cli
[root@xag182 conf]# redis-server /usr/local/redis/conf/redis_7000.conf
[root@xag182 conf]# ps -ef | grep redis
root 25905 1 0 12:58 ? 00:00:00 redis-server 192.168.40.182:7000
root 25909 18263 0 12:58 pts/0 00:00:00 grep --color=auto redis
[root@xag182 conf]# netstat -tunpl | grep 7000
tcp 0 0 192.168.40.182:7000 0.0.0.0:* LISTEN 25905/redis-server
6.停止redis服务
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000 shutdown
[root@xag182 conf]# netstat -tunpl | grep 7000
無
7.客戶端連接
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000
192.168.40.182:7000> info
...
8.添加开机启动服务
vim /etc/systemd/system/redis7000.service
#粘贴以下内容:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_7000.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
9.Redis常用命令
systemctl start redis7000.service #启动redis服务
systemctl stop redis7000.service #停止redis服务
systemctl restart redis7000.service #重新启动服务
systemctl status redis7000.service #查看服务当前状态
systemctl enable redis7000.service #设置开机自启动
systemctl disable redis7000.service #停止开机自启动
10.解決啟動時出現的告警
首次啟動時會存在如下報警
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn
is set to the lower value of 128.
Server initialized
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.
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 madvise > /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
(set to 'madvise' or 'never').
解決方法:
vim /etc/sysctl.conf
#增加如下配置
net.core.somaxconn = 2048
vm.overcommit_memory = 1
vm.overcommit_memory 指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
[root@xag182 ~]# sysctl -p
[root@xag182 ~]# sysctl vm.overcommit_memory=1
[root@xag182 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
vim /etc/rc.local
#增加如下配置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
#重啟redis
systemctl restart redis7000.service
11.主从配置
[root@xag182 conf]# pwd
/usr/local/redis/conf
[root@xag182 conf]# cp redis_7000.conf redis_7001.conf
[root@xag182 conf]# cp redis_7000.conf redis_7002.conf
[root@xag182 conf]# sed -i 's/7000/7001/g' redis_7001.conf
[root@xag182 conf]# sed -i 's/7000/7002/g' redis_7002.conf
[root@xag182 conf]# vim /etc/systemd/system/redis7001.service
[root@xag182 conf]# vim /etc/systemd/system/redis7002.service
[root@xag182 conf]# echo 'slaveof 192.168.40.182 7000' >> redis_7001.conf
[root@xag182 conf]# echo 'slaveof 192.168.40.182 7000' >> redis_7002.conf
#启动主库7000
systemctl start redis7000.service
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000
192.168.40.182:7000> set key1 value1
#启动从库7001
systemctl start redis7001.service
查看主库7000的日志
-------------------------------------------------------------------------------------------------------------
31830:M 21 Nov 08:16:22.293 * Slave 192.168.40.182:7001 asks for synchronization
31830:M 21 Nov 08:16:22.293 * Full resync requested by slave 192.168.40.182:7001
31830:M 21 Nov 08:16:22.293 * Starting BGSAVE for SYNC with target: disk
31830:M 21 Nov 08:16:22.293 * Background saving started by pid 31958
31958:C 21 Nov 08:16:22.295 * DB saved on disk
31958:C 21 Nov 08:16:22.295 * RDB: 0 MB of memory used by copy-on-write
31830:M 21 Nov 08:16:22.391 * Background saving terminated with success
31830:M 21 Nov 08:16:22.391 * Synchronization with slave 192.168.40.182:7001 succeeded
-------------------------------------------------------------------------------------------------------------
查看从库7001的日志
--------------------------------------------------------------------------------------------------------------
31955:S 21 Nov 08:16:22.293 # Server started, Redis version 3.2.3
31955:S 21 Nov 08:16:22.293 * The server is now ready to accept connections on port 7001
31955:S 21 Nov 08:16:22.293 * Connecting to MASTER 192.168.40.182:7000
31955:S 21 Nov 08:16:22.293 * MASTER <-> SLAVE sync started
31955:S 21 Nov 08:16:22.293 * Non blocking connect for SYNC fired the event.
31955:S 21 Nov 08:16:22.293 * Master replied to PING, replication can continue...
31955:S 21 Nov 08:16:22.293 * Partial resynchronization not possible (no cached master)
31955:S 21 Nov 08:16:22.294 * Full resync from master: 0f48cc42c6ec2a53dbfad4b6df615966b905b8dc:1
31955:S 21 Nov 08:16:22.391 * MASTER <-> SLAVE sync: receiving 94 bytes from master
31955:S 21 Nov 08:16:22.391 * MASTER <-> SLAVE sync: Flushing old data
31955:S 21 Nov 08:16:22.391 * MASTER <-> SLAVE sync: Loading DB in memory
31955:S 21 Nov 08:16:22.391 * MASTER <-> SLAVE sync: Finished with success
--------------------------------------------------------------------------------------------------------------------
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7001
192.168.40.182:7001> get key1
"value1"
192.168.40.182:7001> set key2 value2
(error) READONLY You can't write against a read only slave.
#启动从库7002
systemctl start redis7002.service
查看主库7000的日志
---------------------------------------------------------------------------------------------------------------
31830:M 21 Nov 08:17:40.053 * Full resync requested by slave 192.168.40.182:7002
31830:M 21 Nov 08:17:40.053 * Starting BGSAVE for SYNC with target: disk
31830:M 21 Nov 08:17:40.053 * Background saving started by pid 32055
32055:C 21 Nov 08:17:40.055 * DB saved on disk
32055:C 21 Nov 08:17:40.055 * RDB: 0 MB of memory used by copy-on-write
31830:M 21 Nov 08:17:40.098 * Background saving terminated with success
31830:M 21 Nov 08:17:40.098 * Synchronization with slave 192.168.40.182:7002 succeeded
-----------------------------------------------------------------------------------------------------------------
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7002
192.168.40.182:7002> get key1
"value1"
192.168.40.182:7002> set key2 value2
(error) READONLY You can't write against a read only slave.
12.检查
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000
192.168.40.182:7000> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.40.182,port=7001,state=online,offset=729,lag=0
slave1:ip=192.168.40.182,port=7002,state=online,offset=729,lag=0
master_repl_offset:729
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:728
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7001
192.168.40.182:7001> info replication
# Replication
role:slave
master_host:192.168.40.182
master_port:7000
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:813
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
- 故障切换
#关闭7000主库
systemctl stop redis7000.service #停止redis服务
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7001
192.168.40.182:7001> info replication
# Replication
role:slave
master_host:192.168.40.182
master_port:7000
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1399
master_link_down_since_seconds:18
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#当主库当掉之后,可以执行如下命令将从库升级为主库
192.168.40.182:7001> slaveof no one
OK
192.168.40.182:7001> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#将7002 从库改由指向7001主库
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7002
192.168.40.182:7002> slaveof 192.168.40.182 7001
OK
192.168.40.182:7002> info replication
# Replication
role:slave
master_host:192.168.40.182
master_port:7001
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#启动原主库7000
[root@xag182 conf]# systemctl start redis7000.service
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000
192.168.40.182:7000> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.168.40.182:7000> slaveof 192.168.40.182 7001
OK
192.168.40.182:7000> info replication
# Replication
role:slave
master_host:192.168.40.182
master_port:7001
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:155
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
14.验证新主库7001
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7001
192.168.40.182:7001> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.40.182,port=7002,state=online,offset=267,lag=0
slave1:ip=192.168.40.182,port=7000,state=online,offset=267,lag=1
master_repl_offset:267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:266
192.168.40.182:7001>
192.168.40.182:7001> set key3 v3
OK
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7000
192.168.40.182:7000> get key3
"v3"
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7002
192.168.40.182:7002> get key3
"v3"
15.Redis哨兵(Sentinel)模式
mkdir -p /usr/local/redis/data/27000
mkdir -p /usr/local/redis/data/27001
mkdir -p /usr/local/redis/data/27002
#重启后7000 恢复原主
[root@xag182 ~]# redis-cli -h 192.168.40.182 -p 7000
-----------------------------------------------------------------------------------------
192.168.40.182:7000> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.40.182,port=7001,state=online,offset=43,lag=0
slave1:ip=192.168.40.182,port=7002,state=online,offset=43,lag=0
master_repl_offset:43
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:42
-------------------------------------------------------------------------------------------
mv /usr/local/src/redis-3.2.3/sentinel.conf /usr/local/redis/conf/sentinel_27000.conf
cd /usr/local/redis/conf/
#将 127.0.0.1 替换成 本身的物理IP(192.168.40.182)
sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 192.168.40.182 7000 2/g' sentinel_27000.conf
sed -i 's/127.0.0.1/192.168.40.182/g' sentinel_27000.conf
sed -i 's/port 26379/port 27000/g' sentinel_27000.conf
sed -i 's/dir \/tmp/dir \/usr\/local\/redis\/data\/27000/g' sentinel_27000.conf
echo 'logfile "/usr/local/redis/log/sentinel_27000.log"' >> sentinel_27000.conf
echo 'daemonize yes' >> sentinel_27000.conf
echo 'protected-mode no' >> sentinel_27000.conf
cp sentinel_27000.conf sentinel_27001.conf
cp sentinel_27000.conf sentinel_27002.conf
sed -i 's/27000/27001/g' sentinel_27001.conf
sed -i 's/27000/27002/g' sentinel_27002.conf
16.启动哨兵模式
redis-sentinel /usr/local/redis/conf/sentinel_27000.conf
redis-sentinel /usr/local/redis/conf/sentinel_27001.conf
redis-sentinel /usr/local/redis/conf/sentinel_27002.conf
[root@xag182 conf]# ps -ef | grep redis
root 1811 1 0 12:31 ? 00:00:03 /usr/local/redis/bin/redis-server 192.168.40.182:7000
root 1824 1 0 12:31 ? 00:00:02 /usr/local/redis/bin/redis-server 192.168.40.182:7001
root 1838 1 0 12:32 ? 00:00:02 /usr/local/redis/bin/redis-server 192.168.40.182:7002
root 3336 1 0 13:01 ? 00:00:00 redis-sentinel *:27000 [sentinel]
root 3343 1 0 13:01 ? 00:00:00 redis-sentinel *:27001 [sentinel]
root 3350 1 0 13:01 ? 00:00:00 redis-sentinel *:27002 [sentinel]
root 3364 1519 0 13:01 pts/0 00:00:00 grep --color=auto redis
17.查看日志
[root@xag182 log]# tail -100f sentinel_27000.log
3336:X 08 Dec 13:01:07.899 * Increased maximum number of open files to 10032 (it was originally set to 1024).
...
3336:X 08 Dec 13:01:07.901 # Sentinel ID is 624aeaed433cd5bdee0f88b1c38cb7eddba971aa
3336:X 08 Dec 13:01:07.901 # +monitor master mymaster 192.168.40.182 7000 quorum 2
3336:X 08 Dec 13:01:07.901 * +slave slave 192.168.40.182:7001 192.168.40.182 7001 @ mymaster 192.168.40.182 7000
3336:X 08 Dec 13:01:07.902 * +slave slave 192.168.40.182:7002 192.168.40.182 7002 @ mymaster 192.168.40.182 7000
3336:X 08 Dec 13:01:14.338 * +sentinel sentinel e72bd3067782075173dedf90481733d537150185 192.168.40.182 27001 @ mymaster 192.168.40.182 7000
3336:X 08 Dec 13:01:17.948 * +sentinel sentinel 11c6cfa5c3c06c24744b837ae1e232071f810e84 192.168.40.182 27002 @ mymaster 192.168.40.182 7000
18.查看配置的变化
[root@xag182 conf]# tail -n 8 sentinel_27000.conf
daemonize yes
protected-mode no
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 192.168.40.182 7001
sentinel known-slave mymaster 192.168.40.182 7002
sentinel known-sentinel mymaster 192.168.40.182 27002 11c6cfa5c3c06c24744b837ae1e232071f810e84
sentinel known-sentinel mymaster 192.168.40.182 27001 e72bd3067782075173dedf90481733d537150185
sentinel current-epoch 0
[root@xag182 conf]# tail -n 8 sentinel_27001.conf
daemonize yes
protected-mode no
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 192.168.40.182 7002
sentinel known-slave mymaster 192.168.40.182 7001
sentinel known-sentinel mymaster 192.168.40.182 27002 11c6cfa5c3c06c24744b837ae1e232071f810e84
sentinel known-sentinel mymaster 192.168.40.182 27000 624aeaed433cd5bdee0f88b1c38cb7eddba971aa
sentinel current-epoch 0
[root@xag182 conf]# tail -n 8 sentinel_27002.conf
daemonize yes
protected-mode no
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 192.168.40.182 7001
sentinel known-slave mymaster 192.168.40.182 7002
sentinel known-sentinel mymaster 192.168.40.182 27001 e72bd3067782075173dedf90481733d537150185
sentinel known-sentinel mymaster 192.168.40.182 27000 624aeaed433cd5bdee0f88b1c38cb7eddba971aa
sentinel current-epoch 0
19.检查
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 27000
192.168.40.182:27000> info
...
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.40.182:7000,slaves=2,sentinels=3
20.故障演练
关闭 主 7000节点
systemctl stop redis7000.service #停止redis服务
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 27000
192.168.40.182:27000> info
。。。
master0:name=mymaster,status=ok,address=192.168.40.182:7002,slaves=2,sentinels=3
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7002
192.168.40.182:7002> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.40.182,port=7001,state=online,offset=25646,lag=0
master_repl_offset:25646
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:25645
启动 7000节点
systemctl start redis7000.service
[root@xag182 conf]# redis-cli -h 192.168.40.182 -p 7002
192.168.40.182:7002> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.40.182,port=7001,state=online,offset=47116,lag=1
slave1:ip=192.168.40.182,port=7000,state=online,offset=46973,lag=1
master_repl_offset:47116
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:47115
21.关闭哨兵
redis-cli -h 192.168.40.182 -p 27000 shutdown
redis-cli -h 192.168.40.182 -p 27001 shutdown
redis-cli -h 192.168.40.182 -p 27001 shutdown
网友评论