数据库的相关搭建,以及ansible部署mysql8

1、如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点

当数据库已经运行了一段时间之后,想要添加一台新的机器,可以使用GTID的方法来同步数据库数据,这样比较简单方便,也更加快捷

[root@M9-8m ~]# vim /etc/my.cnf   
log-bin=mysql-bin        #最好还是加上比较好,实验可加可不加
gtid_mode=ON           #主节点设置中最主要的就是加上这两行即可                                                                  
enforce_gtid_consistency
[root@M9-8m ~]# service mysqld restart
[root@M9-8m ~]# mysql -uroot -p123456
mysql> show master logs;  #这一项不重要,因为GTID的复制会自动同步
mysql> grant replication slave on *.* to 'bai'@'10.0.0.%' identified by '123456';   #创建一个复制账号,这一步是必须的
Query OK, 0 rows affected, 1 warning (0.01 sec)    
#到了这里主服务器的配置就完了,这里的报错是因为明文了用户密码,再高版本就不行了,不可以明文,必须先创建用户,再创建用户密码,以下为从节点设置过程
[root@MC12-8m ~]# vim /etc/my.cnf   #从节点就加两行好了,
gtid_mode=ON                    #生产环境切记加二进制日志,主从都要加
enforce_gtid_consistency
[root@MC12-8m ~]# service mysqld restart
[root@MC12-8m ~]# mysql -uroot -p123456
mysql> CHANGE MASTER TO
    -> MASTER_HOST='10.0.0.26',
    -> MASTER_USER='bai',
    -> MASTER_PASSWORD='123456',
    -> MASTER_PORT=3306,
    -> MASTER_AUTO_POSITION=1;   #这里不像之前的设置,要写二进制日志位置
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
mysql> show slave status\G    #这个时候就可以同步了,GTID的设置就这样子做完了

 2、搭建MHA,实现当master服务器宕机,提升一个slave成为新的master

实验前说明:

在管理节点上安装两个包mha4mysql-manager和mha4mysql-node

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不兼容

(实验开始前记得关闭防火墙以及SELinux)

MHA的实现(这里说明以下,MAH的所有节点必须基于key验证的,因此必不可少的有做key的步骤)

[root@MC13-7m ~]# ls    #这个是MHA服务器节点
mha4mysql-node-0.57-0.el7.noarch.rpm   mha4mysql-manager-0.57-0.el7.noarch.rpm
[root@MC13-7m ~]# yum install -y mha4mysql-*.rpm  #因为有依赖关系,yum解决依赖
#下面这是非MHA服务器都要下载的包
[root@MC14-7m ~]# yum install -y mha4mysql-node-0.57-0.el7.noarch.rpm  
[root@MC14-7m ~]# ssh-keygen       #接下来就是生成key的过程了
[root@MC14-7m ~]# ssh-copy-id 127.0.0.1
[root@MC14-7m ~]# rsync -a .ssh 10.0.0.28:/root   #为了保证文件属性,建议用rsync
#所有节点都要下载rsync,才能使用rsync传输,且每个服务器上都要传输这个文件
[root@MC13-7m ~]# mkdir /etc/mastermha/   #在MHA节点上创建这个目录(目录名无所谓,只是习惯,要写配置文件的,包括下面的也是)
[root@MC13-7m ~]# vim /etc/mastermha/app1.cnf   #这里的”app1”指的是一组数据库,可见,其实MHA是可以监控多组数据库的
[server default]
user=shen           #用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=123456
manager_workdir=/data/mastermha/app1/   #目录会自动生成,无需手动创建
manager_log=/data/mastermha/app1/manager.log   #监控MHA的日志文件所在位置
remote_workdir=/data/mastermha/app1/       #在远程的主以及从节点上自动生成的临时存储MHA的文件夹
ssh_user=root       #用于实现远程ssh基于KEY的连接,访问二进制日志
repl_user=bai  #主从复制的用户信息
repl_password=123456
ping_interval=1     #健康性检查的时间间隔
master_ip_failover_script=/usr/local/bin/master_ip_failover   #切换VIP的perl脚本
report_script=/usr/local/bin/sendmail.sh  #当执行报警脚本
check_repl_delay=0   #默认如果slave中从库落后主库relaylog超过100M,主库不会选择这个从库为新的master,因为这个从库进行恢复需要很长的时间.通过这个参数,mha触发主从切换的时候会忽略复制的延时,通过check_repl_delay=0这个参数,mha触发主从切换时会忽略复制的延时,对于设置candidate_master=1的从库非常有用,这样确保这个从库一定能成为最新的master
master_binlog_dir=/data/mysql/  #指定二进制日志存放的目录,mha4mysql-manager-0.58必须
指定,之前版本不需要指定
[server1]
hostname=10.0.0.29
candidate_master=1    
[server2]
hostname=10.0.0.32
candidate_master=1   #设置为优先候选master,即使不是集群中事件最新的slave,也会优先当master
[server3]
hostname=10.0.0.33
说明: 主库宕机谁来接管新的master
1. 所有从节点日志都是一致的,默认会以配置文件的顺序去选择一个新主 
2. 从节点日志不一致,自动选择最接近于主库的从库充当新主 
3. 如果对于某节点设定了权重(candidate_master=1),权重节点会优先选择。但是此节点日志量落后主库超过100M日志的话,也不会被选择。可以配合check_repl_delay=0,关闭日志量的检查,强制选择候选节点
相关脚本:(先配置邮件系统,都是在MHA服务器上做即可)
[root@MC13-7 ~]#cat /usr/local/bin/sendmail.sh 
echo "MySQL is down" | mail -s "MHA Warning" root@XXXXXX.com 
[root@MC13-7m ~]#chmod +x /usr/local/bin/sendmail.sh
[root@MC13-7m ~]# vim /usr/local/bin/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 = '10.0.0.100/24';   #设置Virtual IP,只用改这三个选项就好了
my $gateway = '10.0.0.2';    #网关Gateway IP
my $interface = 'ens33';         #指定VIP所在网卡
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";
}
#最后再给它加上执行权限
[root@MC13-7m ~]# chmod +x /usr/local/bin/master_ip_failover
#接下来是给主从节点安装数据库了,安装数据库要求在实验开始前有写,这里是配置
[root@MC14-7m ~]# vim /etc/my.cnf   #主节点配置
[mysqld]
server-id=29
log-bin
skip_name_resolve=1     #禁止反向解析,这一项很重要
general_log          #开启通用日志便于我们观察结果

