roles、通过roles实现lamp及lnmp、数据库的高可用和负载均衡的实现

news2024/9/27 17:25:34

roles(难点)

1、介绍

roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独的⽬录中,并可以便捷地调⽤它们的⼀种机制。假设我们要写⼀个playbook来安装管理lamp环境,那么这个playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使⽤的时候直接调⽤就可以了,以免重复写。就类似编程⾥的模块化的概念,以

2、创建roles的目录结构

files:⽤来存放由copy模块或script模块调用的⽂件。

tasks:⾄少有⼀个main.yml⽂件,定义各tasks。

handlers:有⼀个main.yml⽂件,定义各handlers。

templates:⽤来存放jinjia2模板。

vars:有⼀个main.yml⽂件,定义变量。

meta:有⼀个main.yml⽂件,定义此⻆⾊的特殊设定及其依赖关系。

注意: 在每个⻆⾊的目录中分别创建files,tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录。

3、通过roles实现lamp(需定制三个角色: httpd,mysql,php)

第1步: 创建roles目录文件,并确认目录结构

[root@m0 ~]# cd /etc/ansible/roles/

[root@m0 roles]#mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}

[root@m0 roles]#touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml

[root@m0 ~]#yum install tree -y

[root@m0 ~]#mkdir /etc/ansible/roles/httpd

[root@m0 ~]#tree /etc/ansible/roles/

/etc/ansible/roles/

├── httpd

├── files

├── handlers

│   └── main.yml

├── meta

    └── main.yml

├── tasks

│   └── main.yml

├── templates

└── vars

└── main.yml

第2步: 准备httpd服务器的主⻚⽂件,php测试⻚和配置文件

[root@m0 ~]#echo "test main page" > /etc/ansible/roles/httpd/files/index.html

[root@m0 ~]#echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php

按需求修改配置⽂件后,拷⻉到httpd⻆⾊⽬录⾥的files⼦⽬录

[root@m0 ~]#vim /etc/httpd/conf/httpd.conf

[root@m0 ~]#cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/

第3步: 编写httpd角色的main.yml文件

[root@m0 ~]#vim /etc/ansible/roles/httpd/tasks/main.yml

---

- name: 安装httpd

yum: name=httpd,httpd-devel state=present

- name: 同步httpd配置⽂件

copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf

notify: restart httpd

- name: 同步主⻚⽂件

copy:

src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html

- name: 同步php测试⻚

copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php

- name: 启动httpd并开机⾃启动

service: name=httpd state=started enabled=yes

第4步: 编写httpd角色里的handler

[root@m0 ~]#vim /etc/ansible/roles/httpd/handlers/main.yml

---

- name: restart httpd

service: name=httpd state=restarted

第5步: 编写mysql⻆⾊的main.yml文件

---

- name: 安装mysql

yum: name=mariadb,mariadb-server,mariadb-devel state=present

- name: 启动mysql并开机⾃启动

service: name=mariadb state=started enabled=yes

第6步: 编写php⻆⾊的main.yml文件

[root@m0 ~]#vim /etc/ansible/roles/php/tasks/main.yml

---

- name: 安装php及依赖包

yum: name=php,php-gd,php-ldap,php-odbc,phppear,php-xml,php-xmlrpc,php-mbstring,php-smp,phpsoap,curl,curl-devel,php-bcmath,php-mysql state=present

notify: restart httpd

第7步:编写lnmp的playbook文件调用前面定义好的三个角色

[root@m0 ~]#vim /etc/ansible/playbook/lamp.yaml

---

- hosts: group1

remote_user: root

roles:

- httpd

- mysql

- php

第8步: 安装mariadb,命令行形式创建数据库和表

[root@m0 ~]#vim /etc/ansible/playbook/lamp.yaml

---

- hosts: group1

  remote_user: root

  roles:

    - httpd

    - mysql

    - php

第9步: 执行lnmp的playbook⽂件

