linux中主从复制的架构和读写分离的方式
- 手机
- 2025-07-21 19:05:36

读写分离 互相主从架构注意点 双主双从架构注意点 一主多从架构注意点 读写分离概念部署jdk环境上传文件,解压文件配置环境变量 部署mycat环境mycat配置文件给所有数据库创建访问用户配置 server.xml配置 schema.xml启动mycat查看启动端口日志负载均衡测试 遇到的问题能进mycat但是进不去TESTDB调整mysql最大连接数在mycat中use TESTDB特别卡测试负载均衡时候,0查看到的是主2,1查看到的是主1,从1从2(基于双主双从做的读写分离)更改假用户登录mycat后查看的数据库名 互相主从 架构 iproleip1ip2的主库、ip2的从库ip2ip1的主库、ip2的从库 注意点
两个服务器上都要创建远程登录拷贝用户
两个数据库都在写入数据,可能会造成主键冲突,可以在my f配置文件中写入
auto_increment_increment=2 //设置初始步长值 auto_increment_offset=1 //设置偏移量这样就可以避免主键冲突
双主双从 架构 iproleip1ip3和ip2的主库,ip2的从库ip2ip4和ip1的主库,ip1的从库ip3ip1的从库ip4ip2的从库 注意点因为ip1和ip2的主库要拷贝多份二进制binlog日志,在my f里添加参数
log-slave-updates //binlog可以多次拷贝,主库复制的内容也会写入从库binlog
一主多从 架构 iproleip1ip2和ip3的主库ip2ip1的从库ip3ip1的从库 注意点因为ip1的主库要拷贝多份二进制binlog日志,在my f里添加参数
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 f更改 在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> 重启,一般情况就起来了linux中主从复制的架构和读写分离的方式由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“linux中主从复制的架构和读写分离的方式”
上一篇
2023年第七届强网杯初赛WP