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

[经验分享] mysql主从配置&&基于keepalived的主备切换

[复制链接]

尚未签到

发表于 2018-10-1 06:37:11 | 显示全部楼层 |阅读模式
  mysql互为主从设置 && 主备切换配置
  需求说明:
  1.公司架构一直是一台单独的mysql在线上跑,虽然一直没有出现什么宕机事件,但是出于一个高可用的考虑,提出主从备份、主备切换的需求;
  2.实现这个需求的前一段时间只是在做数据库备份的时候实现了主从热备,为了实现主备切换功能,继续操作上述需求;
  实验环境:
  master1:10.1.156.3:3306
  master2:10.1.156.5:3306
  my.cnf配置文件关于主从这块的修改:
  master1:
  server-id = 1 #主备id值一定要不同,而且sql语句不能写成死循环,防止主备设置陷入
  log-bin=mysqlmaster-bin
  #binlog-do-db = cad #指定需要进行主从的数据库
  binlog_cache_size = 4M
  binlog_format=mixed
  expire_logs_days=3
  binlog-ignore-db=test #不记录test库的binlog
  replicate-ignore-db=test #不复制test库的binlog
  sync_binlog=1
  sql_mod=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  lower_case_table_names=1
  master2:
  server-id = 2
  log-bin=mysqlslave-bin
  #binlog-do-db = cad #指定需要进行主从的数据库
  binlog_cache_size = 4M
  binlog_format=mixed
  expire_logs_days=3
  binlog-ignore-db=test #不记录test库的binlog
  replicate-ignore-db=test #不复制test库的binlog
  sync_binlog=1
  sql_mod=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  lower_case_table_names=1
  主从配置:
  1.实现从master1-->master2的单向主从配置:
  master1:1)创建同步的账号:(ip地址从mysql:master2所属IP)

  mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.156.5'>  Query OK, 0 rows affected (0.13 sec)
  mysql> flush privileges;
  2)查看master1的master状态,获取二进制日志名和偏移量
  mysql> show master status\G
  *************************** 1. row ***************************
  File: mysqlmaster-bin.000004
  Position: 396
  Binlog_Do_DB:
  Binlog_Ignore_DB:
  Executed_Gtid_Set:
  1 row in set (0.00 sec)
  (备注:show master statusG; 报错ERROR: No query specified 属于语法错误)
  3)主mysql(master1)停止数据库操作,对数据库进行导出操作,然后导入到从mysql(master2)
  #首先添加一个读锁保证数据库的一致性
  mysql> flush tables with read lock;
  mysql> quit;
  mysqldump -h127.0.0.1 -uroot -p -P3306 --all-databases --triggers --routines --events > /opt/all.sql
  #最后恢复Master机器的读锁
  mysql> unlock tables;
  master2: 1)从mysql(master2)将备份数据导入数据库:
  mysql -h 10.1.156.3 -uroot -p -P3306 < /opt/all.sql
  2)master2数据库设置同步数值参数:
  mysql> change master to master_host='10.1.156.3',master_user='slave',master_password='test2015',master_log_file='mysqlmaster-bin.000004',master_log_pos=396;
  3)启动从数据库复制线程,并查询从数据库的复制线程状态
  mysql> start slave;
  Query OK, 0 rows affected (0.01 sec)
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 10.124.165.254
  Master_User: slave
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysqlmaster-bin.000004
  Read_Master_Log_Pos: 1021

  >  Relay_Log_Pos: 914
  Relay_Master_Log_File: mysqlmaster-bin.000004
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 1021
  Relay_Log_Space: 1259
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  Master_UUID: 709e2dcf-0b51-11e5-9754-286ed489d502
  Master_Info_File: /home/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL

  Slave_SQL_Running_State: Slave has read all>  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  1 row in set (0.00 sec)
  查询结果中:Slave_IO_Running: Yes 同时出现才证明主从设置成功
  Slave_SQL_Running: Yes
  2.配置master2-->master1的主从实现双向主从设置:
  master2: 1)创建同步的账号:(ip地址从mysql:master1所属IP)

  mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.156.3'>  Query OK, 0 rows affected (0.13 sec)
  mysql> flush privileges;
  2)查看master2的master状态,获取二进制日志名和偏移量
  mysql> show master status\G
  *************************** 1. row ***************************
  File: mysqlslave-bin.000001
  Position: 120
  Binlog_Do_DB:
  Binlog_Ignore_DB:
  Executed_Gtid_Set:
  1 row in set (0.00 sec)
  master1: 1)master1数据库设置同步数值参数:
  mysql> change master to master_host='10.1.156.5',master_user='slave',master_password='test2015',master_log_file='mysqlslave-bin.000001',master_log_pos=120;
  2)启动从数据库复制线程,并查询从数据库的复制线程状态
  mysql> start slave;
  Query OK, 0 rows affected (0.01 sec)
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 10.1.156.3
  Master_User: slave
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysqlslave-bin.000001
  Read_Master_Log_Pos: 199

  >  Relay_Log_Pos: 367
  Relay_Master_Log_File: mysqlslave-bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 199
  Relay_Log_Space: 540
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 2
  Master_UUID: 6f7cf3a2-8d08-11e5-a52d-5254008c0566
  Master_Info_File: /home/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL

  Slave_SQL_Running_State: Slave has read all>  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  1 row in set (0.00 sec)
  3.注意:
  1)
  Slave_IO_Running: NO
  Slave_SQL_Running: Yes
  mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
  出现上面所述情况,可能有三种情况:1)网络有问题,连接不上;2)配置my.cnf可能有问题;3)授权的问题,replication slave和file权限是必须的。
  解决Slave_IO_Running: NO
  mysql>stop slave;
  mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
  mysql>stop slave;
  2)
  Slave_IO_Running: connecting
  Slave_SQL_Running: Yes
  导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
  1)、网络不通
  2)、密码不对
  3)、pos不对
  可以参考这个连接:http://blog.csdn.net/i_bruce/article/details/17055135
  我这里出现的原因是在my.cnf文件中没有使用这个参数:
  [mysqld]
  skip-name-resolve
  所以导致数据库远程连接过慢,一直处于一个正在连接的状态。
  参考这个连接:解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) http://www.iyunv.net/article/27616.htm
  主备切换配置:(基于keepalived的vip漂移功能实现)
  master1:
  1)keepalived编译安装:
  wget -P /usr/local/src http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
  tar xf /usr/local/src/keepalived-1.2.19.tar.gz -C /usr/local/src
  cd /usr/local/src/keepalived-1.2.19 && ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64&& make && make install
  2)将keepalived做成服务:
  cd /usr/local/keepalived/ && cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp etc/sysconfig/keepalived /etc/sysconfig/ && mkdir /etc/keepalived && cp etc/keepalived/keepalived.conf /etc/keepalived/ && cp sbin/keepalived /usr/sbin
  3)keepalived配置文件
  vim /etc/keepalived/keepalived.conf
  =====================================================
  ! Configuration File for keepalived
  global_defs {
  notification_email {  //定义邮件服务的
  root@localhost  //定义收件人,这里改为本机,只是测试使用
  }
  notification_email_from kaadmin@localhost  //定义发件人,
  smtp_server 127.0.0.1  //定义邮件服务器,一定不能使用外部地址
  smtp_connect_timeout 30 //超时时间
  router_id LVS_DOWNLOAD
  }
  vrrp_instance VI_1 {  //定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
  state MASTER  //开启后,该节点的优先级比另一节点的优先级高,所以转化为MASTER状态
  interface eth0  //所有的通告等信息都从eth0这个接口出去
  virtual_router_id 7  //虚拟路由的ID,而且这个ID也是虚拟MAC最后一段的来源,这个ID号一般不能大于255,且这个ID一定不能有冲突
  priority 100  //初始优先级
  advert_int 1  //通告的个数
  authentication {  //认证机制
  auth_type yzkj  //认证类型
  auth_pass yzkj1234   //密码,应该为随机的字符串
  }
  virtual_ipaddress {  //虚拟地址,即VIP
  10.1.156.2
  }
  }
  master2:
  1)keepalived编译安装:
  wget -P /usr/local/src http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
  tar xf /usr/local/src/keepalived-1.2.19.tar.gz -C /usr/local/src
  cd /usr/local/src/keepalived-1.2.19 && ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64 && make && make install
  2)将keepalived做成服务:
  cd /usr/local/keepalived/ && cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp etc/sysconfig/keepalived /etc/sysconfig/ && mkdir /etc/keepalived && cp etc/keepalived/keepalived.conf /etc/keepalived/ && cp sbin/keepalived /usr/sbin
  3)keepalived配置文件
  vim /etc/keepalived/keepalived.conf
  =====================================================
  ! Configuration File for keepalived
  global_defs {
  notification_email {  //定义邮件服务的
  root@localhost  //定义收件人,这里改为本机,只是测试使用
  }
  notification_email_from kaadmin@localhost  //定义发件人,
  smtp_server 127.0.0.1  //定义邮件服务器,一定不能使用外部地址
  smtp_connect_timeout 30 //超时时间
  router_id LVS_DOWNLOAD
  }
  vrrp_instance VI_1 {  //定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
  state   //开启后,该节点的优先级比另一节点的优先级高,所以转化为MASTER状态
  interface eth0  //所有的通告等信息都从eth0这个接口出去
  virtual_router_id 7  //虚拟路由的ID,而且这个ID也是虚拟MAC最后一段的来源,这个ID号一般不能大于255,且这个ID一定不能有冲突
  priority 99  //初始优先级
  advert_int 1  //通告的个数
  authentication {  //认证机制
  auth_type yzkj  //认证类型
  auth_pass yzkj1234   //密码,应该为随机的字符串
  }
  virtual_ipaddress {  //虚拟地址,即VIP
  10.1.156.2
  }
  }
  注意:使用keepalived设置主备会出现一定的问题,参考链接:http://my.oschina.net/moooofly/blog/223822
  另外,互为主从的设置,主1一旦出现问题,主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-606861-1-1.html 上篇帖子: mysql读写分离中间件atlas的性能测试 下篇帖子: Linux 学习总结(三十)lamp之mysql安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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