栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Liunx 搭建MySQL集群(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Liunx 搭建MySQL集群(二)

让我们继续 MySQL 集群搭建之旅,大部分 MySQL 的集群都是采用主主从的经典模式,这也是部署高可用集群的基础。从上文我们已经知道如果安装 MySQL ,如果没看过的可以了解一下。

Liunx 搭建MySQL集群(一)
Liunx 搭建MySQL集群(三)
现在我们的环境如下:

172.16.185.161:3306 Master 节点,正在使用
172.16.185.162:3306 新搭建数据库,要在上面172.16.185.161 的备库

(1)创建同步用户

我们创建一个用户名为 repl 的用户,授予 REPLICATION SLAVE 权限专门用来同步

#主库 172.16.185.161:3306操作
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

(2) 备份主库的数据【因为主库正在使用】

常用的备份数据的方式有 innobackupex 和 mysqldump,这里数据量少,我们用 mysqldump 进行全备

[root@主 ~]# /usr/local/mysql/bin/mysqldump -uroot -p123456 -S /tmp/mysql.sock -F --opt -R --single-transaction --master-data=2 --default-character-set=utf8MB4 -A > mysql_backup_full.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

这个地方有个警告,意思就是 在命令行使用密码是不安全的。
你可以将用户和密码放到my.cnf 文件中,如下:

#my.cnf文件新增下面语句
[mysqldump]
user=your_backup_user_name
password=your_backup_password

再次执行如下命令

[root@主 ~]$ /usr/local/mysql/bin/mysqldump  -S /tmp/mysql.sock -F --opt -R --single-transaction --master-data=2 --default-character-set=utf8MB4 -A > mysql_backup_full.sql

参数解析:

-S 选择 socket 文件,本机连接数据库可以用这种方法,也可以指定 ip、端口进行连接-F 开始导出之前刷新日志–opt 如果有这个参数表示同时激活了 mysqldump 命令的 quick,add-drop-table,add-locks,extended-insert,lock-tables 参数
(1) --quick 代表忽略缓冲输出,mysqldump 命令直接将数据导出到指定的SQL文件
(2) --add-drop-table 就是在每个 CREATE TABEL 命令之前增加 DROP-TABLE IF EXISTS 语句,防止数据表重名
(3) --add-locks 在INSERT数据之前和之后锁定和解锁对应的数据表
(4) --extended-insert 表示可以多行插入-R 导出存储过程以及自定义函数, 如果有用到存储过程, 需要加这个参数–single-transaction (innodb)设置事务的隔离级别为可重复读,即 REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据, 如果全部表都为 InnoDB 就带上这个参数,保证数据一致性,备份时不会锁表。如果有 MyISAM 的表,需要锁表备份才能保证数据的一致性–lock-all-tables 备份过程加读锁, single-transaction 选项和 lock-all-tables 选项是二选一的–master-data=2 记录当前二进制日志位置, master_data取1和取2的区别,只是后者把 change master … 命令注释起来了–default-character-set 选择编码, 这个选项非常重要, 编码选不对或者没有设置很容易造成乱码-A 代表备份所有的库

数据备份完毕后,把数据文件直接传输到 Slave 机器上

[root@k8s-master ~]# scp ./mysql_backup_full.sql root@172.16.185.162:/usr/local/src
The authenticity of host '172.16.185.162 (172.16.185.162)' can't be established.
ECDSA key fingerprint is SHA256:IHwi5Rali8AlSeqD4+uLcWjV6pu6FXaTbdn5DM7VAw4.
ECDSA key fingerprint is MD5:9d:d9:ca:e7:65:fd:67:50:33:81:26:01:02:58:f8:07.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.185.162' (ECDSA) to the list of known hosts.
root@172.16.185.162's password: 
mysql_backup_full.sql 100% 1209KB  17.9MB/s   00:00    
[root@k8s-master ~]# 

slave 机器上

[root@备 src]# ls
mysql_backup_full.sql  

(3)数据恢复

在 Slave 机器上直接执行 sql 文件导入数据

[root@备 ~]# /usr/local/mysql/bin/mysql -uroot -p123456 -S /tmp/mysql.sock < /usr/local/src/mysql_backup_full.sql

导入完毕,我们可以看到数据和 Master 的备份数据一致

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.01 sec)

mysql> select * from user;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
| 10 | name001 |    0 |
| 11 | name002 |    0 |
| 12 | name003 |    0 |
| 13 | name003 |    0 |
| 14 | name005 |    0 |
| 15 | name005 |    0 |
| 16 | name006 |    0 |
| 17 | name006 |    0 |
+----+---------+------+
8 rows in set (0.00 sec)

mysql> 

(4) 开启同步

回到备份文件,我们从头部找到 Master 备份时间点的二进制日志位置

[root@备 src]# head -30 mysql_backup_full.sql | grep 'CHANGE MASTER TO MASTER_LOG_FILE'
-- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000003', MASTER_LOG_POS=157;

MASTER_LOG_FILE 和 MASTER_LOG_POS 就是在 Master 执行 show master status 得到的二进制位置信息。现在,我们执行同步命令

mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.16.185.161',
    -> MASTER_PORT=3306,
    ->  MASTER_USER='repl',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='master-bin.000003',
    -> MASTER_LOG_POS=157;
Query OK, 0 rows affected, 9 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)

查看同步状态

mysql> show slave status G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.16.185.161
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 157
               Relay_Log_File: k8s-node-1-relay-bin.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: master-bin.000003
             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: 157
              Relay_Log_Space: 542
              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: ca2799be-9c58-11ec-bdf6-000c2962a603
             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)

ERROR: 
No query specified


我们可以从 Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master 这三个参数可以判断出同步状态是否正常

(1) Slave_IO_Running 取 Master 日志的线程, Yes 为正在运行
(2) Slave_SQL_Running 从日志恢复数据的线程, Yes 为正在运行
(3) Seconds_Behind_Master 当前数据库相对于主库的数据延迟, 这个值是根据二进制日志的时间戳计算得到的(秒)

至此主备成功,其实主备搭建和主从搭建是一样的,后续我们将搭建主备互备服务。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号