1、 MySQL主从
主从复制(Master-Slave Replication)是一种数据库复制机制,通过它,一个MySQL服务器(主服务器)上的数据变更会被实时复制到一个或多个从服务器上,从而实现数据的同步和冗余。
当主服务器上的数据发生改变时,写入二进制日志(Binlog)中,从服务器会在一定时间间隔内对主服务器二进制日志进行探测其是否发生改变,如果发生改变,则开始请求主服务器二进制事件,主节点向其发送二进制事件,并保存至从节点本地的中继日志(Relay Log)中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后进入睡眠状态,等待下一次被唤醒。
--关闭防火墙和SElinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
1.1 主服务器配置
a. 修改配置文件/etc/my.cnf
。
[root@localhost ~]# vim /etc/my.cnf
--新增两个配置
log-bin=mysql-bin
server-id=1
b. 启动MySQL。
[root@localhost ~]# systemctl start mysqld
c. 创建一个用户用于从服务器登录主服务器。
[root@localhost ~]# mysql -uroot -p
--创建MySlave用户只允许从从服务器IP登录
mysql> CREATE USER 'MySlave'@'192.168.101.105' IDENTIFIED BY 'Zgsmm285@';
--对MySlave用户权限进行管理,只有从从服务器IP请求,才有权限读写
mysql> GRANT REPLICATION SLAVE ON *.* TO 'MySlave'@'192.168.101.105';
--查询master状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 716 | | | |
+------------------+----------+--------------+------------------+-------------------+
1.2 从服务器配置
c. 修改配置文件/etc/my.cnf
。
[root@localhost ~]# vim /etc/my.cnf
--新增两个配置
log-bin=mysql-bin
server-id=2
d. 启动MySQL。
[root@localhost ~]# systemctl start mysqld
e. 配置主服务器信息。并启动主从复制线程。
[root@localhost ~]# mysql -uroot -p
mysql> change master to
-> master_host='192.168.101.104',
-> master_user='MySlave',
-> master_password='Zgsmm285@',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=716;
--master_log_file和master_log_pos填写主服务器查询master状态的输出结果。意味着从服务器从主服务器的这个二进制日志的某个位置开始主从复制
--启动主从复制线程。
mysql> start slave;
--查询主从复制状态信息。
mysql> show slave status\G;
*************************** 1. row ***************************
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
--留意这两个值,都为Yes代表正常。
1.3 测试
a. 主服务器创建名为test_code
的表,从服务器查询对应表已存在。
--104主服务器
mysql> CREATE TABLE test.test_code (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> dingdan VARCHAR(255) NOT NULL,
-> shangpin VARCHAR(255) NOT NULL
-> );
--105从服务器
mysql> show tables like 'test_code';
+-----------------------------+
| Tables_in_mysql (test_code) |
+-----------------------------+
| test_code |
+-----------------------------+
b. 主服务器往test_code
表插入数据,从服务器查询数据变更已同步落地。
--104主服务器
mysql> INSERT into test.test_code (dingdan,shangpin) VALUES ('订单1','哇哈哈汽水');
--105从服务器
mysql> select * from test.test_code \G;
*************************** 1. row ***************************
id: 1
dingdan: 订单1
shangpin: 哇哈哈汽水
1 row in set (0.00 sec)
2、 读写分离
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信。
应用连接MyCat,通过MyCat中间件进行读写分离配置,把写操作发往主节点,读操作发往从节点。主从复制是前提,把主服务器的写操作同步到从服务器。
主从复制架构不变,新增一台服务器192.168.101.106配置MyCat。
2.1 MyCat安装
a. 如图两个包上传到MyCat服务器。
MyCat安装包可到GitHub下载
jdk安装包到oracle官网下载
b. 安装jdk。
[root@localhost ~]# rpm -ivh jdk-8u251-linux-x64.rpm
[root@localhost ~]# java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
c. 安装MyCat。
[root@localhost ~]# tar -xvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz
[root@localhost ~]# echo 'MYCAT_HOME=/root/mycat' >> /etc/profile
[root@localhost ~]# echo 'PATH=$MYCAT_HOME/bin:$PATH' >> /etc/profile
[root@localhost ~]# source /etc/profile
2.2 MyCat配置
a. 查看MyCat系统配置文件,留意user
标签,这里配置了两个用户(root+user)、密码和可连接的逻辑库。
[root@localhost ~]# vim /root/mycat/conf/server.xml
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
b. 编辑MyCat逻辑库配置文件
[root@localhost ~]# vim /root/mycat/conf/schema.xml
schema标签定义逻辑库
name:和2.2步骤MyCat server.xml配置文件中
user
标签schemas
项所关联。dataNode:定义数据存储的节点为dn1。
dataNode
用于绑定逻辑库到某个具体的数据库上,如果定义此属性,对这个逻辑库的所有操作会直接作用到绑定的dataNode
上,所以这个逻辑库就不能工作在分库分表模式下了(schema
标签内部不得配置任何逻辑表信息)
Table标签定义逻辑表
因为在schema
标签dataNode
定义了数据节点,所以这里需要注释掉这个标签。
dataNode标签定义数据节点
name:对应
schema
标签中的dataNode
。database:数据节点要连接的数据库,改为主和从服务器的数据库
test
。
另外两个标签没用上可以注释掉。
dataHose定义物理数据库
name:对应
dataNode
标签的dataHost
。balance:负载均衡类型。
0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
1:启用读写分离机制,读操作从第一个writeHost下所有readHost和备用writeHost中随机选择一个进行读取。
2:读操作从所有的writeHost及其下面所有readHost随机选择一个进行读取。
3:读操作从所有的readHost随机选择一个进行读取,writerHost不负担读压力。
dbType:指定数据库类型。
dbDriver:使用
native
可以配置mysql
和maridb
数据库类型。其他类型的数据库则需要使用JDBC驱动来支持。writeHost:定义写数据库,
readHost
是writeHost
的子标签,如果writeHost
指定的后端数据库宕机,那么这个writeHost
绑定的所有readHost
都将不可用。另一方面,当一个writeHost
宕机时系统会自动检测到,并切换到备用的writeHost
上去。readHost:定义读数据库。
2.3 启动MyCat
[root@localhost ~]# /root/mycat/bin/mycat start
Starting Mycat-server...
[root@localhost ~]# /root/mycat/bin/mycat status
Mycat-server is running (13105).
2.4 测试
MyCat有两个端口,9066是管理端口,8066是连接端口,和平常的MySQL差不多,登录管理端。
2.4.1 MyCat状态
a. 查看心跳,1为正常。
b. 查看读写状态,W为写R为读。
2.4.2 建表、插入测试
登录客户端8066。
a. 创建表,主从服务器都能正常查询到。
b. 插入数据,查询主从数据都正常落地。
2.4.3 读测试
把从服务器的主从复制停了。MyCat再插一条记录,查询主服务器已存在新插入的数据。MyCat查询没有新插入的数据。停了从服务器的主从复制,没能同步主服务器的写操作过来,MyCat读的是从服务器,证明读配置没问题。
2.4.3 写测试
把从服务器的主从复制开启,停止主服务器的MySQL服务。MyCat插入数据报错,因为写操作为主服务器。