虚拟机软件下载
VMware安装 (一直下一步就行。)
虚拟机创建
然后启动,就会在虚拟机中安装导入的centos镜像。
远程管理服务器
我们不可能在虚拟机centos系统的终端操作命令,很麻烦。所以我们需要一个可以通过ssh客户端,这里使用xshell。
上传服务器文件
为了更好地操作文件,我们需要通过ftp协议去连接服务器,然后进行文件操作,这里选择filezilla。因为linux系统没有GUI,所以编辑起来比较麻烦。
linux默认是不开启ftp协议的,开启的是SFTP协议。
linux优点
- 跨平台的硬件支持
- 丰富的软件支持。CentOS,通过
yum
安装软件,Ubuntu,通过apt
安装软件。 - 多用户多任务。
- 可靠的安全性。(权限管理非常完善)
- 良好的稳定性。
- 完善的网络功能。(强大的防火墙)
linux目录结构
文件或者文件夹都放在根目录下。
/bin
:存放系统的可执行二进制文件,如ls、cp、mv等命令。/boot
:存放引导系统启动所需的文件,包括内核镜像和引导加载程序。/dev
:存放抽象硬件,设备文件目录,包含Linux系统中所有的设备文件,如磁盘、终端设备、打印设备等。/etc
:存放系统配置文件,包括用户帐号和密码、网络配置、服务配置等。/home
:存放用户的主目录,每个用户通常在此目录下有一个与用户名相同的子目录。/lib
:存放系统和应用程序使用的共享库(类似于Windows的动态链接库)。/media
:挂载点目录,用于挂载可移动介质,如光盘、USB存储设备等。/mnt
:挂载点目录,用于挂载临时文件系统,如NFS共享、临时挂载Windows分区等。/opt
:存放可选的应用程序包、第三方软件等。(大型软件存放目录)/proc
:虚拟文件系统,提供有关系统内核和进程的信息。/root
:超级用户(root)的主目录。/sbin
:存放系统管理员使用的系统管理和维护命令。/tmp
:临时文件目录,用于存放临时文件,该目录下的文件在系统重启时会被清空。/usr
:存放用户程序和数据的目录,包括系统应用程序、库文件、文档等。(存放安装程序,程序默认目录)/var
:存放系统运行时需要修改的文件,如日志文件、缓存文件、邮件等。(存放经常变化的文件)
查看linux文件信息
ls -l <dirname / filename>
, ll
文件属性共有10位组成,第一位表示文件类型,其他9位表示权限信息。每三位一组。
文件类型
d
目录-
文件l
软连接b
存储设备。例如移动硬盘的信息。c
串行设备。鼠标键盘等。
属主权限,属组权限,其他用户权限
r
读w
写x
执行
文件类型,操作权限 | 文件数量(文件是1,文件夹统计的是内部文件数量,注意不会递归统计,只会统计当前目录下的) | 创建该文件用户的名字 | 创建该文件所属的用户组名字 | 大小(字节Byte) | 文件创建时间信息 | 文件名 |
---|---|---|---|---|---|---|
drwxr-xr-x. | 2 | root | root | 6 | Aug 5 12:49 | llm |
修改文件或者目录权限
shell
chmod id <dirname / filename>
创建用户
shell
adduser <username>
passwd <username>
login # 登陆
su - <username> # 切换用户
切换用户
创建用户,操作文件,权限不足
修改权限
CentOS7 防火墙
默认安装了firewalld防火墙。利用防火墙我们可以允许或者限制传输的数据通过。
例如我们访问远程服务器上的mysql数据库,如果远程服务器中未开启3306端口,我们将不能访问远程服务器中的mysql。
shell
# 查看
firewall-cmd --state
# 启动
service firewall start
# 关闭
service firewall stop
# 重启
service firewall restart
普通用户无法查看防火墙,必须是超级用户,即root。
管理防火墙
端口管理
shell
# 开启 8080 - 8085 这范围的端口
firewall-cmd --permanent --add-port=8080-8085/tcp
# 加载最新设置
firewall-cmd --reload
# 查看开放哪些端口
firewall-cmd --permanent --list-ports
# 删除端口
firewall-cmd --permanent --remove-port=8080-8085/tcp
查看开启的端口和服务
shell
# 查看开放的网络端口
firewall-cmd --permanent --list-ports
# 有哪些服务使用了互联网
firewall-cmd --permanent --list-services
Docker
Docker 是一个流行的容器化平台,可以帮助简化和改进项目的部署过程。镜像是用来创建容器的。容器是从镜像中创建出来的虚拟实例。
1.轻量和可移植性:Docker 容器非常轻量,只包含运行应用程序所需的最小依赖项,因此可以更有效地利用系统资源。Docker 容器还具有良好的可移植性,可以在不同的运行环境中进行部署,而无需担心依赖项或配置的不兼容性。
2.一致的开发和生产环境:Docker 允许开发人员在本地创建容器,以在与生产环境相同的环境中运行和测试应用程序。这种一致性可以减少由于环境差异而导致的问题,并提高开发团队之间的合作效率。
3.快速部署和扩展:使用 Docker 部署项目可以更快地进行部署和扩展。由于容器是轻量级的,可以在几秒钟内启动和停止,从而大大缩短了项目的部署时间。此外,可以使用 Docker Compose 或 Docker Swarm 这样的工具轻松扩展应用程序的容器实例,以满足不断增长的流量需求。
4.环境隔离和安全性:每个 Docker 容器都是独立且隔离的,具有自己的文件系统、进程和网络空间。这种隔离性可以防止应用程序之间的相互影响,并提供更高的安全性。即使一个容器中的应用程序出现问题,它也不会对其他容器或宿主机造成影响。
5.持续集成和交付:Docker 容器可以与持续集成和持续交付(CI/CD)流程无缝集成。开发团队可以使用容器构建、测试和部署应用程序,从而在开发周期中实现更快的迭代和交付。
总之,Docker 提供了一种方便、可移植、高效和安全的方式来部署和管理项目。它可以提高开发和运维的效率,并促进团队的协作和软件交付的可靠性。
docker创建的所有虚拟实例共用同一个linux内核,对硬件占用较小,属于轻量级虚拟机。
安装Docker
shell
# 先更新yum软件管理器
yum -y update
yum install -y docker
切换docker镜像源
shell
管理docker
shell
# 启动
service docker start
# 关闭
service docker stop
# 重启
service docker restart
docker相关指令
容器管理相关指令
- 创建容器:
docker create
- 启动容器:
docker start
- 停止容器:
docker stop
- 重启容器:
docker restart
- 删除容器:
docker rm
- 查看容器状态:
docker ps
- 进入运行中的容器:
docker exec
- 暂停容器:
docker pause
- 恢复容器的运行:
docker unpause
镜像管理相关指令
- 拉取镜像:
docker pull
- 构建镜像:
docker build
- 查看已安装镜像列表:
docker images
- 删除镜像:
docker rmi
- 导出镜像:
docker save
- 导入镜像:
docker load
- 查看有哪些相关镜像:
docker search <keyword>
网络管理相关指令
- 创建网络:
docker network create
- 查看网络列表:
docker network ls
- 连接容器到网络:
docker network connect
- 断开容器与网络的连接:
docker network disconnect
数据管理相关指令
- 挂载主机目录到容器:
docker run -v
- 查看数据卷:
docker volume ls
- 创建数据卷(目录和目录的映射),文件的映射直接通过
-v
参数去映射即可:docker volume create
- 删除数据卷:
docker volume rm
日志和信息相关指令
- 查看容器日志:
docker logs
- 查看容器信息:
docker inspect
- 查看容器内进程信息:
docker top
其他常用指令
- 克隆镜像并修改名称:
docker tag <原镜像名称> <修改的名称>
- 构建并启动容器:
docker run
- 进入容器交互式终端:
docker exec -it
。-it
表示启动终端交互界面。如果启动时不加这个参数,那么启动后依旧停留在宿主机交互界面中。 - 其他指令选项如
-d
(后台运行)、-p
(端口映射)、-e
(环境变量设置)等,用于配置容器运行参数。
mysql集群方案介绍
数据库集群是一种将多个数据库服务器组合在一起以实现高可用性、负载均衡和扩展性的解决方案。
单节点数据库的弊病
- 单节点数据库无法满足性能上的要求。
- 单节点数据库没有冗余设计,无法满足高可用。
PXC集群
达到实时同步。每个节点都可以读取和写入数据,如果有一个节点数据未写入成功,那么数据就表示写入失败。
安装PXC镜像。
shell
docker pull percona/percona-xtradb-cluster
创建内部网络
出于安全考虑,我们给PXC集群实例创建Docker内部网络。
shell
# 创建网段
docker network create net1
# 查看网段信息
docker network inspect net1
# 移除网段
docker network rm net1
创建数据卷,将宿主机中的数据映射到容器中的PXC节点中。一般创建卷映射文件在/var/lib/docker/volumes/
中。
shell
# 创建数据卷
docker volume create --name v1
# 删除数据卷
docker volume rm v1
创建PXC容器,只需要向PXC镜像传入运行参数就能创建出PXC容器。
shell
# 创建出的容器在后台运行,将宿主机端口与容器端口映射。
# 挂载主机目录到容器,通过上面创建的数据卷
# 指定创建容器的mysql密码,集群名称,数据库节点之间同步用到的密码
# 给映射的文件在容器中操作最高的权限。
# 容器起名字
# 使用的内部网段
# 使用的ip地址
# 镜像的名字
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=password
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=password
--privileged
--name=node1
--net=net1
--ip 172.18.0.2
pxc
创建服务器集群
shell
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
shell
# 创建第一个节点
docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-v v1:/var/lib/mysql --privileged
--name=node1 --net=net1 --ip 172.18.0.2 pxc
# 创建第二个节点
# CLUSTER_JOIN表示和第几个节点进行同步
docker run -d -p 3307:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v2:/var/lib/mysql --privileged
--name=node2 --net=net1 --ip 172.18.0.3 pxc
# 创建第三个节点
docker run -d -p 3308:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v3:/var/lib/mysql --privileged
--name=node3 --net=net1 --ip 172.18.0.4 pxc
# 创建第四个节点
docker run -d -p 3309:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v4:/var/lib/mysql --privileged
--name=node4 --net=net1 --ip 172.18.0.5 pxc
# 创建第五个节点
docker run -d -p 3310:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v5:/var/lib/mysql --privileged
--name=node5 --net=net1 --ip 172.18.0.6 pxc
本地mysql GUI连接数据库
连接上面创建的五个数据库节点
然后操作一个数据库都会影响该集群下的所有数据库。
数据库负载均衡
将请求均匀的分配给集群中的数据库进行操作。使用Haproxy
做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好。
中间件 | 开发语言 | 支持协议 | 负载均衡算法 | 高可用性功能 | 扩展性能力 | 服务发现和注册 | 社区支持和文档 |
---|---|---|---|---|---|---|---|
Nginx | C | HTTP, HTTPS, TCP | 轮询,IP哈希,最少连接 | 健康检查,热备份 | 水平扩展,反向代理 | 第三方实现,集成zookeeper等 | 强大的社区支持和文档 |
HAProxy | C | HTTP, HTTPS, TCP | 轮询,IP哈希,最少连接 | 健康检查,故障转移 | 水平扩展,反向代理,SSL终止 | 主动探测,动态配置管理 | 社区支持和文档丰富 |
Envoy | C++ | HTTP, gRPC, TCP, MQTT | 轮询,最少连接,最佳负载 | 健康检查,故障转移,熔断 | 水平扩展,HTTP/2支持,过滤器 | 集成服务发现(如Consul) | 活跃的开源社区和文档 |
Traefik | Go | HTTP, TCP, UDP | 轮询,IP哈希,最少连接 | 健康检查,故障转移,熔断 | 水平扩展,反向代理,自动HTTPS | 集成服务发现(如Etcd) | 活跃的开源社区和文档 |
Apache Traffic | C | HTTP, HTTPS, TCP, UDP | 轮询,IP哈希,最少连接 | 健康检查,故障转移,会话保持 | 水平扩展,反向代理,负载均衡 | 集成第三方服务发现(如Consul) | 社区支持和文档丰富 |
在docker容器中安装HAProxy镜像。
shell
docker pull haproxy:1.8.8
创建HAProxy配置文件,来达到负载均衡。可以参考这里
shell
touch /home/soft/haproxy/haproxy.cfg
配置文件内容如下
shell
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
启动haproxy容器
shell
# 将容器中的监控界面端口映射到宿主机4001端口上
# 将容器负载均衡端口映射到宿主机4002端口上
# 将主机目录和容器目录映射
# 使用的内部网段。和数据库集群在同一个网段
docker run -it -d
-p 4001:8888
-p 4002:3306
-v /home/soft/haproxy:/usr/local/etc/haproxy
--privileged
--name h1
--net=net1
--ip 172.18.0.7
haproxy
启动容器后,打开其终端交互界面
shell
docker exec --it h1 bash
进入容器后,指定配置文件路径。既可以访问监控界面了
shell
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
在MYSQL中创建一个 haproxy
用户,密码为空的账号。用户haproxy容器向数据库发心跳检测登录使用。
mysql
# 任何ip都可以通过haproxy登录这个账户
CREATE USER 'haproxy'@'%' IDENTIFIED BY ''
由于单节点Haproxy不具备高可用,必须要冗余设计。设计多个数据库负载均衡节点。
利用keepalived实现双机热备。
从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。
从狭义上讲,双机热备就是使用互为备份的两台服务器共同执行同一服务,其中一台主机为工作机(Primary Server),另一台主机为备份主机(Standby Server)。在系统正常情况下,工作机为应用系统提供服务,备份机监视工作机的运行情况(一般是通过心跳诊断,工作机同时也在检测备份机是否正常),当工作机出现异常,不能支持应用系统运营时,备份机主动接管工作机的工作,继续支持关键应用服务,保证系统不间断的运行。双机热备针对的是IT核心服务器、存储、网络路由交换的故障的高可用性解决方案。
安装keepalived,keepalived必须要安装到Haproxy所在的容器之内。这里使用apt指令是因为haproxy镜像是通过ubuntu创建的。
我们先更改apt下载的源,不然会报错,或者下载很慢
shell
apt-get update
apt-get install keepalived
keepalived在运行时需要争抢虚拟ip,所以需要添加配置文件。
shell
# /etc/keepalived/keppalived.conf
vrrp_instance VI_1 {
# keepalived的身份(master主服务器, backup备用服务器)。主服务器需要抢占虚拟ip,备用服务器不会抢占虚拟ip
state MASTER
# 网卡设备
interface eth0
# 虚拟路由标识,master和backup的虚拟路由标识必须一致,标识可以是0 - 255
virtual_router_id 51
# master权重要高于backup,数字越大优先级越高。
priority 100
# master与backup节点间同步检查的时间间隔,单位是秒,准备之间必须一致。
advert_int 1
# 主从服务器验证方式。主备必须使用相同的密码才能正常通信。
authentication {
auth_type PASS
auth_pass 123456
}
# 虚拟ip地址。可以设置多个虚拟ip地址,每行一个
virtual_ipaddress {
172.18.0.201
}
}
启动keepalived程序。
shell
service keepalived start
热备份
将数据备份到寄主机上。创建数据卷
shell
# 在宿主机中创建数据卷
docker volume create backup
# 将数据卷映射到pxc节点中
docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD=12345
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=12345
-v v1:/var/lib/mysql
-v backup:/data
--privileged
-e CLUSTER_JOIN=node2
--name node1
--net=net1
--ip 127.18.0.2 pxc
PXC容器中安装XtraBackup
,并执行备份
shell
apt-get update
apt-get install percona-xtrabackup-24
# 全量备份
innobackupex --user=root --password=123456 /data/backup/full
# 查看宿主机中的数据卷
docker inspect backup
全量冷还原
- 删除数据库集群的所有节点
shell
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
- 删除数据库集群关联的数据卷
shell
docker vokume rm v1 v2 v3 v4 v5
- 重新创建数据库集群节点
shell
docker volume create v1
docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-v v1:/var/lib/mysql
# 找到备份的数据卷,映射到集群中
-v backup:/data
--privileged
--name=node1
--net=net1
--ip 172.18.0.2
pxc
- 清空mysql数据
shell
rm -rf /var/lib/mysql/*
- 把没有提交事务回滚一下
shell
innobackupex
--user=root
--password=123456
--apply-back
/data/backup/full
- 执行冷还原
shell
innobackupex
--user=root
--password=123456
--copy-back
/data/backup/full
- 重启集群节点
shell
docker restart node1
redis高速缓存
高速缓存利用内存保存数据,读写速度远超硬盘。高速缓存可以减少I/O操作,降低I/O压力。
redis集群方案
- redisCluster,没有中心节点。客户端与redis节点直连,不需要中间代理层。官方推荐。
- codis,中间件产品,存在中心节点
- twemproxy,中间件产品,存在中心节点。
配置RedisCluster集群
- 安装redis镜像。
shell
docker pull yyyyttttwwww/redis
- 创建网络
shell
docker network create --subnet=172.19.0.0/16 net2
- 运行redis容器
shell
docker run -it -d
# redis默认端口6379
-p 5001:6379
-net=net2
--ip 172.19.0.2
--name r1
redis bash
- 修改redis的配置文件
shell
# /usr/redis/redis.conf
# 运行在后台
daemonize yes
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 超时时间
cluster-node-timeout 15000
# 开启AOF模式,开启日志
appendonly yes
- 启动redis程序
shell
# 进入 /usr/redis/src
./redis-server ../redis.conf
依据上面的操作,创建若干redis节点。
nginx负载均衡
安装nginx镜像
shell
docker pull nginx
上传nginx.conf文件
ini
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
# 负载均衡,需要启动多个后台接口容器
upstream serve_list {
server 192.168.99.104:6001;
server 192.168.99.104:6002;
server 192.168.99.104:6003;
}
server {
listen 6101;
server_name 192.168.99.104;
location / {
proxy_pass http://serve_list;
index index.html index.htm;
}
}
}
启动nginx容器
shell
docker run -it -d --name n1
-v /home/n1/nginx.conf:/etc/nginx/nginx.conf
--net=host
--privileged
nginx
创建两个nginx节点,通过keepalived实现双机热备。
前端也可以实现负载均衡,实现双机热备,防止一个服务器程序挂掉,服务停止响应。 创建多个前端服务,然后通过nginx实现负载均衡,再通过keepalived实现双机热备。