先规划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实现读写分离的三个目标就已经实现.下一步就可以连接到堡垒机进行别的操作等等