环境:
OS:Red Hat Linux As 5
DB:redis-4.0.6
-------------------------------------主库安装-------------------------------
1.安装
[root@pxc01 soft]#tar –zxvf redis-4.0.6.tar.gz
[root@pxc01 soft]# cp -R ./redis-4.0.6 /opt/
[root@pxc01 opt]# cd redis-4.0.6
[root@pxc01 redis-4.0.6]# make
[root@pxc01 redis-4.0.6]# make test
继续安装
[root@pxc01 redis-4.0.6]# cd src
[root@pxc01 src]# make install
2.创建相应目录
[root@pxc01 opt]# cd redis-4.0.6/
[root@pxc01 redis-4.0.6]# mkdir conf ##配置文件目录
[root@pxc01 redis-4.0.6]# mkdir log ##日志文件目录
[root@pxc01 redis-4.0.6]# mkdir run ##运行的pid文件目录
[root@pxc01 redis-4.0.6]# mkdir rdb ##快照和AOF文件目录
3.主库配置文件(8379.conf)
daemonize yes
pidfile/opt/single_redis-4.0.6/run/redis-8379.pid
port8379
tcp-backlog 511
timeout0
tcp-keepalive 0
loglevel notice
logfile"/opt/single_redis-4.0.6/log/redis-8379.log"
databases 16
save900 1
save300 10
save60 10000
stop-writes-on-bgsave-erroryes
rdbcompression yes
rdbchecksum yes
dbfilenamedump-8379.rdb
dir/opt/single_redis-4.0.6/rdb
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-syncno
repl-diskless-sync-delay5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename"redis-8379.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size64mb
aof-load-truncated yes
lua-time-limit5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries512
hash-max-ziplist-value64
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limitnormal 0 0 0
client-output-buffer-limitslave 256mb 64mb 60
client-output-buffer-limitpubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# Generated byCONFIGREWRITE
#masterauth"richinfo123"
#requirepass"richinfo123"
protected-mode no
4.启动主库
/opt/single_redis-4.0.6/src/redis-server /opt/single_redis-4.0.6/conf/8379.conf
-------------------------------------从库安装-------------------------------
1.安装
跟主库安装一样
2.从库配置文件
从库的配置文件就是在主库配置文件的基础上加上如下2行
slaveof 192.168.56.91 8379 ##表示从那个主库同步
slave-read-only yes ##从库设置为只读
daemonize yes
pidfile/opt/single_redis_slave/run/redis-8379.pid
port8379
tcp-backlog 511
timeout0
tcp-keepalive 0
loglevel notice
logfile"/opt/single_redis_slave/log/redis-8379.log"
databases 16
save900 1
save300 10
save60 10000
stop-writes-on-bgsave-erroryes
rdbcompression yes
rdbchecksum yes
dbfilenamedump-8379.rdb
dir/opt/single_redis_slave/rdb
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-syncno
repl-diskless-sync-delay5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename"redis-8379.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size64mb
aof-load-truncated yes
lua-time-limit5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries512
hash-max-ziplist-value64
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limitnormal 0 0 0
client-output-buffer-limitslave 256mb 64mb 60
client-output-buffer-limitpubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# Generated byCONFIGREWRITE
#masterauth"richinfo123"
#requirepass"richinfo123"
protected-mode no
slaveof 192.168.56.91 8379
3.启动从库
/opt/single_redis_slave/src/redis-server /opt/single_redis_slave/conf/8379.conf
4.查看从库的同步日志
21636:S 23 Jan 04:40:33.028 * Ready to accept connections
21636:S 23 Jan 04:40:33.028 * Connecting to MASTER 192.168.56.91:8379
21636:S 23 Jan 04:40:33.028 * MASTER SLAVE sync started
21636:S 23 Jan 04:40:33.030 * Non blocking connect for SYNC fired the event.
21636:S 23 Jan 04:40:33.031 * Master replied to PING, replication can continue...
21636:S 23 Jan 04:40:33.032 * Partial resynchronization not possible (no cached master)
21636:S 23 Jan 04:40:33.038 * Full resync from master: 4bfec2e8871336c8c86bb37a8b16905d57d5278b:0
21636:S 23 Jan 04:40:33.743 * MASTER SLAVE sync: receiving 4469862 bytes from master
21636:S 23 Jan 04:40:33.772 * MASTER SLAVE sync: Flushing old data
21636:S 23 Jan 04:40:33.785 * MASTER SLAVE sync: Loading DB in memory
21636:S 23 Jan 04:40:34.032 * MASTER SLAVE sync: Finished with success
21636:S 23 Jan 04:40:34.033 * Background append only file rewriting started by pid 21640
21636:S 23 Jan 04:40:34.387 * AOF rewrite child asks to stop sending diffs.
21640:C 23 Jan 04:40:34.387 * Parent agreed to stop sending diffs. Finalizing AOF...
21640:C 23 Jan 04:40:34.387 * Concatenating 0.00 MB of AOF diff received from parent.
21640:C 23 Jan 04:40:34.388 * SYNC append only file rewrite performed
21640:C 23 Jan 04:40:34.389 * AOF rewrite: 10 MB of memory used by copy-on-write
21636:S 23 Jan 04:40:34.439 * Background AOF rewrite terminated with success
21636:S 23 Jan 04:40:34.439 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
21636:S 23 Jan 04:40:34.439 * Background AOF rewrite finished successfully
从输出日志看出,从库启动后,会跟主库进行数据同步,把主库的数据同步过来,主库运行一段时间后,从库也会把主库的历史数据同步过来。
4.验证
主库的数据大小
[root@pxc01 src]# ./redis-cli -h 192.168.56.91 -p 8379
192.168.56.91:8379> dbsize
(integer) 300000
从库的数据大小
[root@pxc02 src]# ./redis-cli -h 192.168.56.92 -p 8379
192.168.56.92:8379> dbsize
(integer) 300000
5.故障切换
当主库当掉之后,可以执行如下命令将从库升级为主库
192.168.56.92:8379> slaveof no one
OK
等主库好了之后可以执行如下命令将当期的主库设置为从库
192.168.56.92:8379> slaveof 192.168.56.91 8379
OK
主库宕机到恢复完成的时间里,之前从库升级主库写入的数据,重新建立主从关系后,这些数据会被覆盖,因为从新建立了主从关系,从库重新同步一份之前主库的数据过来。
-----------------------------Sentine哨兵模式安装-----------------------
创建好主从之后,我们接下部署sentine哨兵模式监控主从的状态,哨兵模式的作用就是监控主从状态,发现主库宕机后,从备库中挑选一个出来当选主库,对外部应用继续提高访问服务。
1.安装
安装步骤跟主从安装redis一样,这里省略
2.配置文件
sentinel.conf
port26379
dir"/tmp"
sentinel myid 3154c22b52f5fdca833d7a972bb0104e11e63b82
sentinelmonitormymaster 192.168.56.91 8379 1
sentinelconfig-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel down-after-millisecondsmymaster15000
logfile"/opt/redis_sentinel/log/sentinel.log"
protected-mode no
关键的参数:
port 端口号,哨兵程序运行的端口号
sentinel monitor mymaster 192.168.56.91 8379 1
mymaster:哨兵监控redis组叫mymaster,这个名字可以任意命名,符合命名要求即可
192.168.56.91 8379:这个是哨兵监控的主库的ip和端口号
1:表示仲裁值,这里表示有1个哨兵发现主库无法访问的时候,就可以从从库中选举新的主库,在多个哨兵的环境下,这个值可以根据需要设置,比如2,3等,意味着至少需要有2、3个哨兵都发现主库无法访问的情况下才重新选举主库。
sentinel down-after-millisecondsmymaster15000
----------这个是sentinel连接master的超时时间,超过这个时间就认为master挂了,实现自动切换。这个默认是30秒,这个时间得调节好,大了会在真正出现故障的时候切换时间会长,小了有时候master由于持久化数据,繁忙不响应,会导致自动切换,实际只是瞬间不可用,现在认为设置为15秒为宜.
3.启动
/opt/redis/src/redis-sentinel /opt/redis/conf/sentinel.conf
4.登陆哨兵查看主从情况
./redis-cli -h 192.168.56.93 -p 26379
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.91:8379,slaves=1,sentinels=1
5.外部应用同步哨兵访问集群
通常情况下,我们通过JedisSentinelPool创建跟集群的连接,这样的话,主从关系改变了,我们的应用程序也不用修改连接,但是主从改变的过程中,外部应用不能访问.
packagecom.hxl;
import java.util.HashSet;
import java.util.Set;
importredis.clients.jedis.Jedis;
importredis.clients.jedis.JedisSentinelPool;
public classSentineTest{
public static voidmain(String[]args) {
Setsentinels= new HashSet();
StringhostAndPort1= "192.168.56.93:26379";
sentinels.add(hostAndPort1);
StringclusterName= "mymaster" ;
JedisSentinelPool redisSentinelJedisPool= newJedisSentinelPool(clusterName,sentinels);
Jedis jedis= null;
try {
jedis=redisSentinelJedisPool.getResource();
jedis.set("test4", "aaa");
System.out.println(jedis.get("test4"));
//System.out.println(jedis.get("test2"));
} catch (Exceptione) {
e.printStackTrace();
} finally {
jedis.close();
}
redisSentinelJedisPool.close();
}
}
String hostAndPort1 = "192.168.56.93:26379" ##这里是指定哨兵所在的机器ip和占用的端口;
String clusterName = "mymaster" ; ##这里要跟服务器设置的一致.
通常情况下,我们会部署多个哨兵,避免一个哨兵宕机了导致外部应用无法访问,部署多个哨兵的部署跟部署一个哨兵的步骤一致,只是配置文件中仲裁值根据需要设定。
--The End --