Linux基础知识及项目部署

本文详细介绍了在Linux环境下使用命令行操作,包括目录管理、文件操作以及防火墙设置。接着,重点讲解了如何使用Docker搭建MySQL的PXC集群和Redis的集群,包括网络配置、数据卷创建、节点启动等步骤。此外,还提到了使用haproxy进行数据库负载均衡和Nginx实现后端项目负载均衡的方法。最后,文章讨论了Keepalived在实现nginx双机热备中的应用,确保高可用性。
摘要由CSDN通过智能技术生成

Linux目录结构及常用命令

登陆进取后,默认是root目录内;但普通用户登陆后more是home里面。

 常用命令

mkdir

touch

echo

ls

ls -l

cat

vi

cp  //拷贝文件

cp -r  //拷贝文件夹,并将文件夹中的文件均拷贝。

rm //删除

rm -rf  //r表示删除目录及其子目录,f表示强制删除

mv

mv -f // 若目标文件已存在,强制覆盖目标文件

chmod //修改文件属性

ls -l  //罗列文件属性

[root@localhost /]# chmod 500 demo.txt

防火墙相关:(38条消息) CentOS7查看和关闭防火墙_centos关闭防火墙_蔚蓝色天空sky的博客-CSDN博客

systemctl status firewalld 或者 firewall-cmd --state

 暂时关闭防火墙
systemctl stop firewalld

永久关闭防火墙
systemctl disable firewalld

开启防火墙
systemctl start firewalld

开放指定端口
 firewall-cmd --zone=public --add-port=端口/tcp --permanent

关闭指定端口
 firewall-cmd --zone=public --remove-port=端口/tcp --permanent

立即生效
firewall-cmd --reload

查看开放的端口
firewall-cmd --zone=public --list-ports

Docker

相关命令

准备阶段的相关命令:

service docker start //启动docker容器

docker images//获取docker容器中的所有镜像

docker sereach java //从官方容器中搜索相关镜像

docker ps //查看正在运行的镜像

docker ps -a   //查看所有镜像

docker pull docker.io/java  //拉取相关镜像

docker rmi docker.io/java //删除相关镜像

docker save docker.io/java > /home/java.tar.gz  //导出镜像为压缩文件

docker load < /home/java.tar.gz  //导入压缩文件为镜像

运行阶段的相关命令:

docker run -it --name myjava -p 9000:8000 -v /home/project:/soft privileged docker.io/java bash

--name表示容器重新命名,

-p表示端口映射,9000表示docker容器的端口号,8000表示宿主机的端口号

-v表示路径映射,用来将docker中的数据持久化,与-p规则一致,privileged表示文件夹享有最高权限。

搭建MySQL集群

 MySQL集群部署的几种方案

Replication:是异步复制解决方案,主要通过三个线程完成,Master的IO线程,Slave的IO线程和clone线程。

优点:速度块。

缺点:弱一致性,无法保证主节点和从节点的强一致性。

PXC:速度不快,但保证了强一致性。数据的读写是双向的。事务在所有集群节点中生效,要么同时成功,否则都回退。不分主节点从节点。

因此准备了前后端分离的项目进行部署,数据库采用PXC方案进行集群部署

//拉取PXC镜像
docker pull  percona/percona-xtradb-cluster:5.7.21

PXC数据库集群搭建

集群搭建的步骤:创建内部net网络,创建多个percona-xtradb-cluster节点即可。

内部net网络创建

使用percona-xtradb-cluster镜像可以创建多个数据库节点,节点之间的网络。ip号设置了24位掩码。

docker network create --subnet=172.18.0.0/24 net1

查看network信息如下:

