分库分表 3:主从复制 (从入门到精通)


环境搭建 - 系列

组件 连接地址
【必须】 虚拟机Linux 开发环境准备 https://www.cnblogs.com/crazymakercircle/p/14194688.html
Linux openresty 安装 Linux openresty 安装
【必须】Linux Redis 安装(带视频) Linux Redis 安装(带视频)
【必须】Linux Zookeeper 安装(带视频) Linux Zookeeper 安装, 带视频
Windows Redis 安装(带视频) Windows Redis 安装(带视频)
RabbitMQ 离线安装(带视频) RabbitMQ 离线安装(带视频)
ElasticSearch 安装, 带视频 ElasticSearch 安装, 带视频
Nacos 安装(带视频) Nacos 安装(带视频)
【必须】Eureka Eureka 入门,带视频
【必须】springcloud Config 入门,带视频 springcloud Config 入门,带视频
【必须】SpringCloud 脚手架打包与启动 SpringCloud脚手架打包与启动
Linux 自启动 假死自启动 定时自启 Linux 自启动 假死启动

本系列之 目录

组件 连接地址
准备一: 在window安装虚拟机集群 vagrant+java+springcloud+redis+zookeeper镜像下载(&制做详解))
并且:在虚拟机上须要安装 mysql centos mysql 笔记(内含vagrant mysql 镜像)
分库分表 Sharding-JDBC 从入门到精通之一 Sharding-JDBC 入门实战
分库分表 Sharding-JDBC 从入门到精通之二 Sharding-JDBC 基本原理
分库分表 Sharding-JDBC 从入门到精通之三 MYSQL主从复制
分库分表 Sharding-JDBC 从入门到精通之四 读写分离
分库分表 Sharding-JDBC 从入门到精通之源码 git

MYSQL主从复制配置

1 练习的场景

主从实战的数据库场景:git

建议有三虚拟机:cdh一、 cdh二、 cdh3(cdh3能够不开启)。面试

cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其余的库如store,不开启主从复制。
有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。redis

2 配置主数据库

登陆主库spring

mysql  ‐uroot ‐p123456

建立用于主从复制的帐号sql

set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';

建立库和表数据库

mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> use user_db;
Database changed

mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)

受权主备复制专用帐号编程

GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';

刷新权限

FLUSH PRIVILEGES;

修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加如下配置:

[mysqld] 
#开启日志,启用二进制日志
log‐bin = mysql‐bin 

#设置服务器标识ID,主从不能一致 ,每台服务器惟一
server‐id = 1      

#设置须要同步的数据库 
binlog‐do‐db=user_db 

#屏蔽不须要同步的数据库 
binlog‐ignore‐db=mysql
binlog‐ignore‐db=information_schema
binlog‐ignore‐db=performance_schema
binlog‐ignore‐db=dolphinscheduler
binlog‐ignore‐db=sys
binlog‐ignore‐db=store

参数说明:

log-bin
  该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是咱们自定义的,咱们自定义的值将做为bin log的名称的前缀信息哟,咱们可使用MySQL命令"show variables like '%log_bin%';"查看我们的配置。

server-id
  该参数能够指定数据库服务器的惟一标识。在同一个复制组下的全部实例的server_id都必须是惟一的,并且取值必须是正整数,取值范围是1~(232)−1

能够经过show databases,查看全部的库,而后找出不须要同步的数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dolphinscheduler   |
| mysql              |
| performance_schema |
| store              |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

完整配置以下:

[root@cdh1 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
log-bin=user-mysql-bin
server-id=1

binlog-do-db=user_db
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=dolphinscheduler
binlog-ignore-db=sys
binlog-ignore-db=store

skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

3 配置从服务器

登陆从库

mysql  ‐uroot ‐p123456

建立用于主从复制的帐号

set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';

建立库和表

mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> use user_db;
Database changed

mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)

受权主备复制专用帐号

GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';

刷新权限

FLUSH PRIVILEGES;

修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加如下配置:

[mysqld] 

log‐bin=mysql‐bin  #开启日志,启用二进制日志
server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器惟一

#设置须要同步的数据库 
replicate_wild_do_table=user_db.% 
#屏蔽系统库同步 
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%

重启数据库

systemctl restart mysqld

完整的配置文件以下:

[root@cdh2 ~]# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
log-bin=user-mysql-bin
server-id=101

replicate_wild_do_table=user_db.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%

skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

4 主从复制的配置

4.1 设置主库

首先链接 master db,为从库的帐号授予复制的权利

GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';

若是权限不够,就执行一下下面的两句:

set global validate_password_policy=0;
set global validate_password_length=1;

刷新权限

FLUSH PRIVILEGES;

在主库查看同步的起点, 记录下文件名以及起点 位置

show master status;

查看数据库状态:

在这里插入图片描述

记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。

4.2设置从库

接下来在 slave db上,配置主从复制:

先中止同步

STOP SLAVE;

修改从库的master配置,指向到主库,配置过程当中,须要使用上一步记录的文件名以及位点

mysql>change master to
master_host='cdh1',
master_user='db_sync',
master_log_file='user-mysql-bin.000001',
master_log_pos=154,
master_port=3306,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

解释下配置参数

master_host='x.x.x.x' // 这里填 master 主机 ip
master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
master_log_pos=154,// 这里填写 Position 的值。

启动同步

START SLAVE;

查看同步

show slave status\G;

结果以下:

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: cdh1
                  Master_User: db_sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: user-mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: cdh2-relay-bin.000004
                Relay_Log_Pos: 377
        Relay_Master_Log_File: user-mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table: user_db.%
  Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 2531
              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: fb8d483c-47eb-11eb-ba17-0800276c3e95
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           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
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。若是不为Yes,请排
查相关异常。

若是不当心配置错, 输入 mysql> stop slave; 而后从新录入一遍就能够了。

5 问题:

问题1: 因为是克隆的虚拟机,因此mysql的uuid相同,报错以下:

The slave I/O thread stops because master and slave have equal MySQL server UUID

缘由:主从复制的mysql实例的uuid不能相同。

修改方法:在从库上,从my.cnf找到data目录,而后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。

具体以下:

$ vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96

修改以后:

[root@cdh2 ~]#  cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96

最终,确保两个mysql 实例的uuid不一样。

而后,重启改动过的实例。

6 主从复制测试

1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,代表从库复制了主库的t_user_0_copy1表。

在这里插入图片描述

2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改成t_user_1

在这里插入图片描述

回到◀疯狂创客圈

疯狂创客圈 - Java高并发研习社群,为你们开启大厂之门

相关文章
相关标签/搜索