MHA+maxscale实现数据库集群的高可用和读写分离-简易版

戏子无情 提交于 2019-12-30 22:48:01

服务器:
manager—MHA的管理节点,负责监控主从集群状态并进行故障迁移
Master–主节点
Slave1
Slave2
准备软件:mysql5.7、mha-manager、mha-node(最好rpm包)、低版本maxscale
提前做好ssh互信
1.所有服务器安装依赖包:防止报错都安装
Yum -y install epel-* 安装扩展源(防止自带的yum源不足)
yum install -y perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager

2.所有服务器安装mysql5.7到/usr/local/mysql下
mysql5.7安装注意事项:需要初始化生成原始密码,备份并删除原始my.cnf文件防止后期soket和pid报错
groupadd mysql
useradd -r -g mysql mysql
mkdir /usr/local/mysql/data -p
chown -R mysql:mysql /usr/local/mysql/
chmod -R 755 /usr/local/mysql/
某个版本之后这个步骤是下面这样,以前是mysql_install_db,datadir就是安装路径,basedir就是根目录
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld 复制启动脚本到资源目录
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld 检查是否加入mysql服务
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysql/mysqlbinlog /usr/bin
service mysqld start
使用随机密码登陆mysql后更改密码为123456后重启
mysql> SET PASSWORD = PASSWORD(‘123456’);

3.搭建主从同步
m和两个s节点配置/etc/my.cnf主配置:
[mysqld]
datadir=/usr/local/mysql/data
#socket=/var/lib/mysql/mysql.sock #一定要注释掉,不然启动的时候会去找sock文件很麻烦
symbolic-links=0
log-bin=mysql-log 二进制名
server-id=1
binlog-do-db=alan #同步的库
relay-log = relay-log #中继日志名
relay_log_purge = 0 //是否自动清空不再需要中继日志
log_slave_updates = 1 #随时更新从的数据
binlog-ignore-db=mysql #不同步的库
sync-binlog=1
binlog-format=row
read_only = ON
#[mysqld_safe] #避免麻烦都注释
#log-error=/var/log/mariadb/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid
注意:三个服务器出了serverid外其余配置一样(因为谁都可能会变成主) 其余配置可以根据生产环境自行更改
保持三个mysql的库表结构完全一致
主库授权用户:grant replication slave on . to slave@’%’ identified by “xxx”;
三台重启mysqld
主库show master status看一下状态
两台从库配置授权用户信息:change master to master_host=‘192.168.37.128’,master_user=‘slave’,master_password=‘123456’;
注意:如果报错需要reset slave再stop slave,停止slave的时候才能执行配置授权操作
启动slave并查看状态show slave status\G;

4.搭建MHA
四台服务器都yum一下mha-node
Manager:yum一下mha-manager(如果报错查看是否缺少依赖包)
四台服务器都登陆mysql创建一下mha的管理用户
grant all on . to mhaadmin@’%’ identified by “xxx”;
创建mha的管理目录:/etc/mha
创建mha主配置:/etc/mha/app1.cnf:
[server default] //适用于server1,2,3个server的配置
user=mhaadmin //mha管理用户
password=mhapass //mha管理密码
manager_workdir=/etc/mha/app1 //mha_master自己的工作路径
manager_log=/etc/mha/manager.log // mha_master自己的日志文件
remote_workdir=/usr/local/mysql/data //主从服务器的工作目录
master_binlog_dir=/usr/local/mysql/data //二进制目录
ssh_user=root // 基于ssh的密钥认证
repl_user=slave //数据库用户名
repl_password=magedu //数据库密码
ping_interval=1 //ping间隔时长
[server1] //节点2
hostname=192.168.37.133 //节点2主机地址
ssh_port=22 //节点2的ssh端口
candidate_master=1 //将来可不可以成为master候选节点/主节点
[server2]
hostname=192.168.37.133
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.37.144
ssh_port=22
candidate_master=1

检测ssh状态:manager-check-ssh --conf=/etc/mha/app1.cnf
出现成功就成功了
问题现象:
[root@DBproxy app1]# masterha_check_ssh --conf=/data/masterha/app1/app1.cnf
Can’t locate MHA/SSHCheck.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/masterha_check_ssh line 25.
BEGIN failed–compilation aborted at /usr/bin/masterha_check_ssh line 25.
[root@DBproxy app1]#
问题定位:应该是环境变量的问题
[root@DBproxy app1]# find / -name SSHCheck.pm
/usr/lib/perl5/vendor_perl/MHA/SSHCheck.pm
将相关路径加入PERL5LIB后,问题解决(根本原因是MHA和OS版本不匹配)。
export PERL5LIB=$PERL5LIB:/usr/lib/perl5/vendor_perl/
检测主从状态:mahager-check-repl --conf=/etc/mha/app1.cnf
出现ok则正常
启动mha监控:nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &

5.测试MHA可用性
开启/etc/mha/manager.log及时查看日志状态
检查下主从同步状态正常
关闭主库:systemctl stop mysqld 同时可以看到日志显示主库飘逸到了其中一台s
进入另外两台s,show slave status\G; 可以看到主库已经变更从一主两从变成一主一从且mha监控已自动关闭
需要手动恢复集群状态:启动已宕机的原主库并添加授权主库信息:
change master to master_host=‘192.168.37.128’,master_user=‘slave’,master_password=‘123456’;
启动从库:start slave并查看三台主从集群状态
编辑mha主配置文件app1.cnf(经过m迁移默认删除了一个server需要手动添加)
启动mha监控:nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
查看集群状态:manager-check-status --conf=/etc/mha/app1.cnf 显示running
测试成功

6.在MHA的基础上搭建maxscale(实验把maxscale装到manager上)
依赖包安装yum install libaio libaio-devel novacom-server libedit -y
使用mysql集群时注意安装低版本的maxscale不然会出现很多冲突报错,可能因为这是mariadb开发的产品
使用yum安装maxscale
三台mysql服务器创建监控用户,目的是监控集群的状态,当有机器宕了就不传送请求给他
grant replication slave, replication client on . to scalemon@’%’ identified by ‘123456’;
三台mysql服务器创建路由用户,目的是检测读写分离的分发请求(应该分发到哪一台机上)
grant select on mysql.* to maxscale@’%’ identified by ‘123456’;
编辑maxscale的主配置文件:
注意添加三台mysql的server信息;注意注释掉只读参数选项;注意修改监控用户和路由用户的参数;注意在maxscale模块下添加info日志路径方便测试查看日志log_info=1
logdir=/tmp
启动:maxscale -f /etc/maxscale.cnf
查看maxscale集群状态:maxadmin --user=admin --password=mariadb(默认用户名和密码)
>list sercers #查看集群状态

7.测试maxscale读写分离
客户端登陆并执行读写操作:mysql -ualan -p123456 -h maxscaleIP -P4006
在maxscale服务端tailf-info日志观察记录:
当执行select时,maxscale将请求转发给了slave的IP
当执行insert时,maxscale将请求转发给了master的IP
关闭其中一台slave的mysqld,登陆maxadmin查看集群状态
测试MHA+maxscale:
开启mha的日志并关闭master的mysqld,查看m的迁移并show slave status查看是否迁移成功
现在就是一主一从的状态
登陆maxadmin查看集群状态是否对应
开启maxscale日志并客户端登陆授权用户执行读写操作查看日志分离记录
手动恢复mha集群,测试完成

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!