redis 数据库
redis 不会频繁变动的数据,存储在redis里面,例如秒杀活动。
实验环境
- rhel7.3
主机名 | IP |
---|---|
server1 | 172.25.60.1(master) |
server2 | 172.25.60.2(slave) |
server3 | 172.25.60.3(slave) |
redis 的主从复制
首先主从复制需要分为两个角色:master(主) 和 slave(从) ,注意:redis里面只支持一个主,不像Mysql、Nginx主从复制可以多主多从。
1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
2、通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
分别在三个结点上安装redis
[server1]
-
安装依赖性gcc:
[root@server1 redis-5.0.3]# yum install gcc -y
-
下载安装包并解压:
-
因为解压后文件中有Makefile,所以直接make(如果make不成功,则加入参数make MALLOC=libc后再make)
-
make install
-
进入到utils目录下执行安装脚本:
[root@server1_7 utils]# ./install_server.sh
其中监听端口、日志文件、数据目录都设置为默认(回车)即可 -
此时查看端口,可以查到redis的端口6379
-
编辑配置文件
[root@server1 utils]# vim /etc/redis/6379.conf
-
编辑完文件后重启redis
[server2,server3] -
将server1上配置好的redis目录拷贝过来
[root@server1 ~]# scp -r redis-5.0.3 server2:
-
和server1一样make install和 ./install_server.sh
-
编辑配置文件,在最后加入slave指向的master:server1
-
修改完配置文件后重启redis
如果redis 起不来,可以删掉/var/lib/redis/6379/dump.rdb 再启动
[测试]
注意:主从复制中,slave时不可以写入的,只可以查看
在server1的redis写入后,在server2和server3上可以get到写入的值 -
server1
-
server2和3
-
redis 的主从切换
-
将sentinel.conf 文件拷贝到/etc/redis/下
-
编辑配置文件
protected-mode no ##关闭保护模式
#指定要监控的master,mymaster是定义的master名字,quorum为法定票数2,此处指的是sentinel的数,
只有指定的sentinel同意时才认为sentinel做的决策是有效的,一般大于sentinel数量的半数。可以有多
个master,一组sentinel集群可以监控N个主从复制架构
sentinel monitor mymaster 172.25.60.1 6379 2
#至少多长时间 连不上才认为主的离线了。单位为ms, 即连接超时时长
sentinel down-after-milliseconds mymaster 10000 (这里我设置为10秒)
# 刚刚设定为新主时,允许同时有多少个从向主发起同步请求。
#sentinel parallel-syncs mymaster 1
#当master故障时,把新的从提升为master,多长时间提不上就认为故障转移失败。
sentinel failover-timeout mymaster 180000
- 重启redis
[root@server2 redis]# /etc/init.d/redis_6379 restart
- 查看server1上的状态
redis-cli ---> info
查看状态
- server2和3上的状态
redis-cli ---> info
查看状态
- [测试]
- 将server1开启两个界面,以用来监控
[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel
- 将server1的redis宕掉
- 此时server2上的变化
redis-cli ---> info
查看状态
odown 都认为他挂了;+sdown 主观认为自己挂了 踢出集群 ;-sdown 加入集群
- 查看server3的状态:此时master变为server2
- 查看server2的状态:
redis-cli ---> info
查看状态
哨兵机制
- 将之前的redis停止
- 搭建集群环境使用的6个集群节点
- 在每个结点的目录里编写配置文件redis.conf
- 并加载
[root@server1 7001]# redis-server redis.conf
- 查看端口是否开启
- 其他节点的配置和7001的一样,只是将7001改为对应的节点号即可
- 也可通过进程查看
- 安装ruby
[root@server1 src]# yum install ruby -y
- 创建集群
[root@server1 src]# redis-cli --cluster create --cluster-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
- [测试]
- 集群对应的关系:7001、7003、7004为master
- 分别对应的slave为7006、7005、7002
- 无中心检测:此时在7001上会转到另一个master7004
- 当master(7004)宕掉都,会转到其对应的slave(7002)上
- 当其对应的slave(7002)也宕掉后,则该集群不可用
- [集群的恢复]
- 重新加载宕掉的节点的配置文件
- 所有的节点都开启后
- 集群就恢复了
添加节点
注意:节点的添加要保证成对存在,避免单点故障
添加节点时要分配新的哈希槽, 因为原来的哈希槽被原来的用完,要分配一部分给他们:两种分配方式:
- reshard 固定分配
- rebalance 平均分配
- 创建两个节点的文件: mkdir 700{7…8}
- 将配置文件编写好后开启
- 将节点添加到集群中:7007为主节点、7008为7007的从节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
edis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id a694bdd909ba85dad926ff18af6836c7c4c63c7a ##id为7007的id
注意:删除节点的时候:redis-cli --cluster del-node 127.0.0.1:7008 3d226f01a50d6e3c50e147d302e93fdb7f05252b然后把给节点的进程杀死,然后把给节点的文件除去.conf文件全部删除
-
查看是否添加成功:
redis-cli --cluster check 127.0.0.1:7001
-
此时节点添加成功,但是并没有哈希槽
-
给创建的节点添加哈希槽:
a)自主分配(分配300个给7007):redis-cli --cluster reshard 127.0.0.1:7007-->300-->id(7007的id)--> all -->yes
查看:
b)平均分配(推荐,因为平均分配可以让每个节点平衡,不容易发生错误):redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001
-
查看:redis-cli --cluster check 127.0.0.1:7008 看其哈希槽是否平均分配
-
进入7008或者7007查看是否能获取到值(能获取到则成功)
redis-cli -c -p 7008--> get name