第六周

内容纲要

1、简述DDL,DML,DCL,DQL,并且说明mysql各个关键字查询时候的先后顺序

DDL: 数据库定义语言。---create/alter/drop
DML:数据库操作语言。---insert/delete/update
DCL:数据库控制语言。---grant/revoke
DQL:数据库查询语言。---select
mysql书写语句时的的顺序:  
select
from
where
group by
having
order by
limit
#顺序不对会报错,比如分组和排序次序:order by 必须在group by 和having之后
执行顺序:
from
where
group by
having
select
order by

2、自行设计sql查询语句,需要用到关键字[GROUP BY/HAVING/ORDER BY/LIMIT],至少同时用到两个

1、select classid,count(*)数量,gender from students group by classid,gender; #多个字段分组统计信息
2、select count(*)数量,gender from students group by gender with rollup; #分组后聚合函数统计再汇总信息
3、select tid,count(*) from teachers group by tid having tid is not null order by tid; #having对聚合函数分组的数据进行筛选
4、select tid,count(*) from teachers group by tid having tid is not null order by tid limit; #对筛选数据只显示前三行
5、select name,age,gender from students order by age asc limit 4; #在学生表中查找姓名、年龄、性别,只显示前四行以年龄降序排列

3、xtrabackup备份和还原数据库练习

xtrabackup全量备份:
1、官网下载xtrabackup工具:地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
2、上传到master中,安装:yum -y install percona-xtrabackup-80-8.0.26-18.1.el8.x86_64.rpm #这样会将依赖包一起安装上。
3、开始备份数据库,这里因为不是yum安装的数据库所有备份时需要指定socket地址
   xtrabackup -uroot -p123456 -S/data/mysql/mysql.socket --backup --target-dir=/dbackup #备份命令
4、复制备份的文件到slave中;
   scp -r /backup/ 10.0.0.138:/ #连同文件夹一起复制,
  注意:这里已经提前在slave上安装好了数据库,安装好了 xtrabackup,数据库是关闭状态,且/data/mysql/文件夹是空的。
5、提交完成的事务,回滚未完成的事务。
   xtrabackup --prepare --target-dir=/backup/
6、复制到数据库目录
   xtrabackup --copy-back --tar-dir=/backup/
7、还原属性
   chown -R mysql:mysql /data/mysql
8、启动服务
   service mysqld start 
备份和还原完成。
如果要检测数据是否一致,可提前在备份前创建一条数据,还原后查看。

xtrabackup增量备份:
1、第一次修改数据:insert teachers(name,age,gender)values('b',45,'F');
   第一次增量备份:xtrabackup -uroot -p123456 -S/data/mysql/mysql.sock --backup --target-dir=/data/inc1 --incremental-basedir=/backup
执行结果最后两行:xtrabackup: Transaction log of lsn (18541469) to (18541479) was copied.
                220928 10:42:16 completed OK!
2、第二次修改数据:insert teachers(name,age,gender)values('c',88,'F');
   第二次增量备份:xtrabackup -uroot -p123456 -S/data/mysql/mysql.sock --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
执行结果最后两行:xtrabackup: Transaction log of lsn (18543389) to (18543409) was copied.
                 220928 10:46:43 completed OK!
3、第三次修改数据:insert teachers(name,age,gender)values('d',99,'M');
   第三次增量备份:xtrabackup -uroot -p123456 -S/data/mysql/mysql.sock --backup --target-dir=/data/inc3 --incremental-basedir=/data/inc2
执行结果最后两行:xtrabackup: Transaction log of lsn (18543845) to (18543855) was copied.
                 220928 10:51:19 completed OK!
