mysql主从复制,互为主从与读写分离

目录

一、主从复制以及主从复制的作用

 二、mysql主从复制的原理:

三、Mysql主从复制实战

3.1 环境说明

3.2 复制的基本原则

3.3 实现MySQL主从复制需要进行的配置

3.4 在主机(master)上建立账户并授权slave

 3.5 在(slave)告知从服务器二进制文件名与位置(从服务器操作)

四、Mysql互为主从,主主架构

4.1 互为主从的配置

4.1.1 修改一台服务器配置文件

4.1.2 修改另一台服务器配置文件

 4.1.3 创建复制帐号

 4.1.4 启动从服务器复制线程

4.1.5 查看从服务器状态

4.2 .验证(创建表,设置ID为自增长,两边插入数据看数据增长)


一、主从复制以及主从复制的作用

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

 二、mysql主从复制的原理:

 在每个事务更新数据完成之前,master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务。

Slave将master的binary log复制到其中继日志。首先slave开始一个工作线程(I/O),I/O线程在master上打开一个普通的连接,然后开始binlog dump process。binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。

Sql slave thread(sql从线程)处理该过程的最后一步,sql线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小

三、Mysql主从复制实战

3.1 环境说明

  • 两个CentOS7的虚拟机
  • Master_IP:192.168.150.16
  • slave_IP:192.168.150.17

注意:MySQL版本号最好一致,为了方便学习测试,建议大家直接克隆虚拟机然后修改下网卡配置文件,重新设置一个IP,并关闭防火墙。

mysql 5.6以后的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的

查看mysql uuid:

show variables like ‘%server_uuid%’;

解决办法:找到/var/lib/mysql文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样。

重启mysql即可。

3.2 复制的基本原则

  • 每个Slave只有一个Master
  • 每个Slave只能有一个唯一的服务ID
  • 每个Master可以有多个Slave

3.3 实现MySQL主从复制需要进行的配置

主服务器:

  • 开启二进制日志 binlog
  • 配置唯一的server-id
  • 获得master二进制文件名及位置
  • 创建一个用于slave和master通信的用户账号

从服务器:

  • 配置唯一的server-id
  • 使用master分配的用户账号读取master二进制日志
  • 启动slave服务

具体操作如下:

找到的配置文件my.cnf,我的在/etc/my.cnf,在[mysqld]部分插入如下:

修改master配置:

[mysqld]

#开启二进制日志

log-bin=mysql-bin

#设置server-id,建议使用ip最后2位

server-id=16

修改slave配置:

[mysqld]

#开启中继日志

relay-log=mysql-relay

#设置server-id,建议使用ip最后2位

server-id=17

重启mysql服务

3.4 在主机(master)上建立账户并授权slave

创建用于zcf并给予权限:

create user 'zcf'@'%' identified with mysql_native_password by 'Zcf@201104';

GRANT REPLICATION SLAVE ON *.* TO 'zcf'@‘%‘;

 flush privileges;

查询master状态:

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000004
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

ERROR:
No query specified

 3.5 在(slave)告知从服务器二进制文件名与位置(从服务器操作)

这里要根据上面主服务器的状态来填写,不要直接用下面的SQL,需要根据实际值修改。

change master to

master_host = ‘192.168.42.16’,   #主库的IP地址

master_user = ‘zcf’,     #在主库上创建的复制账号

master_password = 'Zcf@201104',  #在主库上创建的复制账号密码

master_log_file = ‘mysql-bin.000004’, #开始复制的二进制文件名(从主库查询结果中获取)

master_log_pos = 154; #开始复制的二进制文件位置(从主库查询结果中获取)

查询slave状态:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.150.16
                  Master_User: zcf
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay.000014
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes        ##
            Slave_SQL_Running: Yes        ##
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 736
              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: 16
                  Master_UUID: cbb62356-38c0-11ed-922a-000c2911fea4
             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)

ERROR:
No query specified

查看从服务器状态

start slave;    ##开启服务

注意:上述出现两个YES才正确连接

四、Mysql互为主从,主主架构

在两台服务器上既执行master的操作有执行slave的操作(注意:两台服务器都必须是可以写的)

4.1 互为主从的配置

在主从复制的基础上进行修改。

4.1.1 修改一台服务器配置文件