[root@m0 ~]#ansible-playbook /etc/ansible/playbook/lamp.yaml

练习:请使⽤role来实现lnmp

1、nginx端口修改为8080

[root@m0 ~]# vim /etc/ansible/playbook/nginx.yml

 ---

 - hosts: s

   remote_user: root

   tasks:

   - name: 卸载httpd

     yum: name=httpd   state=absent

   - name: 安装nginx

     yum: name=nginx   state=present

   - name: 修改资源文件

     shell: echo 'i am nginx,port is 80' > /usr/share/nginx/html/index.html

   - name: 修改端口

     command: sed -i '/listen/ s/80/8080/g' /etc/nginx/nginx.conf

     notify:

   - restart nginx

   - name: 启动服务

     service: name=nginx   state=started  enabled=yes

   handlers:

   - name: restart nginx

     service: name=nginx   state=restarted

[root@m0 ~]# ansible-playbook /etc/ansible/playbook/nginx.yml

[root@m0 ~]# yum -y remove *mariadb*

[root@m0 ~]# yum -y install mariadb

[root@m0 ~]# yum -y install mariadb-server.x86_64

[root@m0 ~]# yum -y install mariadb-devel.x86_64

[root@m0 ~]# systemctl start mariadb

[root@m0 ~]# mysql

MariaDB [(none)]> quit

Bye

2、mariadb中创建eleme数据库

[root@m0 ~]# mysql <<EOF

> create database if not exists eleme charset utf8mb4;

> use eleme;

> create table user(id int primary key auto_increment,username varchar(45) not null,password varchar(45) not null,remark varchar(45));

> quit

> EOF

[root@m0 ~]# mysql

 MariaDB [(none)]> show databases;

 +--------------------+

 | Database           |

 +--------------------+

 | information_schema |

 | eleme              |

 | mysql              |

 | performance_schema |

 | test               |

 +--------------------+

 5 rows in set (0.00 sec)

 MariaDB [test]> use eleme;

 Database changed

 MariaDB [eleme]> show tables;

 +-----------------+

 | Tables_in_eleme |

 +-----------------+

 | user            |

 +-----------------+

 1 row in set (0.00 sec)

[root@m0 ~]#cd /etc/ansible/roles/

[root@m0 roles]#ls

mysql nginx

3、将nginx下的之前生成的roles目录文件拷贝到mariabd下

[root@m0 roles]#cp -r nginx/ mariabd

[root@m0 roles]#ls

mysql nginx mariabd

[root@m0 ~]#cd mariabd

[root@m0 mariabd]#vim tasks/main.yml

---

-       name:   卸载 mariadb

        yum:    name=mariadb,mariadb-server,mariadb-devel       state=absent

-       name:   安装mariadb

        yum:    name=mariadb,mariadb-server,mariadb-devel   state=present        

-       name:           启动mariadb服务

        service:        name=mariadb   state=started  enabled=yes

-       name:   执行脚本,创建数据库和数据表

        script: /etc/ansible/script/dbtable.sh

[root@m0 ~]#cd /etc/ansible/

[root@ansible ~]#ls

[root@ansible ~]#mkdir script

[root@m0 ~]#cd script

3、编写脚本,创建创建表 t_user

[root@m0 script]#vim dbtable.sh

#!/bin/bash

mysql << EOF

create database if not exists eleme charset utf8mb4;

use eleme;

create table t_user(

id int primary key auto_increment,

username varchar(45) not null,

password varchar(45) not null,

remark varchar(45)

);

quit

EOF

5、运行剧本

 [root@m0 script]# vim /etc/ansible/playbook/test003.yml

 ---

 - hosts: s

   remote_user: root

   roles:

   - mariadb

 [root@1 script]# cd /etc/ansible/playbook/

 [root@1 playbook]# ansible-playbook test003.yml

饿了么后端的登录模块

1、数据库服务器:

1)基于gtids事务性的主从复制实现数据库的高可用

