主从复制&读写分离
为什么要做主从?
1、做数据的热备,作为后备数据库,当主数据库故障或宕机,可以切换到从库继续工作,防止数据丢失。
2、如果I/O访问频率过高,单机无法满足需求,此时做多库的存储,可以降低磁盘I/O访问的频率,提高单个机器的I/O性能
读写分离的好处
1、可以分担服务器的压力,提高机器的系统处理效率,使数据库能支撑更大的并发
2、增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务
一主双从,使用mycat中间件实现读写分离
准备四台机器:
10.3.134.98 master
10.3.134.99 slave1
10.3.134.100 slave2
10.3.134.101 mycat
准备工作:1、关闭所有机器的防火墙和selinux
2、清理环境,保证主从环境一致
3、做好本地域名解析
vim /etc/hosts 添加如下内容
10.3.134.98 master
10.3.134.99 slave1
10.3.134.100 slave2
10.3.134.101 mycat
先做好主从再进行读写分离:
M-S架构GTID(全局事务标识) 基于事务ID复制
1、yum安装MySQL5.7 (四台一起)
2、启动服务,并设置开机自启
查看端口,看一下服务是否启动成功
!!yum安装密码自动生成在日志问件中,直接将其过滤初来
3、编辑配置文件
[root@biudefor ~]# vim /etc/my.cnf
##### master 端添加如下配置
server-id=4098 #定义server id master必写
log-bin=mylog #开启binlog日志,master比写
gtid_mode=ON #开启gtid
enforce_gtid_consistency=1 #强制gtid
slave1操作: #添加如下配置
server-id=4099
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
slave2操作: #添加如下配置
server-id=4100
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
4、重启服务
5、登陆MySQL,并修改密码
[root@biudefor ~]# mysqladmin -uroot -p password"新密码"
Enter password: 旧密码
6、master上创建连接账户,slave上指定连接账户
在master上操作:
创建账户:
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by '密码' ;
mysql> flush privileges;
slave1和slave2上的操作是一样的:
slave1:
mysql> \e
change master to
master_host='master', #主ip 地址 最好用域名
master_user='授权用户', #主服务上面创建的用户
master_password='授权密码',
master_auto_position=1;
mysql> start slave; #启动slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G #查看状态,验证sql和IO是不是yes。
然后在slave2上进行相同的操作
image.png
7、测试
在master端创建一个库,建一个表,然后看看slave端是否同步。
主从部署完成
Mycat 数据库中间件
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。
部署环境
安装jdk
将jdk上传到服务器中
[root@mycat ~]# tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/
[root@mycat ~]# cd /usr/local/
[root@mycat local]# mv jdk1.8.0_221/ java
设置环境变量
[root@mycat local]# vim /etc/profile #添加如下内容,
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[root@mycat local]# source /etc/profile
部署mycat
下载
[root@mycat ~]# wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
解压
[root@mycat ~]# tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
配置mycat
认识配置文件
MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:
/usr/local/mycat/conf/server.xml #定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
/usr/local/mycat/conf/schema.xml #定义逻辑库,表、分片节点等内容。
编辑server.xml
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# vim server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="root" defaultAccount="true">
<property name="password">Duan@123</property>
<property name="schemas">duan</property>
</user>
</mycat:server>
name='root' mycat的虚拟用户名
password 用于登陆这个虚拟用户的密码
schemas 虚拟库
schema配置详解:
<schema name="duan" // 逻辑库名称,与server.xml的一致
checkSQLschema="false" // 不检查sql
sqlMaxLimit="100" // 最大连接数
dataNode="dn1"> // 数据节点名称
</schema>
<dataNode name="dn1" // 此数据节点的名称
dataHost="localhost1" // 主机组虚拟的
database="duan" /> // 真实的数据库名称
<dataHost name="localhost1" // 主机组
maxCon="1000" minCon="10" // 连接
balance="0" // 负载均衡
writeType="0" // 写模式配置
dbType="mysql" dbDriver="native" // 数据库配置
switchType="1" slaveThreshold="100">
!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
</dataHost>
balance 属性
负载均衡类型,目前的取值有 3 种:
- balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance="1", 全部的 readHost 与 writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
- balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
- writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
- writeType="1",所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。
<heartbeat>select user()</heartbeat> #对后端数据进行检测,执行一个sql语句,user()内部函数
读写配置
<writeHost host="hostM1" url="master:3306" user="mycat" password="Duan@123">
<readHost host="hostS1" url="slave:3306" user="mycat" password="Duan@123" />
<readHost host="hostS2" url="slave1:3306" user="mycat" password="Duan@123" />
</writeHost>
配置schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="duan" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="duan" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="master:3306" user="mycat" password="Duan@123">
<readHost host="hostS1" url="slave1:3306" user="mycat" password="Duan@123" />
<readHost host="hostS2" url="slave2:3306" user="mycat" password="Duan@123" />
</writeHost>
</dataHost>
</mycat:schema>
mycat已经配置好了,然后在master上给用户授权
mysql> grant all on testdb.* to 配置文件中指定的用户名@'%' identified by '配置文件里的密码';
mysql> flush privileges;
启动mycat
启动mycat之前需要调整JVM
在wrapper.conf中添加
[root@mycat mycat]# cd conf/
[root@mycat conf]# vim wrapper.conf #在设置JVM哪里添加如下内容
#wrapper.java.additional.1=
wrapper.startup.timeout=300 //超时时间300秒
wrapper.ping.timeout=120
启动:
[root@mycat conf]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# jps #查看mycat是否启动
13377 WrapperSimpleApp
13431 Jps
[root@mycat ~]# netstat -lntp | grep java
测试
在mycat的机器上面测试mycat用户登录
[root@biudefor conf]# mysql -uroot -hmaster -umycat -p
Enter password:
将master当做mycat的客户端
[root@mysql-master ~]# mysql -uroot -h mycat -p -P 8066
如果在show table报错:
mysql> show tables;
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
解决方式:
登录master服务将mycat的登录修改为%
mysql> update user set Host = '%' where User = 'mycat' and Host = 'localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
或者在授权用户mycat权限为.