mysql主从配置&&基于keepalived的主备切换

本文涉及的产品
RDSClaw,2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介:

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' IDENTIFIED BY 'test2015';

  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_File: mysql_S-relay-bin.000005

                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 relay log; waiting for the slave I/O thread to update it

           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' IDENTIFIED BY 'test2015';

  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_File: mysql-relay-bin.000002

                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 relay log; waiting for the slave I/O thread to update it

           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.jb51.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是不是也会有相应的问题出现呢











本文转自 南非波波 51CTO博客,原文链接:http://blog.51cto.com/nanfeibobo/1716812,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
7月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
829 7
|
7月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
723 11
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
466 1
|
12月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu 22.04上配置和安装MySQL
以上就是在Ubuntu 22.04上配置和安装MySQL的步骤。这个过程可能看起来有点复杂,但只要按照步骤一步步来,你会发现其实并不难。记住,任何时候都不要急于求成,耐心是解决问题的关键。
1392 31
|
11月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
614 11
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
3010 26
|
SQL 关系型数据库 MySQL
seatunnel配置mysql2hive
本文介绍了SeaTunnel的安装与使用教程,涵盖从安装、配置到数据同步的全过程。主要内容包括: 1. **SeaTunnel安装**:详细描述了下载、解压及配置连接器等步骤。 2. **模拟数据到Hive (fake2hive)**:通过编辑测试脚本,将模拟数据写入Hive表。 3. **MySQL到控制台 (mysql2console)**:创建配置文件并执行命令,将MySQL数据输出到控制台。 4. **MySQL到Hive (mysql2hive)**:创建Hive表,配置并启动同步任务,支持单表和多表同步。
|
12月前
|
存储 Oracle 关系型数据库
MySQL 8.4 配置SSL组复制(八个步骤)
MySQL 8.4 配置SSL组复制(八个步骤)
853 0
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置

推荐镜像

更多