# 主服务器(192.168.2.206)的基础配置

[root@s1 ~]# ls

anaconda-ks.cfg

mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

mysql_master.sh

soft

[root@s1 ~]# source mysql_master.sh

tar name:mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

anaconda-ks.cfg

mysql-5.7.44-linux-glibc2.12-x86_64

mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

mysql_master.sh

soft

directory:mysql-5.7.44-linux-glibc2.12-x86_64

2024-08-20T07:23:58.298348Z 1 [Note] A temporary password is generated for root@localhost: /wfjS!NrR1)Z

Starting MySQL.Logging to '/usr/local/mysql/data/db01-master.err'.

SUCCESS!

sign initialize password:/wfjS!NrR1)Z

[root@s1 ~]#cat /usr/local/mysql/my.cnf  //查看配置文件(基于gtids模式)

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

port=3306

log-error=/usr/local/mysql/data/db01-master.err

log-bin=/usr/local/mysql/data/binlog

server-id=10

character_set_server=utf8mb4

gtid-mode=on

log-slave-updates=1

enforce-gtid-consistency

[root@s1 ~]# mysql -proot  //启动主的mysql服务

mysql> create user 'slave0'@'%' identified by 'slave0';  //创建一个slave0用户,%表示在每个主机上都可以使用slave登录到该主机上

Query OK, 0 rows affected (0.01 sec)

mysql> grant replication slave on *.* to 'slave0'@'%';  //将所有的数据库的所有表的replication slave操作权限给到slave0用户

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;  //重新加载权限表

Query OK, 0 rows affected (0.01 sec)

mysql> create user 'slave1'@'%' identified by 'slave1';  //创建一个slave1用户,%表示在每个主机上都可以使用slave登录到该主机上

Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'slave1'@''%';  //将所有的数据库的所有表的replication slave操作权限给到slave0用户

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> set @@global.read_only=ON;  //配置只读模式(因为是基于gtids模式的主从复制)

Query OK, 0 rows affected (0.00 sec)

mysql> exit

Bye

[root@s1 ~]# service mysql57 stop

Shutting down MySQL.. SUCCESS!

做同步:

[root@s1 ~]# rm -rf /usr/local/mysql/data/auto.cnf

[root@s1 ~]# yum -y install rsync   //将主服务器的data文件同步到从服务器上

[root@s1 ~]# yum list installed|grep rsync

rsync.x86_64                          3.1.2-12.el7_9                   @updates

[root@s1 ~]# rsync -av /usr/local/mysql/data root@192.168.2.176:/usr/local/mysql/

# 从服务器(192.168.2.207)的配置

[root@m0 ~]# ls

mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

mysql57.tar.gz

[root@m0 ~]# tar -xvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

