云服务器 + 微服务 + docker -----基本是标配
linux + springcould + docker
linux:
有没有一个误区?
服务器 : 在一些硬件 + 操作系统 + 应用程序 ===输出 应用能力输出
服务器:
Linux
无图像界面的服务器,一般才会作为 服务器
通过客户端 xshell、putty、cmd、finalshell
linux 的根路径
sda:我们用虚拟机方式产生的硬盘,都是sd盘,其实就是 机械硬盘
hd是固态, 他们的区别是,接口不一样
a\b\c… 第几个硬盘
a1\a2\a3… 第1个硬盘的第几个分区
sda1:
ls -lth
安装:
获取命令的帮助:
Task Thread 两个数字不相同, Thread数字大于Task数字, 因为 一个进程可能有多个线程
top命令中按数字1可以看到 多个核,每个核的cpu的使用情况
mem: buffer cache swap
任何一个程序启动,都会在内存中占用:虚拟内存核物理内存
PID 进程id
USER 进程的归属用户
PR 优先级的级别
NI 优先级的值,越低,优先级越高
这三个都是进程的内存相关数据,按小写e 可以切换单位
查看当前系统cpu使用率最高的4个进程: n 4 回车
top命令默认3秒钟刷新一次数据: s\d 数字
我只想看某个进程下的线程资源使用情况: top -H -p pid值
us\usr、sy\sys
ps aux |grep mysqld |grep -v grep
[root@vircent7 ~]# vmstat 1 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1094548 2108 362988 0 0 58 7 40 52 0 0 100 0 0
procs
memory
swap
io
system
cpu
sysstat的工具包,这个工具包中带了很性能分析命令yum install sysstat -y
pidstat: 能看磁盘、内存、cpu的数据,主要看cpu的上下文数据
pidstat -u -w 1 5
中断 VS 上下文切换:
iostat: 看数据换入换出
dstat
块:从磁盘中读取数据的 最小单位
页:从内存中交互数据的 最小单位 页的大小要比 块要大
性能测试分析的思路:先分析硬件 、网络、 系统配置、应用程序
硬件: cpu、内存、磁盘、网络、io
内存: 程序代码、网络数据,外部数据进入cpu的桥梁,内存的速度,要比cpu的速度
cpu中: 内核、线程、架构
cpu的内核,医院中的医生
cpu的线程,医生配备的护士
cpu的架构,医院的结构
看cpu的数据信息: top
lscpu
cat /proc/cpuinfo
/proc 虚拟文件,操作系统启动时,读取的信息,这些信息放内存中
cat /proc/cpuinfo |grep "physical id" |sort |uniq |wc -l
查看物理cpu数量
cat /proc/cpuinfo | grep "cpu cores" |uniq
查看CPU的core数,即核数
cat /proc/cpuinfo | grep "processor" |wc -l
查看逻辑CPU数量
load average = cpuload + ioload
sys高 系统态cpu使用率高, 内核中计算
si 软中断高
us 用户态比较高
真正在做性能测试时,你要管理好你的被测服务器,loadaverage要恢复正常,第一个值,没有明显的上升或下降的趋势,也就是说第1个值,基本不变。
服务器硬件资源监控: grafana(前端) + prometheus(时序数据库) + node_exporter(硬件资源收集器)
./node_exporter
./prometheus
默认端口:9090systemctl restat grafana-server
默认端口: 3000stress-ng: 性能测试模拟工具,可以直接模拟服务器各种压力情况
# 安装epel源,更新系统
yum install -y epel-release.noarch && yum -y update
# 安装stess-ng 的工具
yum install -y stress-ng
(( proc_cnt = `nproc`*10 )); stress-ng --cpu $proc_cnt --pthread 1 --timeout 150
# nproc 这个命令可以获得服务器cpu的数量
# (( proc_cnt = `nproc`*10 )); 把cpu核的数量乘以10倍,给变量proc_cnt
# --cpu $proc_cnt $proc_cnt shell编程中的变量引用
# --pthread 每个进程有多少个线程
# --timeout 超时时间,在命令执行多长时间之后自动结束
总结:
1、top命令,可以到 loadaverage 有持续上升,cpu被100%使用 us + sy + si
2 vmstat proc中r列有非常大的数据 有非常多的进程在抢cpu的资源
memory: free 数据变小, 内存有一部分被使用
system: in有一点点, cs 有明显数据变大,说明有大量的 上下文切换
3 pidstat -w 1----这个命令可以上下文的信息
我们看到的大量 stress-ng–cpu cswch/s 自愿 nvcswch/s非自愿上下文的值
现在可以得出 ,我们线程有大量的 进程上下文切换问题,而这个问题的进程:stress-ng–cpu
当你的服务器,使用top命令发现,系统负载比较高,所有的cpu的使用率接近或等于 100%,我们要排查问题,vmstat 1 , 结果我们看到有procs 中r列 有大量数据,说明我们有大量进程在竞争cpu的资源。--------可能服务器的cpu数量不够, 也可能是 进程启动的太多
vmstat 我们还看 system中 cs 比较高 --------肯定有大量的上下文切换
但是,此时,我并不知道,是哪个进程导致 抢占cpu,-----找具体是哪个进程
==== 应该是某个经常有大量的上下文切换,而导致的cpu使用率过高,系统负载过高的问题
—问题的关键点,找到具体的进程
pidstat -w 3 看到具体的 上下文切换的数据比较大的进程。-------得到具体进程 和进程id
结论
Ø1、top: load值一直在增加,而且增长的非常大
Ø2、top:CPU的 us + sy ≈ 100%,us较高,sy较低
Ø3、vmstat: procs的r 就绪队列长度,正在运行和等待的CPU进程数很大
Ø4、vmstat: system的in(每秒中断次数) 和 cs(上下文切换次数) 都很大
Ø5、vmstat:free、buff、cache变化不大
Ø6、pidstat: nvcswch/s 非自愿上下文切换在逐步升高
只要系统运行,那么 中断和 上下文切换,就不可避免,只不过这些数据比较小
stress-ng --cpu `nproc` --pthread 1024 --timeout 60
分析命令:
+ top
+ vmstat 1
+ pidstat -w 5
结论:
Ø1、top: load值一直在增加,而且增长的非常大
Ø2、top:CPU的 us + sy ≈ 100%,us较低,sy较高
Ø3、vmstat: procs的r 就绪队列长度,正在运行和等待的CPU进程数很大
Ø4、vmstat: system的in(每秒中断次数) 和 cs(上下文切换次数) 都很大
Ø5、vmstat:free变小、buff基本不变、cache变大
Ø6、pidstat: cswch/s 自愿上下文切换 升高
stress-ng
IO密集型,导致服务器平均负载比较高
stress-ng -i 6 --hdd 1 --timeout 150
===你们考虑一下,这个问题这么解决?
----已经定位到了具体是哪个程序导致了
要么换磁盘,要么迁移到io性能更好的服务器
如果你是整体的迁移你的数据库,这个风险比较大,我们可以再另外一个IO性能比较好服务器,再安装一个数据库,做要给数据库读写分离。
要么 减少io操作
要定位到具体代码:
思路:具体进程id之后, 找到进程线程id,然后把线程id进行16进制转换, 进程id日志打印出来,过滤出线程id(16进程)
内存知识
内存中,内存地址与存储单元组成的
数据结构
堆栈: 两种数据结构
内存中数据结构
数据类型:
一个程序: 如: 这个程序启动要 256m
jvm: java虚拟机
程序计数器、java虚拟机栈、本地方法栈、方法区、堆内存
程序计数器:记录程序执行字节码的行号指示器
内存泄漏: 内存的资源不及时释放,一直占用,导致可用的内存资源越来越少。
内存溢出:内存泄漏到一定的时间,可用的空间就会越来越少,某一次我要用比较大的空间时,发现,我申请不到足够的空间了,我申请的空间已经超过最大可用空间,内存溢出。
top: 进程列表中有3列, 虚拟内存、物理内存、共享内存
YGC:Young Generation Minor GC
FGC:Major GC
资源回收的时候,都会出现卡顿,YGC的卡断时间会比较短,FGC卡顿的时间会比较长
性能测试中,就对于这个gc是要关注
如果 新生代资源分配过多,那么,老年代这变就要少, 老年代的空间,我可能就要经常的进行FGC, FGC频率高了,那么累计的gc的时间就长,导致性能比较差
如果 新生代分配的资源少了,那么老年代就分配多些,我的新生代的资源回收频率YGC就要高, 那么累计的ygc的时间也可能长,我的性能也可能较差
gc资源回收
-XX:SurivivorRatio=8 eden空间、from空间、to空间的比例 8:1:1
-XX:MaxMetaspaceSize jdk1.7 jdk1.8这个元空间参数配置名称变了
准备一台linux
检查 jdk1.8
tomcat Jvmpertest.war 丢到webapps文件夹下
JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
启动tomcat
jmeter调用: http://ip:8080/JvmPertest/pertest1
确定oom问题:
nested exception is java.lang.OutOfMemoryError: Java heap space
定位这个问题:
ps -ef |grep java
jps
jmap -dump:live,format=b,file=heap_jvmpertest_20210811002.hprof 2419
java -jar arthas-boot.jar pid
heapdump
,在出现内存溢出的错误是,执行这个命令,可以直接下载heapdump信息看jvm的 gc信息: -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime
IO操作,所以,生产环境,一般不添加
jstat -gcutil 3122 1000 10
分析gc
ØS0:新生代susvivor0区
ØS1:新生代susvivor1区
ØE:新生代eden区
ØO:年老代
ØM:方法区回收比例 CCS:类空间回收比例
ØYGC:minor gc次数
ØYGCT: minor gc耗费的时间
ØFGC: full gc的次数
ØFGCT: full gc的耗时
ØGCT: gc总耗时
cpu相关问题,应用服务器中高频率
内存: 工作中,比较难
网络:见的多,但是不是最难,只是因为大家 见多,网络知识跟不上
磁盘问题: 相对来说问题是最少, 一般集中在 文件服务器\数据服务器
扇区扇区sector:磁盘组成的最小单元(512b),磁盘磁道中一个弧段
块Block:操作系统与磁盘数据交换的最小单位,块=2n x 扇区
Ølinux:类似Ext4文件系统,就是磁盘分块
Øwindows:类似NTFS文件系统,也是块,只是被叫做‘簇’
页page:操作系统与内存数据交换的最小单位 一页的大小,一般是4K
缓冲区buffer:
磁盘阵列RAID:
测试磁盘写的速度
echo 3 >/proc/sys/vm/drop_caches
dd if=/dev/zero of=$PWD/optfile bs=20MB count=100
vmstat 1
cache增大, bo有明显数据,in也有明显数据变化iostat -dx 1
wkB/s有非常大的数据, await也有数测试磁盘读的速度
echo 3 >/proc/sys/vm/drop_caches
dd if=/dev/sda of=/dev/null bs=20MB count=100
vmstat 1
buff 有明显的数据,cache有数据变化,但是不明显, bi有明显的数据iostat -dx 1
rKB/s有明显的数据,await有,但是不是很大测试内存的速度
echo 3 >/proc/sys/vm/drop_caches
dd if=/dev/zero of=/dev/null bs=10MB count=1000
结论: 磁盘的读写速度,几百MB/s 内存 几GB/s 内存速度比磁盘快很多。
写操作时,cache增大, bo有明显数据,
读数据时,buff增大, bi有明显数据
安装python3
yum install gcc -y
yum groupinstall 'Development tools' -y
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libffi-devel -y
# 上传python3.9.1包
# 解压,进入解压后的文件夹
./configure --prefix=/usr/local/python3/
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
安装flask
pip3 install flask
运行项目: python3 pertest_io.py
jmeter请求 http://ip:9800/pertestio/随机数字
发现: 系统平均负载在上升
定位:
网络
TCP组成:源地址、源端口、目的地址、目的端口
电脑最多: 65535个端口
1- 1023 公认端口 21、22、25、80、443
1024-49151 注册端口 8080 9800 3000
49152~65535 私有端口 约16800
问题: Address already in use: connect
优化方向:
定位问题:
1、看到报错
获取商品列表
分析
windows: netstat -ano | find "TCP" /i /c
如果你发起方机器,这个命令的数值,约1.4w,可以肯定,你本地端口成为性能瓶颈
linux:netstat -ano | grep "TCP" | wc -l
2、调优
去掉: keepalive 并不能解决问题,只是把这个报错时间往后延迟一点
修改注册表:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
linux,如果你发发起方是Linux
sysctl -a |grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999 =====2.8w
改端口范围:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -p
判断带宽有没有问题:
源地址
源端口:
目标地址
目标端口
ulimit ulimit -a
查看所有的限制
ulimit -n
open files 打看文件数量限制 默认1024. 某一个应用程序,最多可以打开的文件数量
修改配置项: ulimit -选项参数 配置值
----这种修改,只是临时修改,系统重启之后,自动还原。
持久化\永久性的修改
vim /etc/security/limits.conf
* soft nproc 32768
* hard nproc 32768
* soft nofile 16000
* hard nofile 16000
不管你是用 ulimit命令修改,还是 修改文件limits.conf, 你的应用程序要使用这个配置,那么你的应用程序需要重启
检查系统配置是否成为瓶颈:
lsof -p pid |wc -l
lsof |wc -l
cat /proc/PID/limits # 看具体某个进程运行打开的文件数量
禁ping
# 禁ping
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -w net.ipv4.route.flush=1
sysctl -p
# 开启
sysctl -w net.ipv4.icmp_echo_ignore_all=0
sysctl -w net.ipv4.route.flush=1
sysctl -p
cpu
内存
一个程序启动,在内存中分配一定量的 内存空间 (物理内存)
一个线程的内存,是由 虚拟内存 + 物理内存
内存溢出
内存泄漏
服务器上的应用中间件
服务器上数据库
use
cpu分析: top
loadaverage: 1 5 15分钟
上下文切换
cpu性能分析:
内存:
io问题
网络:
如果看到响应信息中有,too many open file too many connection
tps上不去,可能的原因
java:
springcloud,自己带有tomcat,它打出来的jar包,可以直接运行
java -jar xxxx.jar 默认就是8080
tomcat配置文件
grafana+prometheus 监控tomcat
JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent-0.16.1.jar=3088:./tomcat.yml"
systemctl restart grafana-server
- job_name: 'jvm_exporter'
static_configs:
- targets: ['192.168.3.41:3088']
nginx
yum install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel -y
# 安装必须的pcre
wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
tar -xzvf pcre-8.44.tar.gz
cd pcre-8.44
./configure
make && make install
wget http://nginx.org/download/nginx-1.19.5.tar.gz
tar -xzvf nginx-1.19.5.tar.gz
cd nginx-1.19.5
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
启动nginx的命令: /usr/local/nginx/sbin/nginx
配置文件地址: /usr/local/nginx/conf/nginx.conf
检查nginx的配置文件是否正常: /usr/local/nginx/sbin/nginx -t
重新加载配置文件/usr/local/nginx/sbin/nginx -s reload
安装nginx方法2:
rpm install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm -y
yum install nginx -y
systemctl restart\stop\status nginx
# 检查配置文件是否正常
nginx -t
# 重新家族nginx的配置文件
nginx -s reload
#配置文件地址
/etc/nginx/nginx.conf
两种方式优缺点:
用nginx来配置一个集群
两种安装方式
源码安装nginx:
/usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
我们的监控平台: grafana + prometheus 监控nginx
# nginx-module-vts.tar.gz
git clone https://gitee.com/mirrors/nginx-module-vts.git
tar -xzvf nginx-module-vts.tar.gz
# 路径: /opt/nginx-module-vts
# 重新安装nginx
# 进入nginx的解压文件夹中
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/opt/nginx-module-vts/
make && make install
# 杀调nginx
# 启动nginx
/usr/local/nginx/sbin/nginx
# 下载
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
tar -xzvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
cd nginx-vts-exporter-0.10.3.linux-amd64
# 启动
nohup ./nginx-vts-exporter -nginx.scrape_uri=http://localhost/status/format/json &
现在用 http://nginx_ip:9913/metrics 访问 可以访问,但是没有数据
没有数据是什么原因呢?==-====我们需要修改nginx.conf配置
# 在http节点下
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
# 再在 server
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
# 重新加载 nginx.conf文件
/usr/local/sbin/nginx -t
/usr/local/sbin/nginx -s reload
这个时候 刷新 http://nginx_ip:9913/metrics 我们看到页面中多了很多数据,nginx_vts_exporter 已经开始收集数据
systemctl restart grafana-server
# 修改Prometheus.yml
- job_name: 'nginx_exporter'
static_configs:
- targets: ['192.168.3.41:9913']
nohup ./prometheus &
6、访问: http://grafana_ip:3000 admin admin
7、添加数据源,引入模板: 2949
到现在,我们做性能测试同时,收集了 tomcat、nginx、node
服务器架构演进(三)
因为关系型数据库,遵循ACID原则,所以,一般情况,要数据库入库准确,而且字段数量并更不是很频繁的情况下,使用关系型数据。
存储信息的字段数量不相等,或不确定情况时,我们一般就用 非关系型数据库
现在企业中,关系型数据库 + 非关系型数据库 组合 存储数据的情况,非常场景
数据库锁: 两种常见的
行锁: 每次锁定一行
只有获得了某一行操作的锁了,才能操作这一行数据, 当有高并发时,我可以不同的线程来操作不同的行。
表锁: 每次把整张表锁定
在操作前,先获得整张表的操作锁,只有获得到锁的这个线程,才能操作整张表,其他的线程,没有拿到锁,就只能等待。
mysql数据库一般是5.5以上的版本,它的锁默认是 行锁。mysql5.5以前的版本,默认 表锁。
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
# 安装mysql-server
yum install mysql-community-server -y
# 启动数据库
systemctl restart mysqld
# 配置开机自启动
systemctl enable mysqld
最简单, 但是因为网络的原因,要下载,可能时间会比较长
使用rpm包安装
速度很块,但是,包有先后顺序的依赖关系,
安装方法3:----速度最块
docker方式安装
速度很快,但是,需要有docker的技能
# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
docker run -itd --name mysql -p 3337:3306 -e MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
修改数据库的密码:
通过 grep "password" /var/log/mysqld.log
可以找到密码,但是这个密码是高复杂度的密码,这个密码不好记忆
我们想要修改为低复杂度好记忆的密码
修改 mysql数据库的配置文件 /etc/my.cnf
[mysqld]
validate_password_policy=0 # 设置为 弱密码
validate_password=off # 关闭密码策略
character_set_server=utf8
init_connect='SET NAMES utf8'
重启动mysql: systemctl restart mysqld
进入mysql客户端 mysql -uroot -p
回车
alter user 'root'@'localhost' identified by '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
mysql的默认端口 3306
安装mysql方法2,使用docker安装
# 安装docker依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装docker:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyuncurl -sSL
# 重启docker
systemctl restart docker
# 配置开机自启动
systemctl enable docker
# 创建一个mysql容器
docker run -itd --name mysql5735 -p 3337:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.35
创建库
创建表:
索引
建表: 建表的时候,要特别注意,存储引擎,因为,存储引擎,直接影响这个表的性能。
mysql5.5版本,表默认存储引擎是 InnoDB
mysql5.5版本,表的默认存储引擎 MyISAM
建立好了表,表就会有多个字段,往里面写入数据。
索引:
建立了数据库和表之后,在/var/lib/mysql路径下,就有数据库名称文件夹
索引的优劣:
B树
存储引擎 vs 存储过程
视图:
查询语句的写法:
查询语句的解析过程:
梳理前面我们说的影响数据库性能的地方:
数据库的性能优化:
os + 库
实操 慢查询:
易捷支付项目的数据库开启慢查询日志
# 进入数据库容器
docker exec -it centos7_mysql57 /bin/bash
# 找到容器中 mysql的配置文件路径 /etc/mysql/mysql.cnf
exit # 退出容器
# 从容器中,拷贝路径下 mysql.cnf文件到当前路径
docker cp centos7_mysql57:/etc/mysql/mysql.cnf $PWD
#### 如果你不知道怎么去找这个配置文件,你就用我这个命令
docker cp centos7_mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf $PWD
# 在本地修改mysqld.cnf文件
slow_query_log=ON
long_query_time=1
#把修改后的mysqld.cnf文件,拷贝到容器中去
docker cp mysqld.cnf centos7_mysql57:/etc/mysql/mysql.conf.d/mysqld.cnf
# 重启容器
docker restart centos7_mysq57
我们在做性能测试时,响应时间超过 long_query_time这个设置的时间,才可能出现慢sql
如果出现 Too many connections 适当的调整max_connections
应用程序 ,调用数据库,是不是 还有一个配置文件?
配置文件
netstat -ano|grep dbms_prot |grep ESTABLISHED |wc -l
# 这个命令,在数据库机器中执行 看数据库当前总共有多少的连接数
netstat -ano|grep dbms_prot |grep pjserver_ip |grep ESTABLISHED |wc -l
# 这个命令,在数据库机器中执行 可以看到 应用程序pjserver与 数据库建立连接数有多少
表 + 脚本
mysql数据库的优化
获取慢sql?
分析慢sql,只是数据库表层面的优化的一种。
数据库表层面的优化:
表优化:
慢sql的优化: 找到sql语句
explain sql语句 -----分析你的sql
id:id值大 先被执行;id相同的,执行顺序从上往下
select_type: 查询类型,种类有多种
type: 查询的类型,也是有多种值
key: 脚本真正用到索引
rows: 总共查询了多少行
extra:
sql优化:
mysql数据库的监控
方法1
方法2: docker方式来安装 mysqld_exporter
docker run -itd --name kyj_mysqld_exporter -p 9404:9104 -e DATA_SOURCE_NAME="root:123456@(192.168.3.41:3337)" prom/mysqld-exporter
主从同步、读写分离====实现 热备份(同时), 异步
分表分区
主从同步、读写分离
课程中,主从同步环境搭建,1台机器中,使用docker安装多个不同的数据库容器
yum install -y yum-utils device-mapper-persistent-data lvm2
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 开机自启动、重启docker
systemctl enable docker
systemctl restart docker
Hub · DaoCloud
Docker Hub
# 下载镜像
docker pull daocloud.io/library/mysql:5.7.7
docker run -itd --name mysq577_master -p 3336:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.7
docker run -itd --name mysq577_slave -p 3346:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.7
定义主数据库、从数据库
找到数据库的配置文件,修改配置文件
配置文件路径: /etc/mysql/my.cnf
修改
# 从容器中,拷贝文件到宿主机
docker cp mysq577_master:/etc/mysql/my.cnf $PWD
# 修改配置文件
[mysqld]
server-id = 100
log-bin = mysql-bin
# server-id值得大小来区分主、从数据库,越小的为主数据库,越大的为从数据
# 把修改后的,拷贝到容器中
docker cp my.cnf mysq577_master:/etc/mysql/my.cnf
# 重启动容器
两个数据库之间要建立关联关系
# 从数据库中执行
CHANGE MASTER TO
MASTER_HOST='192.168.2.42',
MASTER_PORT=3336,
MASTER_USER='root',
MASTER_PASSWORD='123456';
start slave;
show slave status; -- 查看slave的状态
数据库操作
分表分区:
CREATE TABLE stu_info_master(
ID
int(8) NOT NULL,
name
varchar(32) DEFAULT NULL,
teacher
varchar(32) DEFAULT NULL,
remark
varchar(32) DEFAULT NULL
) ENGINE=MRG_MYISAM UNION=(stu_info_1, stu_info_2, stu_info_3) INSERT_METHOD=LAST DEFAULT CHARSET=utf8mb4;
MySQL
主从同步、读写分离
2个以上的数据库
主数据库、从数据库配置:
关键点: Slave_IO_Runing Slave_SQL_Runing 一定要为yes
分表分区
CREATE TABLE stu_info_all(
ID
int(8) NOT NULL,
name
varchar(32) DEFAULT NULL,
teacher
varchar(32) DEFAULT NULL,
remark
varchar(32) DEFAULT NULL
)ENGINE=MRG_MYISAM UNION(stu_info_new_1, stu_info_new_2, stu_info_new_3) insert_method=LAST DEFAULT CHARSET=utf8mb4;
show plugins;
看 partition 这个的值是否为 active。是,说明,我们的数据库支持分区。range分区: 给定区间
create table 表名(id,col1,col2…) partition by range(id)
(partition less_10000 values less than(10000) data directory = ‘/opt/less_1w/’ index directory = ‘/opt/less_1w’,
partition less_20000 values less than(20000) data directory = ‘/home/less_2w/’ index directory = ‘/home/less_2w’,
…)
list分区
columns
hash分区
key分区
composite 分区
数据库数据量级 在几千,你连索引都可以不建; 几万,到几十万,上百万数据时,考虑索引;上千万的数据时,考虑 分表; 大几千万,甚至上亿级别数据,这个时候考虑分区。
非关系型数据库
redis 常见的数据类型
安装redis
yum install gcc-c++ make -y
# 升级gcc
$ yum -y install centos-release-scl
$ yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
$ scl enable devtoolset-9 bash
$ echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
# 此时,通过gcc -v 看到gcc的版本应该是在9以上
$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz
$ tar xzf redis-6.0.8.tar.gz
$ cd redis-6.0.8
$ make
# 如果想安装到指定路径: make PREFIX=/usr/local/redis install 指定安装到/usr/local/redis路径
# 启动
$ src/redis-server
进入安装路径中 src/redis-cli
进入客户端模式
config get *
# 获取redis的所有配置信息
项目的服务要获取数据 =>redis 获取数据=没有==>底层的数据库
项目的服务要获取数据 =>redis 获取数据=有==>把数据返回给服务
docker: 软件
docker容器container: 它是一个沙箱。每一个沙箱之间是相互隔离,默认只有一个出入口,
仓库repository:管理容器的镜像的地方,
Docker Hub Container Image Library | App Containerization
Hub · DaoCloud 国内的镜像
镜像image: 根据你的要求,封装好的一个文件集合
docker容器: docker软件+镜像,运行, 就可以提供服务出来
yum install -y yum-utils device-mapper-persistent-data lvm2
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#docker 加速
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io", "http://hub-mirror.c.163.com", "https://registry.docker-cn.com"]}
systemctl daemon-reload
systemctl restart docker systemctl enable docker
检查你的系统是否安装docker docker -v
在不知道用,获取帮助 docker --help
[root@centos7 ~]# docker --help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
app* Docker App (Docker Inc., v0.9.1-beta3)
builder Manage builds
buildx* Build with BuildKit (Docker Inc., v0.6.1-docker)
config Manage Docker configs
container Manage containers
context Manage contexts
image Manage images
docker run -itd --name tomcat85 -p 8989:8080 tomcat:8.5-jdk8-corretto
docker run -itd --name tomcat_erp -p 9898:8080 -v $PWD:/usr/local/tomcat/webapps tomcat:8.5-jdk8-corretto
留思考:把我们易捷支付项目,使用docker方式来部署
自己动手
安装
配置docker
docker命令
docker 网络
docker安装一个mysql数据库容器
docker run -itd --always restart --name=vip11_mysql -p 3336:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.31
docker inspect 容器 |grep “IPAddress” -----查看容器的ip
kyj项目用docker方式来部署
docker部署kyj项目
docker run -itd --name tomcat_1 -p 8484:8080 -v $PWD/webapps/:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.0.44-jre7
docker run -itd --name tomcat_2 -p 8585:8080 -v $PWD/webapps/:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.0.44-jre7
数据库的ip : 172.17.0.2 172.18.0.2
tomcat_1: 172.17.0.3
tocmat_2: 172.17.0.4
application.properties: 数据库ip和端口 宿主机的ip和端口 192.168.3.40:3336
application.properties: 数据库ip和端口 宿主机的ip和端口 172.17.0.2:3306
性能测试与调优、 nginx搭建集群
docker run -itd --name vip11-nginx -p 8888:80 daocloud.io/nginx
Ø安装mysql数据库
Ø初始化数据库 redis_goods
CREATE TABLE goods_item
(
id
int(11) NOT NULL AUTO_INCREMENT,
code
varchar(255) DEFAULT NULL COMMENT ‘商品编号’,
name
varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT ‘商品名称’,
create_time
datetime DEFAULT NULL,
update_time
datetime DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘商品信息表’;
Ø反复执行插入数据
INSERT INTO goods_item(code,name,create_time,update_time) VALUES(‘good_10001’,'高级性能测试VIP课,NOW(),NOW());
项目环境搭建
bin文件夹 ./server.sh start
http://ip:8089/api/cache/goods/info?itemCode=good_10001
docker run -itd --name nginx_kyj -p 80:80 nginx
nginx.conf 集群的文件
知识回顾
性能知识:
硬件: cpu、内存、磁盘、io、网络
应用
微服务: docker + 项目(springcloud)
简历编写