说明:
本人使用的都是ubuntu16.04 本地虚拟机,以下部署都是个人摸索或者寻求他人帮助以及网上查找相关资料进行配置的,可能不适用其他环境或者有遗漏,配置也都是根据简单化的,
深入的我自己也不了解,也许有更好的解决方式,要是有的话 请底下发个连接 谢谢,当前内容仅供参考,希望能帮助遇到相同问题的人, 谢谢!!!
1、准备3台服务器
192.168.1.136 mycat
192.168.1.174 写数据库
192.168.1.175 读数据库
2、配置双主数据库
安装mysql,创建 test 数据库
192.168.1.174服务器操作如下:
//登录Mysql 创建且授权master,专门提供192.168.1.175进行主主备份操作
mysql> grant replication slave on *.* to 'master'@'192.168.1.175' identified by '1234';
mysql> flush privileges;
//Mysql 5.7.2之后的版本通过这样的授权当开启slave的时候slave_IO_Run为No,换种方式授权创建master用户
mysql> grant all privileges on *.* to 'master'@'192.168.1.175' identified by '1234';
修改mysql配置文件内容,修改完后重启mysql服务 systemctl restart mysql

skip-name-resolve init-connect='SET NAME UTF8' skip-character-set-client-handshake character-set-server=utf8 max_connections=2000 lower_case_table_names = 1 skip_ssl server-id = 1 log_bin = /var/log/mysql/mysql-bin.log auto-increment-increment= 2 auto-increment-offset = 1 relay_log = mysqld-relay-bin log-slave-updates=ON expire_logs_days = 15 max_binlog_size = 500M
登录192.168.1.175 的mysql进行如下操作:
mysql> show master status\G

记下 mysql-bin.00001与154
再转回192.168.1.174的mysql 如下操作
mysql> change master to
master_host='192.168.1.175',
master_port=3306,
master_user='master',
master_password='1234',
master_log_file='mysql-bin.000001', //之前数据库查看的文件名称
master_log_pos=154; //之前show master status 的内容位置
mysql> start slave;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
说明开启成功,失败的话只能自行查找原因了或者网上搜搜看
192.168.1.175服务器mysql操作如下
修改Mysql配置文件内容,并且重启mysql服务

skip-name-resolve init-connect='SET NAME UTF8' skip-character-set-client-handshake character-set-server=utf8 max_connections=2000 lower_case_table_names = 1 skip_ssl server-id = 2 //与192.168.1.174必须不同 log_bin = /var/log/mysql/mysql-bin.log auto-increment-increment= 2 auto-increment-offset = 2 relay_log = mysqld-relay-bin log-slave-updates=ON expire_logs_days = 15 max_binlog_size = 500M
查看192.168.1.174服务的mysql master status
mysql> show master status;

登录192.168.1.175 mysql如下操作
mysql> grant replication slave on *.* to 'master'@'192.168.1.174' identified by '1234';
mysql> flush privileges;
mysql> change master to
-> master_host='192.168.1.174',
-> master_port=3306,
-> master_user='master',
-> master_password='1234',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=456;
mysql> start slave;
mysql> show slave status\G

双主数据库已经建立完成
设置Mycat做关联
1、安装mycat之前必须先安装java jdk
java下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载后 存放目录是 /usr/local/jdk1.8.0_20(可自行定义)
2、去官网下载Mycat,http://dl.mycat.io/1.6-RELEASE/ 本人下载是1.6 linux版本
3、上传到192.168.1.136 服务器上 /usr/local/mycat
修改mycat wrapper.conf配置文件
/usr/local/mycat/conf/wrapper.conf
wrapper.java.command=/usr/local/jdk1.8.0_20/bin/java #目录修改为java存放地址
mycat 如下命令: /usr/local/mycat/bin/mycat status /usr/local/mycat/bin/mycat start /usr/local/mycat/bin/mycat stop
mycat下面目录/usr/local/mycat/conf/schema.xml 配置内容如下

mycat下面目录/usr/local/mycat/conf/server.xml 配置内容基本上是默认,修改了用户名跟密码

启动mycat 运行 /usr/local/mycat/bin/mycat start 就可以 若是失败
可以查看mycat启动日志,网上有很多说明,我也只简单使用,我启动的时候是文件权限问题可能有不足仅供参考
chmod +x /usr/local/mycat/bin/mycat
chmod +x /usr/local/mycat/bin/wrapper-linux-x86-32
chmod +x /usr/local/mycat/bin/wrapper-linux-x86-64
授权后 再次运行
/usr/local/mycat/bin/mycat start
应该是成功了,可能有忘记吧,若是不成功 上网查查或者看看日志
然后可以试着修改你的.net Core 连接地址为192.168.1.136 端口号mycat默认是8066
因为本人是使用EntityFrameworkCore的,发现新增数据的时候会报出冲突,、
改成Dapper就没这个问题
这块应该是主键自增问题,EFCore主键默认是+1,
之前mysql为了防止Mysql主主设置相互拷贝冲突在配置文件里都设置了自增+2间隔
C#模型里主键不指定Key,设置非自增,就允许插入数据了
尝试关闭Mysql slave服务 发现每次执行写数据 Add 或者Update操作后,我再去读数据的时候 读的竟然是我配置的写入的数据库
可能有其他处理 我这边也发下我的解决方案
关闭AutoTransactionsEnabled就可以了,这块可能是事务自动提交的原因 具体我也不清楚 主要是看了挺长时间日志发现EF提交的数据里会自带一个autocommit=false
我使用Dapper提交读写操作的mycat的日志 autocommit=true,所以尝试Database.AutoTransactionsEnabled = false 看看 没想到这样读写分离成功了
并发什么的其他的没试过 有兴趣的朋友可以自己试下 仅供学习与参考 谢谢
参考学习地址:
Mysql主主配置:https://www.wandouip.com/t5i383180/
https://www.cnblogs.com/kristain/articles/4142970.html