-实现数据自动同步的服务结构
-主服务器:接受客户服务连接
-从服务器:自动同步主服务器数据,并且在主服务器宕机时充当主服务器
从这张图来看,主从同步分为两个部分,一个是主服务器部分(Master),一个是从服务器部分(Slave)
主服务器:
1.Binary log :也就是binlog日志,主要用于记录sql操作[详解]https://blog.csdn.net/ck784101777/article/details/100766138
从服务器:
1.Relay log : 中继日志是连接mastert和slave的信息,它是复制的核心,I/O线程将来自master的事件存储到中继日志中,中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个事件。
2.I/O thread :从服务器上运行的一个线程,主要用于读写操作,即读取主服务器上的binlog日志,并且写到从服务器上的中继日志上.默认不开启,需手动打开
3.Sql thread:Sql线程,从服务器上运行的一个线程,主要用于读取中继服务器上的二进制文件,并且将其转换为sql语句,并且在Mysql服务中执行
既然了解了主从服务器上的工作的组件,我们来演练一下具体实现主从同步数据的过程
主服务器上插入一条数据-->binlog日志发现并且记载-->从服务器上的I/O线程实时监控binlog日志,发现新记录并读取-->I/O线程将读取过来的数据写到中继日志中-->Sql线程监控到中继日志的变化-->Sql线程将新记录转换为Sql语句并且在mysql中执行(后台执行)
我们通过一个实验来看看如何配置主从同步,如图所示,我们准备两台Mysql服务器,一台作为Master服务器,一台作为Slave服务器,配置ip地址
配置主服务器:
-启用binlog日志,授权用户,查看binlog日志
配置从服务器:
-设置server_id
-保证主从服务器数据一致
-配置同步信息
-启动slave程序,即启动IO和Sql线程
-查看状态信息,是否连接成功,即线程是否启动
主服务器配置:
1)启用binlog日志
- ]# vim /etc/my.cnf
- [mysqld]
- server_id=51 //server_id
- log-bin=master51 //日志名
- :wq
- ]# systemctl restart mysqld
2)用户授权
用户名自定义、客户端地址使用% 或 只指定 从服务器的地址 都可以、只给复制数据的权限即可。
- ]# mysql -uroot -p密碼
- mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
- mysql>quit;
3)查看binlog日志信息
查看日志文件名 和 偏移量位置。
mysql> show master status\G;
*************************** 1. row ***************************
File: master51.000001 //日志名
Position: 441 //偏移量
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
从服务器配置:
1)指定server_id
Server_id值可以自定义,但不可以与主服务器相同。(取值范围1-255)
- ]# vim /etc/my.cnf
- [mysqld]
- server_id=52 //server_id值
- :wq
- ]# systemctl restart mysqld //重启服务
2)确保与主服务器数据一致(如果是使用2台新部署的数据库服务器配置主从同步,此操作可以忽略)
密码写你登录数据库的密码,导入的时候如果
- ]# mysqldump -uroot –p密码 -A > /allbak.sql //在主服务器上备份全部数据
- ]# scp /allbak.sql [email protected]:/root/ //将备份文件拷贝给从服务器
- ]# mysql -uroot –p密码 数据库名 < /root/allbak.sql //从服务器使用备份文件恢复数据
3)指定主服务器信息
数据库管理员root本机登录,指定主服务器信息,其中日志文件名和偏移量 写allbak.sql文件记录的。
指定主服务器信息后,会将主服务器信息保存在/var/lib/mysql/master.info文件下,若需要修改,则有两种途径,一种是在mysql下通过命令修改,而是修改上述文件.修改前必须停止slave线程,命令:stop slave 修改完后开启线程 : start slave
- ]# mysql -uroot –p密码 //管理员root 本机登录
- mysql> show slave status; //查看状态信息,还不是从服务器
- Empty set (0.00 sec)
- mysql> change master to //指定主服务器
- -> master_host=“192.168.4.51”, //主服务器ip地址
- -> master_user=“repluser”, //主服务器授权用户
- -> master_password=“123qqq…A”, //主服务器授权用户密码
- -> master_log_file=“master51.000001 ”, //主服务器日志文件,以主服务器显示的为主
- -> master_log_pos=441; //主服务器日志偏移量,切忌不可加双引号
- -> start slave; //启动线程
- mysql> show slave status\G; //查看状态信息,主要查看两个线程是否启动
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.4.51 //主服务器ip地址
- Master_User: repluser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: master51.000001
- Read_Master_Log_Pos: 437
- Relay_Log_File: host52relay-bin.000002
- Relay_Log_Pos: 604
- Relay_Master_Log_File: master51.000001
- Slave_IO_Running: Yes //IO线程yes状态
- Slave_SQL_Running: Yes //SQL线程yes状态
- ...........................
从服务相关文件信息:
主从同步连接测试
通过授权用户在客户端进行数据插入,插入数据后查看从服务器数据库是否同步数据
1)在主服务器添加访问数据的连接用户
授权用户对所有数据有增删改查的权限即可
- ]# mysql –uroot –p密码
- mysql> grant select,insert,update,delete on *.* to admin@"%" identified by "123qqq...A";
- Query OK, 0 rows affected, 1 warning (0.03 sec)
- mysql> quit
2)客户端连接主服务器访问数据
在50主机 使用主服务器51的授权用户连接
- ]# mysql -h192.168.4.51-uadmin -p123qqq...A
- mysql> show grants;
- +------------------------------------------------------------+
- | Grants for admin@% |
- +------------------------------------------------------------+
- | GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'admin'@'%' |
- +------------------------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> insert into db3.user(name,uid) values("lili",288); //db3库和user表是主从同步之前主服务器已有的。
- Query OK, 1 row affected (0.05 sec)
- mysql> insert into db3.user(name,uid) values("lili",288);
- Query OK, 1 row affected (0.28 sec)
- mysql> insert into db3.user(name,uid) values("lili",288);
- Query OK, 1 row affected (0.05 sec)
- mysql> select name,uid from db3.user where name="lili";
- +------+------+
- | name | uid |
- +------+------+
- | lili | 288 |
- | lili | 288 |
- | lili | 288 |
- +------+------+
- 3 rows in set (0.00 sec)
3) 客户端连接从服务器访问数据
客户端50主机使用授权用户连接从服务器可以看到和主服务器同样的数据
- ]# mysql -h192.168.4.52 –uadmin -p123qqq…A
- mysql> select name,uid from db3.user where name="lili";
- +------+------+
- | name | uid |
- +------+------+
- | lili | 288 |
- | lili | 288 |
- | lili | 288 |
- +------+------+
- 3 rows in set (0.00 sec)
主从同步不仅仅只有一主多从的结构,有四种常用的结构
1.一主一从,单向复制: 一主<--一从
2.一主多从,中心化复制:一从-->一主<--一主
3.一主多从,链式复制:一主<--一从<--一从
4.多主模式,互为主从:一主<-->一主
一主多从-中心化实验案例:
准备3台Mysql服务器,一台作为主服务器,两台作为从服务器,配置内容与一主多从模式相同,参照上一个案例,如果你做了上一个案例,这里只需要配置第二台从服务即可,配置内容与第一台一致
一主多从-链式复制案例:
准备三台Mysql服务器,与上面实验不同的是,这里需要一台主服务器,一台即作为主服务器又作为从服务器,一台作为从服务器
简单的介绍一下这种服务结构:首先你需要知道的是,我们在做一主一从的服务结构时,不可以在从服务器上插入数据(因为主服务器无法同步从服务器上的数据),在这里我们将数据插入到中间的服务器(这里是192.168.4.54的服务器)有和意义呢,想想一下这样一种情况,我们公司新增了一个部门,并且希望配置一台数据库服务器来存储这个部门的信息,但是它需要用到某个旧部门的数据信息(这里是192.168.4.53的数据库服务器),所有我们为它做了主从同步,将这一台新的服务器作为从服务器,并且同步旧部门的数据库信息,但是我们为了提高数据可靠性,希望有一台服务器最为这两台服务器的从服务器,此时我们就可以用到一主多从-链式复制的结构,这样就同步了两台数据库的信息(相当于取并集),这台从服务器从它的主服务器上同步信息,被同步的主服务器又可以通过自己的主服务器同步信息,此时两台服务器的数据都得到了同步.
链式复制还有一个好处,那就是当上一级主服务器宕机后,当前服务器充当主服务器使用
从服务器配置(192.168.4.54)
这里省略了主服务器192.168.4.53的配置,如果做了我上面讲述的实验,这里假设你已经完成了这两台服务器的主从同步配置
步骤一:环境准备
为了在启用binlog日志及同步之前保持主、从库的一致性,主从同步未配置之前,要保证从库上要有主库上的数据,禁用selinux,关闭防火墙服务,保证物理连接正常
1)关闭防火墙,禁用selinux,已关可忽略:
- ]# systemctl stop firewalld
- ]# setenforce 0
步骤二:配置主服务器192.168.4.53
2)用户授权
- ]# mysql -uroot -p123456
- mysql> grant replication slave on *.* to yaya@"%" identified by "123qqq…A“;
- Query OK, 0 rows affected, 1 warning (0.03 sec)
3)启用binlog日志,修改/etc/my.cnf配置,重新启动MySQL服务程序
指定服务器ID号、允许日志同步:
- ]# vim /etc/my.cnf
- [mysqld]
- log_bin=db53 //启用binlog日志,并指定文件名前缀
- server_id=53 //指定服务器ID号
4)重启mysql服务:
- ]# systemctl restart mysqld
5)确保/var/lib/mysql下面有两个文件:
- ]# ls /var/lib/mysql/db51.*
- /var/lib/mysql/db53.000001 /var/lib/mysql/db53.index
6)查看主服务正在使用的日志信息
查看主服务器状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):
- mysql> show master status;
- +-------------+----------+--------------+------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
- +-------------+----------+--------------+------------------+-------------------+
- | db53.000001 |437 | | | |
- +-------------+----------+--------------+------------------+-------------------+
- 1 row in set (0.00 sec)
从服务器配置(192.168.4.55)
步骤一:配置从服务器192.168.4.55
1)验证主库的授权用户
- ]# mysql -h192.168.4.54 -uuser54 -p654321
- mysql: [Warning] Using a password on the command line interface can be insecure.
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 7
- Server version: 5.7.17-log MySQL Community Server (GPL)
- Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql> //验证成功
2)指定server_id
- [mysqld]
- server_id=55
3)重新启动服务
- ]# systemctl restart mysqld
4)管理员登录指定主库信息
- ]# mysql -uroot -p123456
- mysql> change master to
- -> master_host="192.168.4.54”;
- -> master_user="user55”;
- -> master_password="654321",
- -> master_log_file=" db54.000001”;
- -> master_log_pos=154;
- Query OK, 0 rows affected, 2 warnings (0.37 sec)
5)启动slave进程
- mysql> start slave;
- Query OK, 0 rows affected (0.04 sec)
6)查看进程状态信息
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.4.54
- Master_User: user55
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: db54.000001
- Read_Master_Log_Pos: 154
- Relay_Log_File: db55-relay-bin.000001
- Relay_Log_Pos: 315
- Relay_Master_Log_File: db54.000001
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
互为主从-多主模式
要想配置多主模式,你必须了解主从同步的复制模式,并将复制模式更改为半同步复制模式.
[如何更改复制模式]https://blog.csdn.net/ck784101777/article/details/100918876
这里假设你已经更改完,那么配置起来就很容易了,你只需要在两台Mysql服务器上配置指定对方的主机即可,通过 change master to命令,参考上文配置格式.
多主模式的好处就是任意一台服务宕机,剩下的一台都可以作为主服务器,多主模式也是数据库集群架构的基础,缺点是使用两倍的硬件资源,但是存储相同的数据,多少有点浪费资源