redis集群搭建与验证

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

生产环境用了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。

 

最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥

转载于:https://my.oschina.net/zhuangweihong/blog/735835

你可能感兴趣的:(redis集群搭建与验证)