linux中主从复制的架构和读写分离的方式

读写分离

互相主从

架构

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以上的版本上运行。

部署jdk环境

上传文件,解压文件
复制代码
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   //使环境变量生效

部署mycat环境

复制代码
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配置文件

复制代码
mycat/conf/server.xml      //定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接mycat的用户信息,简单来说,就是假的信息

mycat/conf/schema.xml       //定义逻辑库,表、分片节点等内容。
给所有数据库创建访问用户
复制代码
grant all on *.* to '用户名'@'%' identified by "密码";
配置 server.xml

修改配置文件前备份一份

复制代码
<?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>
配置 schema.xml

修改配置文件前备份一份

复制代码
<?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" />
        
<!--主机组,注意name和数据节点的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="主1ip:端口" user="用户" password="密码">
                        <readHost host="hostS1" url="从1ip:端口" user="用户" password="密码"/>
                </writeHost>
                <writeHost host="hostM2" url="主2ip:端口" user="用户" password="密码">
                        <readHost host="hostS2" url="从2ip:端口" user="用户" password="密码"/>
				 </writeHost>
		</dataHost>
</mycat:schema>
启动mycat
复制代码
mycat start
查看启动端口
复制代码
ss -nplt
端口关注8066
日志
复制代码
mycat/logs     //日志目录


drwxr-xr-x 2 root root  4096 12月 26 10:24 2023-12       //打包的日志文件
-rw-r--r-- 1 root root 23800 12月 26 11:19 mycat.log     //mycat的启动日志文件
-rw-r--r-- 1 root root     5 12月 26 10:24 mycat.pid     //启动程序的pid
-rw-r--r-- 1 root root 72956 12月 26 10:24 wrapper.log    //错误日志
负载均衡
复制代码
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:所有读的数据库

遇到的问题

能进mycat但是进不去TESTDB
复制代码
问题一
一般情况是数据库的用户授权或者创建有问题

若是多主数据库的情况,进不去数据库时候,会一直建立连接,用户问题解决后
调整mysql最大连接数
复制代码
max-connections=2000  //增加mysql最大连接数的配置,在my.cnf更改
在mycat中use TESTDB特别卡
复制代码
问题一
schema.xml配置文件中
<!--数据节点,database是真实存在的组,真组和假组在这里建立连接-->
<dataNode name="dn1" dataHost="localhost1" database="stu" />
数据节点database的数据库可能在主从架构中不存在

问题二
创建用户和库的时候,先创的用户,后创建的库,用户没有授权这个库,重新对用户进行授权即可
测试负载均衡时候,0查看到的是主2,1查看到的是主1,从1从2(基于双主双从做的读写分离)
复制代码
主1数据库的最大连接数连满了,写的目标数据库变成主2的数据库
重启数据库即可解决或者设置数据库的最大连接数
更改假用户登录mycat后查看的数据库名
复制代码
<?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">nan</property>
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

schema.xml
<schema name="nan" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

然后就起不来了,问题在假库的配置文件,user的标签内识别不到,不用user标签,将标签删除,如:
<?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">nan</property>
        </user>
</mycat:server>
重启,一般情况就起来了
相关推荐
HWL56795 分钟前
“preinstall“: “npx only-allow pnpm“
运维·服务器·前端·javascript·vue.js
Wgllss5 分钟前
雷电雨效果:Kotlin+Compose+协程+Flow 实现天气UI
android·架构·android jetpack
归辞...1 小时前
「iOS」————设计架构
ios·架构
bing.shao1 小时前
微服务容错与监控体系设计
微服务·云原生·架构
小米里的大麦1 小时前
022 基础 IO —— 文件
linux
Xの哲學2 小时前
Perf使用详解
linux·网络·网络协议·算法·架构
门前灯2 小时前
Linux系统之iprconfig 命令详解
linux·运维·服务器·iprconfig
自由的疯2 小时前
在 Java IDEA 中使用 DeepSeek 详解
java·后端·架构
tb_first2 小时前
k8sday09
linux·云原生·容器·kubernetes