主服务器中做的是写操作,从服务器中做的是读操作
1.创建/myredis文件夹
[root@localhost /]# cd myredis
[root@localhost myredis]# ll
总用量 0
[root@localhost myredis]# cp /etc/redis.conf /myredis/redis.conf
[root@localhost myredis]# ll
总用量 92
-rw-r--r-- 1 root root 93724 3月 10 17:54 redis.conf
[root@localhost myredis]# ls
redis.conf
2.复制redis.conf配置文件到文件夹中去
3.配置一主两从 的,创建三个配置文件
*redis6379.conf
*redis6380.conf
*redis6381.conf
4.修改三个端口号即可
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
5.启动三个redis服务
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
*查看当前主机的运行状况显示master即为都是主机
info replication
在从机上执行slaveof 主机ip端口号
slaveof 127.0.0.1 6379
变成从机了有主机的ip端口号自己也显示是从机
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=308,lag=1
master_failover_state:no-failover
master_replid:875290822467208a9fcdd580f9e312119a3b8864
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:308
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:308
在查看6379变成主机下面有从机
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:98
slave_repl_offset:98
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:875290822467208a9fcdd580f9e312119a3b8864
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
127.0.0.1:6380>
测试主写从读下面为主机写
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
从机读
情况1:一主两仆
主机挂掉,执行shutdown
从机info replication还是显示其主机是挂掉的哪个
如果从机挂掉,执行shutdown
主机开始写数据,从机在开启的时候,恢复数据的时候是从主机从头开始追加的
情况2:薪火相传
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。
从机的大哥是另一台从机的意思
用 slaveof <ip><port> ,中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份
主机挂了,从机还是从机,无法写数据了
情况3:反客为主
当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改
可以使用命令:slaveof no one 将从机变为主机
哨兵模式
主要是为了监控主机宕机之后,从机可以立马变为主机,就和上面的反客为主一样,不用手动设置
能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
再目录中新建一个文件sentinel.conf
,文件格式不能出错
sentinel monitor mymaster 127.0.0.1 6379 1
启动 哨兵模式当主机挂掉,从机会自动升级为主机,升级的规则为哪台服务器的从原主机获得的数据最多就哪台变成主机
原来的主机重启变成从机了
开启启动哨兵的命令:
redis-sentinel sentienl.conf
开启成功的页面如下
哨兵模式的缺点:复制延迟
由于所有的写操作都是先在主机上操作,然后同步更新到从机上,所以从主机同步到从机机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,从机机器数量的增加也会使这个问题更加严重。
java代码结合
主要是ip端口号的连接
以及主机名称new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);
private static JedisSentinelPool jedisSentinelPool=null;
public static Jedis getJedisFromSentinel(){
if(jedisSentinelPool==null){
Set<String> sentinelSet=new HashSet<>();
sentinelSet.add("192.168.11.103:26379");
JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10); //最大可用连接数
jedisPoolConfig.setMaxIdle(5); //最大闲置连接数
jedisPoolConfig.setMinIdle(5); //最小闲置连接数
jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
jedisPoolConfig.setMaxWaitMillis(2000); //等待时间
jedisPoolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试 ping pong
jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);
return jedisSentinelPool.getResource();
}else{
return jedisSentinelPool.getResource();
}
}