linux搭建基于GTID的主从复制,MHA高可靠架构,基于Atlas实现读写分离步骤

先规划mysql服务器架构,我计划最少3台,一台作为主服务器,两台作为从服务器,同时其中一台从服务器作为之后的代理服务器(创两台问题也不大但读写分离的时候不明显).

图如下:

本文主要介绍基于gtid的主从复制,这个方法相比于普通的主从复制,配置更加简单.

1.准备环境

三台centos分别部署MySQL 5.7.26
过程略。。。
mkdir /data/binlog
chown mysql.mysql /data/binlog/

2.准备配置文件

主库db01:

cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/application/mysql/
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=01
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

slave1(db02):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=07
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

slave2(db03):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=09
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

这里的配置文件就改了个server_id,其他都一样

3.开启mysql服务器

systemctl start mysqld

4.构建主从

master:db01:

grant replication slave  on *.* to repli@'192.168.147.%' identified by '123456';

红色的要改成自己的虚拟机网段.

slave:db02,db03:

先登录进入你的从mysql

change master to
master_host='192.168.147.161',
master_user='repli',
master_password='123456',
MASTER_AUTO_POSITION=1;

红色改成你的db01的地址

start slave;//开启slave

show slave status\G

见到都是yes说明同步成功

                                                        MHA搭建高可用架构

简单来说就是,一台从服务器负责监视主服务器,一旦主服务器宕机了,就推举server_id下一位的从服务器当主服务器.

2.1 搭建体验
(1)配置关键程序软连接
ln -s /application/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql          /usr/bin/mysql


(2)配置互信
主服务器:
rm -rf /root/.ssh

ssh-keygen

cd /root/.ssh

mv id_rsa.pub authorized_keys

scp  -r  /root/.ssh  192.168.147.158:/root
scp  -r  /root/.ssh  192.168.147.155:/root

各节点验证
db01:
ssh 192.168.147.161 hostname
ssh 192.168.147.158 hostname
ssh 192.168.147.155 hostname
db02:
ssh 192.168.147.161 hostname
ssh 192.168.147.158 hostname
ssh 192.168.147.155 hostname
db03:
ssh 192.168.147.161 hostname
ssh 192.168.147.158 hostname
ssh 192.168.147.155 hostname

(3)安装软件包
三个节点:(想要实现MHA需要在所有服务器上都安装mha4mysql-node-0.56-0.el6.noarch.rpm,同时在代理服务器上安装MHA manager)
yum install perl-DBD-MySQL unzip -y
# cd
# rz
# scp MHA.zip root@192.168.147.155:/root  
# scp MHA.zip root@192.168.147.158:/root  
# unzip MHA.zip
# cd MHA
# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

MHA压缩包链接:https://pan.baidu.com/s/1wEJcgtGbYo3i4m_YxvVRxA?pwd=1008
提取码:1008

(4) 在db01主库中创建mha需要的用户
grant all privileges on *.* to mha@'192.168.147.%' identified by 'mha';

(5) Manager软件安装(db03)(需要联网)
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
# cd MHA
# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

(6) 配置文件准备(db03)
创建配置文件目录
# mkdir -p /etc/mha
创建日志目录
# mkdir -p /var/log/mha/app1
编辑mha配置文件
# 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_password=123456
repl_user=repli
ssh_user=root
[server1]
hostname=192.168.147.161
port=3306
[server2]
hostname=192.168.147.158 
port=3306
[server3]
hostname=192.168.147.155
port=3306
EOF

(7)  状态检查(db03)
### 互信检查
# masterha_check_ssh  --conf=/etc/mha/app1.cnf


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

(8) 开启MHA(db03):
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 &
--remove_dead_master_conf    //将失效的节点从集群中删除
--ignore_last_failover        //忽略主从切换时间间隔限制
(9)  查看MHA状态
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

到此MHA高可靠就初步搭建完成,在我的设置中,一旦主机宕机,那么就会被从集群中删除,也就是原先主机想恢复,必须手动添加,可以自行验证,我就不验证了.

(10)MHA应用透明:

db03:
cp /root/MHA/master_ip_failover.txt /usr/local/bin/master_ip_failover

vim /usr/local/bin/master_ip_failover
my $vip = '172.16.12.200/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens32:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens32:$key down";

红色的地方改成添加的虚拟ip,这一段配置的功能是:当MHA监控到主机宕机之后,在推举新从机同时,旧主机会关闭虚拟ip,新主机对应网卡会创新的虚拟ip,实现双机热备.

