第十二周--作业

1、主从复制及主主复制的实现

主从复制实现步骤:

#主节点配置
#server-id唯一不可重复
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
log-bin
server-id=#
 
#查看binlog文件位置
mysql> show master logs;
+--------------------+-----------+-----------+
| Log_name           | File_size | Encrypted |
+--------------------+-----------+-----------+
| centos7-bin.000005 |       180 | No        |
| centos7-bin.000006 |       157 | No        |
+--------------------+-----------+-----------+
2 rows in set (0.00 sec)
 
#创建复制账号
mysql> create user 'jiaoxw'@'10.0.0.%' identified create user 'jxw'@'10.0.0.%' identified with mysql_native_password by 'magedu';
mysql> grant replication slave on *.* to 'jiaoxw'@'10.0.0.%';
 
#从节点配置
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
log-bin
server-id=#
 
#使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysql> change master to master_host='10.0.0.7',
    -> master_user='jiaoxw',
    -> master_password='magedu',
    -> master_port=3306,
    -> master_log_file='centos7-bin.000006',
    -> master_log_pos=157;
     
mysql> change master to master_host='10.0.0.7',master_user='jiaoxw',master_password='magedu',master_port=3306,master_log_file='centos7-bin.000006',master_log_pos=157;
 
mysql> start slave;

  

主主复制实现步骤:

#在第一个master节点上实现
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
log-bin
server-id=7
auto_increment_offset=1         #开始点
auto_increment_increment=2      #增长幅度
 
[root@localhost ~]#systemctl restart mysqld
 
#创建复制账号
mysql> create user 'jiaoxw'@'10.0.0.%' identified create user 'joaoxw'@'10.0.0.%' identified with mysql_native_password by 'magedu';
mysql> grant replication slave on *.* to 'jiaoxw'@'10.0.0.%';
 
#在第二个master节点上实现
[root@localhost ~]#vim /etc/my.cnf
[mysqld]  
log-bin
server-id=8
auto_increment_offset=2         #开始点
auto_increment_increment=2      #增长幅度
 
[root@localhost ~]#systemctl restart mysqld
 
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.7',
    ->   MASTER_USER='jiaoxw',
    ->   MASTER_PASSWORD='magedu',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='centos7-bin.000006',
    ->   MASTER_LOG_POS=157;
mysql> start slave;
mysql> show master logs;  #查看二进制位置
 
#在第一个master节点上实现
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.8',
    ->   MASTER_USER='jiaoxw',
    ->   MASTER_PASSWORD='magedu',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='centos8-bin.000006',
    ->   MASTER_LOG_POS=386;
mysql> start slave;

  

2、xtrabackup实现全量+增量+binlog恢复库

下载并安装xtarbackup

wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.23/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm

  

在主机做完全备份到/backup目录

xtrabackup -uroot -p123456 --backup --target-dir=/backup/

  

在目标主机上还原mysql

把备份文件scp到目标主机
scp -r /backup root@10.0.0.8:/root
 
在目标主机上还原
xtrabackup --prepare --target-dir=/backup
xtrabackup --copy-back --target-dir=/backu
chown -R mysql:mysql /data/mysql
systemctl start  mysqld

  

增量备份及还原

新增数据
mysql> create database testdb1;
Query OK, 1 row affected (0.01 sec)
  
mysql> create database testdb2;
Query OK, 1 row affected (0.00 sec)
 
第一次增量
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/
 
新增数据
mysql> create database testdb3;
Query OK, 1 row affected (0.01 sec)
  
mysql> create database testdb4;
Query OK, 1 row affected (0.00 sec)

  

拷贝至目标主机

scp -r /backup root@10.0.0.8:/backup1

  

备份主机开始还原

预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
xtrabackup --prepare --apply-log-only --target-dir=/backup12
xtrabackup --prepare --apply-log-only --target-dir=/backup1 --incremental-dir=/backup1/inc1
合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only
xtrabackup --prepare --target-dir=/backup1 --incrementaldir=/backup1/inc2
复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
xtrabackup --copy-back --target-dir=/backup1
还原属性
chown -R mysql.mysql /data/mysql
启动服务
systemctl start mysqld

  


3、MyCAT实现MySQL读写分离

准备环境:

systemctl stop firewalld
setenforce 0
时间同步
 
#准备4台服务器
10.0.0.7 为客服端
10.0.0.8 为mycat服务器
10.0.0.17 为mysql主服务器
10.0.0.18 为mysql从服务器

  

创建mysql主从数据库

#主节点配置
#server-id唯一不可重复
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
log-bin
server-id=#
 
#查看binlog文件位置
mysql> show master logs;
+--------------------+-----------+-----------+
| Log_name           | File_size | Encrypted |
+--------------------+-----------+-----------+
| centos7-bin.000005 |       180 | No        |
| centos7-bin.000006 |       157 | No        |
+--------------------+-----------+-----------+
2 rows in set (0.00 sec)
 
#创建复制账号
mysql> create user 'jiaoxw'@'10.0.0.%' identified create user 'jxw'@'10.0.0.%' identified with mysql_native_password by 'magedu';
mysql> grant replication slave on *.* to 'jiaoxw'@'10.0.0.%';
 
#从节点配置
[root@localhost ~]#vim /etc/my.cnf
[mysqld]
log-bin
server-id=#
 
#使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysql> change master to master_host='10.0.0.7',
    -> master_user='jiaoxw',
    -> master_password='magedu',
    -> master_port=3306,
    -> master_log_file='centos7-bin.000006',
    -> master_log_pos=157;
     
mysql> change master to master_host='10.0.0.7',master_user='jiaoxw',master_password='magedu',master_port=3306,master_log_file='centos7-bin.000006',master_log_pos=157;
 