[root@m0 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql/

[root@m0 ~]# ls /usr/local/mysql/

bin   include  LICENSE  README  support-files

docs  lib      man      share

[root@m0 ~]# mkdir /usr/local/mysql/mysql-files

[root@m0 ~]# useradd -r -s /sbin/nologin mysql

[root@m0 ~]# chown mysql:mysql /usr/local/mysql/mysql-files/

[root@m0 ~]# chmod 750 /usr/local/mysql/mysql-files/

[root@m0 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql57

[root@m0 ~]# chkconfig --add mysql57

[root@m0 ~]# chkconfig mysql57 on

[root@m0 ~]# vim /usr/local/mysql/my.cnf   //查看配置文件(基于gtids模式)

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

port=3310

log-error=/usr/local/mysql/data/db01-slave.err

relay-log=/usr/local/mysql/data/relaylog

server-id=11

character_set_server=utf8mb4

log-bin=/usr/local/mysql/data/binlog

gtid-mode=on

log-slave-updates=1

enforce-gtid-consistency

skip-slave-start

[root@m0 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8

[root@m0 ~]# sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile

[root@m0 ~]# source /etc/profile

[root@m0 ~]# service mysql57 start

Starting MySQL.Logging to '/usr/local/mysql/data/m0.err'.

ERROR! The server quit without updating PID file (/usr/local/mysql/data/m0.pid).  //此时启动失败,无data文件

[root@m0 ~]# yum -y install rsync

[root@m0 ~]# ls /usr/local/mysql/data

auto.cnf         ib_logfile0

binlog.000001    ib_logfile1

binlog.000002    ibtmp1

binlog.index     mysql

ca-key.pem       performance_schema

ca.pem           private_key.pem

client-cert.pem  public_key.pem

client-key.pem   s1.pid

db01-master.err  server-cert.pem

ib_buffer_pool   server-key.pem

ibdata1          sys

[root@m0 ~]# service mysql57 start  //启动从服务器,密码跟主服务器一致

Starting MySQL.Logging to '/usr/local/mysql/data/db01-slave.err'.

 SUCCESS!

[root@m0 ~]# mysql -P3310 -proot

# 主从复制的实现

主服务器:

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

mysql> create database if not exists abc charset utf8;

ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock

mysql> show master status;  //显示主服务器当前二进制日志的状态信息,

+---------------+----------+--------------+------------------+-------------------------------------------+

| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |

+---------------+----------+--------------+------------------+-------------------------------------------+

| binlog.000003 |      194 |              |                  | 29bcc498-5ec5-11ef-a93f-000c2927b393:1-11 |

+---------------+----------+--------------+------------------+-------------------------------------------+

1 row in set (0.00 sec)

 File:当前正在写入的二进制日志文件的名称。

 Position:当前写入的位置(偏移量)在二进制日志文件中的位置。

从服务器:

[root@mysql-slave ~]# mysql -P3310 -proot   //登录到从的数据库中

mysql> set @@global.read_only=ON;  //配置只读模式(因为是基于gtids模式的主从复制)

Query OK, 0 rows affected (0.00 sec)

mysql> change master to

    -> master_host='192.168.2.206',  //指定主服务器的主机地址

    -> master_user='slave0',  //指定用于连接主服务器进行复制的用户名

    -> master_password='slave0',   //指定对应的密码

    -> master_port=3306,  //指定主服务器的端口

    -> master_log_file='binlog.000003',  //指定从哪个二进制日志文件开始复制

    -> master_log_pos=194;  //指定在指定的二进制日志文件中的起始位置

    -> master_auto_position=1;  //基于gtids模式的主从复制

Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;

Query OK, 0 rows affected, 1 warning (0.03 sec)

 mysql> show slave status\G   //查看主从是否同步

  *************************** 1. row ***************************

                 Slave_IO_State: Waiting for source to send event

                    Master_Host: 10.0.0.57

                    Master_User: slave

                    Master_Port: 3306

                  Connect_Retry: 60

                Master_Log_File: binlog.000003

            Read_Master_Log_Pos: 1178

                 Relay_Log_File: relaylog.000002

                  Relay_Log_Pos: 323

          Relay_Master_Log_File: binlog.000003

               Slave_IO_Running: Yes

              Slave_SQL_Running: Yes

# 在主mysql中添加eleme数据库设置为utf8mb4、添加表t_user、添加2行记录

 [root@s1~]# mysql -p'root'

 mysql> create database if not exists eleme charset utf8mb4;

 Query OK, 1 row affected (0.00 sec)

 mysql> show databases;

 +--------------------+

 | Database           |

 +--------------------+

 | information_schema |

 | eleme              |

 | mysql              |

 | performance_schema |

 | sys                |

 +--------------------+

 6 rows in set (0.00 sec)

 mysql> create table eleme.t_user(

     -> id int not null primary key,

     -> name varchar(32) not null,

     -> username varchar(32) not null,

     -> password varchar(32) not null,

     -> remark varchar(32) not null

     -> );

 Query OK, 0 rows affected (0.01 sec)

mysql> desc eleme.t_user;

 +----------+--------------+------+-----+---------+-------+

 | Field    | Type         | Null | Key | Default | Extra |

 +----------+--------------+------+-----+---------+-------+

 | id       | int(11)      | NO   | PRI | NULL    |       |

 | name     | varchar(32) | NO   |     | NULL    |       |

 | username | varchar(32) | NO   |     | NULL    |       |

 | password | varchar(32) | NO   |     | NULL    |       |

 | remark   | varchar(32) | NO   |     | NULL    |       |

 +----------+--------------+------+-----+---------+-------+

5 rows in set (0.02 sec)

mysql> insert into eleme.t_user values(1,'超级管理员','admin','admin','超级管理员'),(2,'普通用户','guest','guest','普通用户');

 Query OK, 2 rows affected (0.00 sec)

 Records: 2  Duplicates: 0  Warnings: 0

 mysql> select * from eleme.t_user;

 +----+-----------------+----------+----------+-----------------+

 | id | name            | username | password | remark          |

 +----+-----------------+----------+----------+-----------------+

 |  1 | 超级管理员      | admin    | admin    | 超级管理员      |

 |  2 | 普通用户        | guest    | guest    | 普通用户        |

 +----+-----------------+----------+----------+-----------------+

 2 rows in set (0.00 sec)

2)基于mycat读写分离(需要jdk环境的支持)实现数据库的负载均衡

# 设置防火墙规则

 [root@mycat ~]# systemctl stop firewalld

 [root@mycat ~]# systemctl disable firewalld

 [root@mycat ~]# ls

 anaconda-ks.cfg             Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

 jdk-8u192-linux-x64.tar.gz  

# 下载并安装jdk、mycat

 [root@mycat ~]# tar -xf jdk-8u192-linux-x64.tar.gz

 [root@mycat ~]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

 [root@mycat ~]# cp -r jdk1.8.0_192/ /usr/local/jdk

 [root@mycat ~]# cp -r mycat/ /usr/local/

 [root@mycat ~]# ls /usr/local/jdk/

 bin             lib          src.zip

 COPYRIGHT       LICENSE      THIRDPARTYLICENSEREADME-JAVAFX.txt

 include         man          THIRDPARTYLICENSEREADME.txt

 javafx-src.zip  README.html

 jre             release

# 添加环境变量

 [root@mycat ~]# sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile

 [root@mycat ~]# source /etc/profile

 [root@mycat ~]# $JAVA_HOME

 -bash: /usr/local/jdk: 是一个目录

 [root@mycat ~]# sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile

 [root@mycat ~]# source /etc/profile

 [root@mycat ~]# $PATH

 -bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk/bin: 没有那个文件或目录

 [root@mycat ~]# javac -version

 javac 1.8.0_192

 [root@mycat ~]# ls /usr/local/mycat/

 bin  catlet  conf  lib  logs  version.txt

 [root@mycat ~]# ll /usr/local/mycat/

 总用量 12

 drwxr-xr-x. 2 root root  190 8月  15 15:19 bin

 drwxr-xr-x. 2 root root    6 8月  15 15:19 catlet

 drwxr-xr-x. 4 root root 4096 8月  15 15:19 conf

 drwxr-xr-x. 2 root root 4096 8月  15 15:19 lib

 drwxr-xr-x. 2 root root    6 8月  15 15:19 logs

 -rwxr-xr-x. 1 root root  219 8月  15 15:19 version.txt

# 修改mycat的两个配置文件

 [root@mycat ~]# ls /usr/local/mycat/bin/mycat      

 [root@mycat ~]# vim /usr/local/mycat/conf/server.xml

# user标签设置对外的账号和密码,以及数据库名称, 如果只是代理⼀个主从,就注释其他的user标签

         <user name="hj" defaultAccount="true">

                 <property name="password">hj</property>

                 <property name="schemas">eleme</property>

                 <!-- 表级 DML 权限设置 -->

                 <!--            

                 <privileges check="false">

                         <schema name="TESTDB" dml="0110" >

                                 <table name="tb01" dml="0000"></table>

                                 <table name="tb02" dml="1111"></table>

                         </schema>

                 </privileges>           

                  -->

         </user>

 <!--

         <user name="user">

                 <property name="password">user</property>

                 <property name="schemas">TESTDB</property>

                 <property name="readOnly">true</property>

         </user>

 -->

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="eleme" dataNode="dn1"  checkSQLschema="false" sqlMaxLimit="100"></schema>

<dataNode name="dn1" dataHost="localhost1" database="eleme" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"

  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

<heartbeat>select user()</heartbeat>

<writeHost host="hostM1" url="192.168.2.206:3306" user="hj" password="hj">

     <readHost host="hostS2" url="192.168.2.207:3310" user="hj" password="hj" />

     <readHost host="hostS3" url="192.168.2.207:3310" user="hj" password="hj" />

</writeHost>

</dataHost>

</mycat:schema>

# 启动mycat服务

[root@mycat ~]# /usr/local/mycat/bin/mycat start

Starting Mycat-server...

[root@mycat ~]# netstat -lnput | grep 8066

tcp6       0      0 :::8066                 :::*                    LISTEN      1336/java

注意!!!:

(1)如果出现启动异常,8806端口没有打开,可以检查两个日志文件

vim /usr/local/mycat/logs/wrapper.log

vim /usr/local/mycat/logs/mycat.log

(2)nginx、lvs和haproxy 都是负载均衡软件,但它们分不清什么数据库能读、什么数据库能写,master可读可写,而slave只能读,因此选择mycat实现数据库负载均衡。

2、后端服务器配置

1)配置两台java后端服务器    java01(192.168.2.11)  java02(192.168.2.12)

# 添加环境变量

[root@java01 ~]#vim /etc/profile

export JAVA_HOME

export PATH=$PATH:$JAVA_HOME

# 使用jar包启动后端java服务器

[root@java01 ~]#vim application.yml

# 修改application.yml文件,修改yml中的端口或数据源(port默认8080)

url:jdbc:mysql://192.168.2.206:8066/eleme

username: hj

password: hj

[root@java01 ~]#java -jar eleme_server-0.0.1-SNAPSHOT.jar

[root@java01 ~]#nohup java -jar element_server_server-0.0.1-SNAPSHOT.jar&  //后台运行

2)基于lvs的DR模式代理java服务器