vim /etc/my.cnf

[mysqld]
server-id = 16
log_bin = mysql_bin
relay_log = relay-log
skip-name-resolve = on
log_slave_updates = 1
auto_increment_increment=2     #表示自增长字段从那个数开始
auto_increment_offset=1     #表示自增长字段从那个数开始

 重启mysql服务

4.1.2 修改另一台服务器配置文件

vim /etc/my.cnf

[mysqld]
server-id = 15
relay_log = relay-log
log_bin = mysql-log
skip-name-resolve = on
log_slave_updates = 1
auto_increment_increment=2  #表示自增长字段每次递增的量
auto_increment_offset=2     #表示自增长字段从那个数开始

重启mysql服务

 4.1.3 创建复制帐号

两台服务器都要创建

create user 'zcf'@'%' identified with mysql_native_password by 'Zcf@201104';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'zcf'@'%'

 4.1.4 启动从服务器复制线程

这里要根据上面主服务器的状态来填写,不要直接用下面的SQL,需要根据实际值修改。

change master to

master_host = '192.168.42.15',   #主库的IP地址

master_user = 'zcf',     #在主库上创建的复制账号

master_password = 'Zcf@201104',  #在主库上创建的复制账号密码

master_log_file = 'mysql-bin.000001', #开始复制的二进制文件名(从主库查询结果中获取)

master_log_pos = 3306; #开始复制的二进制文件位置(从主库查询结果中获取)

另一台已经在主从复制配置好了

4.1.5 查看从服务器状态

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.150.15
                  Master_User: zcf
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-log.000001
          Read_Master_Log_Pos: 2090
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 661
        Relay_Master_Log_File: mysql-log.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2090
              Relay_Log_Space: 865
              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: 15
                  Master_UUID: c6e942b2-3ca0-11ed-a287-000c29a7d949
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica 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:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set, 1 warning (0.01 sec)

注意:上述出现两个YES才正确连接

4.2 .验证(创建表,设置ID为自增长,两边插入数据看数据增长)

在一台数据库服务器上创建

create table userinfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20) NOT NULL);

insert into userinfo (name) values('ni'),('wo'),('ta');

 

然后查看表,因为是自增长id,从1开始,步长为2,所以添加的数据id为1,3,5。

然后在另一台数据库服务器插入数据,因为是自增长id,从2开始,步长为2,所以新 添加的数据id为6,8,10。

insert into userinfo (name) values('n'),('w'),('t');

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于搭建MySQL主从复制分离的步骤如下: 1. 配置主服务器: - 在主服务器的配置文件中开启二进制日志(binlog),可以通过在my.cnf文件中添加如下配置进行开启: ``` log-bin=mysql-bin server-id=1 ``` - 重启MySQL服务。 2. 配置从服务器: - 在从服务器的配置文件中添加如下配置: ``` server-id=2 relay-log=mysql-relay-bin read-only=1 ``` - 重启MySQL服务。 3. 创建复制用户: - 在主服务器上创建一个用于复制的用户,并赋予适当的权限: ``` CREATE USER 'replication'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; FLUSH PRIVILEGES; ``` - 注意修改密码为实际使用的密码。 4. 备份主服务器数据并导入到从服务器: - 在主服务器上执行以下命令备份数据: ``` mysqldump -u root -p --all-databases --master-data > dump.sql ``` - 将备份文件导入到从服务器: ``` mysql -u root -p < dump.sql ``` 5. 配置主从复制: - 在从服务器上执行以下命令,指定主服务器的地址、复制用户和密码,并开始复制: ``` CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX; START SLAVE; ``` - 注意替换主服务器IP、复制用户和密码,以及MASTER_LOG_FILE和MASTER_LOG_POS参数。 6. 配置分离: - 在从服务器上创建一个用于取数据的用户,并赋予适当的权限: ``` CREATE USER 'reader'@'%' IDENTIFIED BY 'password'; GRANT SELECT ON *.* TO 'reader'@'%'; FLUSH PRIVILEGES; ``` - 在应用程序中配置分离,将请求发往从服务器,请求发往主服务器。 完成上述步骤后,你将成功搭建MySQL主从复制分离。请记住,以上步骤仅供参考,具体操作可能因环境和需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值