当前位置: 首页 > article >正文

基于keepalived+GTID半同步主从复制的高可用MySQL集群

文章目录

  • 项目架构图
  • 项目名称
  • 项目环境
  • 项目描述
  • ip地址规划
  • 项目步骤
  • 一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。
    • 1、关闭firewalld
    • 2.关闭seLinux
    • 3.配置每台主机静态ip地址
    • 4.设置每台主机对应的主机名
  • 二.部署ansible服务器,配置SSH免密通道(单向),编写主机清单,使用ansible以二进制方式通过脚本一键安装MySQL
    • 1、安装ansible
    • 2、建立免密通道,在ansible主机上生成密钥对
    • 3、上传公钥到MySQL集群服务器的root用户家目录下
    • 4、验证是否实现免密码密钥认证
    • 5、编写主机清单
    • 6、测试
    • 7、MySQL官网下载mysql的二进制包,编写好一键安装脚本
  • 三、在master服务器和ansible服务器之间建立双向的免密通道,方便同步数据
  • 四、部署4台MySQL服务器,一台master服务器,2台slave服务器,一台delay-backup延迟服务器,安装半同步相关的插件。
  • 五.使用mysqldump在master服务器上导出基础数据,scp远程同步到ansible服务器,通过ansible服务器下发到salve服务器。
  • 六、在slave服务器上使用mysql导入master服务器的基础数据
    • 1.slave服务器上直接导入
    • 2.使用ansible(shell模块)导入基础数据
  • 七、MySQL集群开启GTID功能,启动主从复制服务,配置好延迟备份服务器,从slave-1上拿二进制日志
    • 1、安装半同步复制插件
    • 2、修改master和salve配置文件
    • 3、在slave-1上操作(既是master的slave,也是delay-backup的master)
    • 4、在slave-2上操作
    • 5、配置好延迟备份服务器,从slave-1上拿二进制日志
    • 6、注意事项:如果 Slave_IO_Running、Slave_SQL_Running的状态是 NO
    • 7、测试
  • 八、部署mysql的failover插件(MHA),实现自动的故障切换,如果master宕机,能自动提升其中一台slave为新的master,其他slave到新的master上获得二进制日志
    • 1、安装MHA
      • 1、前提条件(准备好rpm包),MySQL集群都安装mha4mysql-node
      • 2、通过ansible使用rpm安装rpm包
      • 3、管理节点安装mha4mysql-manager,延迟服务器同时是管理节点
      • 4、建立免密通道
      • 5、创建监控用户(一台master和2台slave都要创建,delay-backup服务器不用)
    • 2、配置MHA
      • 1、创建工作目录
      • 2、在/usr/local/bin目录下创建脚本master_ip_failover(故障切换脚本,切换master的VIP地址)
      • 3、给脚本可执行权限
      • 4、在/etc/masterha下创建配置文件app1.cnf
      • 5、检查管理节点到所有Node节点的ssh连接状态
    • 6、检查复制环境
    • 7、检查管理节点的状态
    • 8、开启管理节点监控
    • 9、关闭master服务器的mysqld
    • 10、管理节点查看配置文件,会发现[server1]模块和user=root被删除了
  • 九、在master上创建一个计划任务每天凌晨3点进行数据库的备份,编写备份脚本,备份文件包含当天的日期,使用rsync+sersync远程同步到ansible服务器
    • 1、备份脚本
    • 2、部署rsync+sersync
      • 1、ansible服务器操作
      • 2、master服务器操作
    • 3、实现自动同步
  • 十、部署两台安装了mysqlrouter中间件软件的服务器,实现读写分离和高可用功能
    • 1、去官方网站下载rpm包,使用xftp上传到Linux里
    • 2、安装mysqlrouter
    • 3、修改配置文件
    • 4.启动MySQL router服务
    • 5.在master上创建2个账号,测试读写分离
    • 6.在客户端上测试读写分离的效果,使用2个测试账号
    • 7、实现高可用功能
    • 8、测试高可用
  • 十一、在两台mysql router服务器上安装keepalived软件,配置2个vrrp实例,互为主备,来实现双vip的高可用功能。
    • 1、安装keepalived
    • 2、router-1 修改配置文件
    • 3、router-2 修改配置文件
    • 4、 验证vip漂移
    • 5、测试使用vip连接

项目架构图

项目名称

项目环境

8台服务器(2G,2核)centos7.9、mysql5.7.41、mysqlrouter8.0.33、keepalived1.3.5、ansible2.9.27、sysbench-1.0.17

项目描述

目的是构建一个高可用的能实现读写分离的高性能MySQL集群,确保业务的稳定同时能批量的去部署和管理整个集群。

ip地址规划

HostnameIP Address
ansible192.168.0.14
master192.168.0.11
slave-1192.168.0.17
slave-2192.168.0.12
delay-backup192.168.0.13
mysqtrouter-1192.168.0.15
mysqtrouter-2192.168.0.16
test-client192.168.2.221

项目步骤

一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。

1、关闭firewalld

# 立即关闭firewalld
systemctl stop firewalld
 
# 设置firewalld开启不启动
systemctl disable firewalld
 
# 查看firewalld的状态
systemctl status firewalld

2.关闭seLinux

# 临时关闭seLinux
setenforce 0
 
# 永久关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
 
# 查看seLinux
getenforce 

3.配置每台主机静态ip地址

set -e
#!/bin/bash


#第1步:下载阿里云的centos-7.reop文件
cd  /etc/yum.repos.d

curl  -O http://mirrors.aliyun.com/repo/Centos-7.repo
#新建存放centos官方提供的repo文件,因为官方不提供服务了
mkdir  backup
mv  CentOS-*  backup
#安装一些经常使用的软件 vim  net-tools  
yum  install   vim   net-tools   tree  psmisc  -y

#第2步:修改主机名
hostnamectl  set-hostname  $1



#第3步:配置静态ip地址
cat  >/etc/sysconfig/network-scripts/ifcfg-ens33 <<EOF
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=$2
PREFIX=24
GATEWAY=$3
DNS1=114.114.114.114
DNS2=222.246.129.80
EOF

#启动网络服务
service  network  restart

#第4步: 关闭selinux和firewalld防火墙服务
systemctl stop  firewalld
systemctl disable firewalld

#修改/etc/selinux/config文件里的enforcing为disabled
sed  -i  '/SELINUX=/  s/enforcing/disabled/'  /etc/selinux/config 
#重启服务器
reboot

4.设置每台主机对应的主机名

hostnamectl set-hostname ansible
 
hostnamectl set-hostname master
 
hostnamectl set-hostname slave-1
 
hostnamectl set-hostname slave-2
 
hostnamectl set-hostname delay-backup
 
hostnamectl set-hostname mysqlrouter-1
 
hostnamectl set-hostname mysqlrouter-2
 
hostnamectl set-hostname test-client
 
su - root

二.部署ansible服务器,配置SSH免密通道(单向),编写主机清单,使用ansible以二进制方式通过脚本一键安装MySQL

1、安装ansible

yum install ansible -y

2、建立免密通道,在ansible主机上生成密钥对

[root@ansible .ssh]# ssh-keygen -t rsa

[root@ansible .ssh]# ls
id_rsa  id_rsa.pub

3、上传公钥到MySQL集群服务器的root用户家目录下

ssh-copy-id  -i id_rsa.pub root@192.168.0.11
ssh-copy-id  -i id_rsa.pub root@192.168.0.17
ssh-copy-id  -i id_rsa.pub root@192.168.0.12
ssh-copy-id  -i id_rsa.pub root@192.168.0.13

4、验证是否实现免密码密钥认证