mysql> start slave

  

安装并启动mycat

[root@localhost ~]#yum -y install java
[root@localhost ~]#wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
[root@localhost ~]#mkdir /apps
[root@localhost ~]#tar -xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps
#配置环境变量
[root@localhost ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@localhost ~]#source /etc/profile.d/mycat.sh
#启动
[root@localhost ~]#mycat start
#查看日志,确认成功
[root@localhost ~]#cat /apps/mycat/logs/wrapps.log
...省略...
INFO   | jvm 1    | 2022/06/04 13:48:11 | MyCAT Server startup successfully. see logs in logs/mycat.log
#连接mycat,默认密码为123456,默认端口为8066
[root@localhost ~]#mysql -uroot -p123456 -h127.0.0.1 -P8066

  

在mycat服务器上修改server.xml文件配置mycat连接信息

[root@localhost ~]#vim /apps/mycat/conf/server.xml
#删除注释,并修改下面行的8066改为3306
<property name="serverPort">3306</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<property name="authTimeout">15000</property>
<property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property> #5 * 60 * 1000L; //连接空闲检查 删除#后面此部分
<property name="frontWriteQueueSize">4096</property> <property
name="processors">32</property> #--> 删除#后面此部分
 .....
<user name="root">                                      #连接Mycat的用户名
   <property name="password">magedu</property>          #连接Mycat的密码
   <property name="schemas">TESTDB</property>           #数据库名要和schema.xml相对应

  

修改schema.xml实现读写分离策略

#修改后的读写分离策略
[root@localhost ~]#vim /apps/mycat/conf/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" />
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
   <heartbeat>select user()</heartbeat>
   <writeHost host="host1" url="10.0.0.17:3306" user="root" password="123456">
     <readHost host="host2" url="10.0.0.18:3306" user="root" password="123456" />
   </writeHost>
 </dataHost>
</mycat:schema>

  

在后端服务器创建用户并对mycat授权

[root@localhost ~]#mysql -uroot -p
mysql> create user 'root'@'10.0.0.%' identified with mysql_native_password by '123456';
mysql> grant all on *.* to 'root'@'10.0.0.%';
mysql> flush privileges;

  

在mycat服务器上连接测试

[root@localhost ~]#mysql -uroot -pmagedu -h127.0.0.1
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB;
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.00 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          18 |
+-------------+
1 row in set (0.00 sec)
mysql> select @@hostname;
+-------------+
| @@hostname  |
+-------------+
| centos8.org |
+-------------+
1 row in set (0.00 sec)

  

4、ansible常用模块介绍

ping模块:检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong

raw模块:执行原始的命令,而不是通过模块子系统。在任何情况下,使用shell或命令模块是合适的。给定原始的参数直接通过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变更处理程序支持

yum模块:这个模块是RedHat / CentOS作为远端节点的OS的时候,用的最多的。RedHat / CentOS包管理工具

使用`yum’软件包管理器管理软件包,其选项有:
– config_file:yum的配置文件 (optional)
– disable_gpg_check:关闭gpg_check (optional)
– disablerepo:不启用某个源 (optional)
– enablerepo:启用某个源(optional)
– name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
– state:状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除
apt模块:这个模块是ubuntu作为远端节点的OS的时候,用的最多的。Ubuntu/Debian的包管理工具

– deb: 用于安装远程机器上的.deb后缀的软件包(optional)
– install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
– update_cache: 当这个参数为yes的时候等于apt-get update(optional)
– name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
– state:状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除
pip模块:用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements

– chdir: 执行pip命令前cd进入的目录
– name:要安装的Python库的名称或远程包的URL。
– requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。
– version:指定的Python库的安装版本。
– extra_args:额外的参数传递给pip。
– executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。
– virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。
– virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。
– virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。
– state:状态(present,absent,latest, forcereinstall),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除
   forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。

synchronize模块:– 使用rsync同步文件,将主控方目录推送到指定节点的目录下,其参数如下:

– delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no
– src: 要同步到目的地的源主机上的路径; 路径可以是绝对的或相对的。如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制
– dest:目的地主机上将与源同步的路径; 路径可以是绝对的或相对的。
– dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。
– mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。
– rsync_opts:通过传递数组来指定其他rsync选项。

template模块:基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)

– backup: 如果原目标文件存在,则先备份目标文件
– src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
– dest:将模板渲染到远程机器上的位置。
force:是否强制覆盖,默认为yes
– owner:目标文件属主
– group:目标文件属组
– mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。

copy模块:在远程主机执行复制操作文件。

– src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/“来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
– content:用于替代"src”,可以直接设定指定文件的值
– dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
– directory_mode:递归的设定目录的权限,默认为系统默认权限
– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
– others:所有的file模块里的选项都可以在这里使用

user模块:user模块是请求的是useradd, userdel, usermod三个指令

– home:指定用户的家目录,需要与createhome配合使用。
– groups:指定用户的属组。
– uid:指定用的uid。
– password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。

– name:指定用户名。
– createhome:是否创建家目录 yes|no。
– system:是否为系统用户。
– remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
– state:是创建还是删除。(present,absent)
– shell:指定用户的shell环境。
– generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
– ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
– ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
– ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
– ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。

group模块:goup模块请求的是groupadd, groupdel, groupmod 三个指令

– gid:指定用的gid。
– name:指定用户名。
– state:是创建还是删除。(present,absent)
– system:如果是,则表示创建的组是系统组。

service模块:用于管理服务。

– arguments:给命令行提供一些选项
– enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。
– name:必选项,服务名称
– runlevel:运行级别
– sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
– state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

posted @   এ蓝桉、  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示