一、redis哨兵
1.主从复制存在的问题:
1. 主从复制,从节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master(哨兵)
2 主从复制,只能主写数据,所以写能力和存储能力有限(集群)
2.原理
1 多个sentinel发现并确认master有问题
2 选举触一个sentinel作为领导
3 选取一个slave作为新的master
4 通知其余slave成为新的master的slave
5 通知客户端主从变化
6 等待老的master复活成为新master的slave
3.搭建步骤
第一步:先搭建一主多从
第二步:配置哨兵(也是一个特殊的redis服务端,客户端可以连接)
port 26379 daemonize yes dir /root/redis/data bind 0.0.0.0 logfile "redis_sentinel.log" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
4.客户端测试
import redis
from redis.sentinel import Sentinel
#链接哨兵服务器(主机名也可以用域名)
# 10.0.0.101:26379
sentinel = Sentinel([('139.196.158.24', 26379),
('139.196.158.24', 26380),
('139.196.158.24', 26381)],
socket_timeout=5)
#print(sentinel)
##获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
##### 读写分离
# 获取主服务器进行写入
# master = sentinel.master_for('mymaster', socket_timeout=5)
# w_ret = master.set('foo', 'bar')
# slave = sentinel.slave_for('mymaster', socket_timeout=0.5)
# r_ret = slave.get('foo')
# print(r_ret)
二、redis集群
port 7000 daemonize yes dir "/lqz/data0/" logfile "7000.log" #masterauth 集群搭建时,主的密码 cluster-enabled yes # 开启cluster cluster-node-timeout 15000 # 故障转移,超时时间 15s cluster-config-file nodes-7000.conf # 给cluster节点增加一个自己的配置文件 cluster-require-full-coverage yes #只要集群中有一个故障了,整个就不对外提供服务了,这个实际不合理,假设有50个节点,一个节点故障了,所有不提供服务了;,需要设置成no port 7000 daemonize yes dir "/root/redis/data7000/" logfile "7000.log" cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-7000.conf cluster-require-full-coverage yes ./src/redis-cli -p 7000 --cluster create 127.0.0.1:7000 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 --cluster-replicas 1 redis-cli -c -p 7002
./src/redis-cli -p 7005 --cluster add-node 127.0.0.1:7006 127.0.0.1:7007 # 把7006加入到集群中 ./src/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7005 # 把7007加入到集群并且作为7006的从库 ./src/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7005 --cluster-slave --cluster-master-id f7b06c1d565727e085b3cd81533842589fa3fafa # 迁移槽 redis-cli --cluster reshard 127.0.0.1:7000 # 第一步:启动6个实例 -6个配置文件(格式如下,稍微改动) port 7000 daemonize yes dir "/root/redis/data7000/" logfile "7000.log" cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-7000.conf cluster-require-full-coverage yes # 第二部:启动实例 -启动6个实例,自动处理(老的配置集群,比较麻烦,手动做好多东西),集群中有6个节点,每个主节点有一个从节点(主和从都是redis自己选择) ./src/redis-cli -p 7000 --cluster create 127.0.0.1:7000 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 --cluster-replicas 1 # 第三步:客户端连接 redis-cli -c -p 7000 # -c是集群模式,查询或写入的数据如果不在当前节点,会自动跳转查询或写入 cluster nodes # 查看集群节点信息 cluster info # 第四步:扩容 -启动两个实例,加入集群,一个作为主,一个作为从 - 把7006加入到集群中 ./src/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7005 -把7007加入到集群并且作为7006的从库 ./src/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7005 --cluster-slave --cluster-master-id f7b06c1d565727e085b3cd81533842589fa3fafa -迁移槽(指定迁移的大小,指定从哪个节点迁移(all),每个节点迁移一部分) redis-cli --cluster reshard 127.0.0.1:7000 # 第四步:缩容(自己实现一下) # 下线迁槽(把7006的1366个槽迁移到7000上) redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7000的id --cluster-slots 1366 127.0.0.1:7000 yes redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7001的id --cluster-slots 1366 127.0.0.1:7001 yes redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7002的id --cluster-slots 1365 127.0.0.1:7002 yes # 忘记节点,关闭节点 redis-cli --cluster del-node 127.0.0.1:7000 要下线的7007id # 先下从,再下主,因为先下主会触发故障转移 redis-cli --cluster del-node 127.0.0.1:7000 要下线的7006id # # 关掉其中一个主,另一个从立马变成主顶上, 重启停止的主,发现变成了从