[root@ansible .ssh]# ssh root@192.168.0.11
Last login: Tue Aug  1 11:12:38 2023
[root@master ~]# exit
登出
Connection to 192.168.0.11 closed.
[root@ansible .ssh]# ssh root@192.168.0.17
Last login: Tue Aug  1 11:12:58 2023
[root@slave-1 ~]# exit
登出
Connection to 192.168.0.17 closed.
[root@ansible .ssh]# ssh root@192.168.0.12
Last login: Tue Aug  1 11:13:07 2023
[root@slave-2 ~]# exit
登出
Connection to 192.168.0.12 closed.
[root@ansible .ssh]# ssh root@192.168.0.13
Last login: Tue Aug  1 11:13:23 2023
[root@delay-backup ~]# exit
登出
Connection to 192.168.0.13 closed.

5、编写主机清单

[root@ansible .ssh]# cd /etc/ansible
[root@ansible ansible]# ls
ansible.cfg  hosts  roles
[root@ansible ansible]# vim hosts 
[db]
192.168.0.11
192.168.0.17
192.168.0.12
192.168.0.13
 
[slave]
192.168.0.17
192.168.0.12
192.168.0.13

6、测试

[root@ansible ansible]# ansible db  -m shell -a "ip add"
192.168.0.17 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a0:46:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.17/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 85265sec preferred_lft 85265sec
    inet6 fe80::cbd1:6bd3:108f:e86e/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::3d73:75d:9f7a:924c/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e027:ebc3:6ae5:d5e7/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
192.168.0.12 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:6b:0e:a9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.12/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 83115sec preferred_lft 83115sec
    inet6 fe80::cbd1:6bd3:108f:e86e/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::3d73:75d:9f7a:924c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
192.168.0.13 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:fe:7a:e0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.13/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 83157sec preferred_lft 83157sec
    inet6 fe80::cbd1:6bd3:108f:e86e/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::3d73:75d:9f7a:924c/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e027:ebc3:6ae5:d5e7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
192.168.0.11 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:90:24:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 85257sec preferred_lft 85257sec
    inet6 fe80::cbd1:6bd3:108f:e86e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

7、MySQL官网下载mysql的二进制包,编写好一键安装脚本

[root@ansible ~]# ls
mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary_v2.sh
 
[root@ansible ~]# cat onekey_install_mysql_binary_v2.sh 
#!/bin/bash
 
#解决软件的依赖关系
yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel ncurses-compat-libs -y
 
#解压mysql二进制安装包
tar  xf  mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz
 
#移动mysql解压后的文件到/usr/local下改名叫mysql
mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql
 
#新建组和用户 mysql
groupadd mysql
 
#mysql这个用户的shell 是/bin/false 属于mysql组 
useradd -r -g mysql -s /bin/false mysql
 
#关闭firewalld防火墙服务,并且设置开机不要启动
systemctl  stop 	firewalld
systemctl  disable  firewalld
 
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
 
#新建存放数据的目录
mkdir  /data/mysql -p
#修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户可以对这个文件夹进行读写了
chown mysql:mysql /data/mysql/
#只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
chmod 750 /data/mysql/
 
#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/
 
#初始化mysql
./mysqld  --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql  &>passwd.txt
 
#让mysql支持ssl方式登录的设置
./mysql_ssl_rsa_setup --datadir=/data/mysql/
 
#获得临时密码,$NF表示最后一个字段,命令替换:$(命令)
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
 
# 修改PATH变量,加入mysql bin目录的路径
#临时修改PATH变量的值
export PATH=/usr/local/mysql/bin/:$PATH
#重新启动linux系统后也生效,永久修改
echo  'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc
 
#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp  ../support-files/mysql.server   /etc/init.d/mysqld
 
#修改/etc/init.d/mysqld脚本文件里的datadir目录的值
sed  -i '70c  datadir=/data/mysql'  /etc/init.d/mysqld
 
#生成/etc/my.cnf配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF
 
#修改内核的open file的数量
ulimit -n 1000000
#设置开机启动的时候配置也生效
echo "ulimit -n 1000000" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
 
#启动mysqld进程
service mysqld start
 
#将mysqld添加到linux系统里服务管理名单里
/sbin/chkconfig --add mysqld
#设置mysqld服务开机启动
/sbin/chkconfig mysqld on
 
#初次修改密码需要使用--connect-expired-password 选项
#-e 后面接的表示是在mysql里需要执行命令  execute 执行
#set password='Sanchuang123#';  修改root用户的密码为Sanchuang123#
mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='Sanchuang123#';"
 
#检验上一步修改密码是否成功,如果有输出能看到mysql里的数据库,说明成功。
mysql -uroot -p'Sanchuang123#'  -e "show databases;"

三、在master服务器和ansible服务器之间建立双向的免密通道,方便同步数据

[root@master ~]# ssh-keygen -t rsa
[root@master ~]# cd .ssh
[root@master .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub
[root@master .ssh]# ssh-copy-id  -i id_rsa.pub root@192.168.0.14
# 测试
[root@master .ssh]# ssh root@192.168.0.14
Last login: Tue Aug  1 11:12:29 2023
[root@ansible ~]# exit
# 登出
Connection to 192.168.0.14 closed.
[root@master .ssh]# 

四、部署4台MySQL服务器,一台master服务器,2台slave服务器,一台delay-backup延迟服务器,安装半同步相关的插件。

[root@ansible ~]# ansible db -m copy -a "src=/root/onekey_install_mysql_binary_v2.sh  dest=/root/ "
192.168.0.11 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "4d0492d9e7313f84092c386da4e8e4971779ec36", 
    "dest": "/root/onekey_install_mysql_binary_v2.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0a5d406e52205a0274cd89f9167d6610", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 3044, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860872.1-12092-6885179297673/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "4d0492d9e7313f84092c386da4e8e4971779ec36", 
    "dest": "/root/onekey_install_mysql_binary_v2.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0a5d406e52205a0274cd89f9167d6610", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 3044, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860872.46-12098-124732116956579/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.17 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "4d0492d9e7313f84092c386da4e8e4971779ec36", 
    "dest": "/root/onekey_install_mysql_binary_v2.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0a5d406e52205a0274cd89f9167d6610", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 3044, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860872.16-12094-264748168418124/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "4d0492d9e7313f84092c386da4e8e4971779ec36", 
    "dest": "/root/onekey_install_mysql_binary_v2.sh", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0a5d406e52205a0274cd89f9167d6610", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 3044, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860872.43-12096-172851883633782/source", 
    "state": "file", 
    "uid": 0
}
[root@ansible ~]# 
 
 
[root@ansible ~]# ansible db -m copy -a "src=/root/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz  dest=/root/ "
192.168.0.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "08b13fb151cf83d81e1254d42d522587730b84ad", 
    "dest": "/root/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "501a7f6f25246b178fef90321391891c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 678018165, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860896.32-12194-189907039350318/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.11 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "08b13fb151cf83d81e1254d42d522587730b84ad", 
    "dest": "/root/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "501a7f6f25246b178fef90321391891c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 678018165, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860896.26-12189-112504332061161/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "08b13fb151cf83d81e1254d42d522587730b84ad", 
    "dest": "/root/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "501a7f6f25246b178fef90321391891c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 678018165, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860896.29-12193-195272794525868/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.17 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "08b13fb151cf83d81e1254d42d522587730b84ad", 
    "dest": "/root/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "501a7f6f25246b178fef90321391891c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 678018165, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690860896.26-12191-279069254403413/source", 
    "state": "file", 
    "uid": 0
}
 
 
[root@ansible ~]# ansible db -m shell -a 'bash /root/onekey_install_mysql_binary_v2.sh'
192.168.0.13 | CHANGED | rc=0 >>
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
软件包 cmake-2.8.12.2-2.el7.x86_64 已安装并且是最新版本
软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 2:vim-enhanced-7.4.629-8.el7_9.x86_64 已安装并且是最新版本
软件包 lsof-4.87-6.el7.x86_64 已安装并且是最新版本
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
软件包 1:openssl-devel-1.0.2k-26.el7_9.x86_64 已安装并且是最新版本
没有可用软件包 ncurses-compat-libs。
无须任何处理
Starting MySQL.. SUCCESS! 
Database
information_schema
mysql
performance_schema
sysLogging to '/data/mysql/delay-backup.err'.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.0.17 | CHANGED | rc=0 >>
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.bfsu.edu.cn
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
软件包 cmake-2.8.12.2-2.el7.x86_64 已安装并且是最新版本
软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 2:vim-enhanced-7.4.629-8.el7_9.x86_64 已安装并且是最新版本
软件包 lsof-4.87-6.el7.x86_64 已安装并且是最新版本
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
软件包 1:openssl-devel-1.0.2k-26.el7_9.x86_64 已安装并且是最新版本
没有可用软件包 ncurses-compat-libs。
无须任何处理
Starting MySQL... SUCCESS! 
Database
information_schema
mysql
performance_schema
sysLogging to '/data/mysql/slave-1.err'.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.0.12 | CHANGED | rc=0 >>
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
软件包 cmake-2.8.12.2-2.el7.x86_64 已安装并且是最新版本
软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 2:vim-enhanced-7.4.629-8.el7_9.x86_64 已安装并且是最新版本
软件包 lsof-4.87-6.el7.x86_64 已安装并且是最新版本
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
软件包 1:openssl-devel-1.0.2k-26.el7_9.x86_64 已安装并且是最新版本
没有可用软件包 ncurses-compat-libs。
无须任何处理
Starting MySQL.. SUCCESS! 
Database
information_schema
mysql
performance_schema
sysLogging to '/data/mysql/slave-2.err'.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.0.11 | CHANGED | rc=0 >>
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.bfsu.edu.cn
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
软件包 cmake-2.8.12.2-2.el7.x86_64 已安装并且是最新版本
软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 2:vim-enhanced-7.4.629-8.el7_9.x86_64 已安装并且是最新版本
软件包 lsof-4.87-6.el7.x86_64 已安装并且是最新版本
软件包 bzip2-1.0.6-13.el7.x86_64 已安装并且是最新版本
软件包 1:openssl-devel-1.0.2k-26.el7_9.x86_64 已安装并且是最新版本
没有可用软件包 ncurses-compat-libs。
无须任何处理
Starting MySQL.. SUCCESS! 
Database
information_schema
mysql
performance_schema
sysLogging to '/data/mysql/master.err'.
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.

