背景 [TOC]
一、简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序 1、DDL:(数据定义语言)是指CREATE,ALTER,DROP语句
DDL允许添加、修改、删除包含数据的逻辑结构,或允许用户访问、维护数据(数据库、表、键、视图等)的逻辑结构。DDL是关于元数据的。
2、DML: (数据操纵语言)是指INSERT,DELETE,UPDATE语句
DML允许自己添加、删除、修改数据
3、DQL:(数据查询语言)是指SELECT,SHOW,HELP语句
SELECT是主要的DQL指令,它会检索需要的数据;SHOW检索有关元数据的信息;HELP是帮助查询命令的作用和用法
4、DCL:(数据控制语言)是指GRANT,REVOKE语句
DCL用于授予、撤销对数据库及其内容的权限。MySQL的权限相当复杂,DCL是关于安全性的。
SELECT查询语句执行的先后顺序:
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER BY --> LIMIT
二、自行设计10个sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个 为了方便后续实验,导入一个数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@Rocky ~] [root@Rocky ~] mysql> show databases; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | mysql | | performance_schema | | sys | | zabbix | +--------------------+ mysql> use hellodb
①将teachers表按年龄从小到大排序,取前两个(order by:以某条件进行排序,默认为正序排序)
1 2 3 4 5 6 7 8 mysql> select * from teachers order by age limit 2; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M || 3 | Miejue Shitai | 77 | F | +-----+---------------+-----+--------+ 2 rows in set (0.00 sec)
②将teachers表按年龄从小到大排序,取第2个和第3个(limit 2:取前2个;limit 1,2:取第一个后面的两个)
1 2 3 4 5 6 7 8 mysql> select * from teachers order by age limit 1,2; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 3 | Miejue Shitai | 77 | F || 4 | Lin Chaoying | 93 | F | +-----+---------------+-----+--------+ 2 rows in set (0.00 sec)
③将teachers表按年龄从大到小排序,取前两个( order by后添加desc,表示倒序排序 )
1 2 3 4 5 6 7 8 mysql> select * from teachers order by age desc limit 2; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 2 | Zhang Sanfeng | 94 | M || 4 | Lin Chaoying | 93 | F | +-----+---------------+-----+--------+ 2 rows in set (0.00 sec)
④学生表中以班级为组,求出每个班级有几个,并按正序排序(group by:以某条件进行筛选,然后进行聚合运算;count(*):每个班级有几个)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysql> select classid,count(*)数量 from students group by classid order by 数量; +---------+--------+ | classid | 数量 | +---------+--------+ | 5 | 1 | | NULL | 2 | | 2 | 3 | | 7 | 3 | | 1 | 4 | | 4 | 4 | | 3 | 4 || 6 | 4 | +---------+--------+ 8 rows in set (0.00 sec)
⑤学生表中以班级为组,求出每个班级有几个,并按正序排序,取前3个
1 2 3 4 5 6 7 8 9 mysql> select classid,count(*)数量 from students group by classid order by 数量 limit 3; +---------+--------+ | classid | 数量 | +---------+--------+ | 5 | 1 | | NULL | 2 || 2 | 3 | +---------+--------+ 3 rows in set (0.00 sec)
⑥学生表中以班级为组,求出每个班级有几个,并取前3个
1 2 3 4 5 6 7 8 9 mysql> select classid,count(*)数量 from students group by classid limit 3; +---------+--------+ | classid | 数量 | +---------+--------+ | 2 | 3 | | 1 | 4 || 4 | 4 | +---------+--------+ 3 rows in set (0.00 sec)
⑦将学生表中男生划分成一组,取男生的平均年龄(avg():平均值;having:对分组聚合运算后的结果指定过滤条件)
1 2 3 4 5 6 7 mysql> select gender,avg(age)平均年龄 from students group by gender having gender='M'; +--------+--------------+ | gender | 平均年龄 | +--------+--------------+ | M | 33.0000 | +--------+--------------+ 1 row in set (0.00 sec)
⑧按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的数据
1 2 3 4 5 6 7 8 9 mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30; +---------+--------------+ | classid | 平均年龄 | +---------+--------------+ | 2 | 36.0000 | | 5 | 46.0000 || NULL | 63.5000 | +---------+--------------+ 3 rows in set (0.00 sec)
⑨按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的前2条数据
1 2 3 4 5 6 7 8 mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30 limit 2; +---------+--------------+ | classid | 平均年龄 | +---------+--------------+ | 2 | 36.0000 || 5 | 46.0000 | +---------+--------------+ 2 rows in set (0.00 sec)
⑩按不同班级进行分组,求每个班级的平均年龄,并取出平均年龄大于30的数据,按照倒序排序
1 2 3 4 5 6 7 8 9 mysql> select classid,avg(age)平均年龄 from students group by classid having 平均年龄 >30 order by 平均年龄 desc; +---------+--------------+ | classid | 平均年龄 | +---------+--------------+ | NULL | 63.5000 | | 5 | 46.0000 || 2 | 36.0000 | +---------+--------------+ 3 rows in set (0.00 sec)
三、xtrabackup备份和还原数据库练习 在centos7及以前的版本中,EPEL源中带有percona-xtrabackup包,可以直接yum进行安装。
在centos8中没有percona-xtrabackup包,需要先在官网上下载percona-xtrabackup包
下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
只需下载percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm这个包即可,并将包导入到Linux中
实验:利用xtrabackup8.0完全,增量备份及还原MySQL8.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 1 、备份过程#第一步:完全备份 [root@Rocky ~ ]#yum -y install percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm #在原主机安装xtrabackup包 [root@Rocky ~ ]#mkdir /backup #在原主机上新建backup目录,用来存放备份的数据 [root@Rocky ~ ]#xtrabackup -uroot --backup --target-dir=/backup/base 2022 -10 -22 T16:36 :43.440670 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK! #将数据备份到/backup/base,其中base目录会自动创建 #第二步:第一次修改数据 mysql> insert teachers (name,age,gender ) value ('liu' ,40 ,'M' ) ;#第三步:第一次增量备份 [root@Rocky ~ ]#xtrabackup -uroot --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base 2022 -10 -22 T17:03 :23.595901 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK! #将数据备份到/backup/inc1,基于/backup/base完全备份进行的增量备份 #第四步:第二次修改数据 mysql> insert teachers (name,age,gender ) value ('xiaoyun' ,42 ,'F' ) ;#第五步:第二次增量备份 [root@Rocky ~ ]#xtrabackup -uroot --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 2022 -10 -22 T17:10 :36.646597 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK! #将数据备份到/backup/inc2,基于/backup/inc1备份进行的增量备份 #第六步:将数据复制到目标主机(目标主机不用创建backup目录,直接复制目录本身) [root@Rocky backup ]#scp -r /backup/ 10.0.0.128:/ 2 、还原过程#第一步:预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务 [root@Rocky8 ~ ]#yum -y install percona-xtrabackup-80-8.0.29-22.1.el8.x86_64.rpm #在目标主机安装xtrabackup包 [root@Rocky8 ~ ]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base 2022 -10 -22 T17:24 :54.399051 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK!#第二步:合并第一次增量备份到完全备份 [root@Rocky8 ~ ]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1 2022 -10 -22 T17:28 :03.937839 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK!#第三步:合并第二次增量备份到完全备份,最后一次还原不需要加选项--apply-log-only [root@Rocky8 ~ ]#xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2 2022 -10 -22 T17:30 :03.748682 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK!#第四步:复制到数据库目录(数据库目录必须为空,且mysql服务不能启动) [root@Rocky8 ~ ]#systemctl status mysqld Active: inactive (dead) since Sat 2022 -10 -22 16 :53 :19 CST; 38 min ago #查看可确认服务已关闭 [root@Rocky8 ~ ]#ls /var/lib/mysql/ #查看确认为空 [root@Rocky8 ~ ]#xtrabackup --copy-back --target-dir=/backup/base 2022 -10 -22 T17:34 :33.338805 +08 :00 0 [Note] [MY-011825 ] [Xtrabackup] completed OK!#第五步:还原属性 [root@Rocky8 ~ ]#chown -R mysql.mysql /var/lib/mysql #将用户和组都更改为mysql #第六步:启动服务 [root@Rocky8 ~ ]#systemctl start mysqld
查看目标主机发现有hellodb数据库,且有增量备份的内容
四、实现mysql主从复制,主主复制和半同步复制 1、主从复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 主节点配置: [root@master ~] [mysqld] server-id=184 log-bin=/data/logbin/mysql-bin :wq [root@master ~] [root@master ~] [root@master ~] [root@master ~] mysql-bin.000001 mysql-bin.index [root@master ~] mysql> create user repluser@"10.0.0.%" identified by "123456" ; mysql> grant replication slave on * .* to repluser@'10.0.0.%'; [root@master ~] [root@master ~] [root@master ~] full-2022-10-24.sql mysql> show processlist; +----+---------------+---------+------+-------+------+------------------+----------+ | Id | User | Host | db |Command | Time | State | Info | +----+---------------+---------+------+-------+------+------------+----------------+ | 5 |event_scheduler |localhost | NULL | Daemon | 1451 |Waiting on empty queue | NULL | | 8 | root |localhost | NULL | Query | 0 | init |show processlist | +----+--------------+----------+------+-------+------+------------+----------------+ 从节点配置: [root@slave1 ~] [mysqld] server-id=185 read-only :wq [root@slave1 ~] [root@slave1 ~] [root@master ~] [root@slave1 ~] fullbackup_2022-10-24.sql [root@slave1 ~] CHANGE MASTER TO MASTER_HOST='10.0.0.184', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_PORT=3306, :wq [root@slave1 ~] mysql> set sql_log_bin=0; mysql> source /backup/fullbackup_2022-10-24.sql mysql> set sql_log_bin=1; mysql> show databases; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | mysql | | performance_schema | | sys | | zabbix | +--------------------+ mysql> insert teachers (name,age,gender) values('wang',34,'M'); mysql> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | +-----+---------------+-----+--------+ mysql> show slave status\G* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * * Slave_IO_State: Master_Host: 10.0.0.128 Master_User: REPLUSER Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 156 Relay_Log_File: slave1-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000005 Slave_IO_Running: No Slave_SQL_Running: No mysql> start slave; mysql> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | wang | 34 | M | +-----+---------------+-----+--------+
2、主主复制 两个节点,都可以更新数据,并且互为主从
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 mysql> show master logs; +---------------+-----------+-----------+ | Log_name | File_size | Encrypted | +---------------+-----------+-----------+ | binlog.000001 | 459 | No | +---------------+-----------+-----------+ mysql> CHANGE MASTER TO -> MASTER_HOST='10.0.0.185', -> MASTER_USER='repluser', -> MASTER_PASSWORD='123456', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=156; mysql> start slave; mysql> insert teachers (name,age,gender) values('li',34,'M'); mysql> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | wang | 34 | M | | 6 | li | 34 | M | +-----+---------------+-----+--------+ mysql> insert teachers (name,age,gender) values('sun',34,'M'); mysql> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | wang | 34 | M | | 6 | li | 34 | M | | 7 | sun | 34 | M | +-----+---------------+-----+--------+
3、半同步复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [root@master ~] /usr/lib64/mysql/plugin/semisync_master.so /usr/lib64/mysql/plugin/semisync_slave.so [root@master ~] mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' ; mysql> show plugins; [root@master ~] [mysqld] server-id=184 rpl_semi_sync_master_enabled rpl_semi_sync_master_timeout=3000 :wq [root@master ~] [root@master ~] mysql> create user repluser@'10.0 .0 .%' identified by '123456' ; mysql> grant replication slave on *.* to repluser@'10.0 .0 .%'; [root@master ~] [root@master ~] [root@slave1 ~] [root@slave1 ~] [root@slave1 ~] [root@master ~] [root@slave1 ~] mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ; [root@master ~] [mysqld] server-id=185 read -only rpl_semi_sync_slave_enabled :wq [root@slave1 ~] [root@slave1 ~] CHANGE MASTER TO MASTER_HOST='10.0.0.184' , MASTER_USER='repluser' , MASTER_PASSWORD='123456' , MASTER_PORT=3306 , :wq [root@slave1 ~] [root@slave1 ~] mysql>start slave;
五、用mycat实现mysql的读写分离 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 #先快速搭建mysql主从服务器 #主服务器 [root@master ~]#yum -y install mysql-server [root@master ~]#systemctl enable [root@master ~]#vim /etc/my.cnf #修改配置文件 [mysqld]server -id=185 log -bin :wq [root@master ~]#systemctl restart mysqld #重新加载 [root@master ~]#mysql mysql> create user repluser@'10.0.0.%' identified by '123456' ; #创建账号 mysql> grant replication slave on *.* to repluser@'10.0.0.%' ; #账号授权 [root@master ~]#mkdir /backup #创建备份目录 [root@master ~]#mysqldump -A -F [root@master ~]#ls /backup #查看是否备份成功full -2022 -10 -25. sql #从服务器 [root@slave ~]#yum -y install mysql-server [root@slave ~]#systemctl enable [root@slave ~]#vim /etc/my.cnf #修改配置文件 [mysqld]server -id=186 read -only :wq [root@slave ~]#systemctl restart mysqld [root@slave ~]#mkdir /backup #创建备份接受目录 [root@master ~]#scp /backup/full -2022 -10 -25. sql 10.0 .0 .186 :/backup #将备份数据复制到从服务器 [root@slave ~]#ls /backup #复制成功full -2022 -10 -25. sql [root@slave ~]#vim /backup/full -2022 -10 -25. sql #编辑备份数据 CHANGE MASTER TO #在此行后面添加后面四行 MASTER_HOST='10.0.0.185' , MASTER_USER='repluser' , MASTER_PASSWORD='123456' , MASTER_PORT=3306 , :wq [root@slave ~]#mysql < /backup/full -2022 -10 -25. sql #导入备份数据 [root@slave ~]#mysql mysql> start slave; #开启线程 #此时主从复制已完成,下一步安装并启动mycat [root@mycat-server ~]#mkdir /apps ; tar xf Mycat-server -1.6 .7 .4 -release -20200105164103 -linux.tar.gz -C /apps #创建/apps目录,并将安装包解压至/apps目录 [root@mycat-server ~]#ls /apps/mycat/bin/ #可以看到mycat启动路径 dataMigrate.sh mycat startup_nowrap.sh wrapper -linux-x86-32 init_zk_data.sh rehash.sh wrapper -linux-ppc-64 wrapper -linux-x86-64 #为了不输入路径也能启动mycat,将mycat启动路径写入PATH [root@mycat-server ~]#vi /etc/profile.d/mycat.shPATH =/apps/mycat/bin:$PATH :wq [root@mycat-server ~]#. /etc/profile.d/mycat.sh #运行脚本 #因为mycat需要用到java,所以需要安装Java(占空间大),将虚拟机内存调到3 G [root@mycat-server ~]#free -h #查看内存是否更改成功 total used free shared buff/cache available Mem: 2.7 Gi 275 Mi 2.2 Gi 9.0 Mi 303 Mi 2.3 Gi Swap: 2.0 Gi 0 B 2.0 Gi [root@mycat-server ~]#yum -y install java #安装java #可以看到打开多个端口,其中8066 端口用于连接MyCAT [root@mycat-server ~]#ss -ntlp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0 .0 .0 :22 0.0 .0 .0 :* users:(("sshd",pid=956 ,fd=4 )) LISTEN 0 1 127.0 .0 .1 :32000 0.0 .0 .0 :* users:(("java",pid=24596 ,fd=4 )) LISTEN 0 50 *:38695 *:* users:(("java",pid=24596 ,fd=66 )) LISTEN 0 100 *:9066 *:* users:(("java",pid=24596 ,fd=87 )) LISTEN 0 50 *:35117 *:* users:(("java",pid=24596 ,fd=68 )) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=956 ,fd=6 )) LISTEN 0 50 *:1984 *:* users:(("java",pid=24596 ,fd=67 )) LISTEN 0 100 *:8066 *:* users:(("java",pid=24596 ,fd=91 )) #查看日志,确认mycat是否启动成功 [root@mycat-server ~]#tail /apps/mycat/logs/wrapper .log INFO | jvm 1 | 2022 /10 /25 09 :42 :33 | MyCAT Server startup successfully. see logs in logs/mycat.log #startup successfully:启动成功 #客户端配置 [root@Centos7 ~]#yum -y install mariadb #安装数据库 [root@Centos7 ~]#mysql -uroot -p123456 -h10.0 .0 .184 -P8066 #用户root,密码123456 是mycat自己自动生成的账号密码(/apps/mycat/conf/server .xml可以在这修改账号密码) MySQL [(none )]> show databases; #此时只有一个测试数据库(虚拟的) + | DATABASE | + | TESTDB | + #正常情况下mysql端口号是3306 ,我们可以把mycat的端口号改为3306 [root@mycat-server ~]#mycat stop [root@mycat-server ~]#vim /apps/mycat/conf/server .xml <! <property name ="serverPort">3306 </property> <property name ="managerPort">9066 </property> #添加此行 #为了让客户端通过mycat可以连接到真正的数据库,需要将数据库映射到mycat的测试数据库。 #在mysql上创建mycat可以连接到mysql的账号密码 [root@master ~]#mysql mysql> create user admin @'10.0.0.%' identified by '123456' ; #创建账号密码,此账号主要是用于mycat,可以指定具体地址(不用网段) mysql> grant all on hellodb.* to admin @'10.0.0.%' ; #给账号授权,只想让mycat有访问hellodb的权限 #在mycat上添加mysql新建的账号 [root@mycat-server ~]#vim /apps/mycat/conf/schema .xml <schema name ="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> #将原单词改为false <dataNode name ="dn1" dataHost="localhost1" database ="hellodb" /> #将原数据库改为hellodb <dataHost name ="localhost1" maxCon="1000" minCon="10" balance="1" #将balance=0 改为=1 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user ()</heartbeat> <writeHost host="host1" url="10.0.0.18:3306" user ="root" password ="123456"> <readHost host="host2" url="10.0.0.28:3306" user ="root" password ="123456" /> #添加主从服务器地址账号密码 :wq #上面配置中,balance改为1 ,表示读写分离。以上配置达到的效果就是10.0 .0 .18 为主库,10.0 .0 .28 为从库 #修改完成后再重新启动mycat [root@Rocky ~]#mycat start [root@Rocky ~]#tail /apps/mycat/logs/wrapper .log INFO | jvm 1 | 2022 /10 /25 11 :22 :40 | MyCAT Server startup successfully. see logs in logs/mycat.log #此时客户端可以通过mycat访问数据库中的hellodb [root@Centos7 ~]#mysql -uroot -p123456 -h10.0 .0 .184 #已经将端口号改为默认端口号3306 了,不用在输入了 MySQL [(none )]> show databases; + | DATABASE | + | TESTDB | + MySQL [(none )]> use TESTDB MySQL [TESTDB]> show tables ; + | Tables_in_hellodb | + | classes | | coc | | courses | | scores | | students | | teachers | | toc | + #已经可以看到数据库里的内容了
六、实现openvpn部署,并且测试通过,输出博客或者自己的文档存档
1、阿里云网络配置 ①配置参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 阿里云创建专有网络 指定城市和可用区: 华北3 张家口可用区A区 网段名magedu-net1和地址段172.16 .0.0 /12 ,默认资源组 交换机名magedu-net1-n68 可用区A IPv4 的地址段 172.30 .0.0 /24 安全组开放22 端口2 创建OpenVPN 服务器有公网IP 的实例1 个 指定城市和可用区: 华北3 张家口可用区A区 共享型s6 2 vCPU 4 G 网络:magedu-net1 交换机:magedu-net1-n68 公网IP 私网IP :172.30 .0.1 /24 按量收费 100 M 默认安全组 默认配置 22 ,3389 ,icmpRocky Linux 8.6 系统盘 SSD 云盘40 G3 创建局域网的服务器无公网IP 的实例2 个 按量付费 指定城市和可用区: 华北3 张家口可用区A区 共享型 1 vCPU2GRocky Linux 8.6 系统盘 ESSD 云盘40 G 网络:magedu-net1 magedu-net1-n68 无公网IP 私网IP :172.30 .0.100 /24 172.30 .0.200 /24 默认安全组 主网卡magedu-net1-n684 重设所有实例密码5 修改安全组打开 1194 /TCP /UDP
②验证主机配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@Rocky ~] The authenticity of host '47.92 .232.42 (47.92 .232.42 )' can't be established. ECDSA key fingerprint is SHA256:Bzrhb3djhiGwPo8sjkwu7loauam5plaqO9YlG2eyjE4. Welcome to Alibaba Cloud Elastic Compute Service ! Activate the web console with: systemctl enable --now cockpit.socket [root@openvpn-server ~]2 : eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00 :16 :3 e:21 :bc:7 f brd ff:ff:ff:ff:ff:ff inet 172.30 .0.1 /24 brd 172.30 .0.255 scope global dynamic noprefixroute eth0 [root@openvpn-server ~] root@172.30 .0.100 's password: Welcome to Alibaba Cloud Elastic Compute Service ! Activate the web console with: systemctl enable --now cockpit.socket Last login: Thu Oct 27 09 :33 :58 2022 from 172.30 .0.1 [root@web01 ~]172.30 .0.100 [root@web01 ~] root@172.30 .0.200 's password: Welcome to Alibaba Cloud Elastic Compute Service ! Activate the web console with: systemctl enable --now cockpit.socket [root@web02 ~]172.30 .0.200
③安装httpd
1 2 3 [root@web02 ~] # yum -y install httpd;systemctl enable --now httpd;hostname > /var /www/html /index.html #安装完后外部直接连接,查看网页打不开,需要openVPN的配置
2、安装openvpn ①查看及安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 需要用到两个软件 openVPN和easy-rsa(openVPN系统自带,easy-rsa不自带需要配置epel源) [root@openvpn -server ~]# yum list openvpn Last metadata expiration check: 0 :01 :14 ago on Thu 27 Oct 2022 10 :06 :06 AM CST. Available Packages openvpn.x86_64 2.4 .12 -1. el8 epel [root@openvpn -server ~]# yum list easy-rsa Last metadata expiration check: 0 :06 :25 ago on Thu 27 Oct 2022 09 :52 :01 AM CST. Error: No matching Packages to list#配置epel源 [root@openvpn -server ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm [root@openvpn -server ~]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel* [root@openvpn -server ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel* #安装两个软件 [root@openvpn -server ~]# yum -y install easy-rsa #证书管理软件 [root@openvpn -server ~]# yum -y install openvpn #openvpn服务器端
②准备相关配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #生成服务器配置文件 [root@openvpn -server easy-rsa]# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/ [root@openvpn -server easy-rsa]# cd /etc/openvpn [root@openvpn -server openvpn]# ls certs client server server.conf#准备证书颁发相关文件 [root@openvpn -server ~]# mkdir -p /data/easy-rsa [root@openvpn -server ~]# ls /data/easy-rsa #查看复制结果 easyrsa openssl-easyrsa.cnf x509-types#准备颁发证书相关变量的配置文件 [root@openvpn -server ~]#cp /usr/share/doc/easy-rsa/vars.example /data/easy-rsa/vars [root@openvpn -server ~]# cd /data/easy-rsa [root@openvpn -server easy-rsa]# ls easyrsa openssl-easyrsa.cnf vars x509-types#修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长 [root@openvpn -server easy-rsa]# vim vars set_var EASYRSA_CA_EXPIRE 36500 #CA的证书有效期 set_var EASYRSA_CA_EXPIRE 36500 #此次是指的openvpn的有效期,后面再配置客户端(用户)的有效期
3、准备证书相关文件 ①初始化PKI生成PK相关目录和文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# ./easyrsa init-pki Note: using Easy-RSA configuration from : /data/easy-rsa/vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is : /data/easy-rsa/pki [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── openssl-easyrsa.cnf │ ├── private │ ├── reqs │ └── safessl-easyrsa.cnf ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
②创建CA机构环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #给CA颁发证书(自签名证书) [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# ./easyrsa build-ca nopass #nopass表示生成的私钥没有设置密码,生产中要设置 [root@openvpn-server easy-rsa]# tree #生成了ca.crt文件和其他文件 . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt #CA的证书 │ ├── certs_by_serial │ ├── index .txt #颁发证书生成的索引信息 │ ├── index .txt.attr │ ├── issued │ ├── openssl-easyrsa.cnf │ ├── private │ │ └── ca.key │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ └── serial ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
③创建openVPN服务器证书申请
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #创建服务器证书申请文件,其中server是文件前缀 [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# ./easyrsa gen-req server nopass Keypair and certificate request completed. Your files are: req: /data/easy-rsa/pki/reqs/server .req #证书申请文件 key: /data/easy-rsa/pki/private /server .key #私钥文件 [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt │ ├── certs_by_serial │ ├── index .txt │ ├── index .txt.attr │ ├── issued │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ └── server .key #此时新增了私钥文件 │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ │ └── server .req #新增了证书申请文件 │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ └── serial ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
④给openVPN服务器颁发证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@openvpn-server ~]# cd /data/easy-rsa #第一个server表示证书的类型,第二个server表示请求文件名的前缀 [root@openvpn-server easy-rsa]# ./easyrsa sign server server Certificate created at: /data/easy-rsa/pki/issued/server .crt [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt │ ├── certs_by_serial │ │ └── 746 A3EC66A04B10F5BEAABC519143A3F.pem #颁发证书的备份文件 │ ├── index .txt │ ├── index .txt.attr │ ├── index .txt.attr.old │ ├── index .txt.old │ ├── issued │ │ └── server .crt #给服务器颁发的证书 │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ └── server .key │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ │ └── server .req │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ ├── serial │ └── serial.old ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
⑤创建Diffie-Hellman密钥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# ./easyrsa gen-dh DH parameters of size 2048 created at /data/easy-rsa/pki/dh.pem [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt │ ├── certs_by_serial │ │ └── 746 A3EC66A04B10F5BEAABC519143A3F.pem │ ├── dh.pem #生成的加密文件 │ ├── index .txt │ ├── index .txt.attr │ ├── index .txt.attr.old │ ├── index .txt.old │ ├── issued │ │ └── server .crt │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ └── server .key │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ │ └── server .req │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ ├── serial │ └── serial.old ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
⑥创建客户端证书申请
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #为了快捷,目录仍使用服务器端目录(正常最好设置客户端目录,进行区分) [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# ./easyrsa gen-req magekecheng nopass req: /data/easy-rsa/pki/reqs/magekecheng.req key: /data/easy-rsa/pki/private /magekecheng.key [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt │ ├── certs_by_serial │ │ └── 746 A3EC66A04B10F5BEAABC519143A3F.pem │ ├── dh.pem │ ├── index .txt │ ├── index .txt.attr │ ├── index .txt.attr.old │ ├── index .txt.old │ ├── issued │ │ └── server .crt │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ ├── magekecheng.key │ │ └── server .key │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ │ ├── magekecheng.req │ │ └── server .req │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ ├── serial │ └── serial.old ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
⑦给客户端颁发证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #一般用户的证书有效期为3-6个月,所以在颁发证书前,需要设置有效期 [root@openvpn-server ~]# cd /data/easy-rsa [root@openvpn-server easy-rsa]# vim vars set_var EASYRSA_CERT_EXPIRE 180 #时间有效期180天 [root@openvpn-server easy-rsa]# ./easyrsa sign client magekecheng Certificate created at: /data/easy-rsa/pki/issued/magekecheng.crt #客户的证书 [root@openvpn-server easy-rsa]# tree . ├── easyrsa ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt │ ├── certs_by_serial │ │ ├── 746 A3EC66A04B10F5BEAABC519143A3F.pem │ │ └── 998 A52A40FE7B270749799A0A0F968A2.pem │ ├── dh.pem │ ├── index .txt │ ├── index .txt.attr │ ├── index .txt.attr.old │ ├── index .txt.old │ ├── issued │ │ ├── magekecheng.crt #客户端的证书 │ │ └── server .crt │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ ├── magekecheng.key │ │ └── server .key │ ├── renewed │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── reqs │ │ ├── magekecheng.req │ │ └── server .req │ ├── revoked │ │ ├── certs_by_serial │ │ ├── private_by_serial │ │ └── reqs_by_serial │ ├── safessl-easyrsa.cnf │ ├── serial │ └── serial.old ├── vars └── x509-types ├── ca ├── client ├── code-signing ├── COMMON ├── email ├── kdc ├── server └── serverClient
⑧将CA和服务器证书相关文件复制到服务器相应的目录
1 2 3 4 [root@openvpn-server easy-rsa]# mkdir /etc/ openvpn/certs [root@openvpn-server easy-rsa]# cp pki/ca.crt pki/ dh.pem pki/issued/ server.crt pki/private/ server.key /etc/ openvpn/certs #将四个文件拷贝到/ etc/openvpn/ certs [root@openvpn-server easy-rsa]# ls /etc/ openvpn/certs ca.crt dh.pem server.crt server.key
⑨将客户端私钥与证书相关文件复制到服务器相关的目录
1 2 3 4 5 [root@openvpn-server easy-rsa]# mkdir /etc/ openvpn/client/m agekecheng/ [root@openvpn-server easy-rsa]# cp pki/ca.crt pki/i ssued/magekecheng.crt pki/ private /magekecheng.key / etc/openvpn/ client/magekecheng/ #将三个文件拷贝到/etc/ openvpn/client/m agekecheng/ [root@openvpn-server easy-rsa]# ls /etc/ openvpn/client/m agekecheng/ ca.crt magekecheng.crt magekecheng.key
4、修改OpenVPN服务器配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@openvpn-server openvpn] port 1194 proto tcp dev tun ca /etc/ openvpn/certs/ ca.crt cert /etc/ openvpn/certs/ server.crt key /etc/ openvpn/certs/ server.key dh /etc/ openvpn/certs/ dh.pem server 10.8 .0.0 255.255 .255.0 push "route 172.30.0.0 255.255.255.0" keepalive 10 120 cipher AES-256 -CBC compress lz4-v2 push "compress lz4-v2" max-clients 2048 user openvpn group openvpn status /var/ log/openvpn/ openvpn-status.log log-append /var/ log/openvpn/ openvpn.log verb 3 mute 20 :wq [root@openvpn-server openvpn] [root@openvpn-server ~] [root@openvpn-server ~] drwxr-xr-x 2 openvpn openvpn 6 Oct 27 12 :50 /var/ log/openvpn
5、启动openvpn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@openvpn-server ~] [Unit] Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I After=network.target [Service] Type=notify PrivateTmp=true ExecStart=/usr/s bin/openvpn --cd /etc/openvpn/ --config %i.conf [Install] WantedBy=multi-user.target :wq [root@openvpn-server openvpn] [root@openvpn-server openvpn]
6、准备OpenVPN客户端配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@openvpn-server openvpn] client dev tun proto tcp remote 47.92 .232.42 1194 resolv-retry infinite nobind ca ca.crt cert magekecheng.crt key magekecheng.key remote-cert-tls server cipher AES-256 -CBC verb 3 compress lz4-v2 comp-lz压缩 :wq [root@openvpn-server openvpn] [root@openvpn-server magekecheng] ca.crt client.ovpn magekecheng.crt magekecheng.key [root@openvpn-server magekecheng] [root@openvpn-server magekecheng] [root@openvpn-server magekecheng]
7、实现OpenVPN客户端 7.1、Windows配置部署OpenVPN客户端 官方客户端下载地址:
https://openvpn.net/community-downloads/
openvpn客户端安装过程:
将下载的压缩包解压到此目录下
连接成功后,电脑自动获取地址(10.8.0.6)
此时openvpn服务器也获取一个地址
1 2 3 4 5 6 7 8 9 10 11 [root@openvpn-server magekecheng]2 : eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00 :16 :3 e:21 :bc:7 f brd ff:ff:ff:ff:ff:ff inet 172.30 .0.1 /24 brd 172.30 .0.255 scope global dynamic noprefixroute eth0 valid_lft 315339583 sec preferred_lft 315339583 sec inet6 fe80::216 :3 eff:fe21:bc7f/64 scope link valid_lft forever preferred_lft forever3 : tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 link/none inet 10.8 .0.1 peer 10.8 .0.2 /32 scope global tun0 valid_lft forever preferred_lft forever
此时电脑就可以直接连接openvpn了
8、实现访问VPN服务器的内网主机 但需要注意的是此时仍无法连接到openvpn后面的机器
因为openvpn接收到请求后发现地址不是自己,就把请求扔掉了,所以需要设置防火墙
1 2 3 4 #在服务器开启ip_forward转发功能[root@openvpn-server magekecheng] #echo net.ipv4 .ip_forward = 1 >> /etc/sysctl.conf [root@openvpn-server magekecheng] #sysctl -p net.ipv4 .ip_forward = 1
此时仍是ping不同,但是后面的地址收到请求,也回应了
此时ping不通,是因为双方的ip不在一个网段,回应时走的路由器(网关172.30.0.253),但路由器找不到地址
1 2 3 4 5 [root@web01 ~] # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 172 .30 .0 .253 0 .0 .0 .0 UG 100 0 0 eth0172.30.0.0 0 .0 .0 .0 255 .255 .255 .0 U 100 0 0 eth0
解决此问题的方法:①在web01机器上添加到10.8.0.0/24网段的路由
1 2 #在内网每个主机上添加路由(阿里云服务器不支持修改路由) [root@web01 ~]#route add -net 10.8.0.0/24 gw 172.30.0.1
②在OpenVPN服务器配置iptables规则
1 2 3 4 5 6 7 8 9 10 11 [root@openvpn-server magekecheng]# iptables -t nat -A POSTROUTING -s 10.8 .0 .0 /24 ! -d 10.8 .0 .0 /24 -j SNAT [root@openvpn-server magekecheng]# iptables -t nat -vnL #查看添加的规则 Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
此时就可以ping通了,直接访问网页了