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

一、主节点
1.1修改master主节点的配置
[root@master ~]#vim /etc/my.cnf
[mysqld]
server_id=7
binlog_format=row
log-bin=/data/logbin/mysql-bin

1.2 建立二进制文件存放目录,修改所有者和所属组
[root@master ~]#mkdir /data/logbin/ -p
[root@master ~]#chown -R mysql.mysql /data/logbin/

1.3 重启数据库服务
[root@master ~]#systemctl restart mysqld

1.4 数据库完全备份
[root@master ~]#mysqldump -A -F -uroot -pMySQL@2022. --master-data=1 --single-transaction > /data/all.sql

1.5 创建复制用户并授权
MariaDB [mysql]> grant replication slave on . to repluser@'10.0.0.%' identified by '123456';

1.6 将备份复制到从节点
[root@master ~]#scp /data/all.sql 10.0.0.17:/data

二、从节点
2.1 修改slave从节点的配置
[root@slave ~]#vim /etc/my.cnf
[mysqld]
server_id=17
binlog_format=row
read_only=on
log-bin=/data/logbin/mysql-bin

2.2 建立二进制文件存放目录,修改所有者和所属组
[root@slave ~]#mkdir /data/logbin/ -p
[root@slave ~]#chown -R mysql.mysql /data/logbin/

2.3 重启数据库服务
[root@slave ~]#systemctl restart mysqld

2.4 从节点修改备份文件
[root@slave ~]#vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='10.0.0.7',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=328;

2.5关闭二进制日志
MariaDB [mysql]> set sql_log_bin=off;

2.6 导入备份数据
MariaDB [mysql]> source /data/all.sql

2.7查看从节点备份状态
MariaDB [mysql]> show slave status\G

2.8开启从节点slave进程,从节点开始复制
MariaDB [mysql]> start slave;

2.9 再次查看从节点备份状态
MariaDB [mysql]> show slave status\G

3.0 查看从节点的账号信息及数据库
MariaDB [mysql]> select user,host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| repluser | 10.0.0.% |
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
+-------------+-----------+
MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
+--------------------+

3.1从节点开启二进制日志
MariaDB [mysql]> set sql_log_bin=on;

MySQL主主复制的实现
环境准备:MySQL主主复制架构环境
master1 CentOS7.9-10.0.0.7 MariaDB-10.4.22
master2 CentOS7.9-10.0.0.17 MariaDB-10.4.22
一、master1节点
1.1修改master1的配置
[root@master1 ~]#cat /etc/my.cnf
[mysqld]
server_id=7
binlog_format=row
log-bin=/data/logbin/mysql-bin

1.2 建立二进制文件存放目录,修改所有者和所属组
[root@master1 ~]#mkdir /data/logbin/ -p
[root@master1 ~]#chown -R mysql.mysql /data/logbin/

1.3 重启数据库服务
[root@master1 ~]#systemctl restart mysqld

1.4 查看二进制位置
MariaDB [mysql]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+

1.5 创建复制用户并授权
MariaDB [mysql]> grant replication slave on . to repluser@'10.0.0.%' identified by '123456';
MariaDB [mysql]> FLUSH PRIVILEGES;

1.6 完成备份后再次查看二进制位置
MariaDB [mysql]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 656 |
+------------------+-----------+

1.7 确定同步master2的数据
MariaDB [mysql]> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.17',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;

1.8 开启master1进程,开始复制
MariaDB [mysql]> start slave;

1.9 查看master1备份状态
MariaDB [mysql]> show slave status\G

2.0 创建数据库db1
MariaDB [mysql]> create database db1;

2.1 查看master2 创建的db2数据
MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| db2 |
| information_schema |
| mysql |
| performance_schema |
+--------------------+

二、master2节点
2.1 修改master2的配置
[root@master2 ~]#cat /etc/my.cnf
[mysqld]
server_id=17
binlog_format=row
log-bin=/data/logbin/mysql-bin

2.2 建立二进制文件存放目录,修改所有者和所属组
[root@master2 ~]#mkdir /data/logbin/ -p
[root@master2 ~]#chown -R mysql.mysql /data/logbin/

2.3 重启数据库服务
[root@master2 ~]#systemctl restart mysqld

2.4 查看二进制位置
MariaDB [mysql]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+

2.5 确定同步master1的数据
MariaDB [mysql]> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.7',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;

2.6查看master2备份状态
MariaDB [mysql]> show slave status\G

2.7开启master2进程,开始复制
MariaDB [mysql]> start slave;

2.8 再次查看master2备份状态
MariaDB [mysql]> show slave status\G

2.9再次查看二进制位置
MariaDB [mysql]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+

3.0 查看master2的账号信息
MariaDB [mysql]> select user,host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| repluser | 10.0.0.% |
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
+-------------+-----------+