五.使用mysqldump在master服务器上导出基础数据,scp远程同步到ansible服务器,通过ansible服务器下发到salve服务器。

# 建库建表,插入一些数据
[root@master ~]# mysql -uroot -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.41 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
root@(none) 11:49  mysql>CREATE DATABASE TENNIS default character set utf8;
Query OK, 1 row affected (0.00 sec)
 
root@(none) 11:49  mysql>use TENNIS;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
root@TENNIS 11:50  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
 
root@TENNIS 11:50  mysql>CREATE   TABLE TEAMS
    ->         (TEAMNO         INTEGER      NOT NULL,
    ->          PLAYERNO       INTEGER      NOT NULL,
    ->          DIVISION       CHAR(6)      NOT NULL,
    ->          PRIMARY KEY    (TEAMNO)             )
    -> ;
Query OK, 0 rows affected (0.01 sec)
 
root@TENNIS 11:50  mysql>INSERT INTO TEAMS VALUES (1,  6, 'first'),(2, 27, 'second');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
root@TENNIS 11:50  mysql>select * from TEAMS;
+--------+----------+----------+
| TEAMNO | PLAYERNO | DIVISION |
+--------+----------+----------+
|      1 |        6 | first    |
|      2 |       27 | second   |
+--------+----------+----------+
2 rows in set (0.00 sec)
 
root@TENNIS 11:51  mysql>exit
Bye
 
# master服务器上导出基础数据
[root@master ~]# mysqldump -uroot -p'Sanchuang123#'  --all-databases  > /root/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master ~]# ls
all_db.sql
 
 
# scp远程同步到ansible服务器
root@master ~]# scp /root/all_db.sql  root@192.168.0.14:/root/
all_db.sql                                                                                                                                                                     100%  874KB  24.1MB/s   00:00    
[root@master ~]# 
 
#通过ansible下发到salve服务器
[root@ansible ~]# ls
all_db.sql  anaconda-ks.cfg  mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary_v2.sh  static_ip.sh
[root@ansible ~]# ansible db -m copy -a "src=/root/all_db.sql  dest=/root/ "
192.168.0.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "checksum": "b23510fc2d56012aa8a06c08517c38fcd0b85b7b", 
    "dest": "/root/all_db.sql", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/root/all_db.sql", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 895179, 
    "state": "file", 
    "uid": 0
}
192.168.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "b23510fc2d56012aa8a06c08517c38fcd0b85b7b", 
    "dest": "/root/all_db.sql", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0f0a31a6514212b0735dd62aac19e930", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 895179, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690862468.66-12380-216585534347340/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.17 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "b23510fc2d56012aa8a06c08517c38fcd0b85b7b", 
    "dest": "/root/all_db.sql", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0f0a31a6514212b0735dd62aac19e930", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 895179, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690862468.48-12378-85743988533689/source", 
    "state": "file", 
    "uid": 0
}
192.168.0.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "b23510fc2d56012aa8a06c08517c38fcd0b85b7b", 
    "dest": "/root/all_db.sql", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0f0a31a6514212b0735dd62aac19e930", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:admin_home_t:s0", 
    "size": 895179, 
    "src": "/root/.ansible/tmp/ansible-tmp-1690862468.71-12382-262895436169053/source", 
    "state": "file", 
    "uid": 0
}

六、在slave服务器上使用mysql导入master服务器的基础数据

1.slave服务器上直接导入

[root@slave-1 ~]# mysql -uroot -p"Sanchuang123#" <all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@slave-1 ~]# mysql -uroot -p"Sanchuang123#"

root@(none) 12:02  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
 
root@(none) 12:02  mysql>use TENNIS;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
root@TENNIS 12:02  mysql>select * from TEAMS;
+--------+----------+----------+
| TEAMNO | PLAYERNO | DIVISION |
+--------+----------+----------+
|      1 |        6 | first    |
|      2 |       27 | second   |
+--------+----------+----------+
2 rows in set (0.00 sec)
 
root@TENNIS 12:03  mysql>exit
Bye
[root@slave-1 ~]# 

2.使用ansible(shell模块)导入基础数据

[root@ansible ansible]# ansible slave -m shell -a 'mysql -uroot -p"Sanchuang123#" </root/all_db.sql'
192.168.0.13 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.0.17 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.0.12 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@ansible ansible]# 
 
验证slave服务器上是否有数据
[root@slave-2 ~]# mysql -uroot -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.41 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
root@(none) 12:04  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
 
root@(none) 12:05  mysql>use TENNIS;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
root@TENNIS 12:05  mysql>select * from TEAMS;
+--------+----------+----------+
| TEAMNO | PLAYERNO | DIVISION |
+--------+----------+----------+
|      1 |        6 | first    |
|      2 |       27 | second   |
+--------+----------+----------+
2 rows in set (0.00 sec)
 
root@TENNIS 12:05  mysql>exit
Bye
[root@slave-2 ~]# 

七、MySQL集群开启GTID功能,启动主从复制服务,配置好延迟备份服务器,从slave-1上拿二进制日志

1、安装半同步复制插件

master服务器上操作

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

salve服务器上操作

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

使用ansible的playbook在slave上,下载半同步复制插件和检查插件是否安装

[root@ansible ~]# vim slave.yaml 
[root@ansible ~]# cat slave.yaml 
- hosts: slave
  remote_user: root
  tasks:
  - name: install plugin
    shell: mysql -uroot -p'Sanchuang123#' -e "INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';"
  - name: check plugin
    shell: mysql -uroot -p'Sanchuang123#' -e "SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';"
[root@ansible ~]# ansible-playbook --syntax-check slave.yaml 
 
playbook: slave.yaml
[root@ansible ~]# ansible-playbook slave.yaml 
 