# ds主机    内网(dip为192.168.2.13)   外网(vip为192.168.2.14)

ifconfig ens33:0 192.168.2.14 broadcast 192.168.2.14 netmask 255.255.255.255 up  //挂载对外的vip192.168.2.14

route add vip dev ens33:0  //为vip添加路由

yum -y install ipvsadm  //安装ipvsadm

ipvsadm -Ln  //查看规则

ipvsadm -C  //清空之前的规则

ipvsadm -A -t 192.168.2.14:8080 -s rr  

ipvsadm -a -t 192.168.2.14:8080 -r 192.168.2.11 -g    # -g:网关路由

ipvvsadm -a -t 192.168.2.14:8080 -r 192.168.2.12 -g

# rs主机,不需要指定端口

ifconfig lo:0 192.168.2.14 broadcast 192.168.2.14 netmask 255.255.255.255 up  //挂载vip

route add 192.168.2.14 dev lo:0  //为vip 添加路由

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore                                                                                 

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announc

扩展:部署nginx代理java服务器,负载均衡策略为轮询问,端⼝为80

4、测试:

# 打开java服务器的端口,端⼝8080,不关防⽕墙,在远程浏览器上测试,看其是否是动态的,数据库里存在账号密码即可登录

firewall-cmd --add-port=8080/tcp --permanent

