运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

Centos7环境下mysql主从复制教程

运维开发网 https://www.qedev.com 2021-04-28 14:04 出处:51CTO 作者:mb5d2cae3e8f9a3
1. Mysql主从概念:  mysql的主从复制,是用来建立一个和主数据库完全一样的数据库环境, 从库会同步主库得所有数据,可轻松实现故障转移。 1.1 mysql主从主要作用: 实现数据备份; 基于数据备份, 实现故障转移; 基于数据备份, 实现读写分离;1.2 常见mysql主从架构一主一从 一主多从 互为主从1.3 主从工作原理1.4 主从复制工作流程:1.主节点任何的数据修改在binlo

1. Mysql主从概念: 

 mysql的主从复制,是用来建立一个和主数据库完全一样的数据库环境, 从库会同步主库得所有数据,可轻松实现故障转移。

 1.1 mysql主从主要作用: 

实现数据备份; 基于数据备份,
实现故障转移; 基于数据备份,
实现读写分离;

1.2 常见mysql主从架构

一主一从
一主多从
互为主从

1.3 主从工作原理

Centos7环境下mysql主从复制教程

1.4 主从复制工作流程:

1.主节点任何的数据修改在binlog写入binlog中
2.从节点通过I/O thead线程发起请求
3.主节点通过I/O dump thread线程发送binlog中的内容
4.从节点通过I/O thead线程将主节点binlog中的内容写入本地relaylog中
5.从节点通过sql thread线程将relaylog中的内容在本地replay

======================================================================
整个过程中需要注意的地方:
1.主节点必须开启binlog,从节点必须开启relay_log
2.每台mysql服务器必须有唯一的server_id
3.为避免从服务器上进行写操作,从服务器要开启read-only选项,但该选项对super用户无效,mysql5.7之后新增了一个super_read_only选项
4.binlog_format必须是row格式(binlog_do_db和binlog_ignore_db不支持statement格式)

2. MySQL主从部署: 

master: 192.168.75.130 
slave: 192.168.75.135

2.1 master端配置

# 安装好mysql/mariadb数据库: 
yum instal mariadb mariadb-server -y 
# 修改配置文件,在[mysqld]指令段添加以下行:
 log-bin=jfedu-bin
  server-id=1
# 启动数据库服务: 
[[email protected]~]# systemctl start mariadb 
 # 查看mysql进程: 
 [[email protected]~]# ps -ef |grep mysqld mysql     
 2040     1  0 01:15 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr mysql    
 2203  2040  0 01:15 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql -plugin-dir=/usr/lib64/mysql/plugin --logerror=/var/log/mariadb/mariadb.log 
                                       --pidfile=/var/run/mariadb/mariadb.pid -socket=/var/lib/mysql/mysql.sock root      
 2316  1946  0 02:05 pts/0    00:00:00 grep -color=auto mysqld 
 # 查看mysql端口: [[email protected]~]# netstat -ntlp |grep 3306 
 tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2203/mysqld

2.2 查看配置是否生效

# 通过mysql直接进入数据库: 
[[email protected]~]# mysql Welcome to the MariaDB monitor. 
Commands end with ; or \g. 
Your MariaDB connection id is 3 Server version: 5.5.64-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> 
# 查看log_bin和sql_log_bin是否均为on; 
MariaDB [(none)]> show variables like "%log_bin"; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| log_bin       | ON    | 
| sql_log_bin   | ON    | 
+---------------+-------+ 
2 rows in set (0.00 sec)

2.3 授权从库

MariaDB [(none)]> grant replication slave on *.* to "smith"@"192.168.1.105" identified by "123456"; 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

2.4 查看master状态

MariaDB [mysql]> show master status;
+------------------------+----------+--------------+------------------+
| File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------+----------+--------------+------------------+
| mysqlmaster-bin.000006 |     1602 |              |                  |
+------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2.5 查看slave端配置

# 修改配置文件,在[mysqld]指令块下添加如下行: server-id=2

2.6 启动slave端数据库服务

[[email protected]~]# systemctl start mariadb
[[email protected]~]# ps aux|grep mysqld
mysql     1280  0.0  0.0 113304  1612 ?        Ss   09:43   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     1525  0.0  4.5 1168704 86572 ?       Sl   09:43   0:12 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin 
                                                                 --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      5051  0.0  0.0 112720   984 pts/0    R+   13:11   0:00 grep --color=auto mysqld

2.7 指定master

MariaDB [(none)]> change master to   
 -> master_host="192.168.75.130",    #主库IP
 -> master_user="root",             #主库用户名
 -> master_password="123456",    
 -> master_log_file="master-bin.000002",    
 -> master_log_pos=476;

2.8 查看slave状态

MariaDB [(none)]> slave start; 
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show slave status\G
 *************************** 1. row ***************************               
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.75.130                 
                   Master_User: jfedu                  
                   Master_Port: 3306                
                 Connect_Retry: 60              
               Master_Log_File: jfedu-bin.000002          
           Read_Master_Log_Pos: 476               
                Relay_Log_File: mariadb-relay-bin.000002                
                 Relay_Log_Pos: 529        
         Relay_Master_Log_File: jfedu-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:   
   Replicate_Wild_Ignore_Table:                    
                    Last_Errno: 0                   
                    Last_Error:                  
                  Skip_Counter: 0          
           Exec_Master_Log_Pos: 476              
               Relay_Log_Space: 825              
               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 
    1 row in set (0.00 sec)

2.9 主从数据验证

# 在主库创建一个数据库: 
MariaDB [(none)]> create database jfedu charset=utf8; 
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases; 
+--------------------+ 
| Database           | 
+--------------------+ 
| information_schema | 
| jfedu              | 
| mysql              | 
| performance_schema | 
| test               | 
+--------------------+
# 在从库查看:
 MariaDB [(none)]> show databases; 
 +--------------------+ 
 | Database           |
 +--------------------+ 
 | information_schema | 
 | jfedu              | 
 | mysql              | 
 | performance_schema |
 | test               |
 +--------------------+
 5 rows in set (0.00 sec)

3. 常见问题解决

3.1 同步错误分析

Slave_IO_Running: Connecting /NO
# 第一种:主库宕机 
# 第二种:从库指定的用户名与密码错误(与主库授权的用户名和密码不一致) 
# 第三种:关闭防火墙 Slave_IO_Running: No 
# 从库指定的二进制文件有误 Slave_SQL_Running: No 
# pos点问题

3.2 主从复制延迟问题及解决方法: 

1 从库过多: 
建议从库数量3-5 为宜,要复制的从节点数量过多,会导致复制延迟。
2 从库硬件差: 
从库硬件比主库差,导致复制延迟,查看master和slave的系统配置,可能 会因为机器配置的问题,包括磁盘IO、CPU、内存等各方面因素造成复制 的延迟,一般发生在高并发大数据量写入场景。
1.4.3 网络问题: 
主从库之间的网络延迟,主库的网卡、网线、连接的交换机等网络设备都 可能成为复制的瓶颈,导致复制延迟

3.3 navcat连接不上mysql分析

mysql8.0-

[[email protected]~]# mysql --version
mysql  Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
解决方法:
MariaDB [mysql]> update user set host = '%' where user ='root';更新主机权限
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql8.0+

造成该问题的原因是mysql8.0采取的加密方式不同,mysql 7之前的加密方式是mysql_native_password,mysql 7之后加密方式是caching_sha2_password
解决方法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Newpassword';

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号