EntityFrameworkCore+Mysql+Mycat進行讀寫分離配置


說明:

本人使用的都是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
View Code

登錄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
View Code

 查看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

Mycat配置:https://github.com/MyCATApache/Mycat-Server/wiki/2.0-Mycat%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM