第二十周作业

一、总结tomcat优化方法

1.1 内存空间优化

JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= "

-server         服务器模式
-Xms            堆内存初始化大小
-Xmx            堆内存空间上限
-XX:NewSize=    新生代空间初始大小
-XX:MaxNewSize= 新生代空间最大值

一般将 -Xms 和 -Xmx 的大小设置成相同,防止内存增大产生碎片

1.2 线程池调整

connectionTimeout:连接超时时长,单位ms
maxThreads:最大线程数,默认200
minSpareThreads:最小空闲线程数
maxSpareThreads:最大空闲线程数
acceptCount:当启动线程满了之后,等待队列的最大长度,默认100
URIEncoding:URI地址编码格式,建议使用utf-8
enableLookups:是否启用客户端主机名的DNS反向解析,默认禁用,建议禁用
compression:是否启用传输压缩机制,建议“on”,CPU和流量的平衡
  compressionMinSize:启用压缩传输的数据流最小值,单位是字节
  compressableMimeType:定义启用压缩功能的MIME类型test/html,text/xml,text/css,text/javascript

二、java程序出现oom如何解决?什么场景下会出现oom?

使用Jprofiler监控java程序,根据软件显示的结果定位故障。

当JVM因为没有足够的内存来为对象分配空间、并且垃圾回收器也已经没有空间可回收时,就会抛出 java.lang.Out Of Memory Error 错误。

三、简述redis特点及其应用场景

3.1 Redis的特点

速度快:10W QPS(每秒查询率),基于内存,C语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富:支持Lua脚本、发布订阅、事务、pipeline等功能
简单:代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
支持主从复制
支持高可用和分布式

3.2 Redis的应用场景

Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
缓存:数据查询、电商网站商品信息、新闻内容
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
消息队列:ELK的日志缓存、部分业务的订阅发布系统
地理位置:基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能

四、对比redis的RDB、AOF模式的优缺点

优点 缺点
RDB 1、RDB快照保存了某个时间点数据,可以保留多个备份,文件格式支持第三方工具进行后续的数据分析
2、RDB可以最大化Redis的性能,父进程在保存RDB文件时只需要fork出一个子进程,然后该子进程就会处理所有保存的工作,父进程不需要执行任何I/O操作
3、RDB处理大量数据时,恢复的数据比AOF快
不能够实时保存数据
数据量巨大时,父进程fork子进程进行保存至RDB文件时需要一点时间,可能是ms或者s,取决于磁盘I/O性能
AOF 1、数据安全性高,使用fsync策略(fsync是同步内存中Redis所有已经修改的文件到存储设备),默认是appendfsync everysec,即每秒执行一次fsync,当发生故障停机,最多只会丢失1s的数据(fsync在后台线程执行,不影响主线程处理其它请求)
2、对日志文件的写入操作采用的是append模式,因此在写入过程中不需要seek,即使出现宕机现象,也不会破环日志文件中已经存在的内容。如果本次操作只是写入了一半数据就出现了系统崩溃问题,那么在Redis下一次启动之前,可以通过redis-check-aof工具来解决数据的一致性问题
3、Redis可以在AOF文件体积变得过大时,自动的在后台对AOF进行重写,重写后的文件包含了恢复当前数据集所需的最小命令集合。
4、AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。
会重复记录某些操作,导致文件大小比RDB要大
在恢复大数据集的速度比RDB要慢
bug出现的可能性更多

五、实现redis哨兵,模拟master故障场景

实验架构图

image

5.1 编译安装Redis4.0版本

# 准备好源码包
[root@centos7 ~]# ls
anaconda-ks.cfg  redis-5.0.14.tar.gz

# 安装依赖包
[root@centos7 ~]# yum -y install gcc jemalloc-devel systemd-devel

# 编译安装
[root@centos7 ~]# tar xf redis-5.0.14.tar.gz 
[root@centos7 ~]# cd redis-5.0.14/
[root@centos7 redis-4.0.14]# make USE_SYSTEMD=yes  PREFIX=/apps/redis install

# 配置变量
[root@centos7 redis-4.0.14]# echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
[root@centos7 redis-4.0.14]# . /etc/profile.d/redis.sh

# 准备配置文件和相关目录
[root@centos7 redis-4.0.14]# mkdir /apps/redis/{etc,log,data,run}
[root@centos7 redis-4.0.14]# cp redis.conf /apps/redis/etc/

# 创建用户并编辑目录权限
[root@centos7 redis-4.0.14]# useradd -r -s /sbin/nologin redis
[root@centos7 redis-4.0.14]# chown -R redis.redis /apps/redis/

# 修改配置文件
[root@redis-master ~]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
requirepass wuhaolam
pidfile /apps/redis/run/redis_6379.pid
logfile /apps/redis/log/redis-6379.log
dir /apps/redis/data/

# 配置Redis自启动
# 直接修改centos8上yum安装Redis生成的service文件
[root@centos7 redis-4.0.14]# scp 192.168.119.128:/lib/systemd/system/redis.service /lib/systemd/system/
root@192.168.119.128's password: 
redis.service 
[root@centos7 redis-4.0.14]# vim /lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target




# 验证启动
[root@centos7 redis-4.0.14]# systemctl daemon-reload
[root@centos7 redis-4.0.14]# systemctl enable --now redis.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@centos7 redis-4.0.14]# systemctl status redis.service 
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-08-01 19:38:57 CST; 6s ago
 Main PID: 4922 (redis-server)
   CGroup: /system.slice/redis.service
           └─4922 /apps/redis/bin/redis-server 127.0.0.1:6379

