作业五

、如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点(写出操作步骤)

  1. 首先备份master节点数据
  2. 恢复数据到slave节点
  3. 复制起始位置为主节点备份时的二进制日志文件

#在主节点做完全备份

[root@CentOS8 ~]# mysqldump -A -F --single-transaction --master-data=1  > /backup/fullback_`date +%F_%T`.sql

[root@CentOS8 ~]# ll /backup/

total 2988

-rw-r--r-- 1 root root 3056439 Oct 17 09:43 fullback_2020-10-17_09:43:38.sql

#从主节点拷贝备份文件到slave节点

[root@CentOS8 ~]# scp /backup/fullback_2020-10-17_09\:43\:38.sql 10.0.0.28:/data/

#将完全备份还原到slave节点

#在slave节点安装mysql

[root@CentOS8 ~]# dnf -y install mariadb-server

添加修改配置文件

[root@CentOS8 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=11

read-only

#启动服务

[root@CentOS8 ~]# systemctl start mariadb

#检查完全备份的二进制日志文件及起始POS

[root@CentOS8 ~]# grep '^CHANGE MASTER' /data/fullback_2020-10-17_09\:43\:38.sql

CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;

#导入完全备份数据到slave节点

[root@CentOS8 ~]# mysql < /data/fullback_2020-10-17_09\:43\:38.sql

#配置slave节点,从完全备份的位置之后开始同步复制

[root@CentOS8 ~]# mysql

MariaDB [(none)]> change master to

    -> master_host='10.0.0.8',

    -> master_user='repluser',

    -> master_password='123456',

    -> master_port=3306,

    -> MASTER_LOG_FILE='mariadb-bin.000003',

    -> MASTER_LOG_POS=389;

Query OK, 0 rows affected (0.003 sec)

#开启slave节点复制

MariaDB [(none)]> start slave;

Query OK, 0 rows affected (0.001 sec)

 

 

、当master服务器宕机,提升一个slave成为新的master(写出操作步骤)

 

#首先查询slave服务器的relay-log.info信息,找到哪个服务器的数据库是最新,让它成为新master

[root@CentOS8 ~]# cat /var/lib/mysql/relay-log.info

./mariadb-relay-bin.000005

27378298

mariadb-bin.000003

27378179

#新选择的master修改配置文件,关闭read-only配置,并启用二进制日志

[root@slave1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=18

read-only=OFF

log-bin

#重启服务,生成二进制日志文件

[root@CentOS8 ~]# systemctl restart mariadb

MariaDB [(none)]> show master logs;

+--------------------+-----------+

| Log_name           | File_size |

+--------------------+-----------+

| mariadb-bin.000001 |       379 |

| mariadb-bin.000002 |       375 |

+--------------------+-----------+

 

#在新选择的master服务器上清除旧的master信息

MariaDB [(none)]> stop slave;

MariaDB [(none)]> reset slave all;

#在新选择的master服务器上做完全备份

[root@CentOS8 ~]# mysqldump -A  -F --single-transaction --master-data=1 > backup.sql

#如果旧的master服务器没有完全宕机,还能提取出二进制日志文件,那么分析旧的master 的二进制日志,将未同步到至新master的二进制日志导出来,恢复到新master,尽可能的恢复数据

#将新选择的master服务器上做的完全备份拷贝到其他slave服务器上

[root@CentOS8 ~]# scp backup.sql 10.0.0.28:

#在其它所有slave上重新还原数据库,指向新的master

[root@CentOS8 ~]#vim backup.sql   #编辑完全备份文件,添加master信息

CHANGE MASTER TO 

MASTER_HOST='10.0.0.18',   

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE=' mariadb-bin.000002 ',

MASTER_LOG_POS=375

 

MariaDB [hellodb]>stop slave;

MariaDB [hellodb]>reset slave all;

MariaDB [hellodb]>set sql_log_bin=off;

MariaDB [hellodb]>source backup.sql;

MariaDB [hellodb]>set sql_log_bin=on;

MariaDB [hellodb]>start slave;

 

 

、通过 MHA 0.58 搭建一个数据库集群结构

 

环境:4台主机

10.0.0.7 CentOS7 MHA管理端 mysql5.7

10.0.0.8 CentOS8 Master mysql8.0

10.0.0.18 CentOS8 Slave1 mysql8.0

10.0.0.28 CentOS8 Slave2 mysql8.0

 

1.安装MHA 0.58

说明: mha4mysql-manager-0.56-0.el6.noarch.rpm 不支持CentOS 8,只支持CentOS7 以下版本

说明: mha4mysql-manager-0.58-0.el7.centos.noarch.rpm ,支持MySQL 5.7 ,但和CentOS8版本上的Mariadb -10.3.17不兼容

共两个包:

mha4mysql-manager

mha4mysql-nod

1.1 在管理节点安装这两个包

[root@mha-manager ~]#yum -y install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

[root@mha-manager ~]#yum -y install mha4mysql-node-0.58-0.el7.centos.noarch

 

1.2 在3台mysql服务器上安装mha4mysql-node包,此包支持CentOS 8/7/6

[root@CentOS8 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

2. 在所有节点实现相互之间ssh key验证

[root@mha-manager ~]#ssh-keygen

[root@mha-manager ~]#ssh-copy-id  10.0.0.7

[root@mha-manager ~]#rsync -av .ssh 10.0.0.8:/root/    #保留属性,或用scp -p

[root@mha-manager ~]#rsync -av .ssh 10.0.0.18:/root/

[root@mha-manager ~]#rsync -av .ssh 10.0.0.28:/root/

 

3. 在管理节点建立配置文件和相关脚本

3.1 配置文件

[root@mha-manager ~]#mkdir /etc/mastermha/

[root@mha-manager ~]#vim /etc/mastermha/app1.cnf

[server default]

user=mhauser   #管理 MHA 用户的名称

password=123456  #管理 MHA 用户的密码

manager_workdir=/data/mastermha/app1/  #MHA manager 使用的工作目录

manager_log=/data/mastermha/app1/manager.log  #MHA manager 生成日志的保存路径及文件名

remote_workdir=/data/mastermha/app1/  #每一个 MHA node 保存从 master 节点复制而来的二进制日志的工作目录

ssh_user=root  MHA manager 和 MHA node 通过此用户连接至 Mysql 所在的主机

repl_user=repluser  #主从复制时使用的用户名称

repl_password=123456   主从复制时使用的用户密码

ping_interval=1  MHA manager ping master 节点的时间间隔,单位为秒,当连续 3 次 ping 失败后, MHA manager 认为此 master 节点宕机

master_ip_failover_script=/usr/local/bin/master_ip_failover  #故障转移脚本

report_script=/usr/local/bin/sendmail.sh  #以邮件告警的方式来发送 failover 报告脚本

check_repl_delay=0  #默认情况下如果一个 slave 节点落后 master 节点 100M 的中继日志, MHA 将不会选择该 slave 节点作为一个新的 master 节点,因为对于这个 slave 节点的恢复需要花费很长时间,通过设置 check_repl_delay=0 , MHA 在选择一个新的 master 节点时将会忽略复制延时,此参数对于设置了 candidate_master=1 的主机非常有用,因为此备选 master 节点在切换过程中一定是新的 master 节点

master_binlog_dir=/data/mysql/  #master 节点生成二进制日志的目录

[server1]

hostname=10.0.0.8

candidate_master=1  #从不同的 slave 节点中,提升一个可靠的节点作为新的 master 节点,如果此值设置为 1 ,此 slave 节点会优先成为新的 master 节点,即使这个 slave 节点的事件不是最新的

[server2]

hostname=10.0.0.18

candidate_master=1

[server3]

hostname=10.0.0.28

 

3.2 相关脚本

#报警邮件脚本

[root@mha-manager ~]#cat /usr/local/bin/sendmail.shecho "MySQL is down" | mail -s "MHA Warning" root@xxx.com

[root@mha-manager ~]#chmod +x /usr/local/bin/sendmail.

#故障主备切换脚本

#!/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 = '10.0.0.100';#设置Virtual IP

my $gateway = '10.0.0.2';#网关Gateway IP

my $interface = 'eth0';

my $key = "1";

my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";

my $ssh_stop_vip = "/sbin/ifconfig $interface:$key down";

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" ) {

# $orig_master_host, $orig_master_ip, $orig_master_port are passed.

# If you manage master ip address at global catalog database,

# invalidate orig_master_ip here.

my $exit_code = 1;

eval {

print "Disabling the VIP on old master: $orig_master_host \n";

&stop_vip();

$exit_code = 0;

};

if ($@) {

warn "Got Error: $@\n";

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "start" ) {

# all arguments are passed.

# If you manage master ip address at global catalog database,

# activate new_master_ip here.

# You can also grant write access (create user, set read_only=0, etc) here.

my $exit_code = 10;

eval {

print "Enabling the VIP - $vip on the new master - $new_master_host \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";

}

 

4.配置master 服务器

[root@master ~]# yum -y install mysql-server

[root@master ~]#mkdir /data/mysql/

[root@master ~]#chown mysql.mysql /data/mysql

#准备配置文件

[root@master ~]#vim /etc/my.cnf

[mysqld]

server_id=1

log-bin=/data/mysql/mysql-bin

skip_name_resolve=1  #禁止反向解析

general_log    #非必须

 

mysql> show master logs;

+------------------+-----------+-----------+

| Log_name         | File_size | Encrypted |

+------------------+-----------+-----------+

| mysql-bin.000001 |       179 | No        |

| mysql-bin.000002 |       156 | No        |

+------------------+-----------+-----------+

 

#准备相关账户及权限

mysql> create user repluser@'10.0.0.%' identified by '123456';

Query OK, 0 rows affected (0.00 sec)

 

mysql> grant replication slave on *.* to repluser@'10.0.0.%';

Query OK, 0 rows affected (0.01 sec)

 

mysql> create user mhauser@'10.0.0.%' identified by '123456';

Query OK, 0 rows affected (0.01 sec)

 

mysql> grant all on *.* to mhauser@'10.0.0.%';

Query OK, 0 rows affected (0.01 sec)

 

#配置Virtual IP,在启动MHA之前未添加,启动之后master也能获取,VIP地址已在failover脚本中定义

[root@master ~]#ifconfig eth0:1 10.0.0.100/24

 

5.配置slave服务器(需在两个slave服务器上分别配置)

[root@slave1 ~]# yum -y install mysql-server

[root@slave1 ~]#mkdir /data/mysql

[root@slave1 ~]#chown mysql.mysql /data/mysql/

[root@slave1 ~]#vim /etc/my.cnf

 

[mysqld]

server_id=2   #不同节点此值不同

log-bin=/data/mysql/mysql-bin

read_only

relay_log_purge=0   #表示在默认情况下, slave 节点的中继日志会在 SQL 线程执行完毕后被自动删除,但是在 MHA 环境中,这些中继日志在恢复其它 slave 节点时可能会被用到,因此需要禁用中继日志的自动删除功能。

skip_name_resolve=1

mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.8', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=156;

mysql> start slave;

 

6.检查MHA环境

#检查环境

[root@mha-manager ~]#masterha_check_ssh --conf=/etc/mastermha/app1.cnf

[root@mha-manager ~]#masterha_check_repl --conf=/etc/mastermha/app1.cnf

#查看状态

[root@mha-manager ~]#masterha_check_status --conf=/etc/mastermha/app1.cnf

 

注意:MHA 从 0.58 版本开始增加了 super_read_only 功能,而 MariaDB-10.3.17 中没有 super_read_only 这个变量!在masterha_check_repl时报错如下,因为当时用了mysql服务器安装的是MariaDB-10.3.17,后来更换为mysql 8.0不再报错!

 

    Checking if super_read_only is defined and turned on..DBD::mysql::st execute failed: Unknown system variable 'super_read_only' at /usr/share/perl5/vendor_perl/MHA/SlaveUtil.pm line 245.

Tue Oct 20 14:42:10 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln208] Slaves settings check failed!

Tue Oct 20 14:42:10 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln416] Slave configuration failed.

Tue Oct 20 14:42:10 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/bin/masterha_check_repl line 48.

Tue Oct 20 14:42:10 2020 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.

 

7.在管理节点上启动MHA

#开启MHA,默认前台运行

[root@mha-manager ~]#nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null

[root@mha-manager ~]#masterha_manager --conf=/etc/mastermha/app1.cnf

Tue Oct 20 15:55:34 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Oct 20 15:55:34 2020 - [info] Reading application default configuration from /etc/mastermha/app1.cnf..

Tue Oct 20 15:55:34 2020 - [info] Reading server configuration from /etc/mastermha/app1.cnf..

 

#查看状态

[root@mha-manager ~]# masterha_check_status --conf=/etc/mastermha/app1.cnf

app1 (pid:25452) is running(0:PING_OK), master:10.0.0.8

 

#可在master服务器上看到每秒一次的健康性检查

[root@master ~]# tail -f /var/lib/mysql/CentOS8.log

2020-10-20T08:01:00.861407Z     24 Query  SELECT 1 As Value

2020-10-20T08:01:01.861432Z     24 Query  SELECT 1 As Value

2020-10-20T08:01:02.863248Z     24 Query  SELECT 1 As Value

2020-10-20T08:01:03.863969Z     24 Query  SELECT 1 As Value

#可在master服务器上看到Virtual IP地址

[root@master ~]# ip a

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:41:a6:5d brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0

       valid_lft forever preferred_lft forever

    inet 10.0.0.100/8 brd 10.255.255.255 scope global eth0:1

       valid_lft forever preferred_lft forever

 

8.模拟故障

#在master服务器停止mysql服务

[root@master ~]# systemctl stop mysqld

 

#管理节点MHA自动退出

[root@mha-manager ~]# masterha_manager --conf=/etc/mastermha/app1.cnf

Tue Oct 20 15:55:34 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Oct 20 15:55:34 2020 - [info] Reading application default configuration from /etc/mastermha/app1.cnf..

Tue Oct 20 15:55:34 2020 - [info] Reading server configuration from /etc/mastermha/app1.cnf..

  Creating /data/mastermha/app1 if not exists..    ok.

  Checking output directory is accessible or not..

   ok.

  Binlog found at /data/mysql/, up to mysql-bin.000002

Tue Oct 20 16:04:48 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Oct 20 16:04:48 2020 - [info] Reading application default configuration from /etc/mastermha/app1.cnf..

Tue Oct 20 16:04:48 2020 - [info] Reading server configuration from /etc/mastermha/app1.cnf..

 

[root@mha-manager ~]# masterha_check_status --conf=/etc/mastermha/app1.cnf

app1 is stopped(2:NOT_RUNNING).

 

#排错日志显示VIP切换成功

[root@mha-manager ~]# cat /data/mastermha/app1/manager.log

----- Failover Report -----

 

app1: MySQL Master failover 10.0.0.8(10.0.0.8:3306) to 10.0.0.18(10.0.0.18:3306) succeeded

 

Master 10.0.0.8(10.0.0.8:3306) is down!

 

Check MHA Manager logs at CentOS7:/data/mastermha/app1/manager.log for details.

 

Started automated(non-interactive) failover.

Invalidated master IP address on 10.0.0.8(10.0.0.8:3306)

The latest slave 10.0.0.18(10.0.0.18:3306) has all relay logs for recovery.

Selected 10.0.0.18(10.0.0.18:3306) as a new master.

10.0.0.18(10.0.0.18:3306): OK: Applying all logs succeeded.

10.0.0.18(10.0.0.18:3306): OK: Activated master IP address.

10.0.0.28(10.0.0.28:3306): This host has the latest relay log events.

Generating relay diff files from the latest slave succeeded.

10.0.0.28(10.0.0.28:3306): OK: Applying all logs succeeded. Slave started, replicating from 10.0.0.18(10.0.0.18:3306)

10.0.0.18(10.0.0.18:3306): Resetting slave info succeeded.

Master failover to 10.0.0.18(10.0.0.18:3306) completed successfully.

Tue Oct 20 16:04:56 2020 - [info] Sending mail..

# VIP已转移至slave1服务器上

[root@slave1 ~]# ip a

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:18:44:08 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.18/24 brd 10.0.0.255 scope global noprefixroute eth0

       valid_lft forever preferred_lft forever

    inet 10.0.0.100/8 brd 10.255.255.255 scope global eth0:1

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe18:4408/64 scope link

       valid_lft forever preferred_lft forever

 

# slave1服务器上查看read_only已变为OFF

mysql> show global variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | OFF   |

+---------------+-------+

 

# slave1服务器上查看slave节点为server id=3

mysql> show slave hosts;

+-----------+------+------+-----------+--------------------------------------+

| Server_id | Host | Port | Master_id | Slave_UUID                           |

+-----------+------+------+-----------+--------------------------------------+

|         3 |      | 3306 |         2 | 5ce3037d-12a8-11eb-87f1-000c29ded6af |

 

# slave2服务器上查看slave状态host地址已指向slave1的地址

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.0.0.18

                  Master_User: repluser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 156

               Relay_Log_File: CentOS8-relay-bin.000002

                Relay_Log_Pos: 324

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

#查看告警邮件:

From root@CentOS7.localdomain Tue Oct 20 17:33:55 2020

Return-Path: <root@CentOS7.localdomain>

Date: Tue, 20 Oct 2020 17:33:55 +0800

To: 343882044@qq.com

Subject: MHA Warning

User-Agent: Heirloom mailx 12.5 7/5/10

Content-Type: text/plain; charset=us-ascii

From: root@CentOS7.localdomain (root)

 

MySQL is down

 

9.修复故障的master服务器

#master节点添加下面两个参数到配置文件,并启动mysqld服务

[root@master ~]# vim /etc/my.cnf

read_only

relay_log_purge=0

 

[root@master ~]# systemctl start mysqld

 

#在管理节点查看复制的起始位置

[root@mha-manager ~]# grep -i "All other slaves should start" /data/mastermha/app1/manager.log

Tue Oct 20 17:33:49 2020 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.18', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156, MASTER_USER='repluser', MASTER_PASSWORD='xxx';

 

#master节点复制指向slave1(新的master)节点,并启动复制线程

mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.18', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156;

mysql> start slave;

 

#master节点查看slave状态已指向slave1(新的master)节点

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.0.0.18

                  Master_User: repluser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 156

               Relay_Log_File: CentOS8-relay-bin.000002

                Relay_Log_Pos: 324

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

#在管理节点上删除 app1.failover.complete 文件

[root@mha-manager ~]# ll /data/mastermha/app1/app1.failover.complete

-rw-r--r-- 1 root root 0 Oct 20 17:33 /data/mastermha/app1/app1.failover.complete

You have mail in /var/spool/mail/root

[root@mha-manager ~]# rm -f /data/mastermha/app1/app1.failover.complete

 

#重新启动MHA服务

[root@mha-manager ~]# masterha_manager --conf=/etc/mastermha/app1.cnf

Tue Oct 20 18:11:36 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Oct 20 18:11:36 2020 - [info] Reading application default configuration from /etc/mastermha/app1.cnf..

Tue Oct 20 18:11:36 2020 - [info] Reading server configuration from /etc/mastermha/app1.cnf..

 

[root@mha-manager ~]# masterha_check_status --conf=/etc/mastermha/app1.cnf

app1 (pid:26408) is running(0:PING_OK), master:10.0.0.18

 

、实战案例:Percona XtraDB Cluster(PXC 5.7)

 

1.准备实验环境

四台主机(centos7)

pxc1: 10.0.0.7

pxc2: 10.0.0.17

pxc3: 10.0.0.27

pxc4: 10.0.0.37

 

注意:PXC5.7目前不支持CentOS 8,主机需要关闭防火墙和SELinux并保证时间同步,如果已经安装MySQL,必须卸载

 

2,安装 Percona XtraDB Cluster 5.7

#配置yum源,使用国内yum源

[root@pxc1]# vim /etc/yum.repos.d/pxc.repo

[percona]

name=percona_repo

baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch

enabled = 1

gpgcheck = 0

 

#将yum配置文件拷贝到pxc2,pxc3上

[root@pxc1]# scp /etc/yum.repos.d/pxc.repo  10.0.0.17:/etc/yum.repos.d/

[root@pxc1]# scp /etc/yum.repos.d/pxc.repo  10.0.0.27:/etc/yum.repos.d/

 

#在3个节点都安装pxc

[root@pxc1]# yum install Percona-XtraDB-Cluster-57 -y

[root@pxc2]# yum install Percona-XtraDB-Cluster-57 -y

[root@pxc3]# yum install Percona-XtraDB-Cluster-57 -y

 

3. 在各个节点上分别配置mysql集群配置文件

/etc/my.cnf为主配置文件,当前版本中,其余的配置文件都放在/etc/percona-xtradb-cluster.conf.d目录里,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件

[root@pxc1 # ll /etc/percona-xtradb-cluster.conf.d/

total 12

-rw-r--r-- 1 root root  381 Oct  9 03:01 mysqld.cnf

-rw-r--r-- 1 root root  440 Oct  9 03:01 mysqld_safe.cnf

-rw-r--r-- 1 root root 1066 Oct  9 03:01 wsrep.cnf

 

#修改配置wsrep.cnf文件

[root@pxc1]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

[root@pxc1]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27 #添加3个节点的IP

binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads= 8

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=10.0.0.7   #指定各个节点自己的IP

wsrep_cluster_name=pxc-cluster

wsrep_node_name=pxc-cluster-node-3   #指定各个节点自己的名称

pxc_strict_mode=ENFORCING

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:s3cretPass"   #取消注释本行,使密码验证生效

 

4. 启动PXC集群中第一个节点

#启动PXC的第一个节点

[root@pxc1 ~]# systemctl start mysql@bootstrap.service

[root@pxc1 ~]# ss -nlt

State      Recv-Q Send-Q    Local Address:Port                   Peer Address:Port             

LISTEN     0      128                   *:4567                              *:*                 

LISTEN     0      100           127.0.0.1:25                                *:*                 

LISTEN     0      128                   *:22                                *:*                 

LISTEN     0      100               [::1]:25                             [::]:*                 

LISTEN     0      80                 [::]:3306                           [::]:*                 

LISTEN     0      128                [::]:22                             [::]:*

 

#查看mysql的登录密码

[root@pxc1 ~]# grep "temporary password" /var/log/mysqld.log

2020-10-22T02:56:24.482862Z 1 [Note] A temporary password is generated for root@localhost: s%dK%rrv%5Gf

 

#登录并修改mysql的密码

[root@pxc1 ~]# mysql -uroot -p's%dK%rrv%5Gf'

mysql> alter user root@localhost identified by '123456';

#创建用于数据同步的账户并授权

mysql> create user sstuser@localhost identified by 's3cretPass';

mysql> grant reload,lock tables,process,replication client on *.* to sstuser@localhost;

 

#查看相关变量及状态

mysql> show variables like 'wsrep%'\G

mysql> show status like 'wsrep%'\G

 

Variable_name: wsrep_gcomm_uuid

        Value: 30827c2b-1412-11eb-a6ae-7a25be848952

Variable_name: wsrep_cluster_conf_id

        Value: 1

Variable_name: wsrep_cluster_size

        Value: 1

Variable_name: wsrep_cluster_status

        Value: Primary

Variable_name: wsrep_connected

        Value: ON

Variable_name: wsrep_ready

        Value: ON

Variable_name: wsrep_local_state_comment

        Value: Synced

 

 

5.启动PXC集群中其它节点

 

[root@pxc2 ~]# systemctl start mysql

[root@pxc3 ~]# systemctl start mysql

 

6. 查看集群状态,验证集群是否成功

#在任意节点,查看集群状态

[root@pxc3 ~]# mysql -uroot -p123456

 

mysql> SHOW VARIABLES LIKE 'wsrep_node_name';

+-----------------+--------------------+

| Variable_name   | Value              |

+-----------------+--------------------+

| wsrep_node_name | pxc-cluster-node-3 |

+-----------------+--------------------+

1 row in set (0.01 sec)

 

mysql> SHOW VARIABLES LIKE 'wsrep_node_address';

+--------------------+-----------+

| Variable_name      | Value     |

+--------------------+-----------+

| wsrep_node_address | 10.0.0.27 |

+--------------------+-----------+

1 row in set (0.01 sec)

 

mysql> SHOW VARIABLES LIKE 'wsrep_on';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wsrep_on      | ON    |

+---------------+-------+

1 row in set (0.01 sec)

 

mysql> SHOW VARIABLES LIKE 'wsrep_cluster_size';

Empty set (0.00 sec)

 

mysql> SHOW STATUS LIKE 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size | 3     |

+--------------------+-------+

1 row in set (0.00 sec)

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

 

#在任意节点创建数据库,并在其他节点查看数据库状态是否同步

[root@pxc3 ~]# mysql -uroot -p123456

mysql> create database testdb1;

Query OK, 1 row affected (0.01 sec)

 

[root@pxc2 ~]# mysql -uroot -p123456

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| testdb1            |

+--------------------+

 

7. 在PXC集群中加入新节点

#在PXC集群中再加一台新的主机PXC4:10.0.0.37

[root@pxc1 ]# scp /etc/yum.repos.d/pxc.repo  10.0.0.37:/etc/yum.repos.d/

[root@pxc4 ~]# yum install Percona-XtraDB-Cluster-57 -y

#修改配置,添加IP地址到wsrep_cluster_address,其他选项做相应修改

[root@pxc4 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

[mysqld]

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27,10.0.0.37

binlog_format=ROW

default_storage_engine=InnoDB

wsrep_slave_threads= 8

wsrep_log_conflicts

innodb_autoinc_lock_mode=2

wsrep_node_address=10.0.0.37

wsrep_cluster_name=pxc-cluster

wsrep_node_name=pxc-cluster-node-4

pxc_strict_mode=ENFORCING

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:s3cretPass"

#启动服务,可看到数据已同步

[root@CentOS7 ~]# systemctl start mysql

[root@CentOS7 ~]# mysql -uroot -p123456

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| testdb1            |

+--------------------+

 

mysql>  SHOW STATUS LIKE 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size | 4     |

+--------------------+-------+

 

8. PXC集群中模拟节点故障并修复故障节点

 

#在任意节点停止mysql服务,这里是pxc4

[root@pxc4 ~]#systemctl stop mysql

 

#在其它任意节点查看wsrep_cluster_size变量少了一个节点

[root@pxc1 ~]#mysql -uroot -pmaged

mysql> SHOW STATUS LIKE 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size | 3     |

+--------------------+-------+

#创建数据库

mysql> create database testdb2;

Query OK, 1 row affected (0.00 sec)

#在其他节点上可看到数据库已同步

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| testdb1            |

| testdb2            |

+--------------------+

 

#恢复pxc4的服务,可看到数据自动同步

[root@pxc4~]# systemctl start mysql

[root@pxc4 ~]# mysql -uroot -p123456

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| testdb1            |

| testdb2            |

+--------------------+

7 rows in set (0.00 sec)

 

mysql>  SHOW STATUS LIKE 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size | 4     |

+--------------------+-------+

 

 

、通过 ansible 部署二进制 mysql 8

 

1.环境准备

四台主机

10.0.0.18 CentOS8 做为ansible 管理端

10.0.0.8 CentOS8 远程主机

10.0.0.7 CentOS7 远程主机

10.0.0.6 CentOS6 远程主机

 

2. 安装ansible

#使用yum安装

[root@Ansible ~]# yum -y install ansible

[root@Ansible ~]# ll /etc/ansible/

total 24

-rw-r--r-- 1 root root 19985 Oct  8 02:06 ansible.cfg

-rw-r--r-- 1 root root  1016 Oct  8 02:06 hosts

drwxr-xr-x 2 root root     6 Oct  8 02:06 roles

 

3. 添加host

[root@Ansible ~]# vim /etc/ansible/hosts

[dbservers]

10.0.0.8

10.0.0.7

 

[webservers]

10.0.0.18 ansible_connection=local

10.0.0.6

 

[appservers]

10.0.0.8

10.0.0.6

 

[root@Ansible ~]# ansible all  --list-hosts

  hosts (4):

    10.0.0.8

    10.0.0.7

    10.0.0.18

    10.0.0.6

 

4.实现基于key验证的远程主机登录

#准备基于key验证的脚本

[root@Ansible ~]# vim ssh_push_key.sh

IPLIST="

10.0.0.8

10.0.0.18

10.0.0.7

10.0.0.6

"

rpm -q sshpass &> /dev/null || yum -y install sshpass 

[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''

export SSHPASS=centos

for IP in $IPLIST;do

    sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP

done

 

#运行脚本,实现基于key验证的远程主机登录

[root@Ansible ~]# bash ssh_push_key.sh

 

#使用ping验证

[root@Ansible ~]# ansible all -m ping

10.0.0.18 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/libexec/platform-python"

    },

    "changed": false,

    "ping": "pong"

}

10.0.0.8 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/libexec/platform-python"

    },

    "changed": false,

    "ping": "pong"

}

10.0.0.7 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

10.0.0.6 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

 

5.准备相关文件和包

[root@Ansible ~]# mkdir -pv /data/ansible/files

#准备mysql 8.0的安装包,上传到/data/ansible/files/下

#准备配置文件

[root@Ansible ~]# vim /data/ansible/files/my.cnf

[mysqld]

user=mysql

log-bin

symbolic-links=0

datadir=/data/mysql

socket=/data/mysql/mysql.sock

innodb_file_per_table=1

pid-file=/data/mysql/mysqld.pid

log-error=/data/mysql/mysql.log

 

[client]

port=3306

socket=/data/mysql/mysql.sock

 

[mysqld_safe]

log-error=/var/log/mysqld.log

 

#准备mysql安装脚本

[root@Ansible ~]# vim /data/ansible/install_mysql.yml

---

# install mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz

- hosts: [dbservers]

  remote_user: root

  gather_facts: no

 

  tasks:

    - name: install packages

      yum: name=libaio,autoconf,libtinfo*,libncurses*,perl-Data-Dumper,numactl-libs

    - name: create mysql group

      group: name=mysql gid=306

    - name: create mysql user

      user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes

    - name: copy tar to remote host and file mode

      unarchive: src=/data/ansible/files/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz dest=/usr/local owner=root group=root

    - name: create linkfile /usr/local/mysql

      file: src=/usr/local/mysql-8.0.19-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link

    - name: PATH variable

      copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh

    - name: PATH variable source

      shell: source /etc/profile.d/mysql.sh

    - name: config my.cnf

      copy: src=/data/ansible/files/my.cnf  dest=/etc/my.cnf

    - name: data dir

      shell: mysqld --initialize --user=mysql --datadir=/data/mysql

    - name: service script

      shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    - name: enable service

      shell: /etc/init.d/mysqld start;chkconfig --add mysqld;chkconfig mysqld on

    - name: change mysql password

      shell: mysqladmin  -uroot -p`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log` password 123456

 

6. 开始安装mysql8

[root@Ansible ~]# ansible-playbook /data/ansible/install_mysql.yml

 

PLAY [10.0.0.8] *******************************************

 

TASK [install packages] **********************************

changed: [10.0.0.8]

 

TASK [create mysql group] ****************************

changed: [10.0.0.8]

 

TASK [create mysql user] ********************************

changed: [10.0.0.8]

 

TASK [copy tar to remote host and file mode] *************

changed: [10.0.0.8]

 

TASK [create linkfile /usr/local/mysql] ******************

changed: [10.0.0.8]

 

TASK [PATH variable] **************************************

changed: [10.0.0.8]

 

TASK [PATH variable source] ******************************

changed: [10.0.0.8]

 

TASK [config my.cnf] *************************************

changed: [10.0.0.8]

 

TASK [data dir] ******************************************

changed: [10.0.0.8]

 

TASK [service script] *************************************

changed: [10.0.0.8]

 

TASK [enable service] *************************************

changed: [10.0.0.8]

 

TASK [change mysql password] *****************************

changed: [10.0.0.8]

 

PLAY RECAP *************************************************

10.0.0.8  : ok=12   changed=12   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

#在远程服务器上登录验证

[root@CentOS8 ~]# mysql -uroot -p123456

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 10

Server version: 8.0.19 MySQL Community Server - GPL

 

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

 

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.

 

mysql>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值