4、全量备份已经在上一个步骤中实现,这里直接使用全量备份的数据。
1)scp -r /data/inc*/ 10.0.0.138:/data #复制增量备份数据
2)清空mysql目录,关闭服务。
3)xtrabackup --prepare --apply-log-only --target-dir=/backup #app-log-only阻止回滚未完成的事务
4)xtrabackup --prepare --apply-log-only --target-dir=/backup --incremental-dir=/data/inc1 #合并第一次增量备份到全量备份,这里注意指定还原第一次增量备份的选项和增量备份选项不一致,不然会导致合并失败,但是不报错。--incremental-dir
5)xtrabackup --prepare --apply-log-only --target-dir=/backup --incremental-dir=/data/inc2 #合并第二次增量备份到全量备份
6)xtrabackup --prepare --target-dir=/backup --incremental-dir=/data/inc3 #合并第三次增量备份到全量备份,最后一次增量备份还原不需要加apply-log-only。
7)xtrabackup --copy-back --target-dir=/backup #复制到数据库目录,数据库目录必须为空,服务不能启动
   copy -r /backup/* /data/mysql #两条命令都可实现复制数据,只是上一条命令看着更专业。
8)chown -R mysql:mysql /data/mysql #还原属性
9)service mysqld start #启动服务

4、实现mysql主从复制,主主复制和半同步复制

一、mysql主从复制:
环境:两台rocky8.5,主节点:10.0.0.136,从节点:10.0.0.138
安装mysql使用的脚本,在网站另一篇文章mysql脚本安装内。
安装完mysql8.0后发现无法进入数据库,检查后发现libtinfo.so.5在mysql的依赖库中显示为not found
解决办法:
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
再次使用mysql -uroot -p 后进入数据库。
重点:
mysql主从复制尽量是版本一致,如果不一致:那从节点版本必须必主节点高。不然无法实现主从复制。
	1)主从复制主节点需要做四步:设置server ID;启用二进制日志;创建复制账号并授权;备份数据库;
	2)从节点需要配置:安装数据库;配置my.cnf文件,设置slave id,设置read-only=yes;修改主节点备份文件中的主节点服务器信息;
		临时关闭二进制日志,因为还原时会产生二进制日志,但是这些二进制日志没用,set sql_log_bin=off; 还原数据库;开启二进制日志,set sql_log_bin=on;
		执行change master to 指向master ip 同步用户密码、端口、二进制日志名称及日志开始位置数字
		查看slave状态;开启主从复制;start slave;查看主节点状态show processlist;##验证sql线程和IO线程
		##########从节点重启或者关机再开机,会自动同步主数据库数据
10.0.0.136(主节点):
1)配置my.cnf
[mysqld]
port=3306
server-id=136 #全局唯一
log-bin=/data/mysql/mysql-bin #启用二进制日志
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
2)查看二进制文件和位置开始复制
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      815 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3)创建和授权拥有复制权限的账号(从节点也需要做这步且过程一致),mysql8.0要分成两步
create user repluser@'10.0.0.%' identified by '密码';
grant replication slave on *.* to repluser@'10.0.0.%';
flush privileges;
10.0.0.138(从节点):
1)配置my.cnf
[mysqld]
server-id=138
log-bin=/data/mysql/bin-log
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
read-only=yes
[client]
socket=/data/mysql/mysql.sock
2)创建和授权拥有复制权限的账号,和主节点步骤一致。这步是为了防止后期主节点挂了从节点可提升为主节点而设置的。
3)这里因为是干净的数据库,就不关闭binlog日志了,如果是运行了一段时间的日志,那就要先关闭binlog日志,不然开启复制后会产生大量无用的二进制日志
直接在数据库里执行:
CHANGE MASTER TO
MASTER_HOST='10.0.0.136', #主节点地址
MASTER_USER='repluser', #主节点复制账号
MASTER_PASSWORD='密码', #密码
MASTER_PORT=3306, #端口
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=815;#这里的名称和815是根据上面主节点使用show master status;查看的。
4)启动并查看状态: start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.136
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 815
               Relay_Log_File: rocky-relay-bin.000002
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 815
              Relay_Log_Space: 533
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 136
                  Master_UUID: d8d3bb3e-3b13-11ed-916b-000c29766fc2
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 


二、mysql主主复制:
环境和上面主从复制一样,恢复到刚装完数据库的快照即可。
主主复制需要注意的点:
两个主机的server_id要唯一
都启用binary log和relay log
创建拥有复制权限的账号
定义自动增长的id字段的数值范围各为奇偶
彼此互相设置为主节点,并启动复制线程
1)第一个节点:10.0.0.136
vim /etc/my.cnf
[mysqld]
port=3306
server-id=136
log-bin=/data/mysql/mysql-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
auto_increment_offset=1 #开始增长点
auto_increment_increment=2 #增长幅度
[client]
socket=/data/mysql/mysql.sock
重启mysql:service mysqld restart
查看bin_log文件和数字,用于在第二个主节点上使用
mysql> show master logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |       203 | No        |
| mysql-bin.000002 |       815 | No        |
| mysql-bin.000003 |       179 | No        |
| mysql-bin.000004 |       156 | No        |
+------------------+-----------+-----------+
4 rows in set (0.01 sec)
第二个节点:
vim /etc/my.cnf
[mysqld]
server-id=138
log-bin=/data/mysql/bin-log
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
#read-only=yes
auto_increment_offset=2 #开始增长点
auto_increment_increment=2 #增长幅度
[client]
socket=/data/mysql/mysql.sock
重启mysql服务:service mysqld restart
查看bin_log文件和位置数字:用于第一个主节点上使用
mysql> show master logs;
+----------------+-----------+-----------+
| Log_name       | File_size | Encrypted |
+----------------+-----------+-----------+
| bin-log.000001 |       179 | No        |
| bin-log.000002 |       852 | No        |
| bin-log.000003 |       156 | No        |
| bin-log.000004 |       179 | No        |
| bin-log.000005 |       179 | No        |
| bin-log.000006 |       671 | No        |
| bin-log.000007 |       156 | No        |
+----------------+-----------+-----------+
7 rows in set (0.00 sec)
到这里,需要的数据都拿到了。可以开始配置了。
10.0.0.136:
添加master节点:
CHANGE MASTER TO
MASTER_HOST='10.0.0.138', 
MASTER_USER='repluser', 
MASTER_PASSWORD='密码', 
MASTER_PORT=3306, 
MASTER_LOG_FILE='bin-log.000007', MASTER_LOG_POS=156;
start slave;
10.0.0.138:
添加master节点:
CHANGE MASTER TO
MASTER_HOST='10.0.0.136', 
MASTER_USER='repluser', 
MASTER_PASSWORD='密码', 
MASTER_PORT=3306, 
MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=156;
start slave;
配置完成。查看复制状态命令都一致:show slave status;
主要查看两个IO和SQL是否为yes和复制的延迟时间
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            Seconds_Behind_Master: 0



三、半同步复制:
环境:上面实验的主从环境,做好主从后再设置半同步复制。master:10.0.0.136,slave:10.0.0.138
master上配置:
在/etc/my.cnf中添加两行
rpl_semi_sync_master_enabled=ON #添加此行,需要先安装semisync_master.so插件,再重启
rpl_semi_sync_master_timeout=3000 #设置3S内无法同步,也将返回成功信息给客户端
登录数据库:
install plugin rpm_semi_sync_master soname 'semisync_master.so';#安装插件
set global rpm_semi_sync_master_enabled=ON;     #临时修改变量
set global rpm_semi_sync_master_timeout=3000;   #临时设置超时时间
master配置结果如下:
show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 3000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
slave配置如下:注意:如果实现了主从复制,先关闭主从,配置完半同步复制再开启
在/etc/my.cnf中添加:
rpl_semi_sync_slave_enabled=ON; #修改完后需重启数据库生效,不重启就临时设置数据库变量
进入数据库:
mysql -uroot -p
stop slave; #关闭主从复制
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; #安装同步插件
set global rpl_semo_sync_slave_enabled=ON;  #临时设置同步变量为开启
show global variables like '%semi%';  #查看设置后的值
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
start slave;  #开启主从复制
show slave status\G; #查看同步状态
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.136
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 156
               Relay_Log_File: rocky-relay-bin.000006
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 156
              Relay_Log_Space: 748
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 136
                  Master_UUID: d8d3bb3e-3b13-11ed-916b-000c29766fc2
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.01 sec)

配置已经完成,可在master上查看是否有客户端通过同步插件连接到master
mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
从结果可看到插件状态为ON,有一个客户端已经连接。
测试:
master上创建了两个数据库:
mysql> create database db1;
Query OK, 1 row affected (0.38 sec)

mysql> create database db2;
Query OK, 1 row affected (0.13 sec)
slave上查看结果:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.10 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
半同步复制配置成功。

5、用mycat实现mysql的读写分离

mycat读写分离:
环境:mycat: 10.0.0.133
     master:10.0.0.136
     slave: 10.0.0.138
     上面半同步复制环境。关闭防火墙、关闭selinux、时间同步
mycat:安装mycat,将下载好的mycat上传至服务器。链接:链接:https://pan.baidu.com/s/10MEmKSm1mzWmkKs-p3BoLw 提取码:tu3y
mkdir /apps #创建文件夹
mv Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz /apps #移动上传的文件
tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz  #解压
echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh  #配置环境变量
source /etc/profile.d/mycat.sh  #生效

vim /apps/mycat/conf/server.xml
                <property name="serverPort">3306</property>
                <property name="managerPort">9066</property>
将这两行添加到 <property name="handleDistributedTransactions">0</property> 这一行上即可,其他不动。

vim /apps/mycat/conf/schema.xml #这里schema.xml文件修改较多。直接上模板
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="hellodb" />  #数据库名称为hellodb
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" #balance为负载均衡模式,0不开启,1为将请求分配到writeHost对应的readHost和standby的writeHost上,一般使用1
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host1" url="10.0.0.136:3306" user="admin" #写入数据库使用的IP、端口、用户和密码
                   password="123456">
        <readHost host="host2" url="10.0.0.138:3306" user="admin"  #读取数据库使用的IP、端口、用户和密码
                   password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

master:主从复制已经实现,这里直接在主库上创建账号和授权即可,主库执行的操作会自动同步到从库。
create user admin@'10.0.0.%' identified by '123456';
grant all on *.* to admin@'10.0.0.%'; 

环境配置完毕。
开启mycat:
mycat start #启动mycat
[09:40:43 root@rocky ~]#tail -f /apps/mycat/logs/wrapper.log  #查看启动日志,这里可以看到最下面一行mycat已经成功启动。
INFO   | jvm 1    | 2022/09/28 09:20:34 | 
INFO   | jvm 1    | 2022/09/28 09:20:41 | MyCAT Server startup successfully. see logs in logs/mycat.log
STATUS | wrapper  | 2022/09/28 09:20:54 | TERM trapped.  Shutting down.
STATUS | wrapper  | 2022/09/28 09:20:55 | <-- Wrapper Stopped
STATUS | wrapper  | 2022/09/28 09:38:55 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2022/09/28 09:38:56 | Launching a JVM...
INFO   | jvm 1    | 2022/09/28 09:38:56 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2022/09/28 09:38:56 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2022/09/28 09:38:56 | 
INFO   | jvm 1    | 2022/09/28 09:39:00 | MyCAT Server startup successfully. see logs in logs/mycat.log


注意:没有配好mycat的情况下不要启动,不然连接错误连接过多会导致连接不上数据库,可以在master上flush hosts;重置连接,也可以设置错误连接次数为1000或者10000改大点参数。默认是100。如果检查了几遍一直没问题可以在mycat上测试连接主库和从库;安装一个mysql-client测试是否能正常连接master和slave。
mysql> show global variables like '%max_connect_error%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
+--------------------+-------+

测试读写分离:需要现在master和slave中开启通用日志,set global general_log=on;
连接mycat服务器的数据库:mysql -uroot -p123456 -h10.0.0.133 #账号密码在server.xml文件中,端口在server中已经修改为3306,默认是8066。
在mycat上执行命令:
select @@server_id; #这是一条查询命令,查到的ID为从库的server_id
+-------------+
| @@server_id |
+-------------+
|         138 |
+-------------+
update teachers set age=@@server_id where tid=5; #这里修改tid为5的age修改成@@server_id,根据上面的结果应该是138,实际上并不是。
结果:
mysql> select * from hellodb.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 | a             | 136 | M      |
+-----+---------------+-----+--------+
5 rows in set (0.14 sec)

从这里已经看到读写分离了,读的时候读取的是从库的server_id=138,但是写的时候发现写入数据库的server_id变成了主库的136。
读写分离完成!!!

6、实现openvpn部署,并且测试通过。

环境:
openvpn-server:eth0:10.0.0.133 eth1:192.168.234.130
lan:192.168.234.132 GW:192.168.234.130
client:10.0.0.1
安装:
openvpn-server:
yum -y install openvpn easy-rsa #安装openvpn和easy-rsa
rpm -ql openvpn  #查看文件
rpm -ql easy-rsa #查看文件
mkdir -p /apps/openvpn/easy-rsa-{server,client} #创建serverheclient的生成文件目录
cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /apps/openvpn 复制模板配置文件到/apps/openvpn下
cp -r /usr/share/easy-rsa/3 /apps/openvpn/easy-rsa-server/ #复制证书生成文件到指定目录
cp /usr/share/doc/easy-rsa/vars.example /apps/openvpn/easy-rsa-server/vars #复制颁发证书的相关配置文件

vim /apps/openvpn/easy-rsa-server/vars #修改ca和openvpn的证书有效期
   set_var EASYRSA_CA_EXPIRE       36500 #CA默认是3650天,10年,这里改到了100年
   set_var EASYRSA_CERT_EXPIRE     3650  #服务器证书默认是825天,这里改到了10年

cd /apps/openvpn/easy-rsa-server/ #进入目录
./easyrsa init-pki  #初始化数据,将会在目录下生成pki文件夹及相关文件
./easyrsa build-ca nopass #生成自签名的ca证书,回车接受默认名称即可

ll pki/ca.crt pki/private/ca.key  #生成一个ca.crt证书文件和ca.key私钥文件
-rw-------. 1 openvpn openvpn 1204 Oct  7 16:33 pki/ca.crt
-rw-------. 1 openvpn openvpn 1679 Oct  7 16:32 pki/private/ca.key

./easyrsa gen-req server nopass #创建服务器证书文件申请,server是文件前缀,也是接受默认回车即可

ll pki/reqs/server.req pki/private/server.key  #生成一个server.req的请求文件和一个server.key的私钥文件
-rw-------. 1 openvpn openvpn 1704 Oct  7 16:37 pki/private/server.key
-rw-------. 1 openvpn openvpn  887 Oct  7 16:37 pki/reqs/server.req

./easyrsa sign server server #生成服务器证书

Request subject, to be signed as a server certificate for 3650 days: #这里就是设置的服务器证书有效期了10年

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details:  #输入yes回车即可

ll pki/issued/server.crt  #生成的服务器证书文件
-rw-------. 1 openvpn openvpn 4608 Oct  7 16:42 pki/issued/server.crt

ll pki/certs_by_serial/99C506B4A64B32CFF1C11FC0FAC72B1A.pem #生成的服务器证书文件

-rw-------. 1 openvpn openvpn 4608 Oct  7 16:42 pki/certs_by_serial/99C506B4A64B32CFF1C11FC0FAC72B1A.pem
diff pki/certs_by_serial/99C506B4A64B32CFF1C11FC0FAC72B1A.pem pki/issued/server.crt #查看文件内容是否一

./easy-rsa gen-dh #创建diffie-hellman文件

ll pki/dh.pem 生成的文件
-rw-------. 1 openvpn openvpn 424 Oct  7 16:48 pki/dh.pem
到这里服务器的证书已经配置完成

配置client证书,这个证书和相关配置文件就是给用户连接openvpn-server使用的。
cp -r /usr/share/easy-rsa/3 /apps/openvpn/easy-rsa-client/ #复制证书生成文件到指定目录
cp /usr/share/doc/easy-rsa/vars.example /apps/openvpn/easy-rsa-client/vars #复制颁发证书的相关配置文件
./easyrsa init-pki #和openvpn-server一样初始化生成pki文件
./easyrsa gen-req zhang nopass #生成用户zhang的证书申请文件,不使用密码,接收默认值,回车即可

ll pki/reqs/zhang.req pki/private/zhang.key #生成的密钥文件和证书申请文件
-rw-------. 1 openvpn openvpn 1708 Oct  7 19:20 pki/private/zhang.key
-rw-------. 1 openvpn openvpn  887 Oct  7 19:21 pki/reqs/zhang.req

cd /apps/openvpn/easy-rsa-server
./easyrsa import-req /apps/openvpn/easy-rsa-client/pki/reqs/zhang.req zhang #复制客户端的证书申请文件到server的ca目录下

ll pki/reqs/
total 8
-rw-------. 1 openvpn openvpn 887 Oct  7 16:37 server.req
-rw-------. 1 openvpn openvpn 887 Oct  7 19:24 zhang.req

vim vars
   set_var EASYRSA_CERT_EXPIRE     180 #修改客户端证书有效期,根据具体情况这里设置的是180天

./easyrsa sign client zhang #默认,输入yes回车即可

ll pki/issued/zhang.crt  #生成的zhang.crt文件
-rw-------. 1 openvpn openvpn 4491 Oct  7 19:27 pki/issued/zhang.crt

mkdir -p /etc/openvpn/{certs,client/zhang} #创建存放服务器证书和客户端证书的文件夹
复制服务器端文件到指定目录
cp /apps/openvpn/easy-rsa-server/pki/ca.crt /etc/openvpn/certs
cp /apps/openvpn/easy-rsa-server/pki/issued/server.crt /etc/openvpn/certs
cp /apps/openvpn/easy-rsa-server/pki/private/server.key /etc/openvpn/certs
cp /apps/openvpn/easy-rsa-server/pki/dh.pem /etc/openvpn/certs
复制客户端证书文件到指定目录

find /apps/openvpn/ -name \("zhang.key" -o -name "zhang.crt" -o -name ca.crt\) -exec cp {} /etc/openvpn/client/zhang \; #多复制一个ca.crt删除即可
准备openvpn配置文件:
vim /etc/openvpn/server.conf

port 1194 #端口
proto tcp #协议
dev tun   #IP路由隧道
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 #分配给客户端的ip地址
push "route 192.168.234.0 255.255.255.0"  #内网ip段
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
duplicate-cn


创建日志路径并授权:
mkdir -p /var/log/openvpn/
chown -R openvpn. /var/log/openvpn
准备openvpn.service文件,centos8默认没有,从centos7上拷贝即可
vim /lib/systemc/system/openvpn@.service
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target
重新载入systemctl并启动
systemctl daemon-reload
systemctl enable --now openvpn@server
systemctl status openvpn@server.service  #查看状态,已经启动

● openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-10-08 09:37:40 CST; 1h 46min ago
 Main PID: 1030 (openvpn)
   Status: "Initialization Sequence Completed"
    Tasks: 1 (limit: 23470)
   Memory: 2.5M
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─1030 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf

ss -ntl #查看端口,是否有1194

State      Recv-Q      Send-Q           Local Address:Port           Peer Address:Port     Process     
LISTEN     0           128                    0.0.0.0:22                  0.0.0.0:*                    
LISTEN     0           32                     0.0.0.0:1194                0.0.0.0:*                    
LISTEN     0           128                       [::]:22                     [::]:*               
   
准备客户端配置文件:

vim /etc/openvpn/client/zhang/client.ovpn

client
dev tun 
proto tcp
remote  10.0.0.133  1194 #服务器地址和端口,生产中建议写域名,便于维护
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert zhang.crt
key zhang.key
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3 #日志级别,和server端一致
compress lz4-v2

进入到client目录下,cd /etc/openvpn/client/zhang
tar cf zhang.tar * #打包文件传到windows上。

lan主机:提前安装好http服务并启动,然后再修改网卡为仅主机模式
yum -y install httpd
systemctl enable --now httpd
echo "this is test-20221001" > /var/www/html/index.html #设置页面
route add -net 10.8.0.0/24 gw 192.168.234.130 #修改lan网关为openvpn-server,网段为10.8.0.0,因为server.conf中分配给客户端的网段为10.8.0.0,访问的时候使用的是openvpn的192.168.234.130的地址,但返回客户端就要使用10.8.0.0了。

windows机器:下载openvpn安装包,在官网上有
安装Open-V-P-N-2.5.5-I602-amd64.msi,装完后会提示没有配置文件。
把刚才从openvpn-server打包下载的zhang.tar解压放到windows下的config中,注意:直接放到config中,不用再创建文件夹

然后开始启动openvpn,连接成功右下角会变成绿色。并且会给windows分配一个10.8.0.6的一个ip地址。

到这里openvpn已经配置完成。
测试访问lan:192.168.234.132 #提前在windows中禁用仅主机的192.168.234的网卡。不然会不通过vpn直接访问到。

这里发现无法访问网页。

因为openvpn-server是一台服务器,不是路由器,访问192.168.234.132时,openvpn-server发现不是访问它的就直接丢弃了。需要执行开启转发功能:
openvpn-server:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #开启转发功能
sysctl -p #马上生效
再次访问:192.168.234.132访问成功。


openvpn已经搭建完成,但是没有密码是不安全的,而且手工分配证书很浪费时间,也没有讲吊销证书。下次写好脚本一键颁发证书再补充。

1人评论了“第六周”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注