firewall-cmd --reload

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android SDK 遇到的坑之 AIUI(星火大模型)

目录 一、AIUI 二、常见错误 2.1 唤醒无效 2.2 错误码:600103 1、存放唤醒词等资源的路径 2、aiui_phone.cfg 文件配置 3、vtn.ini 文件配置 2.3 错误码:600022 相关推荐 一、AIUI 需要给桌面机器人(医康养)应用做语音指引/控制/健康咨询等功能&#xff0c;根据调研选择A…

【Midjourney】Midjourney全面开放网站版,所有用户每天可免费生成25次

Midjourney一直作为AI文生图领域的龙头老大&#xff0c;最近对面对市场上日益增长的竞争压力&#xff0c;尤其是来自 Flux 的挑战&#xff0c;终于向所有用户开放官方网站。尽管还处于早期阶段&#xff0c;但为了吸引更多用户体验&#xff0c;它暂时是完全免费的。 下面是Midj…

河道非法采砂智能检测系统:采砂船识别监测系统

一、引言 随着科技的不断发展&#xff0c;河道非法采砂问题日益严重&#xff0c;不仅破坏了河床生态平衡&#xff0c;还危及河道沿岸人民的生命财产安全。因此&#xff0c;建立一个高效、智能的河道非法采砂检测系统势在必行。本文将重点介绍一种基于智能识别的河道非法采砂检…

