热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

17mysql主从(搭建)

文章目录MySql主从(搭建)一、搭建mysql主从1.1拉取镜像1.2配置master1.3配置Slave1.4验证二、Slave只读2.1设置只读的考虑2.2readOnly设


文章目录

  • MySql主从(搭建)
    • 一、搭建mysql主从
      • 1.1 拉取镜像
      • 1.2 配置master
      • 1.3 配置Slave
      • 1.4 验证
    • 二、Slave只读
      • 2.1 设置只读的考虑
      • 2.2 readOnly设置
    • 参考


MySql主从(搭建)


一、搭建mysql主从


1.1 拉取镜像

docker pull mysql:5.7
docker run -p 3339:3306 --name my-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 3340:3306 --name my-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

1.2 配置master


  • 进入容器修改配置,先更新apt-get ,安装vim

apt-get update
apt-get install vim
cd /etc/mysql
vi my.cnf

  • my.cnf配置信息如下:注意不要漏了 [mysqld]和server-id,不配置server-id 启动也会失败:

[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键),配置次项表示开启bin-log日志,配置值代表bin-log文件名称
log-bin=mysql-bin

  • 修改完配置后重启master

docker start my-master

  • 配置slave账号

root@d1e4a1eb0bed:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.28 MySQL Community Server (GPL)Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '
slave'@'%';
Query OK, 0 rows affected (0.00 sec)

  • 查询 master 的 master_log_pos,这里查到的 Position 在后面配置slave的时候要用,

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 2425 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

1.3 配置Slave


  • my.cnf 配置信息如下:

[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

  • 配置 slave 的主机

root@d8a4501c94b7:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28-log MySQL Community Server (GPL)Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.08 sec)start slave; --- 注意这里启动slaveshow slave status\G;

  • 需要注意的是 change master 这条命令需要正确,命令中的 master_host,master_user ,master_password ,master_port 容易理解分别是主机的ip,端口以及之前 master 上配置的slave同步账号,master_log_pos主要正确配置,就是前面在master 中查到的 Position,master_log_file 是同步的binlog文件;

  • 如果 change master 有问题,那么show slave status\G; 可能会提示错误,正常情况show slave status\G;输出大概如下:

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 172.17.0.2Master_User: slaveMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 2425Relay_Log_File: edu-mysql-relay-bin.000002Relay_Log_Pos: 2091Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 2425Relay_Log_Space: 2302Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 100Master_UUID: 5722550e-2319-11ea-b15e-0242ac110002Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
1 row in set (0.01 sec)

  • 这里的 Seconds_Behind_Master 显示的是Slave 落后 Master 的时间,已经扣除了两台机器的时钟差距,显示的就是主从同步延迟时间;

1.4 验证


  • 如果大致没问题,在主库创建数据库,即可在从库看到了;

二、Slave只读


2.1 设置只读的考虑


  • 设置只读可以防止备库上执行修改语句,导致主备不一致;
  • 防止切换过程由bug,比如双写,导致主备不一致
  • 用readOnly来判断节点角色

状态查询:show global variables like “%read_only%”;

show global variables like "%read_only%"; 查询只读状态,如果set global read_only=1;,
则read_only为ON,
set global read_only=0; read_only 为OFF

  • 注意 read_only 不会影响主从同步,因为同步是超级用户,只读限制的是非超级用户,(设置后root用户是可以写的)

2.2 readOnly设置


  • 创建用户,授权增删改查到指定数据库

grant select,insert,update,delete on db_test.* to 'readUser'@'%' identified by '123456';

  • set global read_only = 1 ; 全局设置只读后,再插入数据就会提示为只读,插入失败:

在这里插入图片描述


  • 然后执行 set global read_only = 0 ; 后,就能继续插入了;

  • 下面附上一段代码,read_only 是ON

public static void main(String[] args) throws Exception {conn = DriverManager.getConnection(DB_URL, USER, PASS);String sql = "show global variables like \"%read_only%\";";Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {String key = resultSet.getString("Variable_name");String value = resultSet.getNString("Value");System.out.println(key + " ---> " + value);}}innodb_read_only ---> OFF
read_only ---> ON
super_read_only ---> OFF
transaction_read_only ---> OFF
tx_read_only ---> OFF

参考


  • [1] 基于Docker的Mysql主从复制搭建
  • [2] MySQL权限整理及授权命令
  • [3] mysql授权
  • [4] MySQL设置只读模式
  • [5] Mysql的read_only 只读属性说明 (运维笔记)

推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
沉沦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有