[root@localhost ~]# docker inspect net1
[
    {
        "Name": "n2",
        "Id": "5178b704203ce9affab6aa2e1042f8ebf9a88e486929fb0186561fc594dc692b",
        "Created": "2023-06-07T19:19:25.44676899+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

创建docker数据卷

(42条消息) Docker(五)进阶:Docker卷(volumes)_docker volumes_lin钟一的博客-CSDN博客https://blog.csdn.net/weixin_46618592/article/details/126591142通过目录映射,实现数据持久化。具体来说,就是将容器内的数据目录与宿主机中的目录进行映射,从而实现容器中数据的持久化。

创建docker数据卷v1,后续仅需要目录映射即可。

docker volume create v1

可以在此制定映射路径,格式 容器内路径地址:宿主机路径地址。

构建PXC节点

第一个节点的创建:

docker run -d -p 3306:3306 
-v v1:/var/lib/mysql 
-e mysql_root_password=123456 
-e cluster_name=PXC 
-e xtrabackup_password=123456 
--privileged 
--name=node1 
--net=net1 
--ip=172.18.0.2 
docker.io/percona/percona-xtradb-cluster

注意,一定要在node1创建后,进行MySQL连接测试,测试成功后再创建其余节点。再补充其他4个节点信息。

[root@localhost ~]# docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e cluster_join=node1 -e mysql_root_password=123456 -e cluster_name=PXC -e xtrabackup_password=123456 --privileged --name=node2 --net=net1 --ip=172.18.0.3 docker.io/percona/percona-xtradb-cluster
c25bf3304ba60278a4e9b2deb9a6f162bdd3a644e8cccd24168ce7da58cf5077

[root@localhost ~]# docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e cluster_join=node1 -e mysql_root_password=123456 -e cluster_name=PXC -e xtrabackup_password=123456 --privileged --name=node3 --net=net1 --ip=172.18.0.4 docker.io/percona/percona-xtradb-cluster
8ca2d6df74e48c21600296e8efd9e5561bc16db531371c74c4a42cd37beec861

[root@localhost ~]# docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e cluster_join=node1 -e mysql_root_password=123456 -e cluster_name=PXC -e xtrabackup_password=123456 --privileged --name=node4 --net=net1 --ip=172.18.0.5 docker.io/percona/percona-xtradb-cluster
50fb5f956f485f45aa55f4db4f61995abf4912c086110d50581b8e9f405edf4f

[root@localhost ~]# docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e cluster_join=node1 -e mysql_root_password=123456 -e cluster_name=PXC -e xtrabackup_password=123456 --privileged --name=node5 --net=net1 --ip=172.18.0.6 docker.io/percona/percona-xtradb-cluster
702d9054042495249e69514b5623e84c036745be4ff6f1393ae0996842a2697e

上述节点设置与node1的区别在于,端口号的映射、数据卷的映射、节点命名的区别。

PXC集群之间的负载均衡 haproxy工具

使用haproxy作为数据库集群负载均衡的原因:其对TCP协议的支持较好。

docker pull  docker.io/haproxy  //拉取haproxy镜像

运行haproxy的docker,并配置端口映射,注意端口映射的顺序,4001表示后台监控映射的端口。宿主机端口:docker容器端口;文件路径映射也是宿主机路径:docker路径。

[root@localhost ~]# docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name=h1 --privileged --net=net1 docker.io/haproxy
ce546e9a53fdd5477a92375fc19bf66e508d82736b3d4e1a3efb533b04cdc736

要指定haproxy配置文件,首先需要进入到运行中的容器里面。

在实际过程中遇到了haproxy版本不兼容的问题,可能是老师之前写的haproxy.cfg和最新的haproxy语法要求有冲突的缘故。更改镜像中haproxy的版本,如下所示。

1. docker pull haproxy:1.8.8
2. docker tag docker.io/haproxy:1.8.8 haproxy
3. docker rmi docker.io/haproxy:1.8.8
4. docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy bash
5. docker exec -it h1 bash
6. haproxy -f /usr/local/etc/haproxy/haproxy.cfg是将latest版本的haproxy替换为1.8.8版本

设置成功后,浏览器可以访问后台监控页面http://172.20.162.106:4001,可以看到,只有node1运行成功,主要原因尚待解决。

搭建Redis集群

docker简易搭建Redis高速缓存集群-蒲公英云 (dandelioncloud.cn)

采用RedisCluster方案实现主从同步。

首先设置内部通信网络net2,然后通过run命令启动单节点Redis容器,并进入Redis配置文件中修改相关内容。

docker network create --subnet=172.19.0.0/16 net2 docker run -it -d --name=r1 -p 5001:6379 --net=net2 --ip=172.19.0.2 redis bash

经过上述代码,Redis单节点已部署成功。

然后进入Redis容器中,要修改的配置文件如下:

进入Redis配置文件:docker exec -it r1 bash 编辑Redis.conf文件:vi /usr/redis/redis.conf

按“/”可以按关键字查询配置文件内容,按“i”开始编辑,结束后按“:wq”可保存并退出。

此时需要手动启动Redis服务,不要退出r1容器,进入路径cd /usr/redis/src,包含文件如下所示:

​
Makefile      anet.o       config.c      dict.h         intset.h         multi.c       quicklist.h        redis-check-rdb    replication.o  server.o        sparkline.o  util.c
Makefile.dep  aof.c        config.h      dict.o         intset.o         multi.o       quicklist.o        redis-check-rdb.c  rio.c          setproctitle.c  syncio.c     util.h
adlist.c      aof.o        config.o      dump.rdb       latency.c        networking.c  rand.c             redis-check-rdb.o  rio.h          setproctitle.o  syncio.o     util.o
adlist.h      asciilogo.h  crc16.c       endianconv.c   latency.h        networking.o  rand.h             redis-cli          rio.o          sha1.c          t_hash.c     valgrind.sup
adlist.o      bio.c        crc16.o       endianconv.h   latency.o        notify.c      rand.o             redis-cli.c        scripting.c    sha1.h          t_hash.o     version.h
ae.c          bio.h        crc64.c       endianconv.o   lzf.h            notify.o      rdb.c              redis-cli.o        scripting.o    sha1.o          t_list.c     ziplist.c
ae.h          bio.o        crc64.h       fmacros.h      lzfP.h           object.c      rdb.h              redis-sentinel     sds.c          slowlog.c       t_list.o     ziplist.h
ae.o          bitops.c     crc64.o       geo.c          lzf_c.c          object.o      rdb.o              redis-server       sds.h          slowlog.h       t_set.c      ziplist.o
ae_epoll.c    bitops.o     db.c          geo.h          lzf_c.o          pqsort.c      redis-benchmark    redis-trib.rb      sds.o          slowlog.o       t_set.o      zipmap.c
ae_evport.c   blocked.c    db.o          geo.o          lzf_d.c          pqsort.h      redis-benchmark.c  redisassert.h      sdsalloc.h     solarisfixes.h  t_string.c   zipmap.h
ae_kqueue.c   blocked.o    debug.c       help.h         lzf_d.o          pqsort.o      redis-benchmark.o  release.c          sentinel.c     sort.c          t_string.o   zipmap.o
ae_select.c   cluster.c    debug.o       hyperloglog.c  memtest.c        pubsub.c      redis-check-aof    release.h          sentinel.o     sort.o          t_zset.c     zmalloc.c
anet.c        cluster.h    debugmacro.h  hyperloglog.o  memtest.o        pubsub.o      redis-check-aof.c  release.o          server.c       sparkline.c     t_zset.o     zmalloc.h
anet.h        cluster.o    dict.c        intset.c       mkreleasehdr.sh  quicklist.c   redis-check-aof.o  replication.c      server.h       sparkline.h     testhelp.h   zmalloc.o


​
 

输入命令:./redis-server ../redis.conf,表示使用本层目录中的redis-server,并使用上层目录中的配置文件启动该Redis服务。

按照上述配置,共启动 6 个Redis节点,并命名为 r1 ~ r6 。

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                                              NAMES
63fdfc7e09d3        redis                                      "bash"                   35 seconds ago      Up 34 seconds       0.0.0.0:5006->6379/tcp                             r6
17ed2e654a26        redis                                      "bash"                   2 minutes ago       Up 2 minutes        0.0.0.0:5005->6379/tcp                             r5
3b9088d095f0        redis                                      "bash"                   13 minutes ago      Up 13 minutes       0.0.0.0:5004->6379/tcp                             r4
2b275b50714a        redis                                      "bash"                   15 minutes ago      Up 15 minutes       0.0.0.0:5003->6379/tcp                             r3
38ce9ce22f74        redis                                      "bash"                   17 minutes ago      Up 17 minutes       0.0.0.0:5002->6379/tcp                             r2
e7905553a975        redis                                      "bash"                   About an hour ago   Up About an hour    0.0.0.0:5001->6379/tcp                             r1
6da111173f37        docker.io/percona/percona-xtradb-cluster   "/entrypoint.sh my..."   20 hours ago        Up About an hour    4567-4568/tcp, 0.0.0.0:3306->3306/tcp, 33060/tcp   node1

采用Redis-reib方案管理节点

首先需要选定r1这个master节点(docker exec -it r1 bash),进入Redis目录新建cluster文件夹(mkdir cluster),将rb脚本拷贝过去(cp ./src/redis-trib.rb ./cluster),最后进入cluster目录,部署集群(/redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379)。成功界面如下:

完成后,6个Redis节点应该形成三主三从的形式。测试功能,首先选择一个master节点r1,进入r1容器,启动Redis客户端,客户端路径为 “/usr/redis/src”,命令为“./usr/redis/src/redis-cli -c”,其中,“-c”表示连接cluster集群。

root@e7905553a975:/usr/redis/src# ./redis-cli -c
127.0.0.1:6379> set a 10
-> Redirected to slot [15495] located at 172.19.0.4:6379
OK
172.19.0.4:6379> get a
"10"

“cluster nodes”查看当前集群所有节点:

3141cf183f23c5bb15735b6f78b9e848b3a16d48 172.19.0.4:6379 master - 0 1686296892021 3 connected 10923-16383
6355d16f399d7bc7efa8b933054b6e55f0973b99 172.19.0.5:6379 slave 498103012b2e80ce7f08ea57a376de1826a7ba64 0 1686296893028 4 connected
19757cd9d1bf7b5e8f31c9bc12430ffbeb2d5249 172.19.0.7:6379 slave 3141cf183f23c5bb15735b6f78b9e848b3a16d48 0 1686296895042 6 connected
dcaec040f1f095bb5a350ff8144af41a35bfd319 172.19.0.3:6379 master - 0 1686296894035 2 connected 5461-10922
498103012b2e80ce7f08ea57a376de1826a7ba64 172.19.0.2:6379 myself,master - 0 0 1 connected 0-5460
d1857b313f37960fcf7b6227a4c707b752fdfbf0 172.19.0.6:6379 slave dcaec040f1f095bb5a350ff8144af41a35bfd319 0 1686296896049 5 connected

打包并部署后端项目

centOS机器中已经部署MySQL、Redis。在此基础上,将后端项目部署上去。

首先是打包前的准备,先要设置端口等配置文件。

1、配置MySQL的IP地址:

url: jdbc:mysql://ip:3306/renren_fast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

2、配置Redis集群的IP地址:

    cluster:
      nodes:
        - 172.19.0.2.6379
        - 172.19.0.3.6379
        - 172.19.0.4.6379
        - 172.19.0.5.6379
        - 172.19.0.6.6379
        - 172.19.0.7.6379

3、配置tomcat端口号修改为6001,解决多项目部署的端口冲突问题。

4、然后将创建数据集j1,将jar包传递至j1路径(/var/lib/docker/volumes/j1/_data),创建Java容器并运行。

docker run -it -d -v j1:/home/soft --net=host java1.8

其中注意的是,net应等于host,表示采用宿主机的ip,因为容器间的ip互不可见。

创建后需要进入该Java容器内,启动jar包:nohup java -jar ./home/soft/renren-fast.jar。其中,nohup表示在后台运行该jar包,如果需要输出启动信息,则去掉nohup即可。

运行成功截图:

 后端项目成功部署后,发现无法访问swagger接口。查询资料后发现可能是防火墙对应的端口未开启,命令如下:firewall-cmd --zone=public --add-port=8888/tcp --permanent,firewall-cmd --reload 即可。

成功访问swagger接口:ip:6001/renren-fast/swagger/index.html,界面如下:

各个接口测试正常。 

使用Nginx实现负载均衡

为实验nginx负载均衡分配的功能,依葫芦画瓢(步骤:创建数据卷,上传jar包,构建java容器并运行项目)共部署了3个后端项目,开放端口号分别为6001、6002、6003。此处不在赘述,重点看nginx负载均衡内容。

使用Nginx作为后端项目负载均衡的原因:nginx对http协议的负载均衡效果较好。Redis集群不使用其他负载均衡工具的原因:每个后端节点都包含了Redis集群,且做了轮训适配。

nginx.conf配置文件如下所示:

修改好后,将配置文件发送至centOS中的“/home/n1”目录下,然后运行命令“docker run -d -v /home/n1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged docker.io/nginx”构建nginx容器n1,其中的“-v”是文件映射,此处与数据卷不同,数据卷只能映射目录,但是此处是文件映射,即把“/home/n1/”中的nginx.conf文件映射到“/etc/nginx/”中,若后者目录不全,将会自动创建。

部署成功后,从防火墙中移除掉原有后端开放的端口6001、6002、6003:“firewall-cmd --zone=public --remove-port=6003/tcp --permanent”,添加新端口“firewall-cmd --zone=public --add-port=6101/tcp --permanent”,一定要重启防火墙“firewall-cmd --reload”生效。最后访问端口,得到swagger测试页面于上上图一致。也可以关掉部分后端节点,模拟宕机情况。

进一步利用Keepalived实现双机热备冗余

虽然每个后端节点都暴露了端口,但由于对外暴露的是nginx端口,若单个nginx节点挂掉,则会使得整个项目无法访问,因此,需要考虑nginx的冗余。依葫芦画瓢再构建一个nginx容器节点n2,操作步骤与n1一致,n2暴露端口为6102。

两个nginx服务器部署成功后,部署keepalived。Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

keepalived 有三个重要的功能,分别是:

  • 管理LVS负载均衡软件
  • 【健康检查】实现LVS集群节点的健康检查
  • 【故障切换】作为系统网络服务的高可用性(failover)

 Keepalived的安装需要在nginx容器内部,安装工具采用apt-get。

首先更新工具:apt-get update

然后执行安装命令:apt-get install keepalived

然后安装vim编辑器,用来编辑keepalived的配置文件:apt-get install vim

然后编辑配置文件:vi /etc/keepalived/keepalived.conf  ,截图如下:

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.99.151
    }
}
virtual_server 192.168.99.151 6201 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 192.168.99.104 6101 {
        weight 1
    }
}

实际上,xshell中的vi命令无法黏贴,采用vim /etc/keepalived/keepalived.conf命令,并输入“:set mouce=c”,然后右键粘贴配置文件,保存退出即可。

最后,使用“service keepalived start”命令运行keepalived,从而将nginx服务包装起来,当访问该虚拟ip时,实际上访问的是n1节点。

依葫芦画瓢,为n2设置keepalived,使用同一个虚拟ip,这样就与n1进行争抢,并实现故障转移。

创建Sware集群

这部分暂时还未深入学习,后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值