[root@db03 bin]# yum install -y  dos2unix
[root@db03 bin]# dos2unix /usr/local/bin/master_ip_failover
[root@db03 bin]# chmod +x /usr/local/bin/master_ip_failover

[root@db03 bin]# vim /etc/mha/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover

db01:手工添加vip(此步在master服务器上)
[root@db01 ~]# ifconfig ens32:1 192.168.1.14/24

db03 : 重启MHA
[root@db03 bin]# masterha_stop --conf=/etc/mha/app1.cnf

[root@db03 bin]# 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 &

[root@db03 bin]# masterha_check_status --conf=/etc/mha/app1.cnf

会自动显示新的主机

                                                                MHA恢复

在我的MHA启动文件中,我设置的是MHA主从切换时,会把

这里面的原先的server1删除,这时候由于原先的主机没有加入新的主从数据库同步关系,所以我们不能直接添加被删除的server1,有以下步骤(也是正在运行的主从关系添加新从机方法):

1.先锁住主机

2.从机原始数据同步.(进行这一步是因为主从复制如果数据不同步,从机在同步主机命令可能会因为没有对应的数据而关闭同步关系,上面没做同步是因为是新mysql数据库,不会出现数据不同步关系)

        用mysqldump全局备份一份.sql文件,用scp传给新从机(MHA先前已经建立过互信,这里正常是不用输密码的),进入新从机mysql,先reset 先前的主从关系,然后用source运行传过来的.sql文件

3.新从机重新进行gtid同步

4.更改 /etc/mha/app1.cnf内容,添加新从机(如果你想恢复原先的主从关系,那么只要把新主机设成server1,原先主机设成server2重新运行一次MHA主从转换就可以实现),先检查互信关系还在不在,然后就正常运行.

                                                        读写分离

读写分离的思路就是我部署一台代理服务器,我在这台代理服务器上进行mysql操作,然后代理服务器会把我的命令分类转交给对应的mysql服务器.

1.安装配置atlas

[root@db03 ~]# cd MHA
[root@db03 MHA]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
cd /usr/local/mysql-proxy/conf
mv test.cnf test.cnf.bak

安装包我发在上面的度盘里

vim test.cnf
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 172.16.12.200:3306  //我这里用的是主机桥接的虚拟ip
proxy-read-only-backend-addresses = 192.168.147.158:3306,192.168.147.155:3306
pwds = repli:/iZxz+0GRoA=,mha:O2jBXONX098=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log=ON
proxy-address = 0.0.0.0:33060
admin-address = 0.0.0.0:2345
charset=utf8

2.启动atlas
/usr/local/mysql-proxy/bin/mysql-proxyd test start
3. Atlas功能测试

测试读操作:
mysql -umha -pmha  -h 172.16.12.200 -P 33060


mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)

可以看到读会在两个服务器间转移.
测试写操作:
mysql> begin;select @@server_id;commit;

至此,mysql的读写分离已经实现,但如果我想要添加用户该怎么添加?

如果想要在atlas里添加用户,基于我们目前的架构,不难想到是先在db01上赋权就可以同步到db03上了,想法是正确的但其实这还不够,因为在一开始我们就说了,atlas是提供一个中间站的角色,因为他有自己的虚拟环境,他有自己独立的用户,这一点可以从他的admin用户是单独设置的就可以看出,所以如果我们需要在atlas中添加用户,我们就要先进入2345端口也就是admin账号,然后ADD PWD abcd:123456;再执行SELECT * FROM pwds;就可以看到我们新加的账号,之后SAVE CONFIG;保存退出,如果不保存,atlas的配置文件里就不会发生变化,那么账号也只是临时账号

总结如果想要在atlas里添加账号,先在主库db01赋权(保证可以在数据库操作的权限),再在atlas的admin层添加账号,这样我们才能新增atlas的应用层账号.

一些不常见的小问题:

1.我的虚拟ip无法正常被同小组不同电脑的客户机使用,但我自己可以使用

        结论:虚拟ip被占用,本机能ping通是因为会优先找近的,在选择虚拟ip可以先ping,如果不通说明没人占用,再用这个ip.

删除虚拟ip的命令 ip addr del 虚拟ip地址/24 dev 网卡(ens33)

至此,linux搭建基于GTID的主从复制,MHA高可靠架构,基于Atlas实现读写分离的三个目标就已经实现.下一步就可以连接到堡垒机进行别的操作等等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值