首先说下主从同步Replication的原理html
在Slave启动并链接到Master以后,它将主动发送一条SYNC命令。此后Master将启动后台存盘进程,同时收集全部接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次彻底同步。而Slave服务器在接收到数据库文件数据以后将其存盘并加载到内存中。此后,Master继续将全部已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。redis
若是Master和Slave之间的连接出现断连现象,Slave能够自动重连Master,可是在链接成功以后,一次彻底同步将被自动执行。数据库
服务器名称 内网IP服务器
Master 172.30.21.96
Slave1 172.30.21.88
Slave2 172.30.21.89
Slave3 172.30.21.90
Slave4 172.30.21.91架构
master配置分布式
logfile “/tmp/redis6379.log”
# slaveof <masterip> <masterport> #master这个地方注释不打开,保持默认
启动master测试
./redis-server ../redis.conf &
slave配置ui
logfile “/tmp/redis6379.log”
slaveof 172.30.21.96 6379
启动slavespa
./redis-server ../redis.conf &
检查启动结果.net
在各自服务器上用 redis-cli客户端链接redis,输入info指令,便可查看主从的状态。
master:
slave:
主从切换
Redis的主从架构,若是没有设置哨兵,那么若是master出现故障,须要手动将slave切换成master继续服务。下面先说明如何进行手动切换:
#在新的master上执行: SLAVEOF NO ONE #在其余的slave上执行: SLAVEOF <新的masterip> <新的masterport>
原来的主redis恢复正常了,要从新切换回去。从新切回的步骤以下:
1 将如今的主redis的数据进行保存(save指令) 2 将如今的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录 3 启动原来的主redis 4 在如今的主redis中切换 SLAVEOF <旧的masterip> <旧的masterport> 5 在其余的slave节点切换 SLAVEOF <旧的masterip> <旧的masterport> 6 完毕
自动切换(高可用方案配置)
手动的方式容易形成失误,容易致使数据丢失,并且若是主从节点不少,切换起来也很麻烦。自动切换通常经过设置哨兵实现。哨兵能够对master和slave进行监控,并在master出现故障的时候,能自动将slave切换成master。
redis哨兵(Redis Sentinel)的启动和redis实例的启动没有关系。因此能够在任何机器上启动redis哨兵。Redis Sentinel 是一个分布式系统,能够在整个redis主从架构中运行多个 Sentinel 进程(progress)。建议至少要保证有两个哨兵在运行,要否则物理机宕机后哨兵进程也不存在了,就没法进行主从切换。
咱们这里有5台redis服务器(1主4从),因此启动5个哨兵。每一个哨兵的配置以下:
修改sentinel.conf的配置:
logfile "/tmp/sentinel.log"
sentinel monitor mymaster 172.30.21.96 6379 2 #这个2表明,当集群中有2个sentinel认为master挂了时,才能真正认为该master已经不可用了
启动sentinel(默认端口号26379)
./redis-sentinel ../sentinel.conf &
关于sentinel能够看官方文档,有不少的说明。这里列出一些主要的配置属性:
# 指明日志文件名
logfile "/tmp/sentinel.log"
# 哨兵监控的master,主从配置同样,这里只用输入redis主节点的ip/port和法定人数。
sentinel monitor mymaster 172.30.21.96 6379 1
# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster 5000
# 若sentinel在该配置值内未能完成failover操做(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 18000
# 设置master和slaves验证密码
sentinel auth-pass mymaster 123456
# 指定了在执行故障转移时, 最多能够有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
经过哨兵查看集群的信息:
$ redis-cli -p 26379
sentinel master mymaster//查看master的状态
SENTINEL slaves mymaster //查看salves的状态
SENTINEL sentinels mymaster //查看哨兵的状态
SENTINEL get-master-addr-by-name mymaster//获取当前master的地址
info sentinel//查看哨兵信息
写个代码测试下:
public static void main(String[] args) { Set<String> sentinels = new HashSet<String>(); sentinels.add(new HostAndPort("172.30.21.96", 26379).toString()); sentinels.add(new HostAndPort("172.30.21.88", 26379).toString()); sentinels.add(new HostAndPort("172.30.21.89", 26379).toString()); sentinels.add(new HostAndPort("172.30.21.90", 26379).toString()); sentinels.add(new HostAndPort("172.30.21.91", 26379).toString()); JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels); System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString()); Jedis master = sentinelPool.getResource(); //master.set("username","jager"); System.out.println(master.get("username")); sentinelPool.close(); sentinelPool.destroy(); }
参考文档:
http://blog.csdn.net/quiet_boy/article/details/53885406
http://www.cnblogs.com/Xrinehart/p/3502198.html
http://www.cnblogs.com/clor001/p/5409891.html
http://www.cnblogs.com/lulu/archive/2013/04/14/3021261.html