mysql主从复制
一 、企业网站单个 mysql 问题分析
在企业网站中,后端 mysql 数据库只有一台时,会有以下问题:单点故障,服务不可
用;无法处理大量的并发数据请求;数据丢失将造成大灾难。
改造办法:
增加 mysql 数据库服务器,对数据进行备份,形成主备。
确保准备 mysql 数据库服务器是一样的
主服务器宕机了,备份服务器继续工作,数据有保障
mysql 主从复制与读写分离是密切相关
一台主服务器可以做多个从服务器,从服务器也可以充当主服务器,再做多个从服务器,以此类推....
二、主从复制原理原理
mysql 主从复制的类型:
·基于语句的复制
·基于行的复制
·混合类型的复制
1、mysql 从服务器开启 i/o 线程,向主服务器请求数据同步(获取二进制日志)
2、mysql 主服务器开启 i/o 线程回应从服务器
3、从服务器得到主的二进制日志写入中继日志
4、从服务器开启 sql 线程将日志内容执行,实现数据同步
三、mysql 主从备份案例
两台centos7服务器
master---192.168.1.46
slave---192.168.1.47
所有服务器关闭防火墙、关闭selinux
建立时间同步环境 , 在主服务器上安装配置 ntp 时间同步服务器
[root@master ~]# yum -y install ntp
[root@master ~]# vim /etc/ntp.conf
22 server 127.127.1.0 // 手动添加此两行内容
23 fudge 127.127.1.0 startum 8
[root@master ~]# systemctl start ntpd
[root@master ~]# chkconfig ntpd on
从服务器上进行时间同步
[root@slave ~]# yum -y install ntpdate
[root@slave ~]# ntpdate 192.168.1.46
23 aug 17:50:14 ntpdate[3407]: adjust time server 192.168.1.46 offset 0.000029 sec
[root@slave ~]# crontab -e
[root@slave ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate 192.168.1.46
配置 mysql master 主服务器
[root@master ~]# vim /etc/my.cnf
在[mysqld]模块下手动添加
10 log-bin=mysql-bin
11 log-slave-updates=true #手动添加,开启从日志
12 server-id=11
[root@master ~]# systemctl restart mariadb
[root@master ~]# mysql -uroot -p
给从服务器授权
mariadb [(none)]> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123123';
query ok, 0 rows affected (0.00 sec)
mariadb [(none)]> flush privileges;
query ok, 0 rows affected (0.01 sec)
mariadb [(none)]> show master status;
+------------------+----------+--------------+------------------+
| file | position | binlog_do_db | binlog_ignore_db |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 613 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
配置从服务器
[root@slave ~]# yum -y install mariadb-*
[root@slave ~]# vim /etc/my.cnf
10 relay-log=relay-log-bin
11 relay-log-index=slave-relay-bin.index
12 server-id=12 #主从服务器的 server-id 不能相同!
[root@slave ~]# systemctl restart mariadb
[root@slave ~]# mysqladmin -uroot password 123123
[root@slave ~]# mysql -uroot -p123123
mariadb [(none)]> change master to
-> master_host='192.168.1.46',
-> master_port=3306,
-> master_user='myslave',
-> master_password='123123',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=613;
query ok, 0 rows affected (0.01 sec)
mariadb [(none)]> start slave;
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.1.46
master_user: myslave
master_port: 3306
connect_retry: 60
master_log_file: mysql-bin.000001
read_master_log_pos: 613
relay_log_file: relay-log-bin.000002
relay_log_pos: 529
relay_master_log_file: mysql-bin.000001
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: 613
relay_log_space: 821
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: 11
1 row in set (0.00 sec)
通过查看 slave 状态,确保 slave_io_running: yes slave_sql_running: yes
在 mysql 主服务器创建 test db数据库
[root@master ~]# mysql -uroot -p123123
mariadb [(none)]> show databases;
+--------------------+
| database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
在从服务器查看是否数据同步
[root@slave ~]# mysql -uroot -p123123
mariadb [(none)]> show databases;
+--------------------+
| database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
从服务器复制了主服务器上的数据库,主从复制成功。
注意:
若在 从服务器 start slave; 之后发现 slave_io_running: no 、slave_sql_running: yes ,则
需要先 stop slave; 重新 change master to …; 再 start slave;