Autosar(Davinci) --- 新增一帧CAN报文

前言 这里我们简单讲解以下如何通过DBC配置,新增一帧CAN报文,并发送到上位机。 一、修改DBC 首先在Demo工程dbc的基础上,我们新增一个Signal,Message, 然后将这个Message绑定到某一个Network node下,这里我放在了MyECU这个节点下。 这里dbc怎么新建Signal,Message什么的,…

并行程序设计基础——组通信(2)

目录 一、组收集 二、全互换 三、同步 四、规约 五、预定义的归约操作 上一节内容我们介绍了MPI组通信的基本概念和广播、收集、散发接口调用。本节我们继续介绍其余的组通信接口。 一、组收集 MPI_GATHER是将数据收集到ROOT进程,MPI_ALLGATHER相当于每一个进程…

Unity 资源 之 Photon Inventory 2 (Game Creator 2)

免费获取资源&#xff1a; 有2种方式可免费获取资源&#xff1a; 在后台回复**“UnityAssetStore**“ 或 ”Unity资源”。在Unity官方地址&#xff1a;https://assetstore.unity.com/publisher-sale &#xff0c;兑换码&#xff1a;NINJUTSUGAMES 【本周限定】 关注我每周&a…

微软 Azure 推出文本到语音虚拟人;英伟达发布 8B 小语言模型,可在 RTX 工作站部署丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

ArrayList底层扩容机制详解保姆级

我们对下面代码进行debug&#xff0c;当我们使用无参构造器时&#xff0c;也就是没用指定ArrayList的容量的时候他他是空的&#xff0c;当我们第一次添加的时候才会扩容为10&#xff0c;当容量满之后每次会以1.5倍进行扩容。 当我们new之后elementData是空的 &#xff0c;只有执…

存储数据(变量)

变量&#xff1a;专门用来存储数据的容器 let title&#xff1a;string //console.log(消息说明,打印的内容) //console.log(我说,hello world) //变量的存储和修改&#xff08;string number boolean&#xff09; //1.变量存储 //1.1 字符串 string 类型 //注意点1&#xff1a…

C语言 之 memcpy函数的内存重叠问题 及解决该问题的思路

文章目录 函数原型&#xff1a;例子&#xff1a; 解决方式整体思路如下&#xff1a; 内存重叠问题主要是使用函数memcpy的时候会发生的 函数原型&#xff1a; void * memcpy ( void * destination, const void * source, size_t num);这个函数能够在source指向的空间中拷贝nu…

基于YOLOv8的高效滑动验证码滑块缺口检测模型研究与应用

在当今互联网高速发展的时代&#xff0c;滑动验证码作为一种有效的安全验证手段&#xff0c;广泛应用于各类网站和应用中&#xff0c;以防范自动化攻击和恶意登录。然而&#xff0c;随着技术的不断进步&#xff0c;滑动验证码的破解难度也在逐渐提升。为了应对这一挑战&#xf…