[root@MC17-7m ~]# vim /etc/my.cnf    #从节点配置,所有从节点
[mysqld]
server-id=32
log-bin     #二进制日志必须开,不然没法提升为主
skip_name_resolve=1
general_log
read_only
relay_log_purge=0    #中继日志不让自动清除,为了防止提升为主

#接下来在主节点上创建两个用户
[root@MC14-7m ~]# mysql
mysql> show master logs;   #要配置从节点的,记得看一看
mysql> grant replication slave on *.* to bai@'10.0.0.%' identified by '123456';  #复制用的
mysql> grant all on *.* to shen@'10.0.0.%' identified by '123456';  #用于远程连接的
#当主节点在这里完成这些操作后就只剩最后一个配置VIP了
[root@MC14-7m ~]# ifconfig ens33:1 10.0.0.100/24


[root@MC17-7m ~]# mysql   #接下来是配置从节点
CHANGE MASTER TO 
MASTER_HOST='10.0.0.29', 
MASTER_USER='bai', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='MC14-7m-bin.000002', 
MASTER_LOG_POS=414;

[root@MC13-7m ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf  #检查ssh是否正常,这两个都是在MHA服务器上检查的
Thu Oct 15 21:59:52 2020 - [info] All SSH connection tests passed successfully. #成功的样子
[root@MC13-7m ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf  #检查复制的若干要求
MySQL Replication Health is OK.  #成功的样子
[root@MC13-7m ~]# masterha_check_status --conf=/etc/mastermha/app1.cnf  #检查状态
app1 is stopped(2:NOT_RUNNING).    #这样就是成功了,只剩下开启了
#开启MHA,默认是前台运行,”nohup”就是放到后台运行的工具
nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null 
#再次查看状态 
[root@MC13-7m ~]# masterha_check_status --conf=/etc/mastermha/app1.cnf
app1 (pid:12707) is running(0:PING_OK), master:10.0.0.29  
#查看到健康性检查 
[root@master ~]#tail -f /var/lib/mysql/centos8.log

3、搭建Percona XtraDB Cluster(PXC 5.7)

 注意:(PXC实现的是多主架构,即三主即以上,最多八台机器)

OS 版本目前不支持CentOS 8

关闭防火墙和SELinux,保证时间同步

如果已经安装MySQL,必须卸载!!!!!!

实现过程如下

#先配置yum源,使用清华大学yum源,官方源太慢了
[root@MC13-7m ~]# vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/7/RPMS/x86_64/
enabled=1
gpgcheck=0
[root@MC13-7m ~]# scp /etc/yum.repos.d/pxc.repo 10.0.0.29:/etc/yum.repos.d/ 
#每台服务器都要拷贝一份,然后接下来是安装,安装很简单,因为有yum源
[root@MC13-7m ~]# yum install -y Percona-XtraDB-Cluster-57  #每台机器都要安装
#当安装好PXC之后会自动生成好多数据库的文件,但是都基本上不用改,只需要改改它的一个配置文件即可
[root@MC13-7m ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[root@MC13-7m ~]# egrep -v "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so   #这个是配置的库
wsrep_cluster_address=gcomm://10.0.0.28,10.0.0.29,10.0.0.32   #这个是集群的机器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.28   #这是被注释了的,要复制粘贴改一下,改为各自的IP
wsrep_cluster_name=pxc-bai-cluster
wsrep_node_name=pxc-cluster-node-1    #各个节点,指定自己的节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"   #取消本行注释,默认复制用的账号,生产中建议把这一行的密码改一下,而且,要改所有节点都要改

注意:尽管Galera Cluster不再需要通过binlog的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过binlog方式完成同步后再加入集群会是一种更好的选择

#启动PXC,注意第一个节点和后面节点的启动方法不一样,启动的是那台机器无所谓,只要是第一个启动PXC的节点就要这样子启动
[root@MC13-7m ~]# systemctl start mysql@bootstrap.service

[root@MC13-7m ~]# ss -nutl  #这两个就是随机生成的两个端口
Netid State      Recv-Q Send-Q   Local Address:Port                  Peer Address:Port              
tcp   LISTEN     0      128                  *:4567                             *:*                  
......
tcp   LISTEN     0      80                  :::3306                            :::*                  
......
[root@MC13-7m ~]# vim /var/log/mysqld.log  #登录数据库的话需要的密码在这里
A temporary password is generated for root@localhost: y-#EKtj4..h.  #有这个”.”
#上一步也可以” cat /var/log/mysqld.log |grep password”,能快点找到密码
[root@MC13-7m ~]# mysql -p'y-#EKtj4..h.'   #登录数据库,修改root密码
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  #和集群相关的状态信息,常用的是查看状态的这个

#以上都是启动的第一个节点相关的操作,接下来是启动后续节点的操作
[root@MC14-7m ~]# systemctl start mysql   
#当后续节点启动后,就已经算是把集群搭好了,且第一台节点可以查看集群相关的状态信息,可以看见集群有多少台机器。

到这里就当第一个机器启动后,并且做了相关的设置之后就不用再去修改其他节点的设置了,会自动同步过来,包括登录数据库的root用户和密码。

 4、通过ansible部署mysql 8

[root@MC13-7m ~]# vim mysql.yml
---
- hosts: mysql
  remote_user: root
  gather_facts: no
  tasks:
    - name: useradd mysql
      shell: id mysql &> /dev/null || useradd -r -d /data/mysql -s /sbin/nologin mysql
    - name: yum
     yum: name=libaio,perl-Data-Dumper,ncurses-libs
    - name: mkdir mysql’s host
     file: path=/data/mysql state=directory owner=mysql group=mysql
    - name: tar
     unarchive: src=/data/ansible/files/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz dest=/usr/local owner=root group=root
    - name: ln mysql
      file: src=/usr/local/mysql-8.0.19-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link
    - name: ln mysql others
     file: src=/usr/local/mysql/bin/ dest=/usr/bin state=link    
    - name: vim /etc/my.cnf
      copy: content='[mysqld]\ndatadir = /data/mysql\nsocket=/data/mysql/mysql.sock\nlog-error=/data/mysql/mysql.log\npid-file=/data/mysql/mysql.pid\n\n[client]\nport=3306\nsocket=/data/mysql/mysql.sock\n' dest=/etc/my.cnf
    - name: make /data/mysql/*
      shell: /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql
    - name: make mysql.sever
      shell: /bin/cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    - name: start mysqld
      shell: chkconfig --add mysqld;chkconfig mysqld on;service mysqld start
    - name: change mysql root password
      shell: mysqladmin -uroot -p` sed -nr '/A temporary/s/.*: (.*)/\1/p' /data/mysql/mysql.log ` password 123456

  

posted @ 2020-10-18 23:51  玉米地里拱白菜的猪  阅读(353)  评论(0)    收藏  举报