实例1 安装目录: /app/6380 数据目录: /app/6380/data 实例2 安装目录: /app/6381 数据目录: /app/6381/data1、创建实例安装目录
# mkdir -p /app/638{0,1}/{conf,data}
# ls /app/
6380 6381
# ls /app/6380/
conf data
# ls /app/6381
conf data
2、拷贝实例的配置文件
# cp redis-6.2.1/redis.conf /app/6380/conf/ # cp redis-6.2.1/redis.conf /app/6381/conf/3、编辑实例的配置文件
bind 192.168.140.10 port 6380 daemonize yes pidfile /var/run/redis_6380.pid loglevel warning logfile "/var/log/redis_6380.log" dbfilename dump_6380.rdb dir /app/6380/data appendonly yes appendfilename "appendonly_6380.aof"4、启动实例
# redis-server /app/6380/conf/redis.conf # redis-server /app/6381/conf/redis.conf # netstat -antp | grep redis tcp 0 0 192.168.140.10:6380 0.0.0.0:* LISTEN 32667/redis-server tcp 0 0 192.168.140.10:6381 0.0.0.0:* LISTEN 32687/redis-server5、连接redis实例进行数据读写
# redis-cli -h 192.168.140.10 -p 6380 192.168.140.10:6380> 192.168.140.10:6380> set a 10 OK # redis-cli -h 192.168.140.10 -p 6381 192.168.140.10:6381> set b 20 OK二、redis主从复制
1、核心要素作用: 提高redis可用性
2、配置主从复制1、redis采用异步的方式进行数据复制
2、支持一主多从的架构
3、复制数据时是非阻塞
4、从redis 2.6开始,从服务器默认是只读
replicaof测试主从复制masterauth
# redis-cli -h 192.168.140.10 -p 6380 192.168.140.10:6380> 192.168.140.10:6380> set name martin OK 192.168.140.10:6380> exit # redis-cli -h 192.168.140.10 -p 6381 192.168.140.10:6381> get name "martin" 192.168.140.10:6381> set a 10 (error) READonLY You can't write against a read only replica. 192.168.140.10:6381>查看主从复制状态
192.168.140.10:6380> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.140.10,port=6381,state=online,offset=394,lag=1 master_failover_state:no-failover master_replid:a47ef340dc924ea952e39c0b51354efefbb9a9e7 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:394 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:394
# redis-cli -h 192.168.140.10 -p 6381 192.168.140.10:6381> 192.168.140.10:6381> info replication # Replication role:slave master_host:192.168.140.10 master_port:6380 master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_repl_offset:464 slave_priority:100 slave_read_only:1 connected_slaves:0 master_failover_state:no-failover master_replid:a47ef340dc924ea952e39c0b51354efefbb9a9e7 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:464 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:4643、主从切换
1、将从服务器提升为新主服务器 > slaveof no one 2、将从服务器上连接主服务器配置删除三、redis分片集群
1、工作原理redis 3.x版本后开始支持
作用:
1、提升数据读写速度
2、提升可用性
Redis集群使用哈希槽slot进行数据分片
Redis集群有16384个哈希槽, 每个key通过CRC16校验后对16384取模来决定放置哪个槽, 集群的每个节点负责一部分hash槽
举个例子,比如当前集群有3个节点,
那么:
节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
数据究竟存放到哪个槽上?
数据做hash运算除以16384除余2、部署分片集群
环境描述: 192.168.140.10 3个集群模式的实例 7001 7002 7003 192.168.140.11 3个集群模式的实例 7004 7005 70061、分别在两台服务器安装redis 2、创建实例目录,拷贝配置文件
# mkdir -p /app/700{1,2,3}/{conf,data}
# cp redis-6.2.1/redis.conf /app/7001/conf/
# cp redis-6.2.1/redis.conf /app/7002/conf/
# cp redis-6.2.1/redis.conf /app/7003/conf/
3、编辑实例的配置文件
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bind 192.168.140.10 port 7001 daemonize yes loglevel warning logfile "/var/log/redis_7001.log" dbfilename dump_7001.rdb dir /app/7001/data appendonly yes appendfilename "appendonly_7001.aof" cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 15000 # cp /app/7001/conf/redis.conf /app/7002/conf/ # cp /app/7001/conf/redis.conf /app/7003/conf/redis.conf # sed -ri 's/7001/7002/g' /app/7002/conf/redis.conf # sed -ri 's/7001/7003/' /app/7003/conf/redis.conf4、启动实例
# redis-server /app/7001/conf/redis.conf # redis-server /app/7002/conf/redis.conf # redis-server /app/7003/conf/redis.conf # ps -elf | grep redis 5 S root 40446 1 0 80 0 - 41264 ep_pol 16:23 ? 00:00:00 redis-server 192.168.140.10:7001 [cluster] 5 S root 40455 1 0 80 0 - 41264 ep_pol 16:23 ? 00:00:00 redis-server 192.168.140.10:7002 [cluster] 5 S root 40464 1 0 80 0 - 41264 ep_pol 16:23 ? 00:00:00 redis-server 192.168.140.10:7003 [cluster] # netstat -antp | grep redis tcp 0 0 192.168.140.10:17001 0.0.0.0:* LISTEN 40446/redis-server tcp 0 0 192.168.140.10:17002 0.0.0.0:* LISTEN 40455/redis-server tcp 0 0 192.168.140.10:17003 0.0.0.0:* LISTEN 40464/redis-server tcp 0 0 192.168.140.10:7001 0.0.0.0:* LISTEN 40446/redis-server tcp 0 0 192.168.140.10:7002 0.0.0.0:* LISTEN 40455/redis-server tcp 0 0 192.168.140.10:7003 0.0.0.0:* LISTEN 40464/redis-server5、参考上述方法配置第二台服务器
# ps -elf | grep redis 5 S root 21309 1 0 80 0 - 41264 ep_pol 16:29 ? 00:00:00 redis-server 192.168.140.11:7004 [cluster] 5 S root 21315 1 0 80 0 - 41264 ep_pol 16:29 ? 00:00:00 redis-server 192.168.140.11:7005 [cluster] 5 S root 21321 1 0 80 0 - 41264 ep_pol 16:29 ? 00:00:00 redis-server 192.168.140.11:7006 [cluster] 0 S root 21327 6812 0 80 0 - 28203 pipe_w 16:29 pts/0 00:00:00 grep --color=auto redis # netstat -antp | grep redis tcp 0 0 192.168.140.11:17004 0.0.0.0:* LISTEN 21309/redis-server tcp 0 0 192.168.140.11:17005 0.0.0.0:* LISTEN 21315/redis-server tcp 0 0 192.168.140.11:17006 0.0.0.0:* LISTEN 21321/redis-server tcp 0 0 192.168.140.11:7004 0.0.0.0:* LISTEN 21309/redis-server tcp 0 0 192.168.140.11:7005 0.0.0.0:* LISTEN 21315/redis-server tcp 0 0 192.168.140.11:7006 0.0.0.0:* LISTEN 21321/redis-server6、创建集群
# redis-cli --cluster create > 192.168.140.10:7001 > 192.168.140.10:7002 > 192.168.140.10:7003 > 192.168.140.11:7004 > 192.168.140.11:7005 > 192.168.140.11:7006 > --cluster-replicas 1 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.7、连接集群、测试数据读写
# redis-cli -h 192.168.140.10 -p 7002 -c 192.168.140.10:7002> set name martin -> Redirected to slot [5798] located at 192.168.140.11:7004 OK 192.168.140.11:7004> get name "martin" 192.168.140.11:7004> exit四、基于redis实现会话保持
1、配置nginx实现tomcat负载均衡环境描述:
192.168.140.10 nginx
192.168.140.11 tomcat服务器 两个tomcat实例
192.168.140.12 redis服务器 三个redis实例,一主两从环境
192.168.140.13 redis哨兵
upstream tomcatserver {
server 192.168.140.11:9000;
server 192.168.140.11:9001;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver;
proxy_set_header X-Real-IP $remote_addr;
}
# /usr/local/nginx/sbin/nginx # netstat -antp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9536/nginx: master2、配置tomcat实例
# /usr/local/tomcat/bin/version.sh Using CATALINA_base: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk1.8.0_91 Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/8.0.44 Server built: May 10 2017 17:21:09 UTC Server number: 8.0.44.0
# netstat -antp | grep java tcp6 0 0 :::9000 :::* LISTEN 7157/java tcp6 0 0 :::9001 :::* LISTEN 7209/java tcp6 0 0 :::8009 :::* LISTEN 7157/java tcp6 0 0 127.0.0.1:8010 :::* LISTEN 7157/java tcp6 0 0 127.0.0.1:8020 :::* LISTEN 7209/java测试页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
你好
<%
for(int i=1;i<=6;i++){
%>
align="center">欢迎访问 tomcat 1 jsp页面!
>
<%
}
%>
<%= request.getSession().getId() %>
3、通过nginx访问tomcat,此时tomcat会话ID是非持久
4、配置redis一主两从环境
1) 安装redis 2.6
# tar xf redis-2.6.14.tar.gz # cd redis-2.6.14/ # make # make PREFIX=/usr/local/redis install2) 配置redis多实例
# mkdir -p /app/700{1,2,3}/{conf,data}
# cp redis-2.6.14/redis.conf /app/7001/conf/
daemonize yes
pidfile /var/run/redis_7001.pid
port 7001
bind 192.168.140.12
loglevel warning
logfile "/var/log/redis_7001.log"
dbfilename dump_7001.rdb
dir /app/7001/data
appendonly yes
appendfilename appendonly_7001.aof
# cp /app/7001/conf/redis.conf /app/7002/conf/
# sed -ri 's/7001/7002/g' /app/7002/conf/redis.conf
# cp /app/7001/conf/redis.conf /app/7003/conf/
# sed -ri 's/7001/7003/g' /app/7003/conf/redis.conf
3) 配置一主多从
slaveof 192.168.140.12 7001 # redis-server /app/7001/conf/redis.conf # redis-server /app/7002/conf/redis.conf # redis-server /app/7003/conf/redis.conf # netstat -antp | grep redis tcp 0 0 192.168.140.12:7001 0.0.0.0:* LISTEN 8901/redis-server tcp 0 0 192.168.140.12:7002 0.0.0.0:* LISTEN 8905/redis-server tcp 0 0 192.168.140.12:7003 0.0.0.0:* LISTEN 8911/redis-server tcp 0 0 192.168.140.12:7001 192.168.140.12:37184 ESTABLISHED 8901/redis-server tcp 0 0 192.168.140.12:7001 192.168.140.12:37182 ESTABLISHED 8901/redis-server tcp 0 0 192.168.140.12:37184 192.168.140.12:7001 ESTABLISHED 8911/redis-server tcp 0 0 192.168.140.12:37182 192.168.140.12:7001 ESTABLISHED 8905/redis-server4)验证一主多从成功
# redis-cli -h 192.168.140.12 -p 7001 redis 192.168.140.12:7001> info replication # Replication role:master connected_slaves:2 slave0:192.168.140.12,7002,online slave1:192.168.140.12,7003,online redis 192.168.140.12:7001> redis 192.168.140.12:7001> set name martin OK redis 192.168.140.12:7001> exit # redis-cli -h 192.168.140.12 -p 7002 redis 192.168.140.12:7002> get name "martin" redis 192.168.140.12:7002> exit # redis-cli -h 192.168.140.12 -p 7003 redis 192.168.140.12:7003> get name "martin" redis 192.168.140.12:7003> exit5、配置哨兵 1) 安装redis 2.6 2) 复制哨兵配置文件
# mkdir /usr/local/redis/conf # cp redis-2.6.14/sentinel.conf /usr/local/redis/conf3) 编辑配置文件
# vim /usr/local/redis/conf/sentinel.conf port 26379 sentinel monitor mymaster 192.168.140.12 7001 1 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 600004) 启动哨兵
# cp redis-2.6.14/src/redis-sentinel /usr/local/redis/bin/
# redis-sentinel /usr/local/redis/conf/sentinel.conf
[8948] 04 Mar 10:18:58.561 * Max number of open files set to 10032
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 2.6.14 (00000000/0) 64 bit
.-`` .-```. ```/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 8948
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[8948] 04 Mar 10:18:58.564 * +slave slave 192.168.140.12:7002 192.168.140.12 7002 @ mymaster 192.168.140.12 7001
[8948] 04 Mar 10:18:58.564 * +slave slave 192.168.140.12:7003 192.168.140.12 7003 @ mymaster 192.168.140.12 7001
6、配置tomcat连接redis哨兵保存会话
1) 将jar包复制到 tomcat
# cp commons-logging-1.2.jar commons-pool2-2.4.2.jar jedis-2.9.0.jar tomcat-cluster-redis-session-manager-2.0.jar /usr/local/tomcat/lib/2) 编辑tomcat实例配置文件,指定redis集群的信息
# vim /opt/tomcat01/conf/context.xml
# netstat -antp | grep java tcp6 0 0 :::9000 :::* LISTEN 17377/java tcp6 0 0 :::9001 :::* LISTEN 17456/java tcp6 0 0 :::8009 :::* LISTEN 17377/java tcp6 0 0 127.0.0.1:8010 :::* LISTEN 17377/java tcp6 0 0 127.0.0.1:8020 :::* LISTEN 17456/java tcp6 0 0 192.168.140.11:47648 192.168.140.13:26379 ESTABLISHED 17456/java tcp6 0 0 192.168.140.11:47640 192.168.140.13:26379 ESTABLISHED 17377/java7、测试访问nginx,查看会话ID应该是一致的



