Mysql 主从--新增从节点
对于已经运行一段时间且产生一定的数据的mysql , 在线(不能停止mysql服务)添加从节点还是有点儿麻烦的, 网上也有多种实现方式, 笔者借助于第三方工具Percona innobackupex.因此需要事先在主服务器上安装Percona innobackupex 这个工具.
主服务器配置
1. 创建二进制目录
- 创建存放二进制日志目录, 用于存放mysql 二进制日志文件
- 修改目录所有者和所属组为mysql, 因为mysql 是以mysql 用户启动的
[root@gds mysql]# mkdir /var/data/mysql/binlog
[root@gds mysql]# chown mysql:mysql /var/data/mysql/binlog
[root@gds mysql]# drwxr-xr-x. 2 mysql mysql 4096 Aug 4 19:17 /var/data/mysql/binlog/
2. 创建专门用于主从复制用户
- 使用管理员账户登录mysql
- 创建用户主从复制的用户repl, 并设置密码为repl
- 为repl 用户授权
- 刷新授权
>mysql CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
Query OK, 0 rows affected (0.00 sec)
>mysql GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
Query OK, 0 rows affected, 1 warning (0.00 sec)
>mysql flush privileges;
Query OK, 0 rows affected (0.00 sec)
3. 修改配置
- 修改mysql配置文件my.cnf ,笔者配置文件位置: /usr/local/etc/mysql/my.cnf
- 对于二进制文件和二进制索引文件, 默认存放在$datadir目录, 因此相对目录也就是相对于$datadir 目录而言
- 二进制文件命名: 使用_或者驼峰式命名, 不建议使用. 命名, 因为使用多个.会有问题
- 每次重新mysql 都会生成一个新的二进制日志文件, 文件名格式为: mysql_bin_log.000001
#[mysqld] 节点下
# 指定mysql id, 通常用服务器ip 末位或末6位表示
server_id=100
# 指定mysql 二进制文件, 默认存放在$datadir 目录下
log_bin=binlog/myql_bin_log
# 指定mysql 二进制文件索引
log_bin_index=binlog/mysql_bin_log_index
4. 重启mysql 服务
- 如果之前没有开启二进制日志,那么需要重启mysql服务, 否则不需要重启
[root@localhost mysql]# service mysql restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
查看二进制文件
[root@localhost mysql]# ls /var/data/mysql/binlog/ mysql_bin_log.000001 mysql_bin_log_index.index
可登录主服务器查看主服务器状态:
mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+ | mysql_bin_log.000001 | 23742 | | | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
5. 对主库做数据库快照
- 在mysql 主节点上, 使用innobackupex 命令对数据库做全库数据快照, 并记录二进制日志偏移量
- 如果不是本地mysql的话, 可以只通过--host, --port 指定数据库位置
- 笔者使用配置文件方式: 指定my.cnf 位置, 用户名, 密码, 数据库, 和快照存放路径, 生成一个文件名为时间戳的文件夹
- 注意生成数据快照之后, 主数据库就不能进行重启操作, 因为每次重启都会产生一个新的二进制日志文件
[root@localhost mysql]# innobackupex --defaults-file=/usr/local/etc/mysql/my.cnf --user=root --password=root --database=zabbix /tmp/percona
...
xtrabackup: Transaction log of lsn (393631383) to (393651645) was copied.
170804 19:26:15 completed OK!
[root@localhost mysql]# ls /tmp/percona
2017-08-04_19-26-07
6. 保证数据一致性
- 生成备份数据和二进制日志的对应关系, 记录在xtrabackup_binlog_info文件中
[root@localhost percona]# innobackupex --user=root --password=root --apply-log /tmp/percona/2017-08-04_19-26-07/
...
InnoDB: Shutdown completed; log sequence number 393652264
170804 19:27:37 completed OK!
[root@localhost percona]# cat /tmp/percona/2017-08-04_19-26-07/xtrabackup_binlog_info
mysql_bin_log.000001 105847
7. 压缩备份文件
- 压缩日志文件, 方便从服务器之间数据传输
[root@localhost percona]# tar -zcf mysql.tar.gz 2017-08-04_19-26-07/
[root@localhost percona]# ls
2017-08-04_19-26-07 mysql.tar.gz
2. 从服务器
- 如果从服务器为新装mysql服务器, 可不进行初始化登录操作, 直接制定数据目录, 迁移数据即可
- 从服务器也需要创建二进制目录, 并修改所属组和所有者, 此步骤同主服务器
1. 停止从服务器
- 如果没启动或新装mysql 可省略此步骤
[root@localhost percona]# service mysql stop
2. 修改从服务器配置
- 修改配置文件, my.cnf, 建议除了server_id 不一样外, 其它主要配置和主节点保持一致
- 从服务器可设置为只读
#[mysqld] 节点下
# 指定mysql id, 通常用服务器ip 末位或末6位表示
server_id=100
# 指定mysql 二进制文件, 默认存放在$datadir 目录下
log_bin=binlog/myql_bin_log
# 指定mysql 二进制文件索引
log_bin_index=binlog/mysql_bin_log_index
3. 下载主服务器备份文件
- 下载备份文件到/tmp/percona 目录
- 解压备份文件
[root@gds percona]# scp [email protected]:/tmp/percona/mysql.tar.gz .
[email protected]'s password:
mysql.tar.gz 100% 65MB 10.9MB/s 00:06
[root@gds percona]# tar -zxf mysql.tar.gz
[root@gds percona]# ls
2017-08-04_19-26-07 mysql.tar.gz
4. 完全恢复从服务器数据
- 清空或备份mysql 数据目录
- 将备份文件夹所有数据, 拷贝到数据目录
[root@gds mysql]# rm -rf /var/data/mysql/*
[root@gds mysql]# mv /tmp/percona/2017-08-04_19-26-07/* /var/data/mysql/
5. 创建二进制日志存放目录
- 创建二进制日志文件存放目录并修改所有者和所属组
[root@gds mysql]# mkdir /var/data/mysql/binlog
6. 修改mysql 数据目录所有者所属组
[root@gds mysql]# chown -R mysql:mysql /var/data/mysql
7. 启动从服务器
[root@gds percona]# service mysql start
Starting MySQL. SUCCESS!
8. 查看二进制日志信息
- 查看日志文件名和日志偏移量, 用于设置主节点时参数mster_log_file 和 mster_log_pos
[root@gds percona]# cat /var/data/mysql/xtrabackup_binlog_info
mysql_bin_log.000001 105847
9. 从服务器设置主节点
- 使用root账号登录, mysql 服务器
- 设置从节点的主节点信息
- 开启从服务同步
>mysql change master to master_host='192.168.1.100',master_user='repl',master_password='repl',master_log_file='mysql_bin_log.000001',master_log_pos=105847;
10. 启动从服务
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)
11. 查看从节点状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.22.12.225
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin_log.000002
Read_Master_Log_Pos: 120321112
Relay_Log_File: gds-relay-bin.000002
Relay_Log_Pos: 40840
Relay_Master_Log_File: mysql_bin_log.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: 120198962
Relay_Log_Space: 163195
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: 249
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: 225
Master_UUID: 92e53267-7386-11e7-985d-14b31f053816
Master_Info_File: /var/data/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Reading event from the relay log
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)
12. 查看当前主从情况:
- 登录主服务器, 查看主服务器状态和从服务器用户连接情况
- 笔者做的一主两从, 所以可以看到两条记录
mysql> show master status \G
*************************** 1. row ***************************
File: mysql_bin_log.000002
Position: 120759726
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql> SELECT user, host, time, command, time FROM information_schema.processlist WHERE user = 'repl';
+------+----------------------+------+-------------+------+
| user | host | time | command | time |
+------+----------------------+------+-------------+------+
| repl | 192.168.1.101:34473 | 98 | Binlog Dump | 98 |
| repl | 192.168.1.102:46111 | 795 | Binlog Dump | 795 |
+------+----------------------+------+-------------+------+
2 rows in set (0.01 sec)
附:
1. mysql 配置
- 除了server_id 不同之外, 其它都相同
[mysqld]
# mysql 数据存放目录
datadir=/var/data/mysql
# mysql socket
socket=/usr/local/mysql/mysql.sock
# 错误日志
log-error=/var/logs/mysql/mysqld.log
# mysql 进程id
pid-file=/var/run/mysql/mysqld.pid
# 数据库默认编码
character_set_server = utf8
# mysql 节点id
server_id=225
# 二进制文件存放位置, 相对于dataDir
log_bin=binlog/mysql_bin_log
# 二进制文件索引存放位置
log_bin_index=binlog/mysql_bin_log_index
symbolic-links=0
[client]
# 客户端默认连接编码
default-character-set = utf8
# sock 文件位置
socket=/usr/local/mysql/mysql.sock
[mysqladmin]
# 客户端默认连接编码
default-character-set = utf8
# sock 文件位置
socket=/usr/local/mysql/mysql.sock