让我们继续 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 当前数据库相对于主库的数据延迟, 这个值是根据二进制日志的时间戳计算得到的(秒)
至此主备成功,其实主备搭建和主从搭建是一样的,后续我们将搭建主备互备服务。



