redis集群等相关内容-147
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
        
        
        
    -客户端测试
        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)
2 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