数据库的相关搭建,以及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

浙公网安备 33010602011771号