第十二周作业

第十二周作业

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;

image-20220613232051982

主主模式实现

在主从模式的基础上做修改:

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

image-20220614011904250

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配置

此为连接相关,修改默认端口号和默认密码。注意删除注释

image-20220614015912941

Snipaste_2022-06-14_01-26-02

在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输出一般要指定键,否则会全部输出

image-20220531045330681

指定输出内容: msg: "{{result.stdout}}",则只输出stdout键的值。

image-20220531045709763

image-20220531045727855

posted @   小布甲  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示