PLAY [slave] ****************************************************************************************************************************************************************************************************
 
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************
ok: [192.168.0.13]
ok: [192.168.0.17]
ok: [192.168.0.12]
 
TASK [install plugin] *******************************************************************************************************************************************************************************************
changed: [192.168.0.17]
changed: [192.168.0.12]
changed: [192.168.0.13]
 
TASK [check plugin] *********************************************************************************************************************************************************************************************
changed: [192.168.0.12]
changed: [192.168.0.17]
changed: [192.168.0.13]
 
PLAY RECAP ******************************************************************************************************************************************************************************************************
192.168.0.12               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.0.13               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.0.17               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
 
[root@ansible ~]# 

2、修改master和salve配置文件

在master上操作

[root@master ~]# cat /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
#开启二进制日志
log_bin
server_id = 1
 
#开启半同步功能
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000  # 1 second
 
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
 
 
# 重启服务
[root@master ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@master ~]# ps aux|grep mysqld
root       2755  0.0  0.0  11824  1608 pts/0    S    12:16   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/master.pid
mysql      2983  1.4 11.0 1554840 206728 pts/0  Sl   12:16   0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=master.err --open-files-limit=8192 --pid-file=/data/mysql/master.pid --socket=/data/mysql/mysql.sock --port=3306
root       3014  0.0  0.0 112824   988 pts/0    S+   12:16   0:00 grep --color=auto mysqld
 
# 在master上新建一个授权用户,给slave来复制二进制日志
grant replication slave on *.* to 'slave'@'192.168.0.%' identified by 'Sanchuang123#';
 
# 刷新权限
root@(none) 12:21  mysql>flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
#清空二进制日志
root@(none) 12:17  mysql>reset master;
Query OK, 0 rows affected (0.00 sec)
 
root@(none) 12:20  mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3、在slave-1上操作(既是master的slave,也是delay-backup的master)

# 安装半同步复制的主库插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 
 
[root@slave-1 ~]# cat /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
#开启二进制日志,二进制日志包含对数据库的所有更改(除了SELECT查询)
log_bin

# 指定服务器的唯一ID,在主从复制环境中,每个服务器必须有一个唯一的server_id
server_id = 2
 
#开启半同步功能

rpl_semi_sync_master_enabled=1 # 在主库上启用半同步复制。这意味着在提交事务之前,主库会等待至少一个从库确认它已经接收到了该事务的日志
rpl_semi_sync_master_timeout=1000  # 设置主库等待从库确认的时间,单位是毫秒,这里的设置为1000毫秒,即1秒,如果在这个时间内没有收到确认,主库将退回到异步复制模式
 
rpl_semi_sync_slave_enabled=1 # 在从库上启用半同步复制
log_slave_updates=ON # 如果从库也作为其他从库的主库(级联复制)
 
#开启GTID功能
gtid-mode=ON 	# 启用全局事务标识符(GTID)
enforce-gtid-consistency=ON		#强制GTID一致性,确保只有那些能够被安全地复制的事务被执行。
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
 
[root@slave-1 ~]# 
 
# 重启服务
service mysqld restart
 
# 在salve-1上新建一个授权用户,给delay-backup来复制二进制日志
grant replication slave on *.* to 'slave'@'192.168.0.%' identified by 'Sanchuang123#';
 
#清空二进制日志
reset slave all;
 
#填写master信息
change master to master_host='192.168.0.11', 
master_user='slave',
master_password='Sanchuang123#',
master_port=3306,
master_auto_position=1;
 
# 开启slave
root@(none) 12:23  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
 
root@(none) 12:23  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.11
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-1-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             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: 154
              Relay_Log_Space: 530
              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: 1
                  Master_UUID: c97dec66-301d-11ee-b9a8-000c299024d3
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
1 row in set (0.00 sec)
 
ERROR: 
No query specified

4、在slave-2上操作

[root@slave-2 ~]# cat /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
#开启二进制日志
log_bin
server_id = 3
 
#开启半同步功能
rpl_semi_sync_slave_enabled=1
log_slave_updates=ON
 
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
 
[root@slave-2 ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!
 
[root@slave-2 ~]# mysql -uroot -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
root@(none) 12:46  mysql>change master to master_host='192.168.0.11', 
    -> master_user='slave',
    -> master_password='Sanchuang123#',
    -> master_port=3306,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
 
root@(none) 12:47  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
 
root@(none) 12:47  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.11
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 600
               Relay_Log_File: slave-2-relay-bin.000002
                Relay_Log_Pos: 569
        Relay_Master_Log_File: master-bin.000001
             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: 600
              Relay_Log_Space: 778
              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: 1
                  Master_UUID: c97dec66-301d-11ee-b9a8-000c299024d3
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: c97dec66-301d-11ee-b9a8-000c299024d3:2
            Executed_Gtid_Set: c97dec66-301d-11ee-b9a8-000c299024d3:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)
 
ERROR: 
No query specified

5、配置好延迟备份服务器,从slave-1上拿二进制日志

[root@delay-backup ~]# cat /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
 
server_id = 4
 
#开启半同步功能
rpl_semi_sync_slave_enabled=1
log_slave_updates=ON
 
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
 
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
[root@delay-backup ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
 
change master to master_host='192.168.0.17', 
master_user='slave',
master_password='Sanchuang123#',
master_port=3306,
master_auto_position=1;
 
change master to master_delay = 600;
 
root@(none) 14:56  mysql>change master to master_host='192.168.0.17', 
    -> master_user='slave',
    -> master_password='Sanchuang123#',
    -> master_port=3306,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
 
root@(none) 14:57  mysql>change master to master_delay = 600;
Query OK, 0 rows affected (0.01 sec)
 
root@(none) 14:57  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
 
root@(none) 14:57  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.17
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: slave-1-bin.000002
          Read_Master_Log_Pos: 488
               Relay_Log_File: delay-backup-relay-bin.000003
                Relay_Log_Pos: 411
        Relay_Master_Log_File: slave-1-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: 194
              Relay_Log_Space: 1440
              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: 125
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: 2
                  Master_UUID: c2055faa-301d-11ee-b63a-000c29a0461c
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 600
          SQL_Remaining_Delay: 475
      Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: c2055faa-301d-11ee-b63a-000c29a0461c:1,
c97dec66-301d-11ee-b9a8-000c299024d3:1-2
            Executed_Gtid_Set: c97dec66-301d-11ee-b9a8-000c299024d3:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)
 
ERROR: 
No query specified

6、注意事项:如果 Slave_IO_Running、Slave_SQL_Running的状态是 NO

需要检查
1.检查配置文件是否打错

2.修改配置文件后是否重启MySQL服务

3.可能slave上的GTID编号比master上的还大

如果是第三种情况,清空二进制日志。

# master 上操作
# 清空二进制日志
reset  master;
 
# slave上操作
# 停止slave
stop slave;
 
# 清空二进制日志
reset slave all;
 
# 开启slave
start slave;

7、测试

# master上操作
root@(none) 14:59  mysql>create database han;
Query OK, 1 row affected (0.00 sec)
 
root@(none) 14:59  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| han                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
 
 
# slave-1和slave-2上查看
root@(none) 14:59  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| han                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
 
 
root@(none) 14:59  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| han                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
 
# delay-backup上查看
root@(none) 15:00  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

八、部署mysql的failover插件(MHA),实现自动的故障切换,如果master宕机,能自动提升其中一台slave为新的master,其他slave到新的master上获得二进制日志

1、安装MHA

1、前提条件(准备好rpm包),MySQL集群都安装mha4mysql-node

mha4mysql-node-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56-0.el6.noarch.rpm

2、通过ansible使用rpm安装rpm包

ansible db -m shell -a 'rpm -ivh  /root/mha4mysql-node-0.56-0.el6.noarch.rpm'

3、管理节点安装mha4mysql-manager,延迟服务器同时是管理节点

