N46-第十四周作业
1、MariaDB主从复制原理。
答:
MariaDB主从复制使用的为异步复制,所谓异步复制,即当主服务器要写数据时,先写到本地磁盘,同时写到二进制文件日志中,写好二进制日志文件后就把结果返回给客户端,至于从服务器有没有来主服务器同步二进制文件,则不与关心。主要步骤如下:
(1)在主服务器上,每当有写请求进来,先写入磁盘数据文件中,再写入二进制日志文件,然后返回结果给客户端。
(2)当主服务器的二进制日志文件产生新的事件时,主服务器会通知从服务器。
(3)从服务器接收到通知后,由IO thread向主服务器发起二进制日志中的事件请求。
(4)由主服务器的dump thread线程读取主服务器上发生改变的二进制文件。
(5)而后再发送给二进制日志文件给从服务器,从服务器把它保存到自己的中继日志中。
(6)再由从服务器的sql thread线程把中继日志读取出来执行。
(7)sql thread线程把中继日志读取出来执行的结果保存到磁盘文件中去。
2、MariaDB一主一从架构构建。准备两台纯新的CentOS7.6服务器,其中主机称为node1的服务器地址为192.168.130.132,主机称为node2的服务器地址为192.168.130.133。
答:
安装mariadb(主从节点均安装相同版本):
# 配置mariadb的yum源
vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos7-amd64
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
# yum方式安装mariadb
yum install mariadb-server
# 建立数据存放文件夹、日志文件夹、pid文件夹,并对相关目录开启mysql权限
mkdir /data/{mysql,log,pid} -p
chown -R mysql:mysql /data/{mysql,log,pid}
mysql_install_db --datadir=/data/mysql --user=mysql
# 修改mariadb的配置文件,调整数据存放文件夹、日志文件夹、pid文件夹的相关位置
vim /etc/my.cnf.d/server.cnf
[mysqld]
datadir=/data/mysql/
socket=/data/mysql/mysql.sock
pid-file=/data/pid/mysql.pid
log-error=/data/log/mysql.log
vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
socket=/data/mysql/mysql.sock
# 启动mariadb
systemctl enable --now mariadb
主节点:
# 在配置文件里添加二进制日志,server-id:
vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin
server-id=132
log-basename=master
# 重置服务生效:
systemctl restart mariadb
# 进入mariadb里,添加主从授权账号及权限:
MariaDB [(none)]> grant replication slave on *.* to 'repluser'@'192.168.130.%' identified by 'replpass';
# 进入master logs日志的名称及编号
MariaDB [(none)]> show master logs;

从节点:
# 在配置文件里添加二进制日志,server-id,中继日志:
vim /etc/my.cnf.d/server.cnf
[mysqld]
log-bin
server-id=133
read_only=ON
relay_log=relay-log
relay_log_index=relay-log.index
# 重置服务生效:
systemctl restart mariadb
# 进入mariadb,使用有复制权限的用户账号连接至主节点。
change master to master_host='192.168.130.132',
master_user='repluser',
master_password='replpass',
master_log_file='master-bin.000001',
master_log_pos=329;

# 启动复制线程
MariaDB [(none)]> start slave;
# 查看从节点状态

#主节点导入一个测试数据库,验证主从是否同步。
mysql < hellodb_innodb.sql
主节点导入后截图:
从节点同步后截图:

3、MariaDB级联复制,上一节中我们完成了一主一从的MariaDB的主从复制架构,但是有的时候,我们期望有一个后备的MariaDB的节点,只用作备份存储数据,不需要对外提供服务。为了实现该功能,我们可以在之前的一主一从架构上进行调整,即将从节点的二进制文件打开,然后给他配置一个远程同步数据用户,接着使用一台新的服务器做为从服务器的从属,同步从服务器数据的即可,下面我们在原来的架构上添加一台新的CentOS7.6,作为节点3,IP地址为192.168.132.134。
答:
级联从节点:
# 添加二进制日志和级联下发日志
vim /etc/my.cnf.d/server.cnf
[mysqld]
log_slave_updates
# 修改clients文件,添加mysqldump的sock路径
vim /etc/my.cnf.d/mysql-clients.cnf
[mysqldump]
socket=/data/mysql/mysql.sock
# 重启数据库
systemctl restart mariadb
# 完全备份数据库,及远程复制至下属从节点
mysqldump -A -F --single-transaction --master-data=1 > /data/all.sql
scp /data/all.sql root@192.168.130.134:/data
第三节点slave:
# 正常mariadb数据库。
# 在server.cnf中添加servier-id和read-only选项
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=134
read-only
# 修改远程传递过来的all.sql文件,添加chang master to选项
vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.130.133',
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=401;
# 导入数据库,并启动从服务。
mysql < /data/all.sql
mysql -e 'start slave;'
# 查看从节点状态
MariaDB [(none)]> show slave status\G

# 在主节点新建测试库db1,并在级联从节点,以及下属从节点上查看。



