第十二周作业
第十二周作业
1、主从复制及主主复制的实现
2、xtrabackup实现全量+增量+binlog恢复库
3、MyCAT实现MySQL读写分离
4、ansible常用模块介
主从复制及主主复制实现
主从复制
构建实验环境
#master
ip:10.0.0.181
OS:centos8.3
DB:mysql 8
#slave
ip:10.0.0.182
OS:centos8.3
DB:mysql8.0
master配置,修改配置文件,设定server-id,开启bin_log
vim /etc/my.conf
---
[mysqld]
server-id=81
log-bin=/data/mysql_binlog/mysql_binlog
---
mkdir /data/mysql_binlog
chown mysql.mysql /data/mysql_binlog/
查询并记录当前bin_log position。
mysql> show master logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | |
| mariadb-bin.000002 | |
+--------------------+-----------+
2 rows in set (0.001 sec)
创建复制账号及赋权
mysql>
create user 'repluser'@'10.0.0.%';
grant replication slave on *.* to 'repluser'@'10.0.0.%';
从节点配置,修改conf文件
[mysqld]
server-id=82
log-bin=/data/mysql_binlog/mysql_binlog
read-only=on
连接master
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.181',
MASTER_USER='repluser',
MASTER_LOG_FILE='c8-181-bin.000002',
MASTER_LOG_POS=156;
启动
mystemctl restart mysql
mysql> start slave;
mysql> show slave status/G;
主主模式实现
在主从模式的基础上做修改:
181 conf 修改配置:
[mysqld]
server-id=81
log-bin=/data/mysql_binlog/bin_log
auto_increment_offset=1
auto_increment_increment=2
182 conf配置修改
[mysqld]
server-id=82
log-bin
auto_increment_offset=2
auto_increment_increment=2
#删除read-only
查看182 bin_logs
mysql> show master logs;
+-------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+-------------------+-----------+-----------+
| c8-182-bin.000001 | 179 | No |
| c8-182-bin.000002 | 644 | No |
+-------------------+-----------+-----------+
2 rows in set (0.00 sec)
181 chang master
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.182',
MASTER_USER='repluser',
MASTER_LOG_FILE='c8-182-bin.000002',
MASTER_LOG_POS=644;
mysql> start slave
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.181
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: c8-181-bin.000002
Read_Master_Log_Pos: 630
Relay_Log_File: c8-182-relay-bin.000002
Relay_Log_Pos: 799
Relay_Master_Log_File: c8-181-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试略
疑问:182主机的mysql并没有建立repluser用户,但是mysql.user中自动生成了repluser用户,master连接slave时自动生成的吗?
答案是,slave同步了master的用户创建,bin_log_pos是在创建repluser之前。如果在之后,则需要在slave上也创建用户并赋权,是否需要同名,未验证。
xtrabackup实现全量+增量+binlog恢复库、
实验环境
dbser
os:centos7
ip:10.0.0.172
backser
os:centos7
ip:10.0.0.173
安装软件
yum -y install mariadb-server
yum -y install epel-release
yum -y install percona-xtrabackup
[root@c7-172 ~]#rpm -qi percona-xtrabackup
Name : percona-xtrabackup
Version : 2.3.6
Release : 1.el7
Architecture: x86_64
[root@c7-172 ~]#rpm -qi mariadb
Name : mariadb
Epoch : 1
Version : 5.5.68
Release : 1.el7
Architecture: x86_64
dbser上备份
mkdir /backup/inc{1,2}
innobackup --backup --target-dir=/backup/1
#修改数据库
innobackupex --incremental /backup/inc1 --incremental-basedir=/backup/1/2022-06-14_03-53-16
#修改数据库
innobackupex --incremental /backup/inc2 --incremental-basedir=/backup/inc1/2022-06-14_04-09-43
scp -r /backup/* 10.0.0.173:/backup/
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| test1 |
| test2 |
| toc |
+-------------------+
9 rows in set (0.00 sec)
backser上恢复数据
#安装xtrabackup mariadb
innobackupex --apply-log --redo-only /backup/1/2022-06-14_03-53-16/
innobackupex --apply-log --redo-only /backup/1/2022-06-14_03-53-16/ --incremental-dir=/backup/inc1/2022-06-14_04-09-43
innobackupex --apply-log /backup/1/2022-06-14_03-53-16/ --incremental-dir=/backup/inc2/2022-06-14_04-13-19
rm -rf /var/lib/mysql/*
innobackupex --copy-back /backup/1/2022-06-14_03-53-16/
chown -R mysql.mysql /var/lib/mysql/
systemctl restart mariadb.service
mysql>
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| test1 |
| test2 |
| toc |
+-------------------+
9 rows in set (0.00 sec)
MyCAT实现MySQL读写分离
在上一题主从复制的基础上实现,增加主机:
ip:10.0.0.183
os:centos8.3
安装mycat,作为中间件
ip:10.0.0.173
os:centos7
安装mysql客户端
183配置
yum -y install java
[root@c8-183 ~]#wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-16.7.4-release-20200105164103-linux.tar.gz
[root@c8-183 ~]#tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
[root@c8-183 ~/mycat]#ls
bin catlet conf lib logs version.txt
[root@c8-183 ~/mycat]#vim /etc/profile.d/mycat.sh
---
mycat start
mycat已启动,客户端进行连接测试。作为一个中间件,客户端以为他是mysql。
[root@c7-173 ~]#mysql -uroot -p123456 -h 10.0.0.183 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
在mycat服务器上修改server.xml配置
此为连接相关,修改默认端口号和默认密码。注意删除注释
在mycat服务器上修改scheml.xml配置读写分离连接信息。
vim /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.81:3306" user="root"
password="123456">
<readHost host="host2" url="10.0.0.82:3306" user="root"
password="1i23456" />
</writeHost>
</dataHost>
</mycat:schema>
#####
hellodb是数据库中已有的数据库,被隐藏成TESTDB,隐藏真实的数据库名
在主数据库服务器上建立账号及授权
mysql> create user root@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
在客户端测试
[root@c7-173 ~]#mysql -uroot -pqwer1234 -h 10.0.0.183
略
ansible常用模块介
command
-a
如果有专用模块实现,最好就不用command调用shell命令,否则不具有幂等性。
command不支持重定向,不支持管道等,具有局限性。
creates
A filename or (since 2.0) glob pattern. If it already exists, this step *won't* be run.
[Default: (null)]
type: path
ansible webser -m shell -a "sed -i.bak 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.onf"
#不建议这种方式,可以使用replace
ansible webser -m replace -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen 8080" replace="Listen 80"'
ansible webser -m replace -a "path=/etc/httpd/conf/httpd.conf regexp='^(Listen 8080)' replace='Listen 80'"
ansible webser -m replace -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen 80' replace='Listen 8080'"
###
-a 后面用单引号双引号都可以
单引号时强应用,变量可以能会失效,所见即所得
双引号不会使变量失效
单双引号都支持正则表达式
shell
增强版command,支持管道和重定向,通配符
可以把默认模块改成shell,在ansible.cfg中修改。
script
本机的脚本,在远程主机执行。
copy
可以支持修改文件属性
owner
mode
backup
注意复制文件夹时是否加“/“
get_url
远程从http上下载文件到被控主机。
fetch
与copy相反。拉去远程主机文件到本机。
src
dest
不能抓目录,目录需要打包后抓取。
file
创建目录或者空文件,软连接;删除文件
src
path|name|dest
state=link
recurse=yes 递归
state=absent 删除文件
unarchive
copy+解压
支持网络下载+解压;get_url_+解压
copy=no 文件不在本机
copy=yes,文件在本机,从本机复制过去,默认值
stat
archive
打包
hostname
一般不批量执行,否则批量主机改为一个名字了。
corn
计划任务
yum和apt
先判断操作系统,是Ubuntu还是centos
state=absent 卸载包
enablerepo=epel
disablerepo=epel
查看包 list=packagename
yum_repository
直接写好yum.repo,然后批量拷贝也可以
service
管理服务
ansible webser -m service -a "name=httpd state=restarted"
user、group
管理用户,用户组
password是加密的。
lineinfile
类似sed,编辑修改文件
支持正则表达式
path
regexp,正则表达匹配文本,修改文件时,多行都满足,只取用最后一行。删除时,所匹配到的都会生效。
line
replace
类似于lineinfile,只替换
regexp所匹配到的都替换
mount
setup
收集主机的系统信息,经常会调用的模块。
setup的fact信息官方来源,写法?
debug
用来打印输出,方便debug。
msg后面可以自定义输出内容,可以包含变量
- debug:
msg: "{{result.stdout}}"
注意
msg必须要缩进在debug后面,msg不能与debug对齐。
debug的msg输出一般要指定键,否则会全部输出
指定输出内容: msg: "{{result.stdout}}"
,则只输出stdout键的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通