ip | role |
---|---|
ip1 | ip2的主库、ip2的从库 |
ip2 | ip1的主库、ip2的从库 |
两个服务器上都要创建远程登录拷贝用户
两个数据库都在写入数据,可能会造成主键冲突,可以在my.cnf配置文件中写入
auto_increment_increment=2 //设置初始步长值 auto_increment_offset=1 //设置偏移量
这样就可以避免主键冲突
ip | role |
---|---|
ip1 | ip3和ip2的主库,ip2的从库 |
ip2 | ip4和ip1的主库,ip1的从库 |
ip3 | ip1的从库 |
ip4 | ip2的从库 |
因为ip1和ip2的主库要拷贝多份二进制binlog日志,在my.cnf里添加参数
log-slave-updates //binlog可以多次拷贝,主库复制的内容也会写入从库binlog
ip | role |
---|---|
ip1 | ip2和ip3的主库 |
ip2 | ip1的从库 |
ip3 | ip1的从库 |
因为ip1的主库要拷贝多份二进制binlog日志,在my.cnf里添加参数
log-slave-updates //binlog可以多次拷贝,主库复制的内容也会写入从库binlog
一主一从的基础上实现读数据和写数据访问不同的服务器
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的数据库系统,Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。MyCAT是使用JAVA语言进行编写开发,使用前需要先安装JAVA运行环境(JRE),由于MyCAT中使用了JDK7中的一些特性,所以要求必须在JDK7以上的版本上运行。
tar -xf jdk-8u181-linux-x64.tar.gz
vim /etc/profile.d/java.sh //java环境配置
export JAVA_HOME=/opt/jdk1.8.0_211
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile.d/java.sh //使环境变量生效
tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
vim /etc/profile //环境配置
export JAVA_HOME=/opt/mycat
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile //重启环境变量
mycat/conf/server.xml //定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接mycat的用户信息,简单来说,就是假的信息
mycat/conf/schema.xml //定义逻辑库,表、分片节点等内容。
grant all on *.* to '用户名'@'%' identified by "密码";
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- 登录mycat的用户和密码-->
<user name="root" defaultAccount="true">
<property name="password">0</property>
<!-- 登录mycat的用户看到的数据库名-->
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--逻辑库和分表设置,与server.xml一致-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!--数据节点,database是真实存在的组,真组和假组在这里建立连接-->
<dataNode name="dn1" dataHost="localhost1" database="stu" />
<!--主机组,注意那么和数据节点的dataHost相同即可,balance负载均衡-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--健康检查-->
<heartbeat>select user()</heartbeat>
<!--读写配置,此处以双主双从举例,此处的用户数据库必须存在-->
<writeHost host="hostM1" url="master1:3306" user="mycat" password="0">
<readHost host="hostS1" url="slave1:3306" user="mycat" password="0"/>
</writeHost>
<writeHost host="hostM2" url="master2:3306" user="mycat" password="0">
<readHost host="hostS2" url="slave2:3306" user="mycat" password="0"/>
</writeHost>
</dataHost>
</mycat:schema>
balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
mysql -uroot -p0 -hmycat -P8066 TESTDB //此处登录的ip地址是mycat存在的主机,登录的用户是在mycat/conf/server.xml中写的假的数据库登录信息
关闭双主双从的主从复制,服务器分别创建数据库,用负载均衡,进行检查
0:只有正在写的数据库
1:处理正在写的数据库都有
2:所有数据库
3:所有读的数据库