MySQL搭建主从架构

  1. MySQL主从复制原理

    1. 主库提交完事务后,写入binlog日志
    2. 从库连接到主库,请求获取binlog日志
    3. 主库创建一个dump线程,将binlog推送到从库
    4. 从库开启一个IO线程读取同步过来的binlog,并记录到relay log中继日志中
    5. 从库再开启一个sql线程读取relay log中的记录,同步到数据库中
    6. 从库记录自己的binlog日志
  2. 环境配置

    这里准备搭建一主二从的架构,所以需要准备三台服务器(本次版本CentOS7.8),然后在每台上面都安装好MySQL(本次版本5.7.31),不想手动编译安装的话也可以直接用宝塔安装,配置更方便点

    MySQL安装可以看这里:Linux安装MySQL5.7.31

    角色 IP
    master 192.168.241.101
    slave1 192.168.241.102
    slave2 192.168.241.103
  3. 开放端口

    为了避免后边配置主从复制发生错误,可以先将这三台服务器上的防火墙关闭或者开放防火墙端口。

    Linux操作命令可以看这里:Centos7/8开放防火墙端口

  4. MySQL配置

    修改MySQL的配置文件,Linux下默认配置文件位置在:/etc/my.cnf 。在【mysqld】模块下加入以下配置(还有很多非必填的配置,可自行百度查看)

    # 开启二进制日志(必填)
    log-bin = mysql-bin
    # 标识唯一id,值随便改,但是三台MySQL的值不能一样(必填)
    server-id = 1
    # 指定主从同步时忽略的数据库,可设置多个,比如可以把MySQL默认安装的4个库忽略掉
    # 配置在主库,但是如果做了MySQL高可用架构的话,在每个库都需要配置
    binlog-ignore-db = information_schema
    binlog-ignore-db = mysql
    binlog-ignore-db = performance_schema
    binlog-ignore-db = sys
    # 指定需要同步的数据库,可以设置多个
    # 配置在主库,但是如果做了MySQL高可用架构的话,在每个库都需要配置
    binlog-do-db = test
    # 这个需要配置在从库,但是如果做了MySQL高可用架构的话,在每个库都需要配置
    replicate-do-db = test
    

    配置完成后需要重启MySQL service mysql restart

  5. MySQL账号权限配置

    创建用于主从复制的账号,也可以直接用已经存在的root账户,最好还是新建个(三个库都需要)

    # create user '用户名'@'%' identified by '密码';
    create user 'repl'@'%' identified by '123456';
    

    给上边创建的账号授权,允许远程访问(三个库都需要)

    # grant all privileges on *.* to '用户名'@'%' identified by '密码' with grant option;
    grant all privileges on *.* to 'repl'@'%' identified by '123456' with grant option;
    

    指定哪些库是自己的从库,分配权限(在主库配置)

    # grant replication slave on *.* to '从库用户名'@'从库IP' identified by '从库密码'; 
    grant replication slave on *.* to 'repl'@'192.168.241.102' identified by '123456';
    grant replication slave on *.* to 'repl'@'192.168.241.103' identified by '123456';
    

    配置完成刷新权限配置

    flush privileges;
    

    查看主库状态(记录好 File 和 Position,后面要用)

    如果该命令执行后结果为 Empty set(0.00 sec),那说明前面的 my.cnf 没配置对

    show master status;
    

    指定哪个是自己的主库(在两台从库中执行)

    # CHANGE MASTER TO
    # MASTER_HOST='主库IP',
    # MASTER_USER='主库用户名',
    # MASTER_PASSWORD='主库密码',
    # MASTER_LOG_FILE='上述中得到的File',
    # MASTER_LOG_POS=上述中得到的Position;
    CHANGE MASTER TO
    MASTER_HOST='192.168.241.101',
    MASTER_USER='repl',
    MASTER_PASSWORD='123456',
    MASTER_LOG_FILE='mysql-bin.000005',
    MASTER_LOG_POS=2061;
    

    PS:如果之前有开启过主从同步的话,这里运行上述SQL可能会报错,解决方法是:先运行 stop slave;,停止同步,再次运行上述SQL,成功后再开启同步 start slave;

    开启主从同步

    start slave;
    

    同步开启后可检查从库状态

    show slave status;
    # 想美观点可用 \G 来做结束符
    show slave status \G
    
  6. 搭建过程中可能踩的坑

    1、报错信息:Slave_SQL_Running:No

    2、分析:出现 No 就是同步中止了,可能产生的错误也很多。可能是在从库中插入了数据,且与主库不一致,会导致同步中断 .......

    3、解决方案:如果是某一条数据出错导致同步中断,可使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; 命令跳过这个错误,继续往下执行别的,然后根据错误信息手动去改这条出错的数据

    1、报错信息:Slave_IO_Running: No 且 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

    2、分析:这句话大概含义就是主从数据库的 server-id 值重复了

    3、解决方案:先用 show variables like 'server_id'; 命令检查当前MySQL的 server-id 值,然后去my.cnf配置文件修改这个参数

    4、注意:有时候配置文件里参数值不一样,但是用这个命令查看发现是一样的,如何重启MySQL还不行的话,可以先关闭同步(stop slave;),再通过全局变量设置server-id值(set global server_id = 1;),然后再开启同步(start slave),再次查看运行状态(show slave status \G

    1、报错信息:Slave_IO_Running: Connecting 且 Last_IO_Error: error connecting to master 'repl@192.168.241.101:3306' - retry-time: 60 retries: 1

    2、分析:连接主机失败

    3、解决方案:先查看主从库是否授权,再查看是否是 用户名/密码/IP地址 这几个参数写错了

    1、报错信息:Slave_IO_Running: No 且 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

    2、分析:MySQL5.6之后主从复制引入了uuid的概念,主从MySQL中的server_uuid与server-id类似,也得保证不一样。这里由于整体copy的MySQL,所以主从上server_uuid是相同的,可用show variables like '%server_uuid%'; 命令查看

    3、解决方案:找到data文件夹下的auto.cnf文件,直接删掉这个文件,然后重启MySQL服务

    当 Slave_IO_Running 和 Slave_SQL_Running 参数都为 Yes 时,则主从同步配置成功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容