2019独角兽企业重金招聘Python工程师标准>>>
生产环境用了redis集群,用了一段时间以来,redis集群还是挺好用的。因此,把在生产环境中学习到的redis集群的运维知识跟大家分享一下。
1: 先安装redis-server
可从官方下载最新http://redis.io/download,编译安装即可。
cd /usr/local/src
tar -zxvf redis-3.0.7.tar.gz
cd redis-3.0.7
make
安装完后src目录下,三个比较常用的命令如下。redis-server用于启动redis服务器,redis-cli用于连接redis服务器,redis-trib.rb用于创建redis集群:
[root@2_17 redis-3.0.7]# ll -h src/redis*
-rwxr-xr-x 1 root root 4.5M Jun 22 00:51 src/redis-cli
-rwxr-xr-x 1 root root 6.2M Jun 22 00:51 src/redis-server
-rwxrwxr-x 1 root root 60K Jan 25 22:57 src/redis-trib.rb
cp src/redis-cli src/redis-server src/redis-trib.rb /usr/local/bin/拷贝到bin目录可直接运行。
2: 创建redis集群对应的目录,并启动redis-server:
mkdir -pv /data/redis-cluster/7000
mkdir -pv /data/redis-cluster/7001
mkdir -pv /data/redis-cluster/7002
mkdir -pv /data/redis-cluster/8000
mkdir -pv /data/redis-cluster/8001
mkdir -pv /data/redis-cluster/8002
3: 创建配置并启动redis-server,vim /data/redis-cluster/7000/redis.conf
daemonize yes
pidfile "/data/redis-cluster/7000/redis.pid"
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/redis-cluster/7000/redis.log"
cluster-enabled yes
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis-cluster/7000"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
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 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# Generated by CONFIG REWRITE
maxmemory 5859375kb
maxmemory-policy volatile-lru
启动redis服务器:redis-server /data/redis-cluster/7000/redis.conf 。
4: 启动7001,7002,8000,8001,8002的redis服务器。
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/7001/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/7002/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8000/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8001/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8002/redis.conf
vim /data/redis-cluster/7001/redis.conf:
%s/7000/7001/g 把7000的都替换成7001,并启动redis-server:redis-server /data/redis-cluster/7001/redis.conf。
5: 其它的也是类似的替换方式。
6: 此时,redis服务器进程如下:
[root@2_17 7002]# ps auxfw|grep redis
root 4078 0.0 0.1 103244 856 pts/0 S+ 21:13 0:00 \_ grep redis
root 4034 0.0 0.4 137444 2440 ? Ssl 21:03 0:00 redis-server *:7000 [cluster]
root 4043 0.0 0.4 137444 2436 ? Ssl 21:05 0:00 redis-server *:7001 [cluster]
root 4054 0.0 0.4 137444 2440 ? Ssl 21:07 0:00 redis-server *:7002 [cluster]
root 4062 0.0 0.4 137444 2440 ? Ssl 21:12 0:00 redis-server *:8002 [cluster]
root 4067 0.0 0.4 137444 2440 ? Ssl 21:12 0:00 redis-server *:8001 [cluster]
root 4071 0.0 0.4 137444 2436 ? Ssl 21:12 0:00 redis-server *:8000 [cluster]
7: 创建redis集群
创建前准备:
ruby -v #没有ruby的时候安装一下ruby。 yum install gem -y
gem -v #没有gem的时候安装一下gem。 yum install rubygems -y
gem install redis #由于集群是使用ruby的,gem是给ruby安装redis扩展,让ruby能操作redis。
创建redis集群:
#redis-trib.rb create --replicas 1 172.16.0.3:7000 172.16.0.3:7001 172.16.0.3:7002 172.16.0.3:8000 172.16.0.3:8001 172.16.0.3:8002 #此命令创建集群虽然快,但哪个主哪个从无法指定,多台机器的时候比较麻烦,因此使用如下的创建方式。
7.1 先创建redis主的集群。
redis-trib.rb create 172.16.0.3:7000 172.16.0.3:7001 172.16.0.3:7002
#redis-trib.rb add-node 172.16.0.3:7004 172.16.0.3:7000 redis集群新增主,这个未测试。
7.2 一个一个创建redis主集群的从库,多台主机的时候使用这个创建。集群在生产环境使用都是三台主机。
redis-trib.rb add-node --slave 172.16.0.3:8000 172.16.0.3:7000
redis-trib.rb add-node --slave 172.16.0.3:8001 172.16.0.3:7001
redis-trib.rb add-node --slave 172.16.0.3:8002 172.16.0.3:7002
7.3 查看redis集群的情况。
[root@2_17 7002]# redis-cli -p 7000 -c cluster nodes
5b0f437d2760745948123b24acfa70122f13420d 172.16.0.3:8002 slave a3e334fbce1d167a1129f627bcc9cb4a19d1cd79 0 1471785839075 3 connected
cdff657dd5bf50db775ecc439eafb247f902fb08 172.16.0.3:8000 slave 5be2a3e20dcbdff1368b80823d70511ccc514bdf 0 1471785838071 1 connected
a3e334fbce1d167a1129f627bcc9cb4a19d1cd79 172.16.0.3:7002 master - 0 1471785835564 3 connected 10923-16383
495b5d3891e85f9fe325e12df8d2bef991c6ce2a 172.16.0.3:8001 slave 6d3891e9a8c634624ad0d828bb463ee10d044e8b 0 1471785836065 2 connected
5be2a3e20dcbdff1368b80823d70511ccc514bdf 172.16.0.3:7000 myself,master - 0 0 1 connected 0-5460
6d3891e9a8c634624ad0d828bb463ee10d044e8b 172.16.0.3:7001 master - 0 1471785837068 2 connected 5461-10922
7.4 测试集群是否可用
#连接集群不管是写入数据还是读取数据都需要加入-c的参数。
for line in {1..100};do redis-cli -p 7000 -c set ops_${line} ${line}; done #往集群里面写入一百条数据。
for line in {1..100};do redis-cli -p 7000 -c get ops_${line}; done #读取数据看一下是否能读取到。
查看集群的key的分布情况:
db0:keys=30,expires=0,avg_ttl=0
127.0.0.1:7000> #7000有30个。
db0:keys=41,expires=0,avg_ttl=0
127.0.0.1:7001> #7001有41个。
db0:keys=29,expires=0,avg_ttl=0
127.0.0.1:7002> #7002有29个。
# Keyspace
db0:keys=30,expires=0,avg_ttl=0
127.0.0.1:8000> #8000是7000的备份,30个。
7.5 验证集群的切换
redis-cli -p 7000 SHUTDOWN #关闭集群
for line in {1..100};do redis-cli -p 7001 -c get ops_${line}; done #因为7000关闭,所以得用其它端口去测试,看下能否读取成功。
重装启动7000端口的redis服务器:redis-server /data/redis-cluster/7000/redis.conf
redis-cli -p 7000 #使用info看下7000已经成从库,本来应该是主库的。
redis-cli -p 7000 CLUSTER FAILOVER #使用这个命令把7000再次切换为主库。
for line in {1..100};do redis-cli -p 7001 -c get ops_${line}; done #再次验证下数据是否正常。
以上验证都正常。
7.6 redis集群数据的保证
三主三从,三从是用来备份数据的,因此得启动bgsave或者aof其中一个,aof对机器的性能影响比较小,一盘都在从库上开启aof备份数据。操作如下:
config set appendfsync everysec
config set appendonly yes #一设置为yes以后,redis就会启动BGREWRITEAOF,把数据生成一份aof。
config rewrite #直接把配置写入配置文件。
CONFIG SET auto-aof-rewrite-percentage 0 #一般来说把auto-aof-rewrite-percentage设置为0,不让从库自动进行BGREWRITEAOF,以免业务量大的时候影响性能。为什么要进行BGREWRITEAOF,因为aof存的是对redis服务器的操作命令,随着时间的推移,aof文件会不断增大。所以执行是要执行,但要由运维人员自己定时间执行,可以在定时任务在业务空闲的时候使用redis-cli -p 8000 BGREWRITEAOF。
最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