1.实现mysql数据库的主从复制
Linux系统(192.168.126.129)------>mysql(数据库管理管理系统:root root)---------->jtdb(数据库),user(数据库)…
1.1 数据库的挂载原理
1.1.1 检查主数据库的状态
当我没给主库进行配置时,它只会干自己的活,不会去写二进制日志文件。这样,没有人会认为它是主库。
可以通过SQL语句:
SHOW MASTER STATUS;
查询当前这个库是不是被任命为了主库。
查询结果中如果像这样什么都没显示,说明这个库还不是主库。
那么怎么才能成为主库呢?
就是要让这个数据库开启它的二进制文件,即让它的二进制文件生效。
要是数据库能把用户的操作记录一条条地如实记录在这个二进制文件中,那么恭喜,这个数据库就荣升为主库了。
那么怎么开启这个二进制文件呢?
这个二进制文件在每个数据库中都有,只是默认没开启。
现在要对这个数据库进行如下的设置:
1.1.2 开启数据库二进制文件
默认条件下,一个普通的数据库是不能充当主库的。
要想让它能胜任主库,需要开启这个数据库的二进制文件。
修改mysql数据库核心配置文件。(这样,mysql系统中的数据库就都是主库了。)
它叫my.cnf 在/etc/目录下。
通过命令 vim my.cnf 去修改配置文件。
1. datadir=/var/lib/mysql/ 这个路径就是主库写的二进制日志文件的存放目录,也是主库存放它数据库数据的目录。 这行我没有修改。
- 我修改的就是添加了
server-id=1 (1是我自定义的,也可以是别的数字)
log-bin=mysql-bin (mysql-bin是我自己定义的,也可以叫别的名字)
这两行语句。
server-id 就好比员工的工号,每个人的工号都是独一无二的。每个数据库服务器都有自己的server-id,可以用此来区分数据库。
log-bin 定义的就是主库写日志时,那个日志的名字,以后从库就可以根据这个名字去查主库写的日志。
设置完上面两项之后,保存退出my.cnf文件。
并重启一下数据库: systemctl restart mariadb
然后进入二进制日志存放目录:/var/lib/mysql/
可以看到 mysql-bin.000001 就是主库的二进制日志文件。
1.1.3 再次检查主库的状态
如果下面展现了二进制日志文件的信息,就说明我主库正式上任了。
而这个position是什么意思呢?
比如 上一次备份 主库已经将前4917条 “用户对数据库数据的修改日志” 备份到从库中了。
那么这次 主库就从第 4918条 “用户对数据库数据的修改日志” 开启备份,到从库就行了。
1.2 实现主从库之间的挂载
所谓挂载,就是主库和从库之间互动起来。
(其实设置的是这个Linux系统192.168.126.129中的,这个mysql数据库管理系统中的 所有数据库都是主库)
从库 想要 挂载(连接) 主库 ,它需要知道主库的哪些信息?
1.主库的IP地址MASTER_HOST eg: 192.168.126.129
2.主库的端口号MASTER_PORT eg: 3306
3.登录主库的用户名MASTER_USER eg: root
4.登录主库的密码MASTER_PASSWORD eg: root
5.主库写的二进制日志文件MASTER_LOG_FILE eg: mysql-bin.000001
6.主库上次备份时备份到第几条日志信息了MASTER_LOG_POS eg: 501
1.3 启动主库与从库之间的联系
上一步只是让从库找到了主库,要想互动起来还得靠语句:
START SLAVE (开始做奴隶)
运行完 没什么反应。
1.4 验证主从服务是否成功
上一步语句运行完,也没什么明显的反应。
要想验证 主从服务是否成功,还得靠语句:
SHOW SLAVE STATUS;
只要这两个地方,从库的IO线程 和从库的SQL线程 显示的是“Yes”(表示正在运行中),就表明主库与从库之间的服务搭建成功了。
1.5 给从库更换一个主库去连接
在从库已经关联着一个主库的时候,是不能让这个从库直接去关联另一个主库的。
需要毙掉从库这当前这个主库的关联。
语句:
STOP SLAVE (不当奴隶了)
然后重复一遍1.2中的语句,从库就关联上新的主库了。
1.6 展现主从复制的效果
在主库(192.168.126.129)中新建一个数据库(user),在user中再新建一个表(test),表中随便写一些数据。
保存表后。
从库去刷新它的数据库时,会发现多出来一个数据库(user),并且库中的表也是刚刚主库新建的表(test)。
就说明主从复制功能设置成功了。
2.实现mysql数据库读写分离 (Mycat)
如果只让从库去充当一个存储备份数据的角色,那真是大材小用了。毕竟一个服务器挺贵的。
如果从库能适当地帮主库分担一些工作量。那就太好了。降低了主库gg的风险。整个的工作效率也提高了不少。
如果让从库像主库一样的干活,那客户端在访问时就得也知道从库的IP地址。
但通常项目的yml文件中,数据库的url只能写一个:
怎么才能让主库和从库能同时干活呢?
可以引入一个数据库服务器的代理数据库。
就跟tomcat服务器的代理的功能相类似。
这个数据库代理服务器一边接收着客户端的请求,另一边去把任务合理地分配给主库和从库。
(通常,客户端 写 的请求分配给主库,读 的请求分配给从库)
而代理数据库在linux中也有属于自己的端口号:比如Mycat 就是8066
所以项目中的yml中的url只要改成8066,客户端就可以通过访问代理数据库,间接地访问着主库与从库。
注意:这种数据库的代理,也是一种反向代理机制。它保护的是数据库的安全。客户端并不知道自己访问的是主库还是从库,只要拿到想要的信息就行了。
而Mycat就是现在市面上用得最广的一段数据库代理服务器。
它的底层代码是阿里巴巴的团队用JAVA语言写的。
2.1 安装JDK
由于Mycat是用java写的,所以linux系统中得安装JDK先。
过程略。
详见
https://editor.csdn.net/md/?articleId=108456227
2.2 安装Mycat
将第一个安装包直接安装在 /usr/local/src/目录下
而下面的schema.xml 和 server.xml 也是Mycat安装包下conf文件夹中的两个文件,我先在这里改完,到时候覆盖掉原安装包中的文件即可。
2.2.1 配置server.xml
由于Mycat也相当于是一个数据库,所以也得设置访问它的用户名和密码。
这个server.xml文件就是用来设定:用户与代理数据库之间的连接的。
它规定了访问Mycat的端口号,用户名和密码,以及能访问哪些数据库客户端。
1.端口号:8066
2.user和password,能访问的数据库
这里设置了两个用户
用户1:
name:root password:root 有权访问的数据库是:jtdb (如果还想访问别的数据库,比如aaa,就加载jtdb后面,用,分隔就行了) 权限很大,没有约束
用户2:
name:user password:user 有权访问的数据库是:jtdb 权限有限:只能 读取
这个schemas规定的就是 我用root 和 root登录Mysql客户端时,能看到哪些数据库,本例中设定的是只能看到jtdb数据库。
与yml文件中的这里是对应的
2.schema.xml中的配置
2.2.2 替换linux中/usr/local/src/mycat/conf/目录下的原来的2个文件
2.2.3 启动mycat,测试是否配置成功
1.跳转到bin目录中,先启动mycat服务器.之后检查状态信息.
由于yml文件中的url已经改为
#url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
所以在windows系统中,打开浏览器,参照yml中的端口号的配置(如:8091),输入127.0.0.1:8091,
如果能正常进入系统 说明,我通过mycat成功访问到了主节点数据库和从节点数据库。
2.3 测试数据库的负载均衡设置
当前yml文件中配置的是:
客户端连接的是mycat的地址和端口
然后可以在主库中,在jtdb中,找到tb_item表,修改一条数据。而从库中对应的这条数据不修改。
当在windows中访问项目时,查询这条数据时,经过不断的刷新,有时显示的是主库中修改后的信息,有时显示的是从库中未修改的信息,就说明之前配置mycat时,负载均衡的效果成功了。(balance=1)
3.实现mysql数据库高可用
3.1 什么是高可用(HA)
即 主库gg的这段时间中,为了不影响用户的使用,从库升任为主库,干主库的活。
当原来的主库复活以后,从库将这段时间产生的日志记录再同步给原主库。
这个整合步骤都是自动的,mycat中配置好的。
3.2 数据库双机热备的形式(双主模式)
说明:在工作中一般采用双主模式来实现数据库高可用. 本质上来讲2台节点上的数据库都是主机.只是人为的进行了主从的划分.
3.3 实现数据库双向绑定
即模仿上面 数据库主从复制的 步骤,原来的主库现在扮演从库,原来的从库现在扮演主库,进行相应的设置。
使双方既可以当主库,也可以当从库。
1.检查主库的状态
2.实现主从的搭建
/*实现主从的挂载 */
CHANGE MASTER TO MASTER_HOST="192.168.126.130",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=477
/*启动主从服务 */
START SLAVE
SHOW SLAVE STATUS;
3.确认一下mycat中的schema.xml文件中的配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--name属性是自定义的 dataNode表示数据库的节点信息 jtdb表示逻辑库-->
<schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>
<!--定义节点名称/节点主机/数据名称-->
<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
<!--参数介绍 UTF-8 中文报错-->
<!--balance 0表示所有的读操作都会发往writeHost主机 -->
<!--1表示所有的读操作发往readHost和闲置的主节点中-->
<!--writeType=0 所有的写操作都发往第一个writeHost主机-->
<!--writeType=1 所有的写操作随机发往writeHost中-->
<!--dbType 表示数据库类型 mysql/oracle-->
<!--dbDriver="native" 固定参数 不变-->
<!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
<!--switchType=1 表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
<!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select 1</heartbeat>
<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
-->
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
<!--定义第二台主机 由于数据库内部已经实现了双机热备.-->
<!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.-->
<!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
<!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
<!--前提:实现双机热备.-->
<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
4.重启mycat,使配置生效
3.4 数据库高可用测试是否成功
1.启动window中的服务器测试mycat服务是否正确.
2.将数据库主库关闭,检查服务是否正确.
3.将数据库主库启动,检查数据是否同步.