[root@delay-backup ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:mha4mysql-node-0.56-0.el6        ################################# [100%]
 
# 查看Node工具包
[root@delay-backup ~]# ll /usr/bin/{app*,filter*,purge*,save*}
-rwxr-xr-x. 1 root root 16367 41 2014 /usr/bin/apply_diff_relay_logs
-rwxr-xr-x. 1 root root  4807 41 2014 /usr/bin/filter_mysqlbinlog
-rwxr-xr-x. 1 root root  8261 41 2014 /usr/bin/purge_relay_logs
-rwxr-xr-x. 1 root root  7525 41 2014 /usr/bin/save_binary_logs
 
 
[root@delay-backup ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:mha4mysql-manager-0.56-0.el6     ################################# [100%]

4、建立免密通道

管理节点delay-backup要能免密登录主从复制的所有服务器,而不需要反向免密登录。主从复制的所有服务器之间要能免密登录。

ssh-keygen -t rsa
 
ssh-copy-id  -i id_rsa.pub root@192.168.0.%

5、创建监控用户(一台master和2台slave都要创建,delay-backup服务器不用)

grant all privileges on *.* to 'monitor'@'192.168.0.%' identified by '123456';
 
# 刷新权限
flush privileges;

2、配置MHA

1、创建工作目录

mkdir /etc/masterha
 
mkdir -p /var/log/masterha/app1

2、在/usr/local/bin目录下创建脚本master_ip_failover(故障切换脚本,切换master的VIP地址)

cd /usr/local/bin
 
[root@delay-backup bin]# vim master_ip_failover
#!/usr/bin/env perl
 
use strict;
use warnings FATAL =>'all';
use Getopt::Long;
my (
$command,          $ssh_user,        $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
);
 
my $vip = '192.168.0.200/24';  #这里需要改,漂移的VIP
my $key = "1";
my $ssh_start_vip = "/sbin/ip a add $vip dev ens33:$key";  #这两行需要修改,一行是临时添加IP,一行是临时删除IP
 
my $ssh_stop_vip = "/sbin/ip a del $vip dev ens33:$key";  #注意能够使用的命令是ip还是ifconfig,以及网卡名称
 
my $exit_code = 0;
GetOptions(
    'command=s'          => \$command,
    'ssh_user=s'         => \$ssh_user,
    'orig_master_host=s' => \$orig_master_host,
    'orig_master_ip=s'   => \$orig_master_ip,
    'orig_master_port=i' => \$orig_master_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
);
 
exit &main();
 
sub main {
    #print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
    if ( $command eq "stop" || $command eq "stopssh" ) {
        my $exit_code = 1;
        eval {
            print "\n\n\n***************************************************************\n";
            print "Disabling the VIP - $vip on old master: $orig_master_host\n";
            print "***************************************************************\n\n\n\n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {
        my $exit_code = 10;
        eval {
            print "\n\n\n***************************************************************\n";
            print "Enabling the VIP - $vip on new master: $new_master_host \n";
            print "***************************************************************\n\n\n\n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        `ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}
  
# A simple system call that enable the VIP on the new master
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
 
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub usage { 
    print "Usage: master_ip_failover –command=start|stop|stopssh|status –orig_master_host=host –orig_master_ip=ip –orig_master_port=port –new_master_host=host –new_master_ip=ip –new_master_port=port\n";
}

3、给脚本可执行权限

chmod 777 /usr/local/bin/master_ip_failover

4、在/etc/masterha下创建配置文件app1.cnf

[root@delay-backup bin]# vim /etc/masterha/app1.cnf
[server default]
# manager工作目录
manager_workdir=/var/log/masterha/app1
# manager日志目录
manager_log=/var/log/masterha/app1/manager.log
# MySQL的数据目录
master_binlog_dir=/data/mysql/
# 脚本(需要自己编写)
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
# MySQL管理帐号和密码
user=monitor
password=123456
# 监控间隔(秒)
ping_interval=1
remote_workdir=/tmp
# 复制帐号和密码
repl_user=xiaoh
repl_password=Sanchuang123#
report_script=/usr/local/send_report
#故障发生后关闭主机的脚本,不是必须的,但是你要设置为空
shutdown_script=""
ssh_user=root
 
#master节点
[server1]
hostname=192.168.0.11
port=3306
 
#salve节点
[server2]
hostname=192.168.0.17
port=3306
#设置为候选master,发生主从切换将会优先将此从库提升为主库,即使这个主库不是集群中事件最新的slave
#候选在切换的过程中一定是新的master,一定程度上也是可以加快切换的参数
candidate_master=1
check_repl_delay=0
 
[server3]
hostname=192.168.0.12
port=3306

5、检查管理节点到所有Node节点的ssh连接状态

[root@delay-backup .ssh]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
Mon Jul 31 21:35:26 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Jul 31 21:35:26 2023 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Mon Jul 31 21:35:26 2023 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Mon Jul 31 21:35:26 2023 - [info] Starting SSH connection tests..
Mon Jul 31 21:35:28 2023 - [debug] 
Mon Jul 31 21:35:26 2023 - [debug]  Connecting via SSH from root@192.168.2.221(192.168.2.221:22) to root@192.168.2.222(192.168.2.222:22)..
Mon Jul 31 21:35:27 2023 - [debug]   ok.
Mon Jul 31 21:35:27 2023 - [debug]  Connecting via SSH from root@192.168.2.221(192.168.2.221:22) to root@192.168.2.129(192.168.2.129:22)..
Mon Jul 31 21:35:27 2023 - [debug]   ok.
Mon Jul 31 21:35:29 2023 - [debug] 
Mon Jul 31 21:35:27 2023 - [debug]  Connecting via SSH from root@192.168.2.222(192.168.2.222:22) to root@192.168.2.221(192.168.2.221:22)..
Mon Jul 31 21:35:27 2023 - [debug]   ok.
Mon Jul 31 21:35:27 2023 - [debug]  Connecting via SSH from root@192.168.2.222(192.168.2.222:22) to root@192.168.2.129(192.168.2.129:22)..
Mon Jul 31 21:35:28 2023 - [debug]   ok.
Mon Jul 31 21:35:29 2023 - [debug] 
Mon Jul 31 21:35:27 2023 - [debug]  Connecting via SSH from root@192.168.2.129(192.168.2.129:22) to root@192.168.2.221(192.168.2.221:22)..
Mon Jul 31 21:35:28 2023 - [debug]   ok.
Mon Jul 31 21:35:28 2023 - [debug]  Connecting via SSH from root@192.168.2.129(192.168.2.129:22) to root@192.168.2.222(192.168.2.222:22)..
Mon Jul 31 21:35:28 2023 - [debug]   ok.
Mon Jul 31 21:35:29 2023 - [info] All SSH connection tests passed successfully.

6、检查复制环境

注意:报Binlog setting check failed!,可能是master服务器保存二进制日志文件地址填写错误。

[root@delay-backup .ssh]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Mon Jul 31 21:35:59 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Jul 31 21:35:59 2023 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Mon Jul 31 21:35:59 2023 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Mon Jul 31 21:35:59 2023 - [info] MHA::MasterMonitor version 0.56.
Mon Jul 31 21:36:01 2023 - [info] GTID failover mode = 1
Mon Jul 31 21:36:01 2023 - [info] Dead Servers:
Mon Jul 31 21:36:01 2023 - [info] Alive Servers:
Mon Jul 31 21:36:01 2023 - [info]   192.168.2.221(192.168.2.221:3306)
Mon Jul 31 21:36:01 2023 - [info]   192.168.2.222(192.168.2.222:3306)
Mon Jul 31 21:36:01 2023 - [info]   192.168.2.129(192.168.2.129:3306)
Mon Jul 31 21:36:01 2023 - [info] Alive Slaves:
Mon Jul 31 21:36:01 2023 - [info]   192.168.2.222(192.168.2.222:3306)  Version=5.7.41-log (oldest major version between slaves) log-bin:enabled
Mon Jul 31 21:36:01 2023 - [info]     GTID ON
Mon Jul 31 21:36:01 2023 - [info]     Replicating from 192.168.2.221(192.168.2.221:3306)
Mon Jul 31 21:36:01 2023 - [info]     Primary candidate for the new Master (candidate_master is set)
Mon Jul 31 21:36:01 2023 - [info]   192.168.2.129(192.168.2.129:3306)  Version=5.7.41-log (oldest major version between slaves) log-bin:enabled
Mon Jul 31 21:36:01 2023 - [info]     GTID ON
Mon Jul 31 21:36:01 2023 - [info]     Replicating from 192.168.2.221(192.168.2.221:3306)
Mon Jul 31 21:36:01 2023 - [info] Current Alive Master: 192.168.2.221(192.168.2.221:3306)
Mon Jul 31 21:36:01 2023 - [info] Checking slave configurations..
Mon Jul 31 21:36:01 2023 - [info]  read_only=1 is not set on slave 192.168.2.222(192.168.2.222:3306).
Mon Jul 31 21:36:01 2023 - [info]  read_only=1 is not set on slave 192.168.2.129(192.168.2.129:3306).
Mon Jul 31 21:36:01 2023 - [info] Checking replication filtering settings..
Mon Jul 31 21:36:01 2023 - [info]  binlog_do_db= , binlog_ignore_db= 
Mon Jul 31 21:36:01 2023 - [info]  Replication filtering check ok.
Mon Jul 31 21:36:01 2023 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln393] 192.168.2.129(192.168.2.129:3306): User xiaoh does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.
Mon Jul 31 21:36:01 2023 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations.  at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 1403.
Mon Jul 31 21:36:01 2023 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523] Error happened on monitoring servers.
Mon Jul 31 21:36:01 2023 - [info] Got exit code 1 (Not master dead).
 
MySQL Replication Health is NOT OK!

7、检查管理节点的状态

[root@delay-backup .ssh]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

8、开启管理节点监控

[root@delay-backup .ssh]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[2] 4243
 
[root@delay-backup .ssh]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
 
 
 
# 关闭管理节点监控(现在不操作,实验结束后可执行)
[root@delay-backup .ssh]# masterha_stop --conf=/etc/masterha/app1.cnf 
MHA Manager is not running on app1(2:NOT_RUNNING).
[2]-  退出 1                nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1

9、关闭master服务器的mysqld

[root@master .ssh]# systemctl stop mysqld
 
# 查看进程
[root@master .ssh]# ps aux|grep mysqld
root      18525  0.0  0.0 112824   988 pts/0    S+   21:39   0:00 grep --color=auto mysqld

10、管理节点查看配置文件,会发现[server1]模块和user=root被删除了

[root@delay-backup .ssh]# cat /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/data/mysql/
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123456
ping_interval=1
remote_workdir=/tmp
repl_user=xiaoh
repl_password=Sanchuang123#
report_script=/usr/local/send_report
shutdown_script=""
ssh_user=root
 
[server2]
hostname=192.168.0.17
port=3306
candidate_master=1
check_repl_delay=0
 
[server3]
hostname=192.168.0.12
port=3306
 
 
root@(none) 21:41  mysql>show master status\G;
*************************** 1. row ***************************
             File: slave-bin.000001
         Position: 1353
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 11039023-2ede-11ee-a775-000c29e03d59:1-3,
985f2117-2ede-11ee-a327-000c2962e8d0:1-3
1 row in set (0.00 sec)
 
ERROR: 
No query specified

九、在master上创建一个计划任务每天凌晨3点进行数据库的备份,编写备份脚本,备份文件包含当天的日期,使用rsync+sersync远程同步到ansible服务器

1、备份脚本

# 编写脚本
[root@master ~]# cat backup_db.sh 
#!/bin/bash
 
#新建一个目录
mkdir -p /backup/
 
#导出数据库的所有数据
mysqldump -uroot -p'Sanchuang123#'  --all-databases  > /backup/$(date +%Y%m%d%H%M%S)-all_db.sql
 
# 创建计划任务
[root@master ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@master ~]# crontab -l
0 3 * * * bash /backup/backup_db.sh
 
[root@master ~]# mkdir backup
[root@master ~]# mv backup_db.sh /backup
[root@master ~]# cd /backup
[root@master backup]# ls
backup_db.sh

2、部署rsync+sersync

1、ansible服务器操作

# 1、关闭 selinux 
setenforce 0
 
vim /etc/selinux/config
SELINUX=disabled   # 修改
 
# 2、关闭防火墙
systemctl stop firewalld
 
# 3、安装rsync服务端软件
[root@ansible ~]# yum install rsync xinetd -y
 
# 4.设置开启启动
[root@ansible ~]# vim /etc/rc.d/rc.local
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
 
# 5.给予可执行权限,否则重启不执行
[root@ansible ~]# chmod +x /etc/rc.d/rc.local 
[root@ansible ~]# ll /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 523 81 15:08 /etc/rc.d/rc.local
 
# 6.创建rsyncd.conf配置文件
[root@ansible ~]# vim /etc/rsyncd.conf 
uid = root
gid = root
use chroot = yes
max connections = 0
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
secrets file = /etc/rsync.pass  
motd file = /etc/rsyncd.Motd
[back_data]    #配置项名称(自定义)
    path = /backup      #备份文件存储地址
    comment = A directory in which data is stored
    ignore errors = yes
    read only = no
    hosts allow = 192.168.0.11  #允许的ip地址(数据源服务器地址)master
 
[root@ansible ~]# mkdir -p /backup
 
 
# 7.创建用户认证文件
配置文件,添加以下内容,添加允许传输用户和密码
[root@ansible ~]# vim /etc/rsync.pass
[root@ansible ~]# cat /etc/rsync.pass 
sc:sc123456  # 格式,用户名:密码,可以设置多个,每行一个用户名:密码
 
# 8.设置文件权限
chmod 600 /etc/rsyncd.conf  #设置文件所有者读取、写入权限
chmod 600 /etc/rsync.pass   #设置文件所有者读取、写入权限
 
[root@ansible ~]# ll  /etc/rsync.pass
-rw-------. 1 root root 12 81 15:11 /etc/rsync.pass
[root@ansible ~]# ll  /etc/rsyncd.conf
-rw-------. 1 root root 928 81 15:10 /etc/rsyncd.conf
 
 
# 9.启动rsync、xinetd
[root@ansible ~]# /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
[root@ansible ~]# ps aux|grep rsync
root      12800  0.0  0.0 114852   572 ?        Ss   15:13   0:00 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
root      12802  0.0  0.0 112824   980 pts/0    S+   15:13   0:00 grep --color=auto rsync
 
[root@ansible ~]# systemctl start xinetd
[root@ansible ~]# ps aux |grep xinetd
root      17488  0.0  0.0  25044   588 ?        Ss   00:35   0:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
root      17491  0.0  0.0 112824   984 pts/0    S+   00:36   0:00 grep --color=auto xinetd
 
# 10.查看rsync监听的端口号
[root@ansible ~]# netstat -anplut|grep rsync
-bash: netstat: 未找到命令
[root@ansible ~]# yum install net-tools -y
 
[root@ansible ~]# netstat -anplut|grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      12800/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      12800/rsync     
 
[root@ansible ~]# ss -anpult|grep rsync
tcp    LISTEN     0      5         *:873                   *:*                   users:(("rsync",pid=12800,fd=4))
tcp    LISTEN     0      5      [::]:873                [::]:*                   users:(("rsync",pid=12800,fd=5))

2、master服务器操作

# 1.检查firewalld和selinux是否关闭
systemctl status firewalld 
 
getenforce
 
# 2.安装rsync软件
[root@master ~]# yum install rsync xinetd -y
 
# 3.设置开启启动
[root@master ~]# vim /etc/rc.d/rc.local
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
 
# 4.给予可执行权限,否则重启不执行
[root@master ~]# chmod +x /etc/rc.d/rc.local 
[root@master backup]# ll  /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 541 81 15:15 /etc/rc.d/rc.local
 
# 5.创建rsyncd.conf配置文件
[root@master ~]# vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
motd file = /etc/rsyncd.Motd
[Sync]
    comment = Sync
    uid = root
    gid = root
    port= 873
 
# 6.启动xinetd(CentOS中是以xinetd来管理rsync服务的)
[root@master ~]# systemctl start xinetd 
[root@master ~]# ps aux|grep xinetd
root      16076  0.0  0.0  25044   584 ?        Ss   15:15   0:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
root      16089  0.0  0.0 112824   988 pts/0    S+   15:17   0:00 grep --color=auto xinetd
 
# 7.创建认证密码文件
[root@master ~]# vim /etc/passwd.txt  #编辑文件,添加以下内容,该密码应与目标服务器中的/etc/rsync.pass中的密码一致  
[root@master ~]# cat /etc/passwd.txt  
sc123456
 
[root@master ~]# chmod 600 /etc/passwd.txt   #设置文件权限,只设置文件所有者具有读取、写入权限即可  
[root@master ~]# ll  /etc/passwd.txt
-rw-------. 1 root root 9 81 15:18 /etc/passwd.txt
 
# 8.测试数据同步
master服务器到ansible服务器之间的数据同步
[root@master backup]# rsync -avH --port=873 --progress --delete  /backup  root@192.168.0.14::back_data --password-file=/etc/passwd.txt
 
sending incremental file list
backup/
backup/backup_db.sh
            204 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/4)
 
sent 1035 bytes  received 77 bytes  8,224.00 bytes/sec
total size is 1762  speedup is 0.41
 

3、实现自动同步

# inotify已经默认在内核里安装了,不需要安装
# 1、修改inotify默认参数
[root@master ~]#sysctl -w fs.inotify.max_queued_events="99999999"
fs.inotify.max_queued_events = 99999999
 
[root@master ~]# sysctl -w fs.inotify.max_user_watches="99999999"
fs.inotify.max_user_watches = 99999999
 
[root@master ~]# sysctl -w fs.inotify.max_user_instances="65535"
fs.inotify.max_user_instances = 65535
 
[root@master ~]# vim /etc/sysctl.conf  
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
 
# 2、安装sersync
[root@master ~]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
 
#解压
[root@master ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz 
#移动目录到/usr/local/sersync
[root@master ~]# mv GNU-Linux-x86/ /usr/local/sersync
 
#进入sersync安装目录
[root@master ~]# cd /usr/local/sersync/
[root@master sersync]# ls
confxml.xml  sersync2
 
# 备份配置文件
[root@master sersync]# cp confxml.xml confxml.xml.bak
[root@masterl sersync]# cp confxml.xml data_configxml.xml
[root@master sersync]# ls
confxml.xml  confxml.xml.bak  data_configxml.xml  sersync2
 
# 3、修改配置文件data_configxml.xml 
[root@master sersync]# vim data_configxml.xml
# 第24行后的配置
       
       <localpath watch="/backup">            		 		# 本地数据源路径             
		<remote ip="192.168.0.14" name="back_data"/>        # 备份服务器地址信息
       </localpath>
          <rsync>
             <commonParams params="-artuz"/>
             <auth start="true" users="root" passwordfile="/etc/passwd.txt"/>        # 启用身份验证,密码文件路径"/etc/passwd.txt"
             <userDefinedPort start="false" port="874"/><!-- port=874 -->
             <timeout start="false" time="100"/><!-- timeout=100 -->
           <ssh start="false"/>
    	  </rsync>
 
 
 
# 4、修改环境变量
[root@master sersync]# PATH=/usr/local/sersync/:$PATH
[root@master sersync]# echo 'PATH=/usr/local/sersync/:$PATH'  >>/root/.bashrc 
 
# 5.启动服务
[root@master sersync]# sersync2 -d -r -o  /usr/local/sersync/data_configxml.xml
 
# 6、设置sersync开机自动执行
[root@master backup]# vim /etc/rc.local 
/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/data_configxml.xml

十、部署两台安装了mysqlrouter中间件软件的服务器,实现读写分离和高可用功能

1、去官方网站下载rpm包,使用xftp上传到Linux里

1.去官方网站下载rpm包,使用xftp上传到Linux里
[root@mysqlrouter-1 ~]# ls
anaconda-ks.cfg  mysql-router-community-8.0.33-1.el7.x86_64.rpm
 
[root@mysqlrouter-1 ~]# scp mysql-router-community-8.0.33-1.el7.x86_64.rpm  root@192.168.0.16:/root/
The authenticity of host '192.168.0.16 (192.168.0.16)' can't be established.
ECDSA key fingerprint is SHA256:l7LRfACELrI6mU2XvYaCz+sDBWiGkYnAecPgnxJxdvE.
ECDSA key fingerprint is MD5:b6:f7:e1:c5:23:24:5c:16:1f:66:42:ba:80:a6:3c:fd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.16' (ECDSA) to the list of known hosts.
root@192.168.0.16's password: 
mysql-router-community-8.0.33-1.el7.x86_64.rpm                                                                                                                                 100% 5113KB  10.8MB/s   00:00    
[root@mysqlrouter-1 ~]# 
 
[root@mysqlrouter-2 ~]# ls
anaconda-ks.cfg  mysql-router-community-8.0.33-1.el7.x86_64.rpm


2、安装mysqlrouter

[root@mysqlrouter-1 ~]# rpm -ivh mysql-router-community-8.0.33-1.el7.x86_64.rpm 
警告:mysql-router-community-8.0.33-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-router-community-8.0.33-1.e################################# [100%]
 
[root@mysqlrouter-2 ~]# rpm -ivh mysql-router-community-8.0.33-1.el7.x86_64.rpm 
警告:mysql-router-community-8.0.33-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-router-community-8.0.33-1.e################################# [100%]

3、修改配置文件

[root@mysql-router-1 ~]# cd /etc/mysqlrouter/  # 进入存放配置文件的目录
[root@mysql-router-1 mysqlrouter]# ls
mysqlrouter.conf
[root@mysqlrouter-1 mysqlrouter]# vim mysqlrouter.conf 
[root@mysqlrouter-1 mysqlrouter]# cat mysqlrouter.conf |grep -v "^#"
 
 
[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /run/mysqlrouter
config_folder = /etc/mysqlrouter
 
[logger]
level = INFO
 
 
[routing:slaves]
bind_address = 192.168.0.15:7001 # MySQL Router将监听IP地址 192.168.0.15 的端口 7001
destinations = 192.168.0.17:3306,192.168.0.12:3306,192.168.0.13:3306 # 列出了多个从库的地址和端口号(默认MySQL端口为3306
mode = read-only		# 指定此路由模式为只读模式,适用于处理查询类操作
connect_timeout = 1		# 设置连接超时时间为1秒
 
[routing:masters]
bind_address = 192.168.0.15:7002	#  MySQL Router将监听IP地址 192.168.0.15 的端口 7002,用于接收来自客户端的读写请求
destinations = 192.168.0.11:3306	# 指定此路由模式为读写模式
mode = read-write
connect_timeout = 1		# 同样设置了连接超时时间为1秒
 
[keepalive]
interval = 60		# 设置保持活动检测的时间间隔为60秒。这有助于检测并断开不活跃的连接,从而释放资源

4.启动MySQL router服务

[root@mysql-router-1 ~]# service mysqlrouter start
Redirecting to /bin/systemctl start mysqlrouter.service
 
mysqlrouter监听了7001和7002端口
[root@mysql-router-1 ~]# netstat -anplut|grep mysql
tcp        0      0 192.168.2.106:7001      0.0.0.0:*               LISTEN      2258/mysqlrouter    
tcp        0      0 192.168.2.106:7002      0.0.0.0:*               LISTEN      2258/mysqlrouter    

5.在master上创建2个账号,测试读写分离

root@(none) 15:34  mysql>grant all on *.*  to 'write'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
root@(none) 15:35  mysql>grant select on *.*  to 'read'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.01 sec)

6.在客户端上测试读写分离的效果,使用2个测试账号

实现读功能
[root@sc ~]# mysql -h 192.168.0.15 -P 7001 -u read -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
read@(none) 16:45  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wang               |
+--------------------+
5 rows in set (0.02 sec)
 
read@(none) 16:45  mysql>use wang;
Database changed
read@wang 16:45  mysql>show tables;
Empty set (0.01 sec)
 
read@wang 16:45  mysql>create table t1;
ERROR 1142 (42000): CREATE command denied to user 'read'@'192.168.2.223' for table 't1'
read@wang 16:45  mysql>
 
实现写功能
[root@delay-backup ~]# mysql -h 192.168.0.15 -P 7002 -uwrite -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
write@(none) 16:46  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| mysql              |
| performance_schema |
| sys                |
| wang               |
+--------------------+
6 rows in set (0.01 sec)
 
write@(none) 16:46  mysql>use wang;
Database changed
 
write@wang 16:46  mysql>create table t1(id int,name varchar(10));
Query OK, 0 rows affected (0.03 sec)
 
write@wang 16:46  mysql>show tables;
+----------------+
| Tables_in_wang |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)
 
write@wang 16:46  mysql>insert into t1 values(1,'hello'),(2,'world');
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
write@wang 16:47  mysql>desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
 
write@wang 16:47  mysql>select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | hello |
|    2 | world |
+------+-------+
2 rows in set (0.00 sec)

7、实现高可用功能

[root@mysqlrouter-1 mysqlrouter]# vim mysqlrouter.conf 
[root@mysqlrouter-1 mysqlrouter]# cat mysqlrouter.conf |grep -v "^#"
 
 
[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /run/mysqlrouter
config_folder = /etc/mysqlrouter
 
[logger]
level = INFO
 
[routing:slaves]
bind_address = 0.0.0.0:7001
destinations = 192.168.0.17:3306,192.168.0.12:3306,192.168.0.13:3306
mode = read-only
connect_timeout = 1
 
[routing:masters]
bind_address = 0.0.0.0:7002
destinations = 192.168.0.11:3306
mode = read-write
connect_timeout = 1
 
[keepalive]
interval = 60
 
[root@mysqlrouter-1 ~]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
 
[root@mysqlrouter-1 ~]# ss -anplut|grep mysqlrouter
tcp    LISTEN     0      128       *:7001                  *:*                   users:(("mysqlrouter",pid=11961,fd=11))
tcp    LISTEN     0      128       *:7002                  *:*                   users:(("mysqlrouter",pid=11961,fd=10))
 
 
 
[root@mysqlrouter-2 mysqlrouter]# cat mysqlrouter.conf |grep -v "^#"
 
 
[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /run/mysqlrouter
config_folder = /etc/mysqlrouter
 
[logger]
level = INFO
 
[routing:slaves]
bind_address = 0.0.0.0:7001
destinations = 192.168.0.17:3306,192.168.0.12:3306,192.168.0.13:3306
mode = read-only
connect_timeout = 1
 
[routing:masters]
bind_address = 0.0.0.0:7002
destinations = 192.168.0.11:3306
mode = read-write
connect_timeout = 1
 
[keepalive]
interval = 60
 
[root@mysqlrouter-2 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
 
[root@mysqlrouter-2 mysqlrouter]# ss -anplut|grep mysqlrouter
tcp    LISTEN     0      128       *:7001                  *:*                   users:(("mysqlrouter",pid=2238,fd=14))
tcp    LISTEN     0      128       *:7002                  *:*                   users:(("mysqlrouter",pid=2238,fd=15))

8、测试高可用

[root@test-client ~]# mysql -h 192.168.0.15 -P 7002 -uwrite -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
write@(none) 16:54  mysql>exit
Bye
[root@test-client ~]# mysql -h 192.168.0.15 -P 7001 -uread -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.41 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
read@(none) 16:54  mysql>exit
Bye

十一、在两台mysql router服务器上安装keepalived软件,配置2个vrrp实例,互为主备,来实现双vip的高可用功能。

1、安装keepalived

# 1.安装keepalived
yum install keepalived -y

2、router-1 修改配置文件

[root@mysqlrouter-1 ~]# cd /etc/keepalived/
[root@mysqlrouter-1 keepalived]# ls
keepalived.conf
 
[root@mysqlrouter-1 keepalived]# vim keepalived.conf 
[root@mysqlrouter-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.185
    }
}
vrrp_instance VI_2 {
    state backup
    interface ens33
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.186
    }
}
 
[root@mysqlrouter-1 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
 
[root@mysqlrouter-1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3c:cd:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.15/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 66132sec preferred_lft 66132sec
    inet 192.168.0.185/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::cbd1:6bd3:108f:e86e/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::3d73:75d:9f7a:924c/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e027:ebc3:6ae5:d5e7/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
 


3、router-2 修改配置文件

[root@mysqlrouter-2 ~]# cd /etc/keepalived/
[root@mysqlrouter-2 keepalived]# ls
keepalived.conf
 
[root@mysqlrouter-1 keepalived]# vim keepalived.conf 
[root@mysqlrouter-2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state backup
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.185
    }
}
vrrp_instance VI_2 {
    state master
    interface ens33
    virtual_router_id 100
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.186
    }
}
 
 
[root@mysqlrouter-2 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
 
[root@mysqlrouter-2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:97:5c:6f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.16/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 66196sec preferred_lft 66196sec
    inet 192.168.0.186/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe97:5c6f/64 scope link 
       valid_lft forever preferred_lft forever

4、 验证vip漂移

[root@mysqlrouter-1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
 
[root@mysqlrouter-2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:97:5c:6f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.16/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
       valid_lft 66086sec preferred_lft 66086sec
    inet 192.168.0.186/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.0.185/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe97:5c6f/64 scope link 
       valid_lft forever preferred_lft forever

5、测试使用vip连接

[root@test-client ~]# mysql -h 192.168.0.186 -P 7002 -uwrite -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
write@(none) 16:53  mysql>exit
Bye
[root@test-client ~]# mysql -h 192.168.0.185 -P 7001 -uread -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.41-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
read@(none) 16:53  mysql>exit
Bye




http://www.kler.cn/a/534629.html

相关文章:

  • 博客园-awescnb插件-geek皮肤优化-Markdown样式支持
  • systemverilog的program和module的区别
  • iOS 老项目适配 #Preview 预览功能
  • 旋钮屏设备物联网方案,ESP32-C3无线通信应用,助力设备智能化升级
  • Ollama本地搭建大模型
  • GitHub Copilot 越狱漏洞
  • python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理
  • 报错解决方案笔记01
  • 为什么使用nohup 和 启动的python脚本,日志没有在nohup.out中
  • 迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写应用APP
  • 【ROS视频推流】使用web_video_server完成视频推流
  • LLMs之data:synthetic-data-generator的简介、安装和使用方法、案例应用之详细攻略
  • Ubuntu24登录PostgreSql数据库的一般方法
  • 常用的TS类型工具
  • lambda表达式写java比较器
  • deepseek技术细节1
  • 线程池如何知道一个线程的任务已经执行完成
  • 调用腾讯云批量文本翻译API翻译srt字幕
  • Text2Sql:开启自然语言与数据库交互新时代(3030)
  • postgresql-COALESCE函数、NULLIF函数、NVL函数使用
  • 腾讯云 TI 平台部署与调用DeepSeek-R1大模型的实战指南
  • docker常用基础
  • 【极简模式】deepseek文案+剪映图文成片
  • 使用媒体查询确保网页能够在手机、平板和电脑上正常浏览
  • AI回答 | spring,springboot,spring MVC,servlet, spring web之间的联系与支持
  • Java面试:a+=a-=aa原理解析