Redis集群做法的难点,百万并发客户端「实战」( 二 )

  • 全部启动redis:
# systemctl start redis
  • 查看集群状态:
# redis-cli -h 192.168.30.128 -a 123456 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.30.128:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1 slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1 master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:168 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:168# redis-cli -h 192.168.30.129 -a 123456 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:192.168.30.128 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:196 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:196 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:196数据演示
192.168.30.128:6379> keys *(empty list or set)192.168.30.128:6379> set key1 100OK192.168.30.128:6379> set key2 lzxOK192.168.30.128:6379> keys *1) "key1"2) "key2"123456789101112# redis-cli -h 192.168.30.129 -a 123456Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.192.168.30.129:6379> keys *1) "key2"2) "key1"192.168.30.129:6379> CONFIG GET dir1) "dir"2) "/data/redis"192.168.30.129:6379> CONFIG GET dbfilename1) "dbfilename"2) "dump.rdb"192.168.30.129:6379> get key1"100"192.168.30.129:6379> get key2"lzx"192.168.30.129:6379> set key3 aaa(error) READONLY You can't write against a read only replica.1234567891011121314151617181920212223# redis-cli -h 192.168.30.130 -a 123456Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.192.168.30.130:6379> keys *1) "key2"2) "key1"192.168.30.130:6379> CONFIG GET dir1) "dir"2) "/data/redis"192.168.30.130:6379> CONFIG GET dbfilename1) "dbfilename"2) "dump.rdb"192.168.30.130:6379> get key1"100"192.168.30.130:6379> get key2"lzx"192.168.30.130:6379> set key3 aaa(error) READONLY You can't write against a read only replica.可以看到 , 在master节点写入的数据 , 很快就同步到slave节点上 , 而且在slave节点上无法写入数据 。
Sentinel模式Sentinel模式介绍主从模式的弊端就是不具备高可用性 , 当master挂掉以后 , Redis将不能再对外提供写入操作 , 因此sentinel应运而生 。
sentinel中文含义为哨兵 , 顾名思义 , 它的作用就是监控redis集群的运行状况 , 特点如下
功能作用
  1. 监控(monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常 。
  2. 提醒(Notifation):当被监控的某个 Redis 服务器出现问题时 ,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知 。
  3. 自动故障转移(Automatic failover):当一个主服务器不能正常工作时 ,Sentinel 会开始一次自动故障迁移操作 ,它会将失效主服务器的其中一个从服务器升级为新的主服务器 ,并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时 ,集群也会向客户端返回新主服务器的地址 ,使得集群可以使用新主服务器代替失效服务器 。
部署
同样 , 我们还是将每个哨兵部署在一个单独的容器中 。
sentinel配置文件
redis-sentinel1:redis-sentinel2:redis-sentinel3:这三个配置文件一模一样 , 都是监听master的 。 要不你把这个配置文件copy到容器中 , 要不你就创建三份 , 分别挂载到容器中 , 这里选择了后面一种方法 。
这里介绍几个基本的配置
sentinel monitor mymaster redis 6379 2 监听的master的容器别名为redis , 端口是6379 , 最后面的2是当大于等于2个哨兵认为master主观下线后(无论这个值为多少 , 至少得有一半以上的哨兵判定master主观下线后 , master才会被客观下线) , master才会被客观下线 , 这是sentinel重新从slave中选举一个来当master 。
sentinel auth-pass mymaster 123456 如果master配置了密码 , 则此项必须配置 , 否则sentinel会将master标记问主观下线(sdown) 。
docker-composer配置文件
### REDIS-SENTINEL ################################################# masterredis-sentinel:image: johnson19900110/redis-sentinel:latestrestart: always#如果master未开启数据持久化 , 此项应该删除volumes:- ./redis-sentinel/config/sentinel.conf:/usr/local/etc/redis/redis-sentinel.confnetworks:- backenddepends_on:- redis# redis sentinel slave 1redis-sentinel-slave1:image: johnson19900110/redis-sentinel:latestrestart: alwaysvolumes:- ./redis-sentinel/config/sentinel-slave1.conf:/usr/local/etc/redis/redis-sentinel.confnetworks:- backenddepends_on:- redis-slave1- redis-sentinel# redis sentinel slave 2redis-sentinel-slave2:image: johnson19900110/redis-sentinel:latestrestart: alwaysvolumes:- ./redis-sentinel/config/sentinel-slave2.conf:/usr/local/etc/redis/redis-sentinel.confnetworks:- backenddepends_on:- redis-slave2- redis-sentinel-slave1