redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了
memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很
好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。
Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上
(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 append
only file(aof)里面(这称为“全持久化模式”)。
1.安装redis
以server2为例(server3也做)
[root@server2 ~]# tar zxf redis-4.0.8.tar.gz
[root@server2 ~]# yum install gcc -y
Make && make install
[root@server2 redis-4.0.8]# cd utils/
[root@server2 utils]# ./install_server.sh
[root@server2 utils]# vim /etc/redis/6379.conf
bind 0.0.0.0
[root@server2 utils]# /etc/init.d/redis_6379 restart
/etc/redis/6379.conf内容:
2.Redis 主从同步
master(主):server3—->172.25.25.3
slave (从):server2—->172.25.25.2
master上:
[root@server3 utils]# redis-cli
127.0.0.1:6379> set name lin
OK
127.0.0.1:6379> get name
"lin"
127.0.0.1:6379> set user1 111
OK
127.0.0.1:6379> get user1
"111"
slave上
[root@server2 utils]# vim /etc/redis/6379.conf
slaveof 172.25.25.3 6379
[root@server2 utils]# /etc/init.d/redis_6379 restart
[root@server2 utils]# redis-cli
127.0.0.1:6379> get name
"lin"
127.0.0.1:6379> get user1
"111"
/etc/redis/6379.conf内容
再测试:
master
[root@server3 utils]# redis-cli
127.0.0.1:6379> set name lll
OK
slave
127.0.0.1:6379> get name
"lll"
3.redis高可用
先在server1上按照第一步安装配redis,和server2的配置一样作为slave
再在master上配置:
[root@server3 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@server3 redis-4.0.8]# cd /etc/redis/
[root@server3 redis]# vim sentinel.conf
这里只写master的ip,两个slave和master的文件配置完全一样,也写master的ip
把文件传给slave(server1和server2)
[root@server3 redis]# scp sentinel.conf server2:/etc/redis/
[root@server3 redis]# scp sentinel.conf server1:/etc/redis/
监控命令:
[root@server3 redis]# redis-server /etc/redis/sentinel.conf --sentinel
再打开一个server3的shell
# 查看server3的信息
[root@server3 ~]# redis-cli
127.0.0.1:6379> info
.
.
.
# Replication
role:master #本机为mastes
connected_slaves:2
slave0:ip=172.25.25.2,port=6379,state=online,offset=37996,lag=0
slave1:ip=172.25.25.1,port=6379,state=online,offset=38133,lag=0
# 关闭master
127.0.0.1:6379> shutdown
not connected>
# 查看监控监控,30秒后server1变为master,server3为shutdown状态
[root@server3 redis]# redis-server /etc/redis/sentinel.conf --sentinel
6954:X 11 Aug 17:19:35.692 # +switch-master mymaster 172.25.25.3 6379 172.25.25.1 6379
6954:X 11 Aug 17:19:35.693 * +slave slave 172.25.25.2:6379 172.25.25.2 6379 @ mymaster 172.25.25.1 6379
6954:X 11 Aug 17:19:35.693 * +slave slave 172.25.25.3:6379 172.25.25.3 6379 @ mymaster 172.25.25.1 6379
6954:X 11 Aug 17:20:05.739 # +sdown slave 172.25.25.3:6379 172.25.25.3 6379 @ mymaster 172.25.25.1 6379
开启server3的服务
[root@server3 ~]# /etc/init.d/redis_6379 start
# 监控,30秒后server3变为slave
[root@server3 redis]# redis-server /etc/redis/sentinel.conf --sentinel
6954:X 11 Aug 17:22:51.065 # -sdown slave 172.25.25.3:6379 172.25.25.3 6379 @ mymaster 172.25.25.1 6379
查看server3的配置文件最后一行自动添加了内容:
4.Redis 集群(无中心化)
# 建立目录
[root@server3 ~]# cd /usr/local/
[root@server3 local]# mkdir cluster
[root@server3 local]# cd cluster/
# 建立端口
[root@server3 cluster]# mkdir 7001
[root@server3 cluster]# mkdir 7002
[root@server3 cluster]# mkdir 7003
[root@server3 cluster]# mkdir 7004
[root@server3 cluster]# mkdir 7005
[root@server3 cluster]# mkdir 7006
[root@server3 cluster]# cd 7001/
# 编写配置文件
[root@server3 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
[root@server3 7001]# cd /root/redis-4.0.8/src/
[root@server3 src]# cp redis-trib.rb /usr/local/bin/
安装部署ruby
[root@server3 bin]# yum install -y ruby
[root@server3 ~]# yum install ruby-2.2.3-1.el6.x86_64.rpm libyaml-0.1.3-4.el6_6.x86_64.rpm -y
[root@server3 ~]# gem install --local redis-4.0.1.gem
配置并启动
[root@server3 ~]# cd /usr/local/cluster/7001
[root@server3 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/cluster/7001/redis.pid
logfile /usr/local/cluster/7001/redis.log
[root@server3 7001]# redis-server redis.conf
查看日志,根据信息修改
[root@server3 7001]# cat redis.log
[root@server3 7001]# echo 511 > /proc/sys/net/core/somaxconn
[root@server3 7001]# sysctl -w vm.overcommit_memory=1
[root@server3 7001]# vim /etc/sysctl.conf #写入文件
vm.overcommit_memory = 1
[root@server3 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
给其他几个接口都做配置
# 把文件分别拷给其他目录
[root@server3 7001]# cp redis.conf ../7002
[root@server3 7001]# cp redis.conf ../7003
[root@server3 7001]# cp redis.conf ../7004
[root@server3 7001]# cp redis.conf ../7005
[root@server3 7001]# cp redis.conf ../7006
# 将redis.conf文件中7001改为各自的目录名(7002,7003,7004...),并启动
[root@server3 7001]# cd ../7002
[root@server3 7002]# vim redis.conf
[root@server3 7002]# redis-server redis.conf
[root@server3 7002]# cd ../7003
[root@server3 7003]# vim redis.conf
[root@server3 7003]# redis-server redis.conf
[root@server3 7003]# cd ../7004
[root@server3 7004]# vim redis.conf
[root@server3 7004]# redis-server redis.conf
[root@server3 7004]# cd ../7005
[root@server3 7005]# vim redis.conf
[root@server3 7005]# redis-server redis.conf
[root@server3 7005]# cd ../7006
[root@server3 7006]# vim redis.conf
[root@server3 7006]# redis-server redis.conf
建立集群
[root@server3 7006]# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
测试:
[root@server3 7006]# redis-cli -c -p 7001
127.0.0.1:7001> set name llj
-> Redirected to slot [5798] located at 127.0.0.1:7002 #数据写在了7002
OK
127.0.0.1:7002> get name
"llj"
127.0.0.1:7002>
[root@server3 7006]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"llj"
关闭7002
[root@server3 7006]# ps ax
.
.
.
1388 ? Ssl 0:00 redis-server *:7001 [cluster]
1408 ? Ssl 0:00 redis-server *:7002 [cluster]
1415 ? Ssl 0:00 redis-server *:7003 [cluster]
1421 ? Ssl 0:00 redis-server *:7004 [cluster]
1427 ? Ssl 0:00 redis-server *:7005 [cluster]
1433 ? Ssl 0:00 redis-server *:7006 [cluster]
1449 pts/0 R+ 0:00 ps ax
[root@server3 7006]# kill 1388
查看
# 数据由7002的slave(7005)接替
[root@server3 7006]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7005
"llj"
127.0.0.1:7005>
开启7002(本宝宝之前不小心kill掉了7001,如果你们的7001没有kill掉的话不用开启,只需开启7002)
[root@server3 7006]# cd ../7001
[root@server3 7001]# redis-server redis.conf
[root@server3 7001]# cd ../7002
[root@server3 7002]# redis-server redis.conf
[root@server3 7002]# redis-trib.rb check 127.0.0.1:7006
emmm…在做的过程中遇到一些问题,这是恢复正常之后的master和slave状态
如果同时kill掉两个master,master数少于slave,将查询不到任何信息
# kill掉7005和7006
[root@server3 7006]# ps ax
.
.
.
1427 ? Ssl 0:01 redis-server *:7005 [cluster]
1433 ? Ssl 0:01 redis-server *:7006 [cluster]
1460 ? Ssl 0:00 redis-server *:7001 [cluster]
1467 ? Ssl 0:00 redis-server *:7002 [cluster]
1493 ? Ssl 0:01 redis-server *:7003 [cluster]
1501 ? Ssl 0:01 redis-server *:7004 [cluster]
1511 pts/0 R+ 0:00 ps ax
[root@server3 7004]# kill 1427 1433
查询
[root@server3 7002]# redis-trib.rb check 127.0.0.1:7006
[root@server3 7004]# redis-cli -c -p 7004
127.0.0.1:7004> get name
(error) CLUSTERDOWN The cluster is down #查看失败