一、部署MHA+Atlas实现Mysql集群的高可用及读写分离

1.1 环境说明

主机

IP地址

备注

Mysql-proxy

192.168.1.10

Atlas,提供Mysql的访问代理,实现主从的读写分离

db01

192.168.1.11
vip:192.168.1.15

基于GTID主从的主库
VIP用于实现MHA的透明应用

db02

192.168.1.12

基于GTID主从的从库

db03

192.168.1.13

基于GTID主从的从库

MHA-Manager

192.168.1.14

MHA,实现mysql主库的故障切换

1.2 搭建基于GTID的主从复制环境

1.2.1 Mysql安装

使用二进制安装,执行主机db01、db02、db03

安装相关依赖

yum install -y ncurses-devel libaio-devel gcc gcc-c++ numactl libaio glibc cmake autoconf

下载软件包

wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.36-el7-x86_64.tar.gz

解压并创建软链接

tar -zxf mysql-5.7.36-el7-x86_64.tar.gz -C /usr/local
ln -s /usr/local/mysql-5.7.36-el7-x86_64 /usr/local/mysql

添加到环境变量

echo "export PATH=$PATH:/usr/local/mysql/bin/" > /etc/profile.d/mysql.sh
source /etc/profile

准备数据目录及日志文件

mkdir /usr/local/mysql/data
touch /var/log/mysqld.log

创建mysql进程用户

useradd -M -s /sbin/nologin mysql

目录及文件授权

chown -R mysql.mysql /usr/local/mysql
chown mysql.mysql /var/log/mysqld.log

编缉my.cnf配置文件,其中02及lb03的server-id分别设置为2和3,不能与b01相同

cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data/
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=mysql-bin
binlog_format=row
skip-name-resolve
server-id=1
gtid_mode=on
enforce-gtid-consistency=on
log-slave-updates=1
EOF

初始化实例

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

复制启动脚本到启动目录并授权

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld

启动

/etc/init.d/mysqld start

设置root密码

mysqladmin -uroot -p password "123456"

1.2.2 构建主从复制

创建主从复制账号,执行主机lb01

mysql -uroot -p123456 -e “grant replication slave on *.* to dbsync@’192.168.1.%’ identified by ‘123456’;”

从库配置,执行主机lb02、lb03

登录mysql控制台

mysql -uroot -p 123456

写入主库信息

change master to master_host=’192.168.1.11’,master_port=3306,master_user=’dbsync’,master_password=’123456’,master_auto_position=1;

禁止relaylog 自动删除

set global relay_log_purge = 0;
并在my.cnf配置文件[mysqld]标签下添加
relay_log_purge = 0

开启从库

start slave;

检查IO线程以及SQL线程是否正常

show slave status\G;

1.3 搭建MHA高可用

配置主机互信,执行主机MHA-Manager、lb01、lb02、lb03,注意将xx替换为目标IP

ssh-keygen
sshpass -p123456 ssh-copy-id root@192.168.1.xx -o StrictHostKeyChecking

安装MHA客户端,执行主机MHA-Manager、lb01、lb02、lb03

安装依赖

yum -y  install perl-DBD-MySQL

下载并安装MHA-node软件包

wget https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

创建软链接,确保与MHA脚本执行路径一致,执行主机lb01、lb02、lb03

ln -s /usr/local/mysql/bin /usr/bin
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

安装MHA管理端,执行主机MHA-Manager

安装依赖

yum install -y perl-Config-Tiny perl-Log-Dispatch cpan perl-Parallel-ForkManager perl-Time-HiRes

下载并安装MHA-manager软件

wget https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

编缉配置文件,添加mysql主机信息

mkdir /etc/mha && mkdir /var/log/mha/app1
cat >>/etc/mha/app1.cnf<<EOF
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_user=dbrsync
repl_password=123456
ssh_user=root
 [server1]
hostname=192.168.1.11
port=3306
[server2]
hostname=192.168.1.12
port=3306
[server3]
hostname=192.168.1.13
port=3306
EOF    

创建mha管理用户,执行主机db01

mysql -uroot -p123456 -e " grant all privileges on *.* to mha@'192.168.1.%' identified by 'mha'; flush privileges;" 

检查互信

masterha_check_ssh --conf=/etc/mha/app1.cnf

检查主从

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

启动MHA

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

检查MHA

masterha_check_status --conf=/etc/mha/app1.cnf

 

1.4 配置MHA应用透明

为主库添加VIP,执行主机lb01

ifconfig eth0:1 192.168.1.15/24

创建配置文件,修改vip与主库lb01一致,执行主机MHA-Manager

cat > /usr/local/bin/master_ip_failover << 'EOF'
#!/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.1.15/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip  = "/sbin/ifconfig eth0:$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" ) {
        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" ) {
        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";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
    return 0 unless ($ssh_user);
    `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";
}
EOF

授权

chmod +x /usr/local/bin/master_ip_failover

转换为unix格式编码

dos2unix /usr/local/bin/master_ip_failover

配置MHA配置文件,在[server defaut]标签加入脚本路径

master_ip_failover_script=/usr/local/bin/master_ip_failover

重启MHA

masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

1.5 配置binlogServer进行外部数据补偿

编缉MHA配置文件,添加binlog服务器,执行主机MHA-Manager,需安装Mysql工具。

vim /etc/mha/app1.conf

……

[binlog1]

no_master=1 

hostname=192.168.1.14

master_binlog_dir=/data/mysql/binlog 

创建相关目录并授权

mkdir -p /data/mysql/binlog
useradd -M -s /sbin/nologin mysql
chown -R mysql.mysql /data/mysql/*

拉取数据,binlog名称与主库保持一致

cd /data/mysql/binlog/
mysqlbinlog  -R --host=192.168.1.11 --user=mha --password=mha  --raw --stop-never mysql-bin.000001 &

重启MHA

masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

1.6 配置读写分离

下载并安装Atlat中间件,执行主机Mysql-proxy

wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

添加生产用户,执行主机lb01

mysql -uroot -p123456 -e "grant all privileges on *.* to www@'192.168.1.%' identified by '123456';"

生成mha管理用户密码、生产用户密码与主从复制用户密码的密文

/usr/local/mysql-proxy/bin/encrypt mha
/usr/local/mysql-proxy/bin/encrypt 123456

编缉配置文件,添加Mysql主从复制、MHA管理、生产用户以及对应密码密文,添加主库为写库,从库为读库

vim /usr/local/mysql-proxy/conf/test.cnf
admin-username = user
admin-password = pwd
……
proxy-backend-addresses = 192.168.1.15:3306
proxy-read-only-backend-addresses = 192.168.1.12:3306,192.168.1.13:3306
pwds = repl:3yb7jEku3h8=,mha:O2jBXONX075=,www:O2jBXONX075=
……

启动Atlas

/usr/local/mysql-proxy/bin/mysql-proxyd test start

 

posted @ 2023-03-28 13:45  isxiefeng  阅读(93)  评论(0)    收藏  举报