Mysql的主从架构模式,是很多企业广泛使用,并且大家所广为熟知的一种架构模式,从主从模式搭建配合MHA实现故障自动化的感知迁移,这都是DBA所应该熟练掌握的技能。这周Jeson老师将准备两篇文章,系统性的介绍给大家Mysql主从+MHA的架构实现和搭建。
好了,今天我们先来聊一聊Mysql的主从部分。
一、Mysql 主从理论部分:
mysql主从复制用途
· 实时灾备,用于故障切换
· 读写分离,提供查询服务
· 备份,避免影响业务
主从部署必要条件:
· 主库开启binlog日志(设置log-bin参数)
· 主从server-id不同
· 从库服务器能连通主库
存在的问题:
· 主库宕机后,数据可能丢失
· 从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
· 半同步复制、或者全同步复制 要求:Mysql5.7版本
· 并行复制----解决从库复制延迟的问题 要求:Mysql5.6版本以上,建议5.7版
主从同步原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
二、Mysql 主从配置步骤:
1、编辑数据库配置文件my.cnf,一般在/etc/目录下。
#vi /etc/my.cnf
在[mysqld]的下面加入下面代码:
log-bin=mysql-bin
server-id=1 #注意:保证从服务器的该值不同,可以自定义
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=wordpress # 表示只备份该数据库,可以不写,则为全部
binlog_ignore_db=mysql # 表示忽略备份mysql ,可以不写,则为不忽略
2、重启mysql服务器:
/etc/init.d/mysqld restart
3、登录MySQL主服务器。
1. #mysql -uroot -p
在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。
把X.X.X.X替换为从服务器的IP,
把####替换成自定义的用户名
password :为服务器mysql密码
1. mysql> CREATE USER '####'@ 'X.X.X.X' IDENTIFIED BY 'password';
2. mysql> GRANT REPLICATION SLAVE ON *.* TO '####'@'X.X.X.X' IDENTIFIED BY 'password';
4、行以下命令锁定数据库以防止写入数据
mysql>FLUSH TABLES WITH READ LOCK;
5、退出mysql命令行,导出数据库
#mysqldump -u root -p123456 --all-databases --lock-tables=false -- > /root/all.sql
6、使用scp命令传输数据库文件all.sql到从服务器。
#scp /root/all.sql root@xxxxx:/root 把X.X.X.X替换为从服务器的IP,
7、再次连接数据库进入mysql命令行查看master状态。
mysql>show master status;
请记下显示的信息,配置从服务器会用到。
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 1001741 | dbispconfig | mysql |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
8、解锁数据表。
1. mysql>UNLOCK TABLES;
配置从服务器:
1、导入主服务器的数据库数据。
#mysql -u root -p123456 < /root/all.sql
2、编辑配置文件my.cnf,在[mysqld]下面加入:
server-id=2
#relay-log=relay-log-bin
#relay-log-index=slave-relay-bin.index
3、保存文件并重启mysqld。
#service mysqld restart // 或者 /etc/init.d/mysqld restart
4、登录mysql服务器,执行以下命令。
mysql> CHANGE MASTER TO
MASTER_HOST='X.X.X.X', # 主服务器IP
MASTER_USER='user', #设置主服务器访问权限的用户名 和#####一致
MASTER_PASSWORD='password', # 密码 ;同上面password 一致
MASTER_PORT=3306, #端口号 (如果未曾修改,默认即可)
MASTER_LOG_FILE='mysql-bin.000001',
# 主要从哪个版本进行复制,建议从000001开始版本在主服务器
show master status 下面的File
MASTER_LOG_POS=98,
# 控制从MASTER_LOG_FILE中具体哪个位置来拷贝
MASTER_CONNECT_RETRY=10; # 10秒复制一次
5、启动slave进程。
mysql>START SLAVE;
6、查看slave:
mysql > show slave status\G;
7 、测试:
在主服务器中,新建一个数据库,查看从服务器是否更新
8、跳过错误
#### 非GTID的复制模式
mysql> stop slave;
Query OK, 0 rows affected (0.07 sec)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave; Query OK, 0 rows affected (0.07 sec)