Aug 01 19:38:57 centos7 redis-server[4922]: |    `-._`-._        _.-'_.-'    |
Aug 01 19:38:57 centos7 redis-server[4922]: `-._    `-._`-.__.-'_.-'    _.-'
Aug 01 19:38:57 centos7 redis-server[4922]: `-._    `-.__.-'    _.-'
Aug 01 19:38:57 centos7 redis-server[4922]: `-._        _.-'
Aug 01 19:38:57 centos7 redis-server[4922]: `-.__.-'
Aug 01 19:38:57 centos7 redis-server[4922]: 4922:M 01 Aug 19:38:57.961 # WARNING: The TCP backlog setting of 511 cannot be enforced because /p... of 128.
Aug 01 19:38:57 centos7 redis-server[4922]: 4922:M 01 Aug 19:38:57.961 # Server initialized
Aug 01 19:38:57 centos7 redis-server[4922]: 4922:M 01 Aug 19:38:57.961 # WARNING overcommit_memory is set to 0! Background save may fail under... effect.
Aug 01 19:38:57 centos7 redis-server[4922]: 4922:M 01 Aug 19:38:57.961 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel....
Aug 01 19:38:57 centos7 redis-server[4922]: 4922:M 01 Aug 19:38:57.961 * Ready to accept connections
Hint: Some lines were ellipsized, use -l to show in full.

5.2 实现Redis的主从复制架构

5.2.1 Redis安装

# 一台主节点,两台备份节点
# Redis 安装过程见上
[root@redis-master ~]# systemctl status redis.service 
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-08-02 07:29:18 CST; 39min ago
 Main PID: 1040 (redis-server)
   CGroup: /system.slice/redis.service
           └─1040 /apps/redis/bin/redis-server 127.0.0.1:6379

[root@redis-bk1 redis-4.0.14]# systemctl enable --now redis.service
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@redis-bk1 redis-4.0.14]# systemctl status redis.service
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-08-02 08:08:33 CST; 10s ago
 Main PID: 4826 (redis-server)
   CGroup: /system.slice/redis.service
           └─4826 /apps/redis/bin/redis-server 127.0.0.1:6379

[root@redis-bk2 redis-4.0.14]# systemctl status redis.service
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-08-02 08:08:33 CST; 10s ago
 Main PID: 4813 (redis-server)
   CGroup: /system.slice/redis.service
           └─4813 /apps/redis/bin/redis-server 127.0.0.1:6379

5.2.2 实现主从复制

# 在master上设置key1
[root@redis-master ~]# redis-cli -a wuhaolam
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379> SET key1 v1-master
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-master"

# 在从节点上设置key1
[root@redis-bk1 ~]# redis-cli -a wuhaolam
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379> SET key1 v1-bk1
OK
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-bk1"

[root@redis-bk2 ~]# redis-cli -a wuhaolam
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379> SET key1 v1-bk2
OK
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-bk2"

# 配置从节点指向主节点
# bk1 和 bk2 相同
[root@redis-bk2 ~]# vim /apps/redis/etc/redis.conf
replicaof 192.168.119.147 6379
masterauth wuhaolam
[root@redis-bk2 ~]# systemctl restart redis.service

# 在主节点上可查看到从节点的信息
[root@redis-master ~]# redis-cli -a wuhaolam
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.119.147,port=6379,state=online,offset=1064,lag=0
slave1:ip=192.168.119.158,port=6379,state=online,offset=1050,lag=1
master_replid:748560f33eb2b985dc38b0c01cf7b891b60a673c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1064
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1064

5.3 配置哨兵架构

# sentinel配置,修改成如下
# 其余节点相同
[root@redis-master ~]# grep ^[^#] /apps/redis/etc/sentinel.conf 
bind 0.0.0.0
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/redis-sentinel.pid"
dir /tmp
sentinel monitor mymaster 192.168.119.142 6379 2
sentinel auth-pass mymaster wuhaolam
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

# 启动哨兵服务
# 其余节点相同
[root@redis-master ~]# /apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
[root@redis-master ~]# ss -ntl       // 看见26379端口被监听即可

# 查看当前sentinel状态
[root@redis-master ~]# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# 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.119.142:6379,slaves=2,sentinels=3

5.4 模拟故障情景,进行实验验证

# 在主节点上关闭服务,查看从节点是否发生切换
127.0.0.1:6379> SHUTDOWN

# bk1 的从节点信息
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.119.158
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:223898
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b80c44da956da234fa1a2f917beabede32555b0d
master_replid2:748560f33eb2b985dc38b0c01cf7b891b60a673c
master_repl_offset:223898
second_repl_offset:221107
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:477
repl_backlog_histlen:223422

# bk2 的从节点信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.119.147,port=6379,state=online,offset=226087,lag=1
master_replid:b80c44da956da234fa1a2f917beabede32555b0d
master_replid2:748560f33eb2b985dc38b0c01cf7b891b60a673c
master_repl_offset:226377
second_repl_offset:221107
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:883
repl_backlog_histlen:225495

# bk2 节点已经成功切换成为主节点
posted @ 2022-08-02 16:34  wuhaolam  阅读(33)  评论(0编辑  收藏  举报