完成同步。
4、MariaDB半同步复制
答:
主节点:
# 编辑server.cnf文件,添加半同步的配置。
vim /etc/my.cnf.d/server.cnf
server-id=132
plugin-load-add=semisync_master
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000
# 重启mariadb服务
systemctl restart mariadb
# 查看半同步变量是否正常打开
MariaDB [(none)]> show global variables like '%semi%';

MariaDB [(none)]> show global status like '%semi%';

从节点:
# 编辑server.cnf文件,添加半同步的配置
vim /etc/my.cnf.d/server.cnf
server-id=133
plugin_load_add=semisync_slave
rpl_semi_sync_slave_enabled=ON
# 重启mariadb服务
systemctl restart mariadb
# 查看半同步变量是否正常打开
MariaDB [(none)]> show global variables like '%semi%';

MariaDB [(none)]> show global status like '%semi%';

# 测试:
# 主节点创建数据库,立即成功
MariaDB [(none)]> create database db2;
Query OK, 1 row affected (0.115 sec)

# 从节点停止复制线程
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.069 sec)

# 在主节点创建数据库,等待3秒后才能成功
MariaDB [(none)]> create database db3;
Query OK, 1 row affected (3.107 sec)

# 从节点恢复复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.023 sec)

# 主节点创建数据库,立即成功
MariaDB [(none)]> create database db4;
Query OK, 1 row affected (0.110 sec)

# 在从节点停止同步线后,在主节点可以看到以下日志信息。

5、MariaDB高可用方案MHA,准备三台新安装的CentOS7.6服务器,并使用yum安装MariaDB10.2.23,主机名分别为node1,node2,node3,IP地址分别为192.168.130.132-134。
答:
所有节点:
# 安装mariadb
vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos7-amd64
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum install mariadb-server -y
管理节点:
# 安装epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 安装mha的manager包和node包
yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
#基于ssh key验证
ssh-keygen
ssh-copy-id 192.168.130.132
rsync -av .ssh root@192.168.130.133:/root/
rsync -av .ssh root@192.168.130.134:/root/
# 管理节点上建立配置文件
mkdir /etc/mastermha
vim app1.cnf
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
report_script=/usr/local/bin/sendmail.sh
check_repl_delay=0
[server1]
hostname=192.168.130.132
[server2]
hostname=192.168.130.133
[server3]
hostname=192.168.130.134
candidate_master=1
# 安装mailx
yum install -y mailx
#配置mail.rc
vim /etc/mail.rc
set from=******@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=******
set smtp-auth-password=******
# 创建发送邮件通知脚本
vim /usr/local/bin/sendmail.sh
#!/bin/bash
echo "MySQL is down" | mail -s "MHA Warning" ******@qq.com
# 脚本授可执行权限
chmod +x /usr/local/bin/sendmail.sh
#创建故障转移IP脚本
vim master_ip_failover
(此处脚本代码量太大)
# 脚本授可执行权限
chmod +x /usr/local/bin/master_ip_failover
# 修改mysql配制文件,在mysqld下添加如下内容:
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=1
log-bin
skip_name_resolve=1
general_log
# 重启mariadb服务
systemctl restart mariadb
# 检查二进制日志位置
MariaDB [(none)]> show master logs;

# 添加账号权限
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.130.%' identified by 'magedu';
Query OK, 0 rows affected (0.007 sec)
MariaDB [(none)]> grant all on *.* to mhauser@'192.168.130.%' identified by 'magedu';
Query OK, 0 rows affected (0.002 sec)
# 配制VIP
ifconfig eth0:1 10.0.0.100/24
第一从节点:
# 安装mha node包
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
# 配制server.cnf文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=2
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1
# 自启动mariadb
systemctl enable --now mariadb
# 配制slave
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.130.132',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='magedu',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='node1-bin.000001',
-> MASTER_LOG_POS=328;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G

第二从节点:
# 安装mha node包
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
# 配制server.cnf文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=3
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1
# 自启动mariadb
systemctl enable --now mariadb
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.130.132',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='magedu',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='node1-bin.000001',
-> MASTER_LOG_POS=328;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G

管理节点:
# 检查mha
masterha_check_ssh --conf=/etc/mastermha/app1.cnf

masterha_check_repl --conf=/etc/mastermha/app1.cnf

# 检查node1.log,可以发现1s检查一次活跃度
tail -f node1.log

# 导入测试库,查看主从是否同步
mysql < hellodb_innodb.sql



测试:
# 向hellodb中导入存储过程testlog.sql,并运行。
mysql hellodb < testlog.sql
mysql hellodb
MariaDB [hellodb]> call sp_testlog;
#进行停止Mariadb操作
systemctl stop mariadb
#查看masterha_manager程序,并发现有邮件报警。

# 查看第一从节点的slave状态,发现主节点切换至192.168.130.134

# 切换成功,MHA完成。

浙公网安备 33010602011771号