MariaDB 主从同步配置

1 服务器结构

角色ip地址安装教程
主节点192.168.31.102CentOS-7 安装 MariaDB-10.8
从节点192.168.31.103

2 原理:

原理:
(1)master服务器将数据的改变记录到二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

也就是说:

  • 从库会生成两个线程,一个I/O线程,一个SQL线程;

  • I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;

  • 主库会生成一个log dump线程,用来给从库I/O线程传binlog;

  • SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;

简言之可分为下面几个步骤:

  1. 主库的更新事件会被写到bin log日志中。
  2. 从库启用slave服务,发起连接,连接到主库。
  3. 从库创建一个I/O线程,从主库读取bin log日志的内容并写入到relay log日志中。
  4. 从库创建一个SQL线程,从relay log里面读取内容,将更新内容写入到从库。

3. 编辑MySQL主服务器上的/etc/my.cnf,

[mysqld]
# 启用二进制日志
log-bin=didiok-mysql-bin
# 服务器唯一ID,一般为了方便可取IP最后一段 
server-id=102
# 选择 ROW 模式
binlog-format=ROW 
  • log-bin :MySQL的bin-log的名字
  • server-id : MySQL实例中全局唯一,并且大于0。

4.在MySQL主节点上创建用于备份的账号

重启 MariaDB 之后,进入 MariaDB,创建新账号:

#此时创建了名为repl的用户,密码为password,% 表示任意地址都可远程登录。
mariadb> CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
#给repl用户授权同步复制权限(REPLICATION SLAVE)
mariadb> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mariadb> flush privileges;

查询master的状态

mariadb> show master status;

5.编辑 MySQL 从服务器上的 /etc/my.cnf,

[mysqld]
server-id=103

server-id : MySQL实例中全局唯一,并且大于0。与主服务器上的 server-id 区分开。

修改UUID:

使用命令 find / -name auto.cnf 找到auto.cnf文件,修改里面的uuid值,保证各个主从的uuid不一样,重启数据库即可

或者直接删除UUID文件,即auto.cnf ,重新启动服务。

如果找不到可以忽略。

6. MySQL主节点上新增数据

新建数据库didiok,并在数据库中创建表users,并在 users表中新增一条数据:

在这里插入图片描述

7.MySQL主节点上加锁,阻止所有的写入操作

mariadb> FLUSH TABLES WITH READ LOCK;

8.MySQL主节点上,查看bin-log的文件名和位置

mariadb> SHOW MASTER STATUS;

对于上文中的fileposition 的值要记录一下,后面要用到。

9.MySQL主节点上dump所有数据

mysqldump --all-databases --master-data > dbdump.db -uroot -p

mysqldump 方式的优点是可以进行部分复制,如在配置文件中定义 replicate-do-table=db1.*,则用这种方法可以只复制db1库而忽略其它复制事件。缺点是由于mysqldump会生成主库转储数据的SQL语句,实际是一种逻辑备份方式所以速度较慢,不适用于大库。

10.MySQL主节点进行解锁,解锁后,主节点上可以写入数据

mariadb> UNLOCK TABLES;

11.MySQL从节点上导入之前dump的数据

主节点上执行:

# 主库复制数据到从库
find / -name dbdump.db
cd /root 
scp dbdump.db root@192.168.31.103:/root/  #从库的数据文件路径

从节点上执行:

mysql < dbdump.db -uroot -p

在这里插入图片描述

之后查看从节点上数据库中是否有users表,表中是否有数据:

在这里插入图片描述

12.MySQL从节点上配置主从连接信息

命令格式:

mariadb> CHANGE MASTER TO
    -> MASTER_HOST='master_host_name',
    -> MASTER_PORT=port_num,
    -> MASTER_USER='replication_user_name',
    -> MASTER_PASSWORD='replication_password',
    -> MASTER_LOG_FILE='recorded_log_file_name',
    -> MASTER_LOG_POS=recorded_log_position;

实际执行命令如下

CHANGE MASTER TO  MASTER_HOST='192.168.31.102', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='didiok-mysql-bin.000001', MASTER_LOG_POS=890;
  • MASTER_HOST: MySQL主的地址
  • MASTER_PORT: MySQL主节点的端口(无引号)
  • MASTER_USER: 备份账户的用户名
  • MASTER_PASSWORD: 备份账户的密码
  • MASTER_LOG_FILE:bin-log的文件名
  • MASTER_LOG_POS: bin-log的位置(数字型),是show master status 中看到的position的值

bin-log的文件名和位置 是 步骤 8 中的 show master status 得到的。

13.MySQL从节点上开启同步

mariadb> START SLAVE;

查看MySQL从节点的状态

mariadb> show slave status \G

在这里插入图片描述

查看Slave_IO_RunningSlave_SQL_Running是否成功,只有 这两个状态 都是 YES才可以复制。

14 验证是否同步成功

在主数据上操作,从数据库中查看,截图如下:

在这里插入图片描述

在这里插入图片描述

附:

============== MariaDB 主节点上可能的 /etc/my.cnf 配置如下 =============

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server_id = 102    #  一组主从组里的每个id必须是唯一值。推荐用ip位数
log-bin=mysql-bin # 二进制日志,后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下 如果修改的话需要在修改之后赋mysql账号文件夹权限
lower_case_table_names=1 # 不区分大小写
binlog-format=ROW    # 二进制日志文件格式
log-slave-updates=True    # slave更新是否记入日志
sync-master-info=1    # 值为1确保信息不会丢失
slave-parallel-threads=3 #同时启动多少个复制线程,最多与要复制的数据库数量相等即可
binlog-checksum=CRC32    # 效验码
master-verify-checksum=1    # 启动主服务器效验
slave-sql-verify-checksum=1   # 启动从服务器效验
bind-address = 192.168.31.102    # 监听本机网卡ip
expire_logs_days = 5 # 配置定时清理
binlog-ignore-db=mysql # 设置不要复制的数据库
binlog-ignore-db=infomation_schema
binlog-do-db=blade # 设置需要复制的数据库

============== MariaDB 从节点上可能的 /etc/my.cnf 配置如下 =============

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
server_id=103
log-bin=mysql-bin #log-bin是二进制文件
relay_log=relay-bin    # 中继日志, 后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
lower_case_table_names=1

微信公众号:JavaZhiZhe,欢迎关注:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值