4.1 哨兵模式的使用
1. 将服务器调整为一主多从(6379带6380、6381)。
2. 在/usr/local/myredis文件夹下创建sentinel.conf文件(名字一定不能错)。
3. 配置哨兵,sentinel.conf添加内容
sentinel monitor myredis 127.0.0.1 6379 1
其中:myredis 为监控对象起的服务器名称(随意),1代表至少有1个哨兵投票同意迁移
如果Master存在密码,需要配置sentinel auth-pass 服务器名 密码
sentinel auth-pass myredis 123456
4. 启动哨兵,在/usr/local/bin/文件夹下执行./redis-sentinel /usr/local/myredis/sentinel.conf命
令。
5. 模拟Master宕机,哨兵会切换Master
- 通过kill命令关闭Master(6379)
- 等待一段时间,哨兵窗口就会输出信息
根据窗口信息可知,Master由6379转换为6381,进入6381客户端执行info replication
6. 重新启动6379服务器后,自动转换为Slave。
4.2 复制延迟
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,Slave机器数量的增加,会使延迟问题会更加严重。
六、Redis集群
1 Redis集群简介
1.1 Redis集群(RedisCluster)
RedisCluster实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分布存储在这N个节点当中,每个节点存储总数据的1/N。
RedisCluster通过分区(partition)来提供一定程度的可用性(availability):即集群有一部分节点失效或者无法进行通讯,集群也可以继续处理命令。
Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,用来交换彼此的信息。
为了使得集群在一部分节点宕机或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作,Redis 集群对节点使用了主从复制功能。
2 Redis集群搭建
1. 删除持久化数据,aof、dump。
2. 创建6个实例,即在/usr/local/myredis文件夹下分别创建6379、6380、6381、6389、6390、
6391的conf。
3. 在redis.conf中关闭appendonly。
4. 在不同的conf文件中,配置对应的内容
可以通过include /usr/local/myredis/redis.conf将公共基础配置直接引入文件。将include /usr/local/myredis/redis.conf统一添加到这三个文件中
在各个文件中,添加对应的pidfile、port、dbfilename、cluster-enabled(是否打开集群)、cluster-config-file(设定节点配置文件名)、cluster-node-timeout (设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换)
如:
redis6379.conf中添加 pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000
将其他文件按照相同规则创建出来。
5. 启动该6个redis,并确保是否全部生成nodes-xxxx.conf文件。(启动之前务必保证redis服务支持远程连接)
6. 进入redis安装目录下的src文件夹
7. 在该文件夹下执行命令
redis-cli --cluster create --cluster-replicas 1 192.168.56.31:6379 192.168.56.31:6380 192.168.56.31:6381 192.168.56.31:6389 192.168.56.31:6390 192.168.56.31:6391
此处使用真实ip地址,-replicas 1代表采用最简单的方式配置集群,一台主机,一台从机。
replicas表示每个master需要有几个slave。
执行命令后,redis提供推荐的主从配置建议,执行同意。
集群创建成功。
8. 通过./redis-cli -c -p 6379可连接至集群(由于所有节点相通,任意端口号均可)
在redis客户端中执行cluster nodes查看节点状态。
3 Redis集群操作
3.1 Slot
一个 Redis 集群包含 16384 个哈希槽(hash slot),每个键都属于这 16384 个哈希槽的其中一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个节点, 其中:
节点 1 负责处理 0 号至 5500 号哈希槽。
节点 2 负责处理 5501 号至 11000 号哈希槽。
节点 3 负责处理 11001 号至 16384 号哈希槽。
3.2 命令执行
set k1 v1
根据k1计算出的槽值进行切换节点,并存入数据。
不在一个slot下的键值,是不能使用mget、mset等多建操作。
可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到同一个slot中
mset k1{test} v1 k2{test} v2 k3{test} v3
3.3 故障恢复
1. 关闭6379服务器,进入redis-cli执行cluster nodes
6379服务器fail,6390成为了新的master
2. 重新启动6379服务器,再次查看,6379成为了Slave