Ubuntu 22.04 某次重启后nvidia-smi 失效

Ubuntu 22.04 某次重启后nvidia-smi 失效 某次重启后失效&#xff0c;遂在网上寻找答案&#xff1a; 方案一&#xff1a;使用dkms进行安装相应模块 具体的可以参考链接 dkms 但是我试了一下并不好用&#xff0c;并且报错如下&#xff1a; Building module:cleaning build a…

Stable Diffusion整合包与手动本地部署结合内网穿透远程AI绘画

文章目录 前言1. 本地部署Stable Diffusion Web UI1.1 整合包安装1.2 手动安装Stable Diffusion Web UI 2. 安装Cpolar内网穿透3. 实现公网访问Stable Diffusion Web UI4. 固定Stable Diffusion Web UI 公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&a…

基于STM32的温湿度采集设计

介绍 项目详情&#xff1a;通过STM32采集DHT11的数据将温湿度信息显示带LCD及虚拟串口上。 软件平台&#xff1a;keil5 基于STM32的温湿度采集设计是一个结合了硬件连接、软件编程以及数据处理的综合项目。以下是对该设计的详细介绍&#xff1a; 一、设计背景与意义 温湿度…

淘宝(天猫)商品详情数据接口在自有电商平台的应用!

在电商市场的日益成熟下&#xff0c;越来越多的电商参与者上线了自主研发的电商平台。这主要是因为&#xff0c;在电商销售中&#xff0c;品牌在自有电商平台售卖商品的优势颇多&#xff1a; 自有的电商平台能够赋予品牌更大的灵活性和自由度等&#xff0c;品牌商品销售时无需…

【网络编程】第十一章 数据链路层 - 以太网(MAC+MTU+ARP+MSS+RARP)

文章目录 重点链路层以太网MAC帧格式碰撞域MAC地址MAC地址和IP地址 MTU-最大传输单元MTU 对 IP 的影响MTU 对 UDP 的影响MTU 对 TCP 的影响-MSS ARP协议ARP协议的工作流程ARP请求的过程ARP应答的过程 ARP 缓存中间人攻击 RARP协议 重点 数据链路层的作用&#xff1a;两个设备 …

博物馆地图导览:利用GIS与蓝牙定位技术,融合语音解说功能

引言 亲爱的技术员、开发者朋友们&#xff0c;随着科技的不断进步&#xff0c;博物馆等文化场所的导览方式也在不断创新。今天&#xff0c;我将为大家介绍我们的新产品——博物馆地图导览系统&#xff0c;该系统集成了GIS&#xff08;地理信息系统&#xff09;、蓝牙定位技术以…

PHP反序列化一

1.序列化/反序列化 序列化:对象转化为字节流 反序列化:字节流转化为对象 二者相互结合&#xff0c;可以轻松的存储和传输数据&#xff0c;使程序更具维护性 2.反序列化漏洞 原因是程序没有对用户输入的反序列化字符串进行检测&#xff0c;导致反序列化过程可以被恶意控制&…

Heygen注册不了?试试这两种方法!

随着数字媒体发展&#xff0c;视频内容已成为传播信息的重要手段。然而&#xff0c;高质量的视频制作往往需要专业的技术知识和昂贵的制作成本。HeyGen平台&#xff0c;正是打破这一局限的创新工具。它不仅为视频创作者提供了一个全新的创作空间&#xff0c;更能极大程度地降低…

minio使用与注解事务管理

目录 一、minio启动 1、创建文件夹 2、cmd启动 3、查看端口地址以及密码 二、minio使用步骤 1、创建bucket&#xff0c;并且把Access Policy设置成public 2、代码 三、注解事务管理 一、minio启动 1、创建文件夹 2、cmd启动 3、查看端口地址以及密码 二、minio使用步…