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

[经验分享] mysql双机热备+heartbeat集群+自动故障转移

[复制链接]

尚未签到

发表于 2015-9-5 13:24:41 | 显示全部楼层 |阅读模式
  环境说明:本环境由两台mysql 数据库和heartbeat 组成,一台的ip
  为 192.168.10.197,一台为192.168.10.198,对外提供服务的vip
  为192.168.10.200
  备注:heartbeat 本身是不能做到服务不可用自动切换的,所以用结合
  额外的脚本才可以做到,本文中提到的moniter 脚本即为实现某个
  mysql 服务不可用的时候自动切换的还可以自动报警
  安装和配置过程分为如下几步:
  第一部分:mysql 的安装配置
  1 安装
  1.1. 添加mysql 运行所需的用户和组
  groupadd mysql
  useradd -g mysql mysql
  1.2. 解压安装
  tar mysql-5.1.26-rc-linux-x86_64-glibc23.tar.gz
  mv mysql-5.1.26-rc-linux-x86_64-glibc23 /usr/local/mysql/
  chown -R mysql:mysql /usr/local/mysql
  1.3. 复制主配置文件和启动脚本
  cd /usr/local/mysql
  cp support-files/my-medium.cnf /etc/my.cf
  cp support-files/mysql.server /etc/init.d/mysqld
  chmod +x /etc/init.d/mysqld
  1.4. 初始化数据库
  cd /usr/local/mysql
  scripts/mysql_install_db --user=mysql
  1.5. 更改数据目录的所有者和组
  chown -R mysql:mysql ./data
  1.6. 注册mysql 为系统服务
  chkconfig --add mysqld
  chkconfig --levels 2345 mysqld on
  1.7. 输出环境变量
  #Vi /etc/profile(内容如下)
  PATH=$PATH:/usr/local/mysql/bin
  # source /etc/profile
  1.8. 设置数据库密码
  service mysqld start
  mysqladmin password 123456(密码自己定这里只是个例子)
  1.9. 开启root 远程访问权限
  mysql –p123456
  mysql> grant all on *.* to root@'%' identified by '123456';
  Query OK, 0 rows affected (0.00 sec)
  mysql> flush privileges;
  mysql> quit
  2 参数设置
  2.1. 创建相关目录并设置权限
  mkdir /usr/local/mysql/binlog/
  chown –R mysql:mysql /usr/local/mysql/binlog/
  touch /var/log/mysql.log
  chown –R mysql:mysql /var/log/mysql.log
  2.2. 添加同步复制的账号(主库和辅库的设置相同)
  [iyunv@master ~]# mysql -p
  Enter password:(输入root 密码)
  mysql> grant all on *.* to qiangao identified by '123456';(其中的账号和密码要
  和配置文件中指定的相同)
  mysql> flush privileges;
  2.3. 修改主配置文件
  注意:其中ip 要互相指向对方的ip 按实际情况来设定,用户名和密码要和上文的用户名密码保持一致主库设置
  vi /etc/my.cnf(用如下内容覆盖原有内容)
  ################################################
  ##########
  [client]
  port = 3306
  socket = /tmp/mysql.sock
  [mysqld]
  ################### auto_increment
  ###########################
  auto_increment_offset = 1
  auto_increment_increment = 2
  ############## other options ##############
  default-character-set = utf8
  default-storage-engine = InnoDB
  default-table-type = INNODB
  max_connections = 800
  port = 3306
  socket = /tmp/mysql.sock
  skip-locking
  ########## MyISAM options #################
  myisam_max_sort_file_size = 10G
  myisam_max_extra_sort_file_size = 10G
  myisam_sort_buffer_size = 10M
  myisam_repair_threads = 1
  ################ select cache options ##################
  read_buffer_size = 2M
  read_rnd_buffer_size = 16M
  bulk_insert_buffer_size = 5M
  max_allowed_packet = 1M
  table_cache = 2048
  query_cache_size = 32M
  query_cache_limit = 2M
  sort_buffer_size = 8M
  join_buffer_size = 8M
  thread_concurrency = 8
  ################ index cache options ##################
  key_buffer_size = 32M
  key_buffer_size = 32M
  ################# master #########################
  server-id = 1
  log-bin=/usr/local/mysql/binlog/master-bin
  binlog_format=mixed
  relay-log=/usr/local/mysql/binlog/mysqld-relay-bin
  ##################### slave
  ##########################
  relay-log=/usr/local/mysql/binlog/slave-relay-bin
  master-host=192.168.10.198
  master-user=qiangao
  master-password=123456
  master-connect-retry=10
  ############## log ##################
  log-error=/var/log/mysql.log
  ######### INNODB #########
  innodb_file_per_table
  #+++++++ log ++++++++#
  innodb_log_buffer_size = 10M
  innodb_mirrored_log_groups = 1
  innodb_log_files_in_group = 3
  innodb_log_file_size = 50M
  innodb_flush_log_at_trx_commit = 0
  #innodb_log_archive = 0
  #+++++++ System buffer +++++++#
  innodb_buffer_pool_size = 1024M
  innodb_additional_mem_pool_size = 40M
  #+++++++ Other +++++++#
  innodb_file_io_threads = 4
  innodb_lock_wait_timeout = 5
  innodb_force_recovery = 0
  innodb_fast_shutdown = 1
  innodb_thread_concurrency = 8
  innodb_lock_wait_timeout = 50
  transaction-isolation = READ-COMMITTED
  [mysqldump]
  quick
  max_allowed_packet = 16M
  [mysql]
  no-auto-rehash
  # Remove the next comment character if you are not familiar with SQL
  #safe-updates
  [isamchk]
  key_buffer = 128M
  sort_buffer_size = 128M
  read_buffer = 2M
  write_buffer = 2M
  [myisamchk]
  key_buffer = 128M
  sort_buffer_size = 128M
  read_buffer = 2M
  write_buffer = 2M
  [mysqlhotcopy]
  interactive-timeout
  辅库设置
  vi /etc/my.cnf(用如下内容覆盖原有内容,)
  ################################################
  ##########
  [client]
  port = 3306
  socket = /tmp/mysql.sock
  [mysqld]
  ################### auto_increment
  ###########################
  auto_increment_offset = 1
  auto_increment_increment = 2
  ############## other options ##############
  default-character-set = utf8
  default-storage-engine = InnoDB
  default-table-type = INNODB
  max_connections = 800
  port = 3306
  socket = /tmp/mysql.sock
  skip-locking
  ########## MyISAM options #################
  myisam_max_sort_file_size = 10G
  myisam_max_extra_sort_file_size = 10G
  myisam_sort_buffer_size = 10M
  myisam_repair_threads = 1
  ################ select cache options ##################
  read_buffer_size = 2M
  read_rnd_buffer_size = 16M
  bulk_insert_buffer_size = 5M
  max_allowed_packet = 1M
  table_cache = 2048
  query_cache_size = 32M
  query_cache_limit = 2M
  sort_buffer_size = 8M
  join_buffer_size = 8M
  thread_concurrency = 8
  ################ index cache options ##################
  key_buffer_size = 32M
  key_buffer_size = 32M
  ################# master #########################
  server-id = 2
  log-bin=/usr/local/mysql/binlog/master-bin
  binlog_format=mixed
  relay-log=/usr/local/mysql/binlog/mysqld-relay-bin
  ##################### slave
  ##########################
  relay-log=/usr/local/mysql/binlog/slave-relay-bin
  master-host=192.168.10.197
  master-user=qiangao
  master-password=123456
  master-connect-retry=10
  ############## log ##################
  log-error=/var/log/mysql/error.log
  ######### INNODB #########
  innodb_file_per_table
  #+++++++ log ++++++++#
  innodb_log_buffer_size = 10M
  innodb_mirrored_log_groups = 1
  innodb_log_files_in_group = 3
  innodb_log_file_size = 50M
  innodb_flush_log_at_trx_commit = 0
  #innodb_log_archive = 0
  #+++++++ System buffer +++++++#
  innodb_buffer_pool_size = 1024M
  innodb_additional_mem_pool_size = 40M
  #+++++++ Other +++++++#
  innodb_file_io_threads = 4
  innodb_lock_wait_timeout = 5
  innodb_force_recovery = 0
  innodb_fast_shutdown = 1
  innodb_thread_concurrency = 8
  innodb_lock_wait_timeout = 50
  transaction-isolation = READ-COMMITTED
  [mysqldump]
  quick
  max_allowed_packet = 16M
  [mysql]
  no-auto-rehash
  # Remove the next comment character if you are not familiar with SQL
  #safe-updates
  [isamchk]
  key_buffer = 128M
  sort_buffer_size = 128M
  read_buffer = 2M
  write_buffer = 2M
  [myisamchk]
  key_buffer = 128M
  sort_buffer_size = 128M
  read_buffer = 2M
  write_buffer = 2M
  [mysqlhotcopy]
  interactive-timeout
  2.4. 重新启动服务
  service mysqld restart
  3 防火墙是设置
  注意主库和辅库的防火墙设置是一样的
  iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
  service iptables save
  第二部分:heartbeat 的安装和配置
  两台主机硬件环境(不必完全一致):
  eth0: 对外IP
  eth1: 对内IP(HA 专用)
  两台主机的eht1 使用双机对联线直接连接。
  【二】安装前网络环境设定:
  ================================================
  ========
  node1: 主机名:master.qiangao.com
  eth0: 192.168.10.197 //对外IP 地址
  eth1: 172.16.1.3 //HA 心跳使用地址
  ---------------------------
  node2: 主机名:slave.qiangao.com
  eth0: 192.168.10.198 //对外IP 地址
  eth1: 172.16.1.4 //HA 心跳使用地址
  特别注意要检查以下几个文件:
  /etc/hosts
  /etc/host.conf
  /etc/resolv.conf
  /etc/sysconfig/network
  /etc/sysconfig/network-scripts/ifcfg-eth0
  /etc/sysconfig/network-scripts/ifcfg-eth1
  /etc/nsswitch.conf
  #vi /etc/hosts
  node1 的hosts 内容如下:
  127.0.0.1 master.qiangao.com master localhost.localdomain localhost
  192.168.10.197 master.qiangao.com
  192.168.10.198 slave.qiangao.com
  ::1 localhost6.localdomain6 localhost6
  ---------------------------
  node2 的hosts 内容如下:
  127.0.0.1 slave.qiangao.com slave localhost.localdomain localhost
  192.168.10.197 master.qiangao.com
  192.168.10.198 slave.qiangao.com
  ::1 localhost6.localdomain6 localhost6
  #cat /etc/host.conf
  order hosts,bind
  #cat /etc/resolv.conf
  nameserver 202.96.134.133 //DNS 地址
  #cat /etc/sysconfig/network
  NETWORKING=yes
  HOSTNAME= master.qiangao.com //主机名
  GATEWAY="192.168.10.1" //网关
  GATEWAY="eth0" //网关使用网卡
  ONBOOT=YES //启动时加载
  FORWARD_IPV4="yes" //只允许IPV4
  ---------------------------
  #cat /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0
  ONBOOT=yes
  BOOTPROTO=static
  IPADDR=192.168.10.197
  NETMASK=255.255.255.0
  GATEWAY=192.168.10.1
  TYPE=Ethernet
  IPV6INIT=no
  ---------------------------
  #cat /etc/sysconfig/network-scripts/ifcfg-eth1
  DEVICE=eth1
  ONBOOT=yes
  BOOTPROTO=none
  IPADDR=172.16.1.3
  NETMASK=255.255.0.0
  TYPE=Ethernet
  [node1] 与 [node2] 在上面的配置中,除了
  /etc/hosts
  /etc/sysconfig/network
  /etc/sysconfig/network-scripts/ifcfg-eth0
  /etc/sysconfig/network-scripts/ifcfg-eth1
  要各自修改外,其他一致。
  配置完成后,试试在各自主机上ping 对方的主机名,应该可以ping 通:
  [iyunv@master ~]# ping slave.qiangao.com
  PING slave.qiangao.com (192.168.10.198) 56(84) bytes of data.
  64 bytes from slave.qiangao.com (192.168.10.198): icmp_seq=1 ttl=64
  time=0.136 ms
  【三】安装HA 与HA 依赖包
  ================================================
  ===========
  yum install heartbeat
  yum install ipvsadm
  yum install libnet
  【四】 配置 HA 的各配置文件
  首先复制配置文件到/etc 目录
  cd /usr/share/doc/heartbeat-2.1.3
  cp ha.cf haresources /etc/ha.d/
  cp authkeys /etc/ha.d/
  ================================================
  ===========
  配置心跳的加密方式:authkeys
  如果使用双机对联线(双绞线),可以配置如下:
  #vi /etc/hc.d/authkeys
  auth 1
  1 crc
  存盘退出,然后
  #chmod 600 authkeys
  ================================================
  ===========
  配置心跳的监控:haresources
  创建检测脚本(本处如果没有个监测脚本hearbeat 无法启动)
  vi /etc/init.d/test(内容如下)
  #!/bin/bash
  echo "" $>/dev/null
  chmod 777 /etc/init.d/test
  ================================================
  ===========
  #vi /etc/ha.d/haresources(配置资源文件)
  各主机这部分应完全相同。
  master.qiangao.com 192.168.10.200 test
  指定 master.qiangao.com 调用预先写好的一个测试脚本,系统附加一个虚拟IP
  192.168.10.200 给eth0:0
  这里如果master.qiangao.com 宕机后slave.qiangao.com 可以新分配IP
  192.168.10.200
  ================================================
  ===========
  配置心跳的配置文件:ha.cf
  #vi /etc/ha.d/ha.cf
  logfile /var/log/ha_log/ha-log.log ## ha 的日志文件记录位置。如没有
  该目录,则需要手动添加
  bcast eth1 ##使用eht1 做心跳监测
  keepalive 2 ##设定心跳(监测)时间时间为2 秒
  warntime 4####警告时间
  deadtime 6#########确定服务以死的时间
  initdead 30
  hopfudge 1
  udpport 694 ##使用udp 端口694 进行心跳监测
  auto_failback on
  node master.qiangao.com ##节点1,必须要与 uname -n 指令得到的结果一致。
  node slave.qiangao.com ##节点2
  ping 172.16.1.04 ##通过ping 对方来监测心跳是否正常。
  respawn hacluster /usr/lib64/heartbeat/ipfail(因操作系统而异)
  apiauth ipfail gid=haclient uid=hacluster
  debugfile /var/logs/ha-debug.log
  ---------------------------
  【五】 HA 服务的启动、关闭
  [iyunv@master ha.d]# chkconfig --add heartbeat
  [iyunv@master ha.d]# chkconfig --levels 2345 heartbeat on
  启动HA: service heartbeat start
  关闭HA; service heartbeat stop
  【六】 防火墙设置
  ================================================
  ====
  heartbeat 默认使用udp 694 端口进行心跳监测。 如果系统有使用iptables 做
  防火墙,应记住把这个端口打开。
  #vi /etc/sysconfig/iptables
  加入以下内容(互相指向对方ip)
  -A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -d 172.16.1.4 -j ACCEPT
  意思是udp 694 端口对 对方的心跳网卡地址 172.16.1.4 开放。
  #service iptables restart
  重新加载iptables。
  第三部分:监控脚本
  cat /usr/local/mysql/bin/moniter.sh
  #!/bin/bash
  mysql_path=/usr/local/mysql/bin/
  user="root"
  password="123456"
  email="qubq@qian-gao.com"
  logfile=/var/log/moniter.log
  date=`(date +%y-%m-%d--%H:%M:%S)`
  sleeptime=30
  ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' |
  awk -F':' '{print $2;}' | head -1)
  Slave_IO_Running=$(mysql -u$user -p$password -e 'show slave status\G' |
  grep "Slave_IO_Running" | awk '{print $2}')
  Slave_SQL_Running=$(mysql -u$user -p$password -e 'show slave status\G' |
  grep "Slave_SQL_Running" | awk '{print $2}')
  echo "plese fix the server of $ip error now!" >$mysql_path/letter
  letter=$mysql_path/letter
  mysql -p$password -e "use test;"
  if [[ $? != 0 ]]
  then
  mail -s "{$ip}_database connect lost the srcprits fix it now "
  $email<$letter
  killall -9 heartbeat
  killall -9 mysqld
  /etc/init.d/mysqld start
  sleep $sleeptime
  mysql -p$password -e "use test;"
  if [ $? == 0 ]
  then
  echo
  "==============>$date<=====================">>$logfile
  mail -s "{$ip}_database up now " $email
  sleep $sleeptime
  service heartbeat start
  sleep $sleeptime
  netstat -an |grep udp |grep 694
  if [ $? == 0 ]
  then
  echo "complete!">>$logfile
  else
  mail -s "{$ip} heartbeat can't to up please fix it !"
  $email<$letter
  fi
  else
  mail -s "{$ip}_database cant't to up plese fix it" $email
  fi
  else
  if [ "$Slave_IO_Running" = "Yes" -a "$Slave_SQL_Running" =
  "Yes" ]
  then
  echo "Slave is running!" >/dev/null
  else
  echo
  "==============>$date<=====================">>$logfile
  echo "Slave is not running!" >> $logfile
  /bin/mail -s "{$ip}_replicate error please fix it "
  $email<$letter
  fi
  fi
  然后设置自动化任务每2分钟检测一次就可以了,现在就可以实现双机热备了

运维网声明 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-109768-1-1.html 上篇帖子: drupal sn: Heartbeat 下篇帖子: Heartbeat V2 模块分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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