zoukankan      html  css  js  c++  java
  • Mysql的主从配置

    前言:这次学习分布式的思想要配置mysql的主从复制和读写分离,我在主从配置上踩到很多坑,在此演示一遍配置过程,并附上问题的说明和自己的一些见解

    Mysql主从复制的原理

    附上原理图:

    mysql的主从复制原理其实挺简单,主要由两种类型3个线程完成:I/O 和 sql thread

    主服务器上有一个I/O thread用来生成二进制日志,每当有事务产生便写入二进制文件,所有主服务器上需要配置mysql 打开日志服务,新的日志内容会通过从服务器的I/O thread 更新到从服务器上的日志

    从服务器更新日志后会用sql thread 写入数据库,从而实现复制

    显而易见,这种复制方式在数据传输的时候会占用一定时间产生延迟,我们接下来的配置用于测试,一般不会出现延迟

    主从复制的配置

    测试环境

    主服务器:120.78.85.213

    从服务器:120.79.205.19

    mysql版本:5.7.21 (这次演示都是新下的mysql)

    mysql下载:

    sudo apt-get update
    sudo apt-get install mysql-client mysql-server

    (附带mysql删除,说不定你会用的到)

    sudo apt-get remove mysql-*

    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

    主服务器配置

    在 /etc/mysql/mysql.conf.d/ 目录下(按上述安装一般在这里)的mysqld.cnf 的[mysqld]下配置server-id 和 log_bin

    server-id 是服务器号(我这样理解),具体值随意,只要不和从服务器不重叠

    log_bin 就是开启二进制服务(必须要有的)

    然后重启mysql让配置生效

    service mysql restart

    登录到mysql,如果你想远程连接数据库先把mysql 库(mysql 的基础数据库)中的user 表中的 root 用户的host 更新为 %

    use mysql;

    update user set host='%' where user='root';

    其次在刚刚的配置文件里面bind-address 这行

    你可以配置为bind-address = 0.0.0.0 或者直接注释掉


    现在开始正式的配置

    先在主服务器上设置一个账号让从服务器能够访问

    create user 'dba'@'120.79.205.%' identified by '123456';
    grant replication slave on *.* to dba@'120.79.205.%';

    这里用了两步,网上有些配置只用了一步会有一个警告,这个警告好像在mysql5 之后才有的,具体内容就是不能太暴露什么的(比如 mysql -uroot -pXXXX 这时在Linux下你的密码也会暴露,一般warning不用管),用show warning可以查看

    这两步的意思很简单

    一:创建一个名为dba 密码为123456的账号在120.79.205这个网段上都能访问

    二:授权120.79.205这个网段名为 dba 的用户可以和主服务器建立 slave 连接

    访问mysql.user 表可以看到此用户


    然后在主服务器上创建数据库/表,并插入(我自己打的,可能有错,如果你复制的话)

    create database dba;

    create table t(id int,name varchar(10),primary key(id));

    insert into t values(1,'aa'),(2,'aa'),(3,'aa');

    插入数据成功后,网上有的配置直接开始配置从数据库,但是这里需要发送一份.sql 到从数据库先同步一道,毕竟如果不是测试数据库一般不一样,需要在开始就同步(所以一般会在第一步配置,指定要同步的数据库)

    退出数据库

    备份

    mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > all.sql;

    (ps备份单个数据库:mysqldump -u root -p mysql > ~/mysql.sql  #把数据库mysql备份到家目录下命名为mysql.sql)

    输入数据库密码

    发送到从数据库

    scp all.sql root@120.79.205.19:/tmp

    输入连接密码

    发送到从数据库的 /tmp 目录下


    从数据库配置

    参考主数据库的配置打开 mysqld.cnf 只用配置server-id = 2(不和其他数据库的id相同)

    从 /tmp下导入.sql 文件

    cd /tmp

    mysql -uroot -p <all.sql

    (ps导入单个数据库:mysqldump -u root -p mysql < ~/mysql.sql  )

    重启mysql(这里不是因为导入需要重启,而是改了配置文件需要重启,照顾某些强迫症患者)

    你可以查看一下是否导入成功


    现在我们前期工作做好了,准备开始连接

    在主服务器上mysql 操作下输入命令:show master statusG;

    *************************** 1. row ***************************
                 File: master-bin.000002
             Position: 1483
         Binlog_Do_DB:
     Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified
    

      这个error 不用管

    记住

    File: master-bin.000002
    Position: 1483
    这是你主服务器的日志名和日志位置,错了就无法连接

    然后再从服务器的mysql 操作下输入:

    show slave statusG;

    如果显示不为空则先停止slave :stop slave

    尝试建立连接

    change master to master_host='120.78.85.213',master_user='dba',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1483;

    这里一定要注意!!!

    master_log_file='master-bin.000002',master_log_pos=1483 对应的就是主服务器上的日志名和位置

    千万千万不要错了,我当时在配置的时候看了很多博客,有些在配置主服务器的时候是log_bin = mysql 有些是 log_bin = master ,导致后面的命名不同就一直连不上,切记切记

    开启slave: start slave

    查看slave 状态:show slave statusG;

    如果两个状态都为yes 则代表连接成功

    如果io 为no 则代表I/O线程失败,你可以查看Last_IO_Errno:里面的信息为失败原因

    不外乎两种:前面提到的server id 重叠,或者就是change master 不对应

    或者是防火墙问题:

    安装防火墙:

    sudo apt-get install ufw

    你可以通过以下两个命令开启允许访问的端口:

    ufw allow 端口号(3306)

    ufw allow from ip(120.79.94.90)

    两个服务器都查看一下

    ufw status看看是否开启

    如果sql _running:no 一般是你没开启slave ,start slave就OK


    最后你就可以在主服务器上测试插入数据看是否同步了

    以上是我配置主从的过程,可参考

  • 相关阅读:
    GTest交流与经验总结
    linux i2c驱动架构-dm368 i2c驱动分析
    在不同编译环境中如何使用sleep()函数
    Android应用之基本的组件(一)
    Java Arrays Tutorial (3)
    ASP.NET中操作SQL数据库
    安卓开发06:布局-线性布局 LinearLayout
    在开发 ExtJS 应用程序常犯的 10 个错误
    每天4个linux命令--步骤一
    获取CPU序列号
  • 原文地址:https://www.cnblogs.com/tanwt/p/8406952.html
Copyright © 2011-2022 走看看