文章目录
- 项目架构图
- 项目名称
- 项目环境
- 项目描述
- ip地址规划
- 项目步骤
- 一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。
- 二.部署ansible服务器,配置SSH免密通道(单向),编写主机清单,使用ansible以二进制方式通过脚本一键安装MySQL
- 三、在master服务器和ansible服务器之间建立双向的免密通道,方便同步数据
- 四、部署4台MySQL服务器,一台master服务器,2台slave服务器,一台delay-backup延迟服务器,安装半同步相关的插件。
- 五.使用mysqldump在master服务器上导出基础数据,scp远程同步到ansible服务器,通过ansible服务器下发到salve服务器。
- 六、在slave服务器上使用mysql导入master服务器的基础数据
- 七、MySQL集群开启GTID功能,启动主从复制服务,配置好延迟备份服务器,从slave-1上拿二进制日志
- 八、部署mysql的failover插件(MHA),实现自动的故障切换,如果master宕机,能自动提升其中一台slave为新的master,其他slave到新的master上获得二进制日志
- 九、在master上创建一个计划任务每天凌晨3点进行数据库的备份,编写备份脚本,备份文件包含当天的日期,使用rsync+sersync远程同步到ansible服务器
- 十、部署两台安装了mysqlrouter中间件软件的服务器,实现读写分离和高可用功能
- 十一、在两台mysql router服务器上安装keepalived软件,配置2个vrrp实例,互为主备,来实现双vip的高可用功能。
项目架构图
项目名称
项目环境
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
# 立即关闭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 [email protected]
ssh-copy-id -i id_rsa.pub [email protected]
ssh-copy-id -i id_rsa.pub [email protected]
ssh-copy-id -i id_rsa.pub [email protected]
4、验证是否实现免密码密钥认证
[root@ansible .ssh]# ssh [email protected]
Last login: Tue Aug 1 11:12:38 2023
[root@master ~]# exit
登出
Connection to 192.168.0.11 closed.
[root@ansible .ssh]# ssh [email protected]
Last login: Tue Aug 1 11:12:58 2023
[root@slave-1 ~]# exit
登出
Connection to 192.168.0.17 closed.
[root@ansible .ssh]# ssh [email protected]
Last login: Tue Aug 1 11:13:07 2023
[root@slave-2 ~]# exit
登出
Connection to 192.168.0.12 closed.
[root@ansible .ssh]# ssh [email protected]
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 [email protected]
# 测试
[root@master .ssh]# ssh [email protected]
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 [email protected]:/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 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要能免密登录主从复制的所有服务器,而不需要反向免密登录。主从复制的所有服务器之间要能免密登录。
ssh-keygen -t rsa
ssh-copy-id -i id_rsa.pub [email protected].%
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 [email protected](192.168.2.221:22) to [email protected](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 [email protected](192.168.2.221:22) to [email protected](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 [email protected](192.168.2.222:22) to [email protected](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 [email protected](192.168.2.222:22) to [email protected](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 [email protected](192.168.2.129:22) to [email protected](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 [email protected](192.168.2.129:22) to [email protected](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 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服务器操作
# 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 [email protected]::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 [email protected]:/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.
[email protected]'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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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