3.1 查看master1 创建的db1数据
MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| performance_schema |
+--------------------+

3.2 创建db2数据库
MariaDB [mysql]> create database db2;

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

  • 安装软件

[root@localhost ~]# yum install -y percona-xtrabackup-24-2.4.20-1.el8.x86_64.rpm

  • 进行备份操作

[root@localhost ~]# xtrabackup -uroot --backup --target-dir=/backup/
[root@localhost ~]# ll /backup/
total 18456
-rw-r----- 1 root root 431 Apr 17 23:18 backup-my.cnf
-rw-r----- 1 root root 18874368 Apr 17 23:18 ibdata1
drwxr-x--- 2 root root 4096 Apr 17 23:18 mysql
drwxr-x--- 2 root root 4096 Apr 17 23:18 performance_schema
drwxr-x--- 2 root root 122 Apr 17 23:18 test
-rw-r----- 1 root root 135 Apr 17 23:18 xtrabackup_checkpoints
-rw-r----- 1 root root 427 Apr 17 23:18 xtrabackup_info
-rw-r----- 1 root root 2560 Apr 17 23:18 xtrabackup_logfile
[root@localhost ~]# scp -r /backup/* 172.16.66.71:/backup/ #拷贝至远程服务器进行存放
恢复测试

  • 将远程服务器文件拷贝至需恢复数据库的服务器
    [root@localhost ~]# mkdir /backup
    [root@localhost ~]# scp -r /backup/* 172.16.66.71:/backup/
    [root@localhost ~]# xtrabackup --prepare --target-dir=/backup/
    [root@localhost ~]# xtrabackup --copy-back --target-dir=/backup/
    [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql

  • 恢复成功
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    | test |
    +--------------------+
    4 rows in set (0.00 sec)

  • 增量备份

[root@localhost ~]# xtrabackup -uroot --backup --target-dir=/backup/base
MariaDB [(none)]> CREATE DATABASE PTG123;
Query OK, 1 row affected (0.00 sec)
[root@localhost ~]# xtrabackup -uroot --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

  • 增量备份恢复

[root@centos8 ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base
[root@centos8 ~]#xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc1
[root@localhost ~]# xtrabackup --copy-back --target-dir=/backup/base
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# systemctl start mariadb

3、MyCAT实现MySQL读写分离

  • 安装mycat

[root@centos8 ~]# yum -y install java mariadb

[root@centos8 ~]# java -version

[root@centos8 ~]# 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@centos8 ~]# mkdir /apps

[root@centos8 ~]# tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps

[root@centos8 ~]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh

[root@centos8 ~]# . /etc/profile.d/mycat.sh

[root@centos8 ~]# mycat start

  • 配置mycat

[root@centos8 ~]# vim /apps/mycat/conf/server.xml
user name="root" #连接Mycat的用户名
property name="password">123456</property #连接Mycat的密码
property name="schemas">TESTDB</property #数据库名要和schema.xml相对应

[root@centos8 ~]# vim /apps/mycat/conf/schema.xml

[root@centos8 ~]# mycat restart

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

[root@centos8 ~]#mysql -uroot -p
mysql> create database mycat;
mysql> GRANT ALL ON . TO 'root'@'172.16.0.%' IDENTIFIED BY '123456' ;
mysql> flush privileges;

  • 在Mycat服务器上连接并测试

[root@centos8 ~]#mysql -uroot -p123456 -h127.0.0.1 -P8066
mysql> use TESTDB;
mysql> create table t1(id int);
MySQL> select @@server_id;
MySQL> select @@hostname;

4、ansible常用模块介绍

  • ping 模块

检查指定节点机器是否能连通,用法很简单,不涉及参数。如果被检测的主机在线,则返回pong

[root@localhost ~]# ansible 192.168.137.102 -m ping
192.168.137.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}

  • setup模块

setup模块用于收集远程主机的一些基本信息。

常用参数:
filter :用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

[root@localhost ~]# ansible 192.168.137.102 -m setup
不加选项会返回所有的信息。信息太多了 这里就不贴出来了。

获取ip地址
[root@localhost ~]# ansible 192.168.137.102 -m setup -a "filter=ansible_all_ipv4_addresses"
192.168.137.102 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.137.102"
]
},
"changed": false
}

获取是什么系统
[root@localhost ~]# ansible 192.168.137.102 -m setup -a "filter=ansible_distribution"
192.168.137.102 | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "CentOS"
},
"changed": false
}

其他常用的信息。
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。

  • command 模块

command 模块可以帮助我们在远程主机上执行命令,使用的时候可以不用 加 -m 指定。command 是ansible 默认使用的模块。 (可以在配置文件中修改默认模块)

default module name for /usr/bin/ansible
module_name = command
注意:使用command在远程主机执行命令的时候,不会经过shell处理。如果命令带有重定向,管道符等会失效。

[root@localhost ~]# ansible 192.168.137.102 -a 'uptime'
192.168.137.102 | SUCCESS | rc=0 >>
15:44:41 up 1:33, 2 users, load average: 0.00, 0.01, 0.05

[root@localhost ~]# ansible 192.168.137.102 -a 'ls /root/'
192.168.137.102 | SUCCESS | rc=0 >>
anaconda-ks.cfg

  • shell 模块

shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 程序处理。与command模块使用方法类似,只不过支持管道,重定向,变量符等等。由于command比较安全有可预知性,所以我们平时用的时候最好用command。command无法满足需求时,在使用shell。

[root@localhost ~]# ansible 192.168.137.102 -m shell -a 'netstat -lnpt|grep 3306'
192.168.137.102 | SUCCESS | rc=0 >>
tcp6 0 0 :::3306 ::😗 LISTEN 1410/mysqld
远程执行脚本:首先创建一个shell脚本
vim /tmp/test.sh 加入内容#!/bin/bash
echo date > /tmp/ansible_test.txt
然后把该脚本分发到各个机器上
ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"
最后是批量执行该shell脚本
ansible testhost -m shell -a "/tmp/test.sh"

  • file 模块

file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:

  =directory:如果目录不存在,就创建目录

 =file:即使文件不存在,也不会被创建

 = link:创建软链接

 =hard:创建硬链接

 =touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

  =absent:删除目录、文件或者取消链接文件

创建一个目录,如果目录存在,则不做任何操作。
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/ state=directory"

创建一个文件,如果文件存在,则更新文件时间,与touch命令相同
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/testfile state=touch"

创建软链接 path=是新目标路径,src 是源路径
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_link state=link src=/root/test/testfile"

创建硬链接
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_hard state=hard src=/root/test/testfile"

创建软链接时,如果重名 会强制覆盖。
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_link state=link src=/root/test/testfile force=yes"

删除远程文件或者是目录
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_hard state=absent"

创建文件时,指定属主或者修改属主
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_1 state=touch user=mysql"

创建文件时,指定属主或者修改属组
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_1 state=touch group=mysql"

创建文件或目录时,指定权限 或者修改权限
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/test_2 state=touch mode=0644"

递归修改属主
[root@localhost ~]# ansible 192.168.137.102 -m file -a "path=/root/test/ state=directory owner=mysql group=mysql recurse=yes"

​- copy 模块

功能:实现主控端向目标主机copy文件。

参数:
src : 主控端文件位置
dest : 要将源文件复制到远程机器的绝对路径,必选项。
owner : 文件复制过去后的所有者
group : 文件复制过去后的所属组
mode : 文件的权限设定,执行a+x这种方式
backup :在覆盖之前将源文件备份,备份文件包含时间信息。 如果与远程主机下的文件不一致,才会备份
directory_mode :递归设定目录的权限。

  • service 模块

用于远程机的服务管理。

该模块包含如下选项:​
arguments:给命令提供一些选项
​enabled:是否开机启动 yes|no
​name:必须选项,服务名称
​pattern: 定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为改服务依然在运行。
​runlevel:运行级别
​sleep:如果执行了restarted,则在stop和start之间沉睡几秒钟。
​state:对当前服务执行启动,停止,重启,重新加载等操作(started,stopped,restarted,reload)
"name=mysqld state=restarted sleep=20"

  • cron 计划任务模块
    Ansible cron模块主要用于添加、删除、更新操作系统的crontab任务计划
    cron模块使用详解:
    name:任务计划名称
    cron_file:替换客户端该用户的任务计划的文件
    minute:分(0-59, * ,/2)
    hour:时(0-23, * ,
    /2)
    day:日(1-31, * ,*/2)
    month:月(1-12, * , */2)
    weekday:周(0-6或1-7, *)
    job:任何计划执行的命令,state要等于present
    backup:是否备份之前的任务计划
    user:新建任务计划的用户
    state:指定任务计划present、absent

  • yum 模块

name参数:必须参数,用于指定需要管理的软件包,比如 nginx。
state参数:用于指定软件包的最终状态。present:表示安装,默认值。 latest:安装最新版本。absent:表示删除。​

例子:
安装httpd
[root@localhost ~]# ansible 192.168.137.102 -m yum -a 'name=httpd state=latest'
卸载
[root@localhost ~]# ansible 192.168.137.102 -m yum -a 'name=httpd state=absent'
​指定源安装
[root@localhost ~]# ansible 192.168.137.102 -m yum -a 'enablerepo=c7-dvd name=httpd'

  • get_url 模块

该模块主要用于从http,ftp,https,服务器上下载文件(类似于wget)

主要有如下选项:
timeout:下载超时时间,默认10S
url:下载URL
dest:下载文件存放的绝对路径

posted on 2022-03-03 16:21  ray0712  阅读(288)  评论(0)    收藏  举报