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

文章目录

项目架构图

项目名称

项目环境

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

项目描述

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

ip地址规划

Hostname IP Address
ansible 192.168.0.14
master 192.168.0.11
slave-1 192.168.0.17
slave-2 192.168.0.12
delay-backup 192.168.0.13
mysqtrouter-1 192.168.0.15
mysqtrouter-2 192.168.0.16
test-client 192.168.2.221

项目步骤

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

1、关闭firewalld

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

2.关闭seLinux

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

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

bash 复制代码
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.设置每台主机对应的主机名

bash 复制代码
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

bash 复制代码
yum install ansible -y

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

bash 复制代码
[root@ansible .ssh]# ssh-keygen -t rsa

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

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

bash 复制代码
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、验证是否实现免密码密钥认证

bash 复制代码
[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、编写主机清单

bash 复制代码
[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、测试

bash 复制代码
[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的二进制包,编写好一键安装脚本

bash 复制代码
[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服务器之间建立双向的免密通道,方便同步数据

bash 复制代码
[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延迟服务器,安装半同步相关的插件。

bash 复制代码
[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服务器。

bash 复制代码
# 建库建表,插入一些数据
[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服务器上直接导入

bash 复制代码
[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模块)导入基础数据

bash 复制代码
[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服务器上操作

bash 复制代码
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

salve服务器上操作

bash 复制代码
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

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

bash 复制代码
[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上操作

bash 复制代码
[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)

bash 复制代码
# 安装半同步复制的主库插件
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上操作

bash 复制代码
[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上拿二进制日志

bash 复制代码
[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

bash 复制代码
需要检查
1.检查配置文件是否打错

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

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

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

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

7、测试

bash 复制代码
# 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

bash 复制代码
mha4mysql-node-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56-0.el6.noarch.rpm

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

bash 复制代码
ansible db -m shell -a 'rpm -ivh  /root/mha4mysql-node-0.56-0.el6.noarch.rpm'

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

bash 复制代码
[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 4月   1 2014 /usr/bin/apply_diff_relay_logs
-rwxr-xr-x. 1 root root  4807 4月   1 2014 /usr/bin/filter_mysqlbinlog
-rwxr-xr-x. 1 root root  8261 4月   1 2014 /usr/bin/purge_relay_logs
-rwxr-xr-x. 1 root root  7525 4月   1 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要能免密登录主从复制的所有服务器,而不需要反向免密登录。主从复制的所有服务器之间要能免密登录。

bash 复制代码
ssh-keygen -t rsa
 
ssh-copy-id  -i id_rsa.pub root@192.168.0.%

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

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

2、配置MHA

1、创建工作目录

bash 复制代码
mkdir /etc/masterha
 
mkdir -p /var/log/masterha/app1

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

bash 复制代码
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、给脚本可执行权限

bash 复制代码
chmod 777 /usr/local/bin/master_ip_failover

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

bash 复制代码
[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连接状态

bash 复制代码
[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服务器保存二进制日志文件地址填写错误。

bash 复制代码
[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、检查管理节点的状态

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

8、开启管理节点监控

bash 复制代码
[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

bash 复制代码
[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被删除了

bash 复制代码
[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、备份脚本

bash 复制代码
# 编写脚本
[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服务器操作

bash 复制代码
# 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 8月   1 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 8月   1 15:11 /etc/rsync.pass
[root@ansible ~]# ll  /etc/rsyncd.conf
-rw-------. 1 root root 928 8月   1 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服务器操作

bash 复制代码
# 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 8月   1 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 8月   1 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、实现自动同步

bash 复制代码
# 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里

bash 复制代码
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

bash 复制代码
[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、修改配置文件

bash 复制代码
[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服务

bash 复制代码
[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个账号,测试读写分离

bash 复制代码
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个测试账号

bash 复制代码
实现读功能
[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、实现高可用功能

bash 复制代码
[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、测试高可用

bash 复制代码
[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

bash 复制代码
# 1.安装keepalived
yum install keepalived -y

2、router-1 修改配置文件

bash 复制代码
[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 修改配置文件

bash 复制代码
[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漂移

bash 复制代码
[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连接

bash 复制代码
[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
复制代码
相关推荐
ulias2124 小时前
Linux系统中的权限问题
linux·运维·服务器
青花瓷5 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
问简5 小时前
docker 镜像相关
运维·docker·容器
Dream of maid6 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾6 小时前
统信系统UOS常用命令集
linux·运维·服务器
Benszen7 小时前
Docker容器化技术实战指南
运维·docker·容器
ZzzZZzzzZZZzzzz…7 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
一叶知秋yyds8 小时前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
斯普信云原生组9 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
safestar201210 小时前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins