一、更改下:上篇分库分表带来的问题
5、安全性和可用性
鸡蛋不要放在一个篮子里。
在业务层面上垂直切分,将不相关的业务的数据库分隔,因为每个业务的数据量、访问量都不同,不能因为一个业务把数据库搞挂而牵连到其他业务。
利用水平切分,当一个数据库出现问题时,不会影响到100%的用户,每个库只承担业务的一部分数据,这样整体的可用性就能提高。
二、主从工作原理
master是主库,slave是从库,上面的工作原理主要通过binlog来进行执行
1、首先当master有主库写入数据的时候,如果打开了二进制文件,会将写的命令写入到binlog日志文件来。
2、写完之后,这时从库的IO线程不是主动去读取binlog日志。
3、这时master开启异步的线程向其下的所有的slave节点广播,你可以进行数据读取了。
4、这时slave中的io线程就会读取binlog中的日志。
5、然后又会异步写到relay日志。
6、relay日志和binlog日志是一样的。只不过binlog日志属于master的,relay日志属于slave的。
7、这时在slave这边也会有一个sql线程,会把rely日志中的命令读取出来,然后通过sql线程 读取relay日志中的命令,
8、执行命令产生的数据写入到数据库中去。
主要核心的是binlog日志。
在我们开发中,80%在读,20%在写,所以master提供写,slave提供读。
三. 配置MySQL主从具体实现(MYSQL5.7)
3.1在服务器上面安装2个MySQL数据库
- 通过命令下载rpm文件,我这里就不下载了,下面是地址
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
- 安装mysql,我这里已经安装好了,就不用安装了。
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
- 安装数据库
yum install mysql-community-server
安装完有几个是默认的路径。
- 查看mysql 初始化密码
先启动mysql服务:service mysqld start,监听的端口是3306
- cat /var/log/mysqld.log |grep password (查看初始密码)
- 因为5.7版本的mysql密码是不知道,需要找到密码,这时会有一个临时的密码,我这里就不用显示了,已经配置完了。
- 登录mysql,设置密码策略 mysql -uroot -p
set global validate_password_length=1:设置全局的密码长度
set global validate_password_policy=0; - 更新密码
格式:update mysql.user set authentication_string=password('123456') where user='root'; - 授权远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; :授予所有数据库的所有表的权限,远程的密码为root. - FLUSH PRIVILEGES;
记住想要外部连数据库的话:需要放行3306端口
firewall-cmd --add-port=3306/tcp --permanent;
firewall-cmd --reload
然后同上,在另一台机器上也这样搭建,提供一个如果linux出现网卡问题的话,提供一个博客链接:https://blog.csdn.net/qq_32736999/article/details
3.2、Master机器配置
在所有的master-slave机器中,所有的server_id是不同的
server_id=1
log_bin=master-bin:打开二进制日志
配置完成保存后,重启mysql服务器,再次登录Mysql服务器
systemctl restart mysald mysal -uroot -proot
执行 show master status;:主服务器log-bin日志
记录下File的名称和Position的位置,mysql,当里面什么都不存储的时候,二进制文件最终的位置154。
Slave机器配置:配置中转日志,和只读。
配置完成保存后,重启mysql服务器,再次登录MySQL服务器
解决Connection xxxx. reties 18 异常:
方案:必须在master端创建同步的账号和密码,为了slave连接master实现主从同步
create user u_replication identified by 'root'; 用于master给slave使用的
grant replication slave on *.* to 'u_replication'@'%'; 授予对从 主机进行一个备份的权限
flush privileges;
在从服务器执行如下的SQL:
change master to master_host='192.168.124.241',master_port=3306,master_user='u_replication',master_password='root!',master_log_file='master-bin.000002',master_log_pos=154; 开始从哪个文件,哪个位置开始同步
master_host:主机ip master_port:同步的master库端口号 master_user master:提供于slave同步数据用户名 master_password 提供于slave同步数据密码 master_log_file master对应 binlog文件名称 master_log_pos masterbinlog文件最终的位置(内容的偏移量)[slave同步master开始位置]
NOTE:这两个参数master_log_file=master-bin.000002,master_log_pos=154必须和主库一致
3.3、启动主从配置(从服务上执行 )
mysql> start slave
检测是否配置成功
mysql> show slave status \G
### 解决这个异常
原因:虚拟机复制的UUIDS可能相同
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解决方式:
1、查看server_id是否相同
show variables like 'server_id';
2、查看auto.cnf文件
show variables like 'server_uuid'; ##发现一样
cat /var/lib/mysql/auto.cnf
下面操作在从服务上执行 (位置可能不同可以使用命令: find / -name "auto.cnf"查找文件 )
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bk ###重命名该文件
systemctl restart mysql
只要出现下面的两个为yes的话,主从就搭建成功:这是 从服务器上的两个线程
这时主从的配置已经搭建成功了。
测试下:首先在主服务器上建个库
然后在从服务器上读取
总结:这就实现了master的主从。只要master操作了数据库,在从服务器上就会同步,不会实时的,有一定的延迟,但是延迟不是非常的大。搭建了主从的结构,注意:在做读写分离的时候,所有的操作要在主服务器上操作,不要在从服务器上操作,避免将主从的架构给破坏掉。第一次的时候,不管读还是写全部是操作主库,如果破坏的话,需要再次同步下位置,再次重新启动slave start slave。
我们在主库的做的事情,全部会同步到从库。
1、首先在主的数据库上新建一个数据库db6
2、刷新下从库:这时在从库上有了db6
3、然后在主库新建张表tb_test
4、这时在从库上也有对应的表
5、在主库上添加一些数据
6、从库一刷新也有对应的数据
现在看下这个从库的位置在哪里
在主服务器上查询binlog日志:sql优化的时候会用的到
二进制的文件的名称和索引
查询二进制文件:可以看到一些列的日志信息,以及一些的sql语句的执行。
总结:只要对于数据库的操作,命令都会写到binlog日志里面去,包含授权,然后由master去异步的通知所有的slave节点,然后salve节点开启IO线程按照master给的账号去读取binlog日志里的信息。然后按照指定的格式写入到rely二进制文件中,然后SQL线程去读取中转日志rely,把数据全部写入到数据库。完成对master和salve的同步。