设为首页 收藏本站
查看: 880|回复: 0

[经验分享] mysql之MHA架构

[复制链接]

尚未签到

发表于 2018-10-5 06:44:26 | 显示全部楼层 |阅读模式
  角色
  Ip地址
  主机名

  Server>  类型
  master
  192.168.1.131
  master1
  1
  主(写)
  Master(candicate)
  192.168.1.132
  Master2
  2
  从(读)
  Slave
  192.168.1.133
  Slave1
  3
  从(读)
  Manager
  192.168.1.134
  Manager
  管理节点
  准备基础环境:
  1.在配置好 IP 地址后检查 selinux,iptables 设置,关闭 selinux ,iptables 服务以便后期主从同步不出错,时间要同步
  2. 在四台机器上配置epelyum和用到perl包
  [root@master1 ~]# yum -y install epel-rpm-macros.noarch
  [root@master1 ~]#  yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles  ncftp  perl-Params-Validate perl-CPAN  perl-Test-Mock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
  3. 配置hosts环境
  [root@master1 ~]# vim /etc/hosts
  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  192.168.1.131 master1
  192.168.1.132 master2
  192.168.1.133 slave1
  192.168.1.134 manager
  [root@master1 ~]# for i in master2 slave1 manager; do scp /etc/hosts $i:/etc/ ;done
  4. 建立ssh交互登录环境,四台都要做
  [root@master1 ~]# ssh-keygen -t rsa
  [root@master1 ~]# for i in master1 master2 slave1 manager ;do ssh-copy-id -i ~/.ssh/id_rsa.pub $i;done
  配置mysql的半同步复制
  为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置 MHA 的同时建议配置成MySQL 的半同步复制。
  注:mysql 半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是 master
  用的 semisync_master.so,一个是 slave 用的 semisync_slave.so,下面我们就来具体配置一下。如果不清楚 Plugin 的目录,用如下查找:
  mysql> show variables like '%plugin_dir%';
  +---------------+------------------------------+
  | Variable_name | Value                        |
  +---------------+------------------------------+
  | plugin_dir    | /usr/local/mysql/lib/plugin/ |
  +---------------+------------------------------+
  1 row in set (0.01 sec)
  1、 分别在主从节点上安装相关的插件(master, Candicate master,slave)
  在 MySQL 上安装插件需要数据库支持动态载入。检查是否支持,用如下检测
  mysql> show variables like '%have_dynamic_loading%';
  +----------------------+-------+
  | Variable_name        | Value |
  +----------------------+-------+
  | have_dynamic_loading | YES   |
  +----------------------+-------+
  所有 mysql 数据库服务器,安装半同步插件(semisync_master.so,semisync_slave.so)
  mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
  mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  检查 Plugin 是否已正确安装:
  mysql> show plugins;
  | partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
  | ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
  | FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     |
  | ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |
  | rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
  | rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
  +----------------------------+----------+--------------------+--------------------+---------+
  或
  mysql> select * from information_schema.plugins;
  查看半同步相关信息
  mysql> show variables like '%rpl_semi_sync%';
  +-------------------------------------------+------------+
  | Variable_name                             | Value      |
  +-------------------------------------------+------------+
  | rpl_semi_sync_master_enabled              | OFF        |
  | rpl_semi_sync_master_timeout              | 10000      |
  | rpl_semi_sync_master_trace_level          | 32         |
  | rpl_semi_sync_master_wait_for_slave_count | 1          |
  | rpl_semi_sync_master_wait_no_slave        | ON         |
  | rpl_semi_sync_master_wait_point           | AFTER_SYNC |
  | rpl_semi_sync_slave_enabled               | OFF        |
  | rpl_semi_sync_slave_trace_level           | 32         |
  +-------------------------------------------+------------+
  2. 修改mysql配置文件,设置主从同步
  [root@master1 ~]# vim /etc/my.cnf
  server-id = 1
  log-bin=mysql-bin
  binlog_format=mixed
  log-bin-index=mysql-bin.index
  rpl_semi_sync_master_enabled=1
  rpl_semi_sync_master_timeout=1000
  rpl_semi_sync_slave_enabled=1
  relay_log_purge=0

  relay-log =>  relay-log-index = slave-relay-bin.index
  rpl_semi_sync_master_enabled=1 1 表是启用,0 表示关闭
  rpl_semi_sync_master_timeout=10000:毫秒单位 ,该参数主服务器等待确认消息 10 秒后,
  不再等待,变为异步方式。
  [root@master2 ~]# vim /etc/my.cnf
  server-id = 2
  log-bin=mysql-bin
  binlog_format=mixed
  log-bin-index=mysql-bin.index
  relay_log_purge=0

  relay-log =>  relay-log-index = slave-relay-bin.index
  rpl_semi_sync_master_enabled=1
  rpl_semi_sync_master_timeout=10000
  rpl_semi_sync_slave_enabled=1

  注:relay_log_purge=0,禁止 SQL 线程在执行完一个>
  场景下,对于某些滞后从库的恢复依赖于其他从库的>  [root@slave1 ~]# vim /etc/my.cnf
  Server-id = 3
  log-bin = mysql-bin

  relay-log =>  relay-log-index = slave-relay-bin.index
  read_only = 1
  rpl_semi_sync_slave_enabled=1
  在master上查看半同步相关信息
  mysql> show variables like '%rpl_semi_sync%';

  查看半同步状态:
  mysql> show status like '%rpl_semi_sync%';

  rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式
  rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式
  rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量
  rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量
  rpl_semi_sync_master_tx_avg_wait_time :事务因开启 semi_sync ,平均需要额外等待的时间
  rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间
  主从同步
  Master1主机

  mysql> grant replication slave on *.* to rep@'192.168.1.%'>
  mysql> grant all privileges on *.* to manager@'192.168.1.%'>  mysql> show master status;

  第一条 grant 命令是创建一个用于主从复制的帐号,在 master 和 candicate master 的主机上创建即可。
  第二条 grant 命令是创建 MHA 管理账号,所有 mysql 服务器上都需要执行。MHA 会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权。
  Master2主机

  mysql> grant replication slave on *.* to rep@'192.168.1.%'>
  mysql> grant all privileges on *.* to manager@'192.168.1.%'>  mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;
  mysql> start slave;
  mysql> show slave slave;

  Slave1主机

  mysql> grant all privileges on *.* to manager@'192.168.1.%'>  mysql>  change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;
  mysql> start slave;
  mysql> show slave status\G;

  查看 master1 服务器的半同步状态
  mysql> show status like '%rpl_semi_sync%';

  配置mysql-mha
  在所有数据库节点上安装 mha4mysql-node-0.56.tar.gz
  [root@master1 ~]# tar zxf mha4mysql-node-0.56.tar.gz
  [root@master1 ~]# cd mha4mysql-node-0.56/
  [root@master1 mha4mysql-node-0.56]# perl Makefile.PL
  [root@master1 mha4mysql-node-0.56]# make &&make install
  其他两个数据节点也安装 mha4mysql-node-0.56.tar.gz(过程略)
  在管理节点需要两个都安装:mha4mysql-node-0.56.tar.gz 和 mha4mysql-manager-0.56.tar.gz
  [root@manager ~]# tar zxf mha4mysql-node-0.56.tar.gz
  [root@manager ~]# cd mha4mysql-node-0.56/
  [root@manager mha4mysql-node-0.56]# perl Makefile.PL
  [root@manager mha4mysql-node-0.56]# make && make install
  [root@manager mha4mysql-node-0.56]# cd
  [root@manager ~]# tar zxf mha4mysql-manager-0.56.tar.gz
  [root@manager ~]# cd mha4mysql-manager-0.56/
  [root@manager mha4mysql-manager-0.56]# perl Makefile.PL
  [root@manager mha4mysql-manager-0.56]# make &&make install
  [root@manager mha4mysql-manager-0.56]# mkdir /etc/masterha
  [root@manager mha4mysql-manager-0.56]# mkdir -p /masterha/app1
  [root@manager mha4mysql-manager-0.56]# mkdir /scripts
  [root@manager mha4mysql-manager-0.56]# cp samples/conf/* /etc/masterha/
  [root@manager mha4mysql-manager-0.56]# cp samples/scripts/* /scripts/
  [root@manager mha4mysql-manager-0.56]# vim /etc/masterha/app1.cnf
  [server default]
  manager_workdir=/masterha/app1
  manager_log=/masterha/app1/manager.log
  user=manager
  password=123
  ssh_user=root
  repl_user=rep
  repl_password=123
  ping_interval=1
  [server1]
  hostname=192.168.1.131
  port=3306
  master_binlog_dir=/usr/local/mysql/data
  candidate_master=1
  [server2]
  hostname=192.168.1.132
  port=3306
  master_binlog_dir=/usr/local/mysql/data
  candidate_master=1
  [server3]
  hostname=192.168.1.133
  port=3306
  master_binlog_dir=/usr/local/mysql/data
  no_master=1
  保存退出
  [root@manager mha4mysql-manager-0.56]# > /etc/masterha/masterha_default.cnf
  manager_workdir=/masterha/app1 //设置 manager 的工作目录
  manager_log=/masterha/app1/manager.log //设置 manager 的日志
  user=manager //设置监控用户 manager
  password=123456 //监控用户 manager 的密码
  ssh_user=root //ssh 连接用户
  repl_user=mharep //主从复制用户
  repl_password=123.abc //主从复制用户密码
  ping_interval=1 //设置监控主库,发送 ping 包的时间间隔,默认是 3 秒,尝试三次没有回
  应的时候自动进行 railover
  master_binlog_dir=/usr/local/mysql/data //设置 master 保存 binlog 的位置,以便 MHA 可
  以找到 master 的日志,我这里的也就是 mysql 的数据目录
  candidate_master=1 //设置为候选 master,如果设置该参数以后,发生主从切换以后将会
  将此从库提升为主库。
  ssh有效性验证:
  [root@manager mha4mysql-manager-0.56]# masterha_check_ssh --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
  正确显示结果没有报错

  集群复制的有效性验证(mysql必须都启动):
  [root@manager mha4mysql-manager-0.56]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
  命令执行完最后报错的地方

  解决办法在所有服务器上执行:
  [root@manager mha4mysql-manager-0.56]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

  启动manger
  [root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /tmp/mha_mager.log &
  [1] 1319
  状态检查
  [root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
  app1 (pid:1319) is running(0:PING_OK), master:192.168.1.131
  故障转移验证:
  1. 停掉master1
  [root@master1 mha4mysql-node-0.56]# service mysqld stop
  2. 查看MHA日志
  [root@manager ~]# tail -f /masterha/app1/manager.log

  3. 登录slave1的mysql查看slave状态
  mysql> show slave status\G;

  MHA Manager 端日常主要操作步骤
  1)检查是否有下列文件,有则删除。
  发生主从切换后,MHAmanager 服务会自动停掉,且在 manager_workdir(/masterha/app1)
  目录下面生成文件 app1.failover.complete,若要启动 MHA,必须先确保无此文件)
  [root@manager ~]# ll /masterha/app1/
  total 24
  -rw-r--r-- 1 root root     0 Aug  8 02:02 app1.failover.complete
  -rw-r--r-- 1 root root 20955 Aug  8 02:02 manager.log
  [root@manager ~]# rm -rf /masterha/app1/app1.failover.complete
  2)检查 MHA 复制检查:(需要把 master1 设置成 candicatade 的从服务器)
  mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='123';
  mysql> start slave;

  3)停止 MHA: masterha_stop --conf=/etc/masterha/app1.cnf
  4)启动 MHA:
  #nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
  当有 slave 节点宕掉时,默认是启动不了的,加上 --ignore_fail_on_start 即使有节点宕掉也
  能启动 MHA,如下:
  #nohup  masterha_manager  --conf=/etc/masterha/app1.cnf  --ignore_fail_on_start
  &>/tmp/mha_manager.log &
  5) 检查状态:
  # masterha_check_status --conf=/etc/masterha /app1.cnf
  6) 检查日志:
  #tail -f /masterha/app1/manager.log
  7)主从切换后续工作
  重构:
  重构就是你的主挂了,切换到 Candicate master 上,Candicate master 变成了主,因此重构的一种方案原主库修复成一个新的 slave主库切换后,把原主库修复成新从库,然后重新执行以上 5 步。原主库数据文件完整的情况下,可通过以下方式找出最后执行的 CHANGE MASTER 命令:
  [root@manager ~]#  grep "CHANGE MASTER TO MASTER" /masterha/app1/manager.log | tail -1
  Wed Aug  8 02:02:40 2018 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='xxx';
  定期删除中继日志

  在配置主从复制中,slave 上设置了参数>  corntab -e
  0 5 * * * /usr/local/bin/purge_relay_logs --user=root --password=pwd123 --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-612340-1-1.html 上篇帖子: Mysql报错message from server: ERROR 1062 (23000): 下篇帖子